test(admin/users): cover the user-edit page branches
Heading with email, three card sections (profile/groups/password), success vs error form banners, group preselection from editUser.groups, cancel link, delete button. Mocks the confirm service. 7 tests, ~25 branches. Refs #496. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
87
frontend/src/routes/admin/users/[id]/page.svelte.test.ts
Normal file
87
frontend/src/routes/admin/users/[id]/page.svelte.test.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import { describe, it, expect, vi, afterEach } from 'vitest';
|
||||
import { cleanup, render } from 'vitest-browser-svelte';
|
||||
import { page } from 'vitest/browser';
|
||||
|
||||
vi.mock('$lib/shared/services/confirm.svelte', () => ({
|
||||
getConfirmService: () => ({ confirm: async () => false })
|
||||
}));
|
||||
vi.mock('$lib/shared/services/confirm.svelte.js', () => ({
|
||||
getConfirmService: () => ({ confirm: async () => false })
|
||||
}));
|
||||
|
||||
const { default: AdminUserEditPage } = await import('./+page.svelte');
|
||||
|
||||
afterEach(cleanup);
|
||||
|
||||
const baseEditUser = {
|
||||
id: 'u1',
|
||||
firstName: 'Anna',
|
||||
lastName: 'Schmidt',
|
||||
email: 'anna@example.com',
|
||||
birthDate: '',
|
||||
contact: '',
|
||||
groups: [{ id: 'g1' }, { id: 'g2' }]
|
||||
};
|
||||
|
||||
const baseData = (overrides: Record<string, unknown> = {}) => ({
|
||||
editUser: baseEditUser,
|
||||
groups: [
|
||||
{ id: 'g1', name: 'Familie' },
|
||||
{ id: 'g2', name: 'Admins' },
|
||||
{ id: 'g3', name: 'Gäste' }
|
||||
],
|
||||
...overrides
|
||||
});
|
||||
|
||||
describe('admin/users/[id] page', () => {
|
||||
it('renders the edit heading with the user email', async () => {
|
||||
render(AdminUserEditPage, { props: { data: baseData(), form: undefined } });
|
||||
|
||||
await expect.element(page.getByRole('heading', { name: /anna@example/i })).toBeVisible();
|
||||
});
|
||||
|
||||
it('renders all three card sections', async () => {
|
||||
render(AdminUserEditPage, { props: { data: baseData(), form: undefined } });
|
||||
|
||||
await expect.element(page.getByRole('heading', { name: /persönliche daten/i })).toBeVisible();
|
||||
await expect.element(page.getByRole('heading', { name: /^gruppen$/i })).toBeVisible();
|
||||
await expect.element(page.getByRole('heading', { name: /neues passwort/i })).toBeVisible();
|
||||
});
|
||||
|
||||
it('shows the update success banner when form.success is true', async () => {
|
||||
render(AdminUserEditPage, { props: { data: baseData(), form: { success: true } } });
|
||||
|
||||
await expect.element(page.getByText('Änderungen gespeichert.')).toBeVisible();
|
||||
});
|
||||
|
||||
it('shows the update error banner when form.error is set', async () => {
|
||||
render(AdminUserEditPage, {
|
||||
props: { data: baseData(), form: { error: 'E-Mail bereits vergeben' } }
|
||||
});
|
||||
|
||||
await expect.element(page.getByText('E-Mail bereits vergeben')).toBeVisible();
|
||||
});
|
||||
|
||||
it('preselects the user groups in UserGroupsSection', async () => {
|
||||
render(AdminUserEditPage, { props: { data: baseData(), form: undefined } });
|
||||
|
||||
const checkboxes = Array.from(
|
||||
document.querySelectorAll('input[name="groupIds"]')
|
||||
) as HTMLInputElement[];
|
||||
const checked = checkboxes.filter((c) => c.checked).map((c) => c.value);
|
||||
expect(checked.sort()).toEqual(['g1', 'g2']);
|
||||
});
|
||||
|
||||
it('renders cancel link to /admin/users', async () => {
|
||||
render(AdminUserEditPage, { props: { data: baseData(), form: undefined } });
|
||||
|
||||
const cancel = document.querySelector('a[href="/admin/users"]');
|
||||
expect(cancel).not.toBeNull();
|
||||
});
|
||||
|
||||
it('renders the delete button', async () => {
|
||||
render(AdminUserEditPage, { props: { data: baseData(), form: undefined } });
|
||||
|
||||
await expect.element(page.getByRole('button', { name: /löschen/i })).toBeVisible();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user