import { signal } from '@angular/core'; import { fireEvent, render, screen } from '@testing-library/angular'; import { of, throwError } from 'rxjs'; import { BeheerDefaultFill, BffApiV1Service } from 'api-client'; import { AuthService } from 'auth'; import { axe } from 'vitest-axe'; import { DefaultFillPage } from './default-fill-page'; const current: BeheerDefaultFill = { bronorganisatie: '517439943', verantwoordelijkeOrganisatie: '517439943', vertrouwelijkheidaanduiding: 'openbaar', }; class FakeAuth extends AuthService { readonly isAuthenticated = signal(true); readonly bsn = signal(undefined); override readonly roles = signal(['beheerder']); login(): void { /* not exercised */ } logout(): void { /* not exercised */ } } function setup( overrides: { getBeheerDefaultFill?: ReturnType; putBeheerDefaultFill?: ReturnType; } = {}, ) { const getBeheerDefaultFill = overrides.getBeheerDefaultFill ?? vi.fn().mockReturnValue(of(current)); const putBeheerDefaultFill = overrides.putBeheerDefaultFill ?? vi.fn().mockReturnValue(of(undefined)); return { getBeheerDefaultFill, putBeheerDefaultFill, providers: [ { provide: BffApiV1Service, useValue: { getBeheerDefaultFill, putBeheerDefaultFill } }, { provide: AuthService, useClass: FakeAuth }, ], }; } describe('DefaultFillPage', () => { it('loads the current default-fill into the form on open', async () => { const { getBeheerDefaultFill, providers } = setup(); await render(DefaultFillPage, { providers }); expect(getBeheerDefaultFill).toHaveBeenCalled(); const bron = (await screen.findByLabelText('Bronorganisatie')) as HTMLInputElement; expect(bron.value).toBe('517439943'); }); it('saves the edited values via the BFF', async () => { const { putBeheerDefaultFill, providers } = setup(); await render(DefaultFillPage, { providers }); const bron = (await screen.findByLabelText('Bronorganisatie')) as HTMLInputElement; fireEvent.input(bron, { target: { value: '999999999' } }); fireEvent.click(screen.getByRole('button', { name: /opslaan/i })); expect(putBeheerDefaultFill).toHaveBeenCalledWith( expect.objectContaining({ bronorganisatie: '999999999', vertrouwelijkheidaanduiding: 'openbaar' }), ); expect(await screen.findByText(/standaardwaarden zijn opgeslagen/i)).toBeTruthy(); }); it('surfaces a save failure instead of swallowing it', async () => { const { providers } = setup({ putBeheerDefaultFill: vi.fn().mockReturnValue(throwError(() => new Error('403'))), }); await render(DefaultFillPage, { providers }); fireEvent.click(await screen.findByRole('button', { name: /opslaan/i })); expect(await screen.findByText(/opslaan is niet gelukt/i)).toBeTruthy(); }); it('has no WCAG 2.1 AA violations', async () => { document.documentElement.lang = 'nl'; const { container } = await render(DefaultFillPage, { providers: setup().providers }); const results = await axe(container, { runOnly: { type: 'tag', values: ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'] }, }); expect(results.violations).toEqual([]); }); });