feat: complete release readiness work
- consolidate API ownership and remove dead vendor code - add Stripe billing, learning paths, and public CV hardening - add migration, recovery, security, audit, and browser gates
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import '@testing-library/jest-dom';
|
||||
import { render, screen, waitFor } from '@testing-library/react';
|
||||
import { act, render, screen, waitFor } from '@testing-library/react';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import { ToastProvider } from './toast';
|
||||
import { I18nProvider } from './i18n/I18nProvider';
|
||||
@@ -24,6 +24,10 @@ function renderCard() {
|
||||
);
|
||||
}
|
||||
|
||||
async function click(element: Element) {
|
||||
await act(async () => { userEvent.click(element); });
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
mockedApi.get.mockImplementation((url: string) => {
|
||||
@@ -48,16 +52,16 @@ test('shows not-enabled status and walks through the full enable flow to recover
|
||||
renderCard();
|
||||
expect(await screen.findByText('Not enabled')).toBeInTheDocument();
|
||||
|
||||
await userEvent.click(screen.getByRole('button', { name: 'Enable 2FA' }));
|
||||
await click(screen.getByRole('button', { name: 'Enable 2FA' }));
|
||||
await userEvent.type(await screen.findByLabelText('Current password'), 'hunter2');
|
||||
await userEvent.click(screen.getByRole('button', { name: 'Continue' }));
|
||||
await click(screen.getByRole('button', { name: 'Continue' }));
|
||||
|
||||
await waitFor(() => expect(mockedApi.post).toHaveBeenCalledWith('/auth/2fa/setup', { currentPassword: 'hunter2' }));
|
||||
expect(await screen.findByAltText('Scan this QR code')).toHaveAttribute('src', 'data:image/png;base64,abc');
|
||||
expect(screen.getByDisplayValue('ABCD1234')).toBeInTheDocument();
|
||||
|
||||
await userEvent.type(screen.getByLabelText('6-digit code'), '654321');
|
||||
await userEvent.click(screen.getByRole('button', { name: 'Confirm' }));
|
||||
await click(screen.getByRole('button', { name: 'Confirm' }));
|
||||
|
||||
await waitFor(() => expect(mockedApi.post).toHaveBeenCalledWith('/auth/2fa/verify-setup', { code: '654321' }));
|
||||
expect(await screen.findByText('Save your recovery codes')).toBeInTheDocument();
|
||||
@@ -67,9 +71,9 @@ test('shows not-enabled status and walks through the full enable flow to recover
|
||||
const doneButton = screen.getByRole('button', { name: 'Done' });
|
||||
expect(doneButton).toBeDisabled();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("I've saved my recovery codes"));
|
||||
await click(screen.getByLabelText("I've saved my recovery codes"));
|
||||
expect(doneButton).toBeEnabled();
|
||||
await userEvent.click(doneButton);
|
||||
await click(doneButton);
|
||||
|
||||
await waitFor(() => expect(screen.queryByText('Save your recovery codes')).not.toBeInTheDocument());
|
||||
});
|
||||
@@ -86,9 +90,9 @@ test('shows wrong-password error on disable and lets the user retry', async () =
|
||||
renderCard();
|
||||
expect(await screen.findByText(/enabled since/i)).toBeInTheDocument();
|
||||
|
||||
await userEvent.click(screen.getByRole('button', { name: 'Disable 2FA' }));
|
||||
await click(screen.getByRole('button', { name: 'Disable 2FA' }));
|
||||
await userEvent.type(await screen.findByLabelText('Current password'), 'wrong');
|
||||
await userEvent.click(screen.getByRole('button', { name: 'Continue' }));
|
||||
await click(screen.getByRole('button', { name: 'Continue' }));
|
||||
|
||||
expect(await screen.findByText('Incorrect password.')).toBeInTheDocument();
|
||||
expect(screen.getByLabelText('Current password')).toBeInTheDocument();
|
||||
|
||||
Reference in New Issue
Block a user