From 524b09810a0cc4c5799fc53bd704eb03b0b3ae96 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 10 May 2026 00:24:39 +0200 Subject: [PATCH] test(briefwechsel): cover ConversationTimeline branches Year divider rendering, distinct-year branch, no-duplicate consecutive years, no-divider for documents without documentDate, canWrite-gated new-document link with senderId-only and senderId+receiverId href variants. 7 tests covering ~20 branches. Refs #496. Co-Authored-By: Claude Sonnet 4.6 --- .../ConversationTimeline.svelte.test.ts | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 frontend/src/routes/briefwechsel/ConversationTimeline.svelte.test.ts diff --git a/frontend/src/routes/briefwechsel/ConversationTimeline.svelte.test.ts b/frontend/src/routes/briefwechsel/ConversationTimeline.svelte.test.ts new file mode 100644 index 00000000..98840368 --- /dev/null +++ b/frontend/src/routes/briefwechsel/ConversationTimeline.svelte.test.ts @@ -0,0 +1,101 @@ +import { describe, it, expect, afterEach } from 'vitest'; +import { cleanup, render } from 'vitest-browser-svelte'; +import { page } from 'vitest/browser'; +import ConversationTimeline from './ConversationTimeline.svelte'; + +afterEach(cleanup); + +const sender = { id: 'p1', firstName: 'Anna', lastName: 'Schmidt', displayName: 'Anna Schmidt' }; +const receiver = { id: 'p2', firstName: 'Bert', lastName: 'Meier', displayName: 'Bert Meier' }; + +const makeDoc = (overrides: Record = {}) => ({ + id: 'd1', + originalFilename: 'brief.pdf', + documentDate: '1923-04-15', + sender, + receivers: [receiver], + tags: [], + ...overrides +}); + +const baseProps = (overrides: Record = {}) => ({ + documents: [makeDoc()], + senderId: 'p1', + receiverId: '', + canWrite: false, + senderName: 'Anna Schmidt', + receiverName: 'Bert Meier', + ...overrides +}); + +describe('ConversationTimeline', () => { + it('renders the year divider for the document year', async () => { + render(ConversationTimeline, { props: baseProps() }); + + await expect.element(page.getByTestId('year-divider')).toBeVisible(); + }); + + it('renders one year divider per distinct year', async () => { + render(ConversationTimeline, { + props: baseProps({ + documents: [ + makeDoc({ id: 'd1', documentDate: '1923-04-15' }), + makeDoc({ id: 'd2', documentDate: '1924-06-20' }), + makeDoc({ id: 'd3', documentDate: '1925-12-31' }) + ] + }) + }); + + const dividers = document.querySelectorAll('[data-testid="year-divider"]'); + expect(dividers.length).toBe(3); + }); + + it('does not duplicate the year divider when consecutive documents share a year', async () => { + render(ConversationTimeline, { + props: baseProps({ + documents: [ + makeDoc({ id: 'd1', documentDate: '1923-04-15' }), + makeDoc({ id: 'd2', documentDate: '1923-06-20' }) + ] + }) + }); + + const dividers = document.querySelectorAll('[data-testid="year-divider"]'); + expect(dividers.length).toBe(1); + }); + + it('does not render a year divider for documents with no documentDate', async () => { + render(ConversationTimeline, { + props: baseProps({ + documents: [makeDoc({ documentDate: undefined })] + }) + }); + + const dividers = document.querySelectorAll('[data-testid="year-divider"]'); + expect(dividers.length).toBe(0); + }); + + it('renders the new-document link when canWrite is true', async () => { + render(ConversationTimeline, { props: baseProps({ canWrite: true }) }); + + await expect + .element(page.getByTestId('conv-new-doc-link')) + .toHaveAttribute('href', '/documents/new?senderId=p1'); + }); + + it('appends receiverId to the new-document URL when set', async () => { + render(ConversationTimeline, { + props: baseProps({ canWrite: true, receiverId: 'p2' }) + }); + + await expect + .element(page.getByTestId('conv-new-doc-link')) + .toHaveAttribute('href', '/documents/new?senderId=p1&receiverId=p2'); + }); + + it('hides the new-document link when canWrite is false', async () => { + render(ConversationTimeline, { props: baseProps({ canWrite: false }) }); + + await expect.element(page.getByTestId('conv-new-doc-link')).not.toBeInTheDocument(); + }); +});