From 70d858b65af4fcc3d11ce843ebe1dc3994b1a903 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sun, 22 Mar 2026 23:01:25 +0100 Subject: [PATCH] fix(tests): add missing user/canWrite/form props to admin spec fixtures After the layout load function started injecting user+canWrite into all page data, the admin spec files failed svelte-check with missing property errors. Add user:undefined, canWrite:true, and form:null to all fixture data objects. Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/routes/admin/page.svelte.spec.ts | 16 +++++++----- .../admin/users/[id]/page.svelte.spec.ts | 26 +++++++++---------- .../admin/users/new/page.svelte.spec.ts | 14 +++++----- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/frontend/src/routes/admin/page.svelte.spec.ts b/frontend/src/routes/admin/page.svelte.spec.ts index 12ca0f09..848fb1b4 100644 --- a/frontend/src/routes/admin/page.svelte.spec.ts +++ b/frontend/src/routes/admin/page.svelte.spec.ts @@ -27,6 +27,8 @@ const makeUser = (overrides = {}) => ({ }); const baseData = { + user: undefined, + canWrite: true, users: [makeUser()], groups: [makeGroup()], tags: [] @@ -38,35 +40,35 @@ afterEach(cleanup); describe('Admin page – users tab', () => { it('shows the username in the table', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByRole('cell', { name: 'max', exact: true })).toBeInTheDocument(); }); it('shows the full name in the table', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByText(/Max Mustermann/)).toBeInTheDocument(); }); it('shows a dash when user has no name set', async () => { const data = { ...baseData, users: [makeUser({ firstName: undefined, lastName: undefined })] }; - render(Page, { data }); + render(Page, { data, form: null }); await expect.element(page.getByText('–')).toBeInTheDocument(); }); it('shows group badges for the user', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByText('Editoren')).toBeInTheDocument(); }); it('edit link points to /admin/users/[id]', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect .element(page.getByRole('link', { name: /Bearbeiten/i })) .toHaveAttribute('href', '/admin/users/u1'); }); it('new user button links to /admin/users/new', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect .element(page.getByRole('link', { name: /Neuer Benutzer/i })) .toHaveAttribute('href', '/admin/users/new'); @@ -74,7 +76,7 @@ describe('Admin page – users tab', () => { it('shows "no groups" label when user has no groups', async () => { const data = { ...baseData, users: [makeUser({ groups: [] })] }; - render(Page, { data }); + render(Page, { data, form: null }); await expect.element(page.getByText(/Keine Gruppen/i)).toBeInTheDocument(); }); }); diff --git a/frontend/src/routes/admin/users/[id]/page.svelte.spec.ts b/frontend/src/routes/admin/users/[id]/page.svelte.spec.ts index 870b7610..2ff1b450 100644 --- a/frontend/src/routes/admin/users/[id]/page.svelte.spec.ts +++ b/frontend/src/routes/admin/users/[id]/page.svelte.spec.ts @@ -24,7 +24,7 @@ const makeUser = (overrides = {}) => ({ ...overrides }); -const baseData = { editUser: makeUser(), groups }; +const baseData = { user: undefined, canWrite: true, editUser: makeUser(), groups }; afterEach(cleanup); @@ -32,48 +32,48 @@ afterEach(cleanup); describe('Admin edit user page – rendering', () => { it('renders the heading with username', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByText(/Benutzer bearbeiten: max/i)).toBeInTheDocument(); }); it('pre-fills first name from editUser data', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); const input = document.querySelector('input[name="firstName"]'); expect(input?.value).toBe('Max'); }); it('pre-fills last name from editUser data', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); const input = document.querySelector('input[name="lastName"]'); expect(input?.value).toBe('Mustermann'); }); it('pre-fills email from editUser data', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); const input = document.querySelector('input[name="email"]'); expect(input?.value).toBe('max@example.com'); }); it('pre-fills birth date in German format (dd.mm.yyyy)', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); const input = document.querySelector('input[placeholder="TT.MM.JJJJ"]'); expect(input?.value).toBe('22.03.1985'); }); it('pre-fills contact field', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); const textarea = document.querySelector('textarea[name="contact"]'); expect(textarea?.value).toBe('Tel: 0123'); }); it('renders group checkboxes', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByText('Editoren')).toBeInTheDocument(); await expect.element(page.getByText('Admins')).toBeInTheDocument(); }); it('pre-selects the groups the user already belongs to', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); const checkbox = document.querySelector( 'input[type="checkbox"][name="groupIds"][value="g1"]' ); @@ -81,7 +81,7 @@ describe('Admin edit user page – rendering', () => { }); it('does not pre-select groups the user does not belong to', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); const checkbox = document.querySelector( 'input[type="checkbox"][name="groupIds"][value="g2"]' ); @@ -89,7 +89,7 @@ describe('Admin edit user page – rendering', () => { }); it('password fields are empty by default', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); const passwordInputs = document.querySelectorAll('input[type="password"]'); passwordInputs.forEach((input) => { expect(input.value).toBe(''); @@ -97,14 +97,14 @@ describe('Admin edit user page – rendering', () => { }); it('cancel link points to /admin', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect .element(page.getByRole('link', { name: /Abbrechen/i })) .toHaveAttribute('href', '/admin'); }); it('renders the save button', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByRole('button', { name: /Speichern/i })).toBeInTheDocument(); }); }); diff --git a/frontend/src/routes/admin/users/new/page.svelte.spec.ts b/frontend/src/routes/admin/users/new/page.svelte.spec.ts index ab48e816..372cf779 100644 --- a/frontend/src/routes/admin/users/new/page.svelte.spec.ts +++ b/frontend/src/routes/admin/users/new/page.svelte.spec.ts @@ -10,7 +10,7 @@ const groups = [ { id: 'g2', name: 'Admins', permissions: ['ADMIN'] } ]; -const baseData = { groups }; +const baseData = { user: undefined, canWrite: true, groups }; afterEach(cleanup); @@ -18,37 +18,37 @@ afterEach(cleanup); describe('Admin new user page – rendering', () => { it('renders the page heading', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByText(/Neuen Benutzer anlegen/i)).toBeInTheDocument(); }); it('renders the login input', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByRole('textbox', { name: /Login/i })).toBeInTheDocument(); }); it('renders group checkboxes for each available group', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByText('Editoren')).toBeInTheDocument(); await expect.element(page.getByText('Admins')).toBeInTheDocument(); }); it('cancel link points to /admin', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect .element(page.getByRole('link', { name: /Abbrechen/i })) .toHaveAttribute('href', '/admin'); }); it('back link points to /admin', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect .element(page.getByRole('link', { name: /Zurück/i })) .toHaveAttribute('href', '/admin'); }); it('renders the create button', async () => { - render(Page, { data: baseData }); + render(Page, { data: baseData, form: null }); await expect.element(page.getByRole('button', { name: /Erstellen/i })).toBeInTheDocument(); }); });