diff --git a/frontend/src/routes/page.svelte.test.ts b/frontend/src/routes/page.svelte.test.ts new file mode 100644 index 00000000..12d10504 --- /dev/null +++ b/frontend/src/routes/page.svelte.test.ts @@ -0,0 +1,94 @@ +import { describe, it, expect, afterEach } from 'vitest'; +import { cleanup, render } from 'vitest-browser-svelte'; +import HomePage from './+page.svelte'; + +afterEach(cleanup); + +const baseData = (overrides: Record = {}) => ({ + user: null, + canWrite: false, + canBlogWrite: false, + isReader: false, + resumeDoc: null, + incompleteDocs: [], + incompleteTotal: 0, + segmentationDocs: [], + transcriptionDocs: [], + readyDocs: [], + weeklyStats: null, + pulse: null, + activityFeed: [], + drafts: [], + topPersons: [], + recentDocs: [], + recentStories: [], + readerStats: null, + ...overrides +}); + +describe('home page (/)', () => { + it('renders the reader dashboard layout when isReader is true', async () => { + render(HomePage, { + props: { data: baseData({ isReader: true, user: { firstName: 'Anna' } }) } + }); + + // ReaderHeaderBar rendering — at least the page mounts without error + const main = document.querySelector('main'); + expect(main).not.toBeNull(); + }); + + it('renders the contributor dashboard for non-reader users', async () => { + render(HomePage, { props: { data: baseData({ user: { firstName: 'Anna' } }) } }); + + // Should render the greeting heading + const heading = document.querySelector('h1'); + expect(heading).not.toBeNull(); + }); + + it('omits the greeting when there is no user', async () => { + render(HomePage, { props: { data: baseData() } }); + + const heading = document.querySelector('h1'); + expect(heading).toBeNull(); + }); + + it('renders the DropZone when canWrite is true', async () => { + render(HomePage, { + props: { data: baseData({ user: { firstName: 'Anna' }, canWrite: true }) } + }); + + const main = document.querySelector('main'); + expect(main).not.toBeNull(); + }); + + it('omits the DropZone when canWrite is false', async () => { + render(HomePage, { props: { data: baseData({ user: { firstName: 'Anna' } }) } }); + + // DropZone has a file input — verify there isn't one in the rendered tree. + const fileInput = document.querySelector('main input[type="file"]'); + expect(fileInput).toBeNull(); + }); + + it('renders the ReaderDraftsModule when isReader and canBlogWrite are both true', async () => { + render(HomePage, { + props: { + data: baseData({ + isReader: true, + canBlogWrite: true, + user: { firstName: 'Anna' } + }) + } + }); + + const main = document.querySelector('main'); + expect(main).not.toBeNull(); + }); + + it('renders the mission-control caption for the contributor dashboard', async () => { + render(HomePage, { props: { data: baseData({ user: { firstName: 'Anna' } }) } }); + + // MissionControl section has aria-label, find its parent section + const section = document.querySelector('section[aria-label]'); + expect(section).not.toBeNull(); + }); +});