From 0f8b5828137e2d36e187e332d7f0675986de568c Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 20 Mar 2026 17:23:06 +0100 Subject: [PATCH] test(documents): add component tests for sender/receiver URL prefill on new document page Co-Authored-By: Claude Sonnet 4.6 --- .../src/routes/documents/new/+page.svelte | 5 +- .../routes/documents/new/page.svelte.spec.ts | 71 +++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 frontend/src/routes/documents/new/page.svelte.spec.ts diff --git a/frontend/src/routes/documents/new/+page.svelte b/frontend/src/routes/documents/new/+page.svelte index 3727283b..f6808de6 100644 --- a/frontend/src/routes/documents/new/+page.svelte +++ b/frontend/src/routes/documents/new/+page.svelte @@ -3,14 +3,15 @@ import { enhance } from '$app/forms'; import TagInput from '$lib/components/TagInput.svelte'; import PersonTypeahead from '$lib/components/PersonTypeahead.svelte'; import PersonMultiSelect from '$lib/components/PersonMultiSelect.svelte'; +import { untrack } from 'svelte'; import { m } from '$lib/paraglide/messages.js'; let { data, form } = $props(); let tags: string[] = $state([]); -let senderId = $state(data.initialSenderId); +let senderId = $state(untrack(() => data.initialSenderId)); let selectedReceivers: { id: string; firstName: string; lastName: string }[] = $state( - data.initialReceivers + untrack(() => data.initialReceivers) ); let dateDisplay = $state(''); diff --git a/frontend/src/routes/documents/new/page.svelte.spec.ts b/frontend/src/routes/documents/new/page.svelte.spec.ts new file mode 100644 index 00000000..7968fe30 --- /dev/null +++ b/frontend/src/routes/documents/new/page.svelte.spec.ts @@ -0,0 +1,71 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { cleanup, render } from 'vitest-browser-svelte'; +import { page } from 'vitest/browser'; +import Page from './+page.svelte'; + +afterEach(cleanup); + +// ─── Test data ──────────────────────────────────────────────────────────────── + +const baseData = { + persons: [], + initialSenderId: '', + initialSenderName: '', + initialReceivers: [] +}; + +// ─── Prefill – sender ───────────────────────────────────────────────────────── + +describe('New document page – sender prefill', () => { + it('shows an empty sender input when no senderId is in the URL', async () => { + render(Page, { data: baseData }); + const input = document.querySelector('#senderId-search'); + expect(input?.value).toBe(''); + }); + + it('shows the sender name in the typeahead input when initialSenderName is set', async () => { + render(Page, { + data: { ...baseData, initialSenderId: 'p1', initialSenderName: 'Hans Müller' } + }); + const input = document.querySelector('#senderId-search'); + expect(input?.value).toBe('Hans Müller'); + }); + + it('sets the hidden senderId input to the prefilled ID', async () => { + render(Page, { + data: { ...baseData, initialSenderId: 'p1', initialSenderName: 'Hans Müller' } + }); + const hidden = document.querySelector( + 'input[type="hidden"][name="senderId"]' + ); + expect(hidden?.value).toBe('p1'); + }); +}); + +// ─── Prefill – receiver ─────────────────────────────────────────────────────── + +describe('New document page – receiver prefill', () => { + it('shows no receiver chips when initialReceivers is empty', async () => { + render(Page, { data: baseData }); + await expect.element(page.getByText('Anna Schmidt')).not.toBeInTheDocument(); + }); + + it('shows a receiver chip when initialReceivers has a person', async () => { + const data = { + ...baseData, + initialReceivers: [{ id: 'p2', firstName: 'Anna', lastName: 'Schmidt' }] + }; + render(Page, { data }); + await expect.element(page.getByText('Anna Schmidt')).toBeInTheDocument(); + }); + + it('renders a hidden receiverIds input for the prefilled receiver', async () => { + const data = { + ...baseData, + initialReceivers: [{ id: 'p2', firstName: 'Anna', lastName: 'Schmidt' }] + }; + render(Page, { data }); + const hidden = document.querySelector('input[name="receiverIds"]'); + expect(hidden?.value).toBe('p2'); + }); +});