From 5bf25f094d2fb30b48fd624286af114cdce38d8c Mon Sep 17 00:00:00 2001 From: Niek Otten Date: Mon, 13 Jul 2026 14:32:30 +0200 Subject: [PATCH] test(portal-self-service): submit surfaces BFF failures instead of swallowing them (refs #68) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Failing test: when postSelfServiceRegistrations errors, the page should show an alert, not the confirmation, and keep the submit button available for retry. Currently submit() has no error handler, so the rejection is swallowed and the page silently stays put — exactly the failure mode that hid the missing-token bug behind a 90s e2e timeout. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../app/registration/registration-page.spec.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/self-service/src/app/registration/registration-page.spec.ts b/apps/self-service/src/app/registration/registration-page.spec.ts index 4c1a2b2..284f7da 100644 --- a/apps/self-service/src/app/registration/registration-page.spec.ts +++ b/apps/self-service/src/app/registration/registration-page.spec.ts @@ -1,6 +1,6 @@ import { signal } from '@angular/core'; import { fireEvent, render, screen } from '@testing-library/angular'; -import { of } from 'rxjs'; +import { of, throwError } from 'rxjs'; import { AuthService } from 'auth'; import { BffApiV1Service } from 'api-client'; import { axe } from 'vitest-axe'; @@ -43,6 +43,19 @@ describe('RegistrationPage', () => { expect(await screen.findByText(/ontvangen/i)).toBeTruthy(); }); + it('shows an error and keeps the submit available when the BFF call fails', async () => { + const { post, providers: p } = providers(vi.fn().mockReturnValue(throwError(() => new Error('BFF rejected')))); + await render(RegistrationPage, { providers: p }); + + fireEvent.click(screen.getByRole('button', { name: /indienen/i })); + + expect(post).toHaveBeenCalledTimes(1); + // The failure is surfaced (not swallowed), the confirmation is not shown, and the user can retry. + expect(await screen.findByRole('alert')).toBeTruthy(); + expect(screen.queryByText(/ontvangen/i)).toBeNull(); + expect(screen.getByRole('button', { name: /indienen/i })).toBeTruthy(); + }); + it('has no WCAG 2.1 AA violations on the submit page', async () => { // The portal is Dutch; the real index.html sets lang. Set it here so the document-level // html-has-lang rule reflects the app, not the bare jsdom document.