fix(12): satisfy CI fast-checks — lint unused vars, typed contract-test body, prettier
CI / changes (pull_request) Successful in 3s
CI / fast-checks (pull_request) Successful in 2m16s
CI / api (pull_request) Failing after 1m37s
CI / harness (pull_request) Failing after 1h3m45s
CI / security (pull_request) Failing after 11s
CI / gate (pull_request) Failing after 1s
CI / changes (pull_request) Successful in 3s
CI / fast-checks (pull_request) Successful in 2m16s
CI / api (pull_request) Failing after 1m37s
CI / harness (pull_request) Failing after 1h3m45s
CI / security (pull_request) Failing after 11s
CI / gate (pull_request) Failing after 1s
- Remove unused 'res'/'container' assignments (no-unused-vars) - setupClient.contract.test.ts: typed parseSentBody helper + non-async json mock (no-unsafe-*/require-await) - Prettier format 7 setup files Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
f485b38324
commit
a193bc8236
@@ -51,7 +51,10 @@ function makeQueryClient() {
|
||||
});
|
||||
}
|
||||
|
||||
function renderSetupPage(queryClient: QueryClient, props: React.ComponentProps<typeof SetupPage> = {}) {
|
||||
function renderSetupPage(
|
||||
queryClient: QueryClient,
|
||||
props: React.ComponentProps<typeof SetupPage> = {},
|
||||
) {
|
||||
return render(
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<MemoryRouter>
|
||||
@@ -149,7 +152,7 @@ describe('SetupPage — Welcome step', () => {
|
||||
});
|
||||
|
||||
it('has aria-live region for validation status', async () => {
|
||||
const { container } = renderSetupPage(queryClient);
|
||||
renderSetupPage(queryClient);
|
||||
// The step 2 config form has aria-live; step 1 welcome step does not yet show validation
|
||||
// but the structure has it via the general error block. We advance to step 2 to test.
|
||||
// For now we verify that once rendered, the component tree has the correct aria-live
|
||||
@@ -239,15 +242,20 @@ describe('SetupPage — Step 2 VAPID validation (CR-01 gap)', () => {
|
||||
const { postSetupConfig } = await import('../api/client.js');
|
||||
(postSetupConfig as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
|
||||
fireEvent.change(screen.getByLabelText('App URL'), { target: { value: 'https://app.example.com' } });
|
||||
fireEvent.change(screen.getByLabelText('OIDC issuer URL'), { target: { value: 'https://auth.example.com' } });
|
||||
fireEvent.change(screen.getByLabelText('App URL'), {
|
||||
target: { value: 'https://app.example.com' },
|
||||
});
|
||||
fireEvent.change(screen.getByLabelText('OIDC issuer URL'), {
|
||||
target: { value: 'https://auth.example.com' },
|
||||
});
|
||||
fireEvent.change(screen.getByLabelText('OIDC client ID'), { target: { value: 'familysync' } });
|
||||
fireEvent.change(screen.getByLabelText('VAPID public key'), { target: { value: 'BHtest123' } });
|
||||
fireEvent.click(screen.getByRole('button', { name: 'Save & Validate' }));
|
||||
}
|
||||
|
||||
it('calls validateSetupVapid after DB and OIDC pass in step 2', async () => {
|
||||
const { validateSetupDb, validateSetupOidc, validateSetupVapid } = await import('../api/client.js');
|
||||
const { validateSetupDb, validateSetupOidc, validateSetupVapid } =
|
||||
await import('../api/client.js');
|
||||
(validateSetupDb as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
(validateSetupOidc as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
(validateSetupVapid as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
@@ -261,7 +269,8 @@ describe('SetupPage — Step 2 VAPID validation (CR-01 gap)', () => {
|
||||
});
|
||||
|
||||
it('renders a VAPID validation row after step 2 validation completes', async () => {
|
||||
const { validateSetupDb, validateSetupOidc, validateSetupVapid } = await import('../api/client.js');
|
||||
const { validateSetupDb, validateSetupOidc, validateSetupVapid } =
|
||||
await import('../api/client.js');
|
||||
(validateSetupDb as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
(validateSetupOidc as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
(validateSetupVapid as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
@@ -276,11 +285,14 @@ describe('SetupPage — Step 2 VAPID validation (CR-01 gap)', () => {
|
||||
});
|
||||
|
||||
it('does NOT show Continue when VAPID validation fails', async () => {
|
||||
const { validateSetupDb, validateSetupOidc, validateSetupVapid } = await import('../api/client.js');
|
||||
const { validateSetupDb, validateSetupOidc, validateSetupVapid } =
|
||||
await import('../api/client.js');
|
||||
(validateSetupDb as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
(validateSetupOidc as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
(validateSetupVapid as ReturnType<typeof vi.fn>).mockRejectedValue(
|
||||
new Error('VAPID validation failed. Check that your VAPID keys were generated with `npm run generate-secrets`.')
|
||||
new Error(
|
||||
'VAPID validation failed. Check that your VAPID keys were generated with `npm run generate-secrets`.',
|
||||
),
|
||||
);
|
||||
|
||||
await advanceToStep2();
|
||||
@@ -296,7 +308,8 @@ describe('SetupPage — Step 2 VAPID validation (CR-01 gap)', () => {
|
||||
});
|
||||
|
||||
it('shows Continue only when db, oidc, AND vapid all pass', async () => {
|
||||
const { validateSetupDb, validateSetupOidc, validateSetupVapid } = await import('../api/client.js');
|
||||
const { validateSetupDb, validateSetupOidc, validateSetupVapid } =
|
||||
await import('../api/client.js');
|
||||
(validateSetupDb as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
(validateSetupOidc as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
(validateSetupVapid as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
@@ -360,8 +373,12 @@ describe('SetupPage — Step 2 Instance copy + DB-name field (gaps 1, 3)', () =>
|
||||
(validateSetupVapid as ReturnType<typeof vi.fn>).mockResolvedValue(undefined);
|
||||
|
||||
await advanceToStep2();
|
||||
fireEvent.change(screen.getByLabelText('App URL'), { target: { value: 'https://app.example.com' } });
|
||||
fireEvent.change(screen.getByLabelText('OIDC issuer URL'), { target: { value: 'https://auth.example.com' } });
|
||||
fireEvent.change(screen.getByLabelText('App URL'), {
|
||||
target: { value: 'https://app.example.com' },
|
||||
});
|
||||
fireEvent.change(screen.getByLabelText('OIDC issuer URL'), {
|
||||
target: { value: 'https://auth.example.com' },
|
||||
});
|
||||
fireEvent.change(screen.getByLabelText('OIDC client ID'), { target: { value: 'familysync' } });
|
||||
fireEvent.change(screen.getByLabelText('VAPID public key'), { target: { value: 'BHtest123' } });
|
||||
fireEvent.click(screen.getByRole('button', { name: 'Save & Validate' }));
|
||||
@@ -403,8 +420,12 @@ describe('SetupPage — Back navigation preserves Instance fields (gap 4)', () =
|
||||
fireEvent.click(await screen.findByRole('button', { name: 'Continue' }));
|
||||
await screen.findByText('Instance Configuration');
|
||||
|
||||
fireEvent.change(screen.getByLabelText('App URL'), { target: { value: 'https://app.example.com' } });
|
||||
fireEvent.change(screen.getByLabelText('OIDC issuer URL'), { target: { value: 'https://auth.example.com' } });
|
||||
fireEvent.change(screen.getByLabelText('App URL'), {
|
||||
target: { value: 'https://app.example.com' },
|
||||
});
|
||||
fireEvent.change(screen.getByLabelText('OIDC issuer URL'), {
|
||||
target: { value: 'https://auth.example.com' },
|
||||
});
|
||||
fireEvent.change(screen.getByLabelText('OIDC client ID'), { target: { value: 'familysync' } });
|
||||
fireEvent.change(screen.getByLabelText('VAPID public key'), { target: { value: 'BHtest123' } });
|
||||
fireEvent.click(screen.getByRole('button', { name: 'Save & Validate' }));
|
||||
|
||||
Reference in New Issue
Block a user