Merge Request — Wave 0 quick wins + Tier-1/Tier-2 features #1
@@ -110,6 +110,20 @@ describe('end-to-end trust loop', () => {
|
|||||||
if (url === '/jobapplications/42') return Promise.resolve({ data: jobRecord } as any);
|
if (url === '/jobapplications/42') return Promise.resolve({ data: jobRecord } as any);
|
||||||
if (url === '/auth/me') return Promise.resolve({ data: { roles: [], profileCvText: 'Master CV text' } } as any);
|
if (url === '/auth/me') return Promise.resolve({ data: { roles: [], profileCvText: 'Master CV text' } } as any);
|
||||||
if (url === '/jobapplications/42/history') return Promise.resolve({ data: [] } as any);
|
if (url === '/jobapplications/42/history') return Promise.resolve({ data: [] } as any);
|
||||||
|
if (url === '/jobapplications/42/tailored-cv-draft') {
|
||||||
|
return Promise.resolve({
|
||||||
|
data: {
|
||||||
|
templateId: 'ats-minimal',
|
||||||
|
headline: 'Backend Developer',
|
||||||
|
summary: ['Tailored for the Acme backend role'],
|
||||||
|
selectedSkills: [],
|
||||||
|
experience: [],
|
||||||
|
education: [],
|
||||||
|
customSections: [],
|
||||||
|
status: 'saved',
|
||||||
|
},
|
||||||
|
} as any);
|
||||||
|
}
|
||||||
if (url === '/attachments/42') return Promise.resolve({ data: [{ id: 9, fileName: 'resume.pdf', uploadDate: new Date().toISOString(), fileType: 'application/pdf', fileSize: 1234, purpose: 'resume', useForAi: true }] } as any);
|
if (url === '/attachments/42') return Promise.resolve({ data: [{ id: 9, fileName: 'resume.pdf', uploadDate: new Date().toISOString(), fileType: 'application/pdf', fileSize: 1234, purpose: 'resume', useForAi: true }] } as any);
|
||||||
if (url === '/correspondence/42') return Promise.resolve({ data: correspondenceMessages } as any);
|
if (url === '/correspondence/42') return Promise.resolve({ data: correspondenceMessages } as any);
|
||||||
if (url === '/gmail/status') return Promise.resolve({ data: { connected: true, gmailAddress: 'user@example.test', lastSyncedAt: new Date().toISOString() } } as any);
|
if (url === '/gmail/status') return Promise.resolve({ data: { connected: true, gmailAddress: 'user@example.test', lastSyncedAt: new Date().toISOString() } } as any);
|
||||||
@@ -207,7 +221,7 @@ describe('end-to-end trust loop', () => {
|
|||||||
|
|
||||||
fireEvent.click(screen.getByRole('tab', { name: /tailored cv/i }));
|
fireEvent.click(screen.getByRole('tab', { name: /tailored cv/i }));
|
||||||
|
|
||||||
expect(await screen.findByDisplayValue('Saved CV')).toBeInTheDocument();
|
expect((await screen.findAllByDisplayValue(/tailored for the acme backend role/i)).length).toBeGreaterThan(0);
|
||||||
expect(await screen.findByDisplayValue('Saved cover letter')).toBeInTheDocument();
|
expect(await screen.findByDisplayValue('Saved cover letter')).toBeInTheDocument();
|
||||||
expect(await screen.findByDisplayValue('Saved application answer')).toBeInTheDocument();
|
expect(await screen.findByDisplayValue('Saved application answer')).toBeInTheDocument();
|
||||||
expect(await screen.findByDisplayValue('Saved recruiter message')).toBeInTheDocument();
|
expect(await screen.findByDisplayValue('Saved recruiter message')).toBeInTheDocument();
|
||||||
|
|||||||
@@ -1,4 +1,11 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { configure } from '@testing-library/react';
|
||||||
|
|
||||||
|
// Heavy MUI views (job table, workspace dialog, profile page) can exceed the
|
||||||
|
// 1s default async query timeout on slower machines; findBy*/waitFor assertions
|
||||||
|
// still resolve as soon as the element appears.
|
||||||
|
configure({ asyncUtilTimeout: 4000 });
|
||||||
|
jest.setTimeout(30000);
|
||||||
|
|
||||||
jest.mock('./api', () => ({
|
jest.mock('./api', () => ({
|
||||||
api: {
|
api: {
|
||||||
|
|||||||
Reference in New Issue
Block a user