From c818ad777674ea05e269a80358f491a9bb997d30 Mon Sep 17 00:00:00 2001 From: cesnimda Date: Sun, 22 Mar 2026 23:08:56 +0100 Subject: [PATCH] test: stabilize generated draft workflow coverage --- .../src/job-details-generated-drafts.test.tsx | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/job-tracker-ui/src/job-details-generated-drafts.test.tsx b/job-tracker-ui/src/job-details-generated-drafts.test.tsx index 3b796f2..ce1b615 100644 --- a/job-tracker-ui/src/job-details-generated-drafts.test.tsx +++ b/job-tracker-ui/src/job-details-generated-drafts.test.tsx @@ -7,6 +7,8 @@ import { ToastProvider } from './toast'; import JobDetailsDialog from './components/JobDetailsDialog'; import { api } from './api'; +jest.setTimeout(15000); + jest.mock('./api', () => ({ api: { get: jest.fn(), @@ -33,6 +35,12 @@ function renderDialog() { } beforeEach(() => { + Object.assign(navigator, { + clipboard: { + writeText: jest.fn().mockResolvedValue(undefined), + }, + }); + mockedApi.get.mockImplementation((url: string) => { if (url === '/jobapplications/42') { return Promise.resolve({ data: { id: 42, jobTitle: 'Backend Developer', status: 'Applied', dateApplied: new Date().toISOString(), daysSince: 3, company: { name: 'Acme', recruiterEmail: 'recruiter@acme.test' }, tailoredCvText: '', shortSummary: 'summary' } } as any); @@ -49,20 +57,26 @@ beforeEach(() => { mockedApi.put.mockResolvedValue({ data: {} } as any); }); +afterEach(() => { + jest.clearAllMocks(); +}); + test('generated application package can be edited and saved', async () => { renderDialog(); fireEvent.click(await screen.findByRole('tab', { name: /tailored cv/i })); - fireEvent.click(await screen.findByRole('button', { name: /generate application package/i })); + expect(await screen.findByRole('button', { name: /generate application package/i })).toBeInTheDocument(); + + fireEvent.click(screen.getByRole('button', { name: /generate application package/i })); expect(await screen.findByDisplayValue('Generated CV')).toBeInTheDocument(); const coverLetter = await screen.findByDisplayValue('Draft letter'); fireEvent.change(coverLetter, { target: { value: 'Edited cover letter' } }); - const saveButtons = screen.getAllByRole('button', { name: /^save$/i }); + const saveButtons = await screen.findAllByRole('button', { name: /^save$/i }); fireEvent.click(saveButtons[0]); await waitFor(() => { - expect(mockedApi.put).toHaveBeenCalled(); + expect(mockedApi.put).toHaveBeenCalledWith('/jobapplications/42/application-drafts', { coverLetterText: 'Edited cover letter' }); }); });