feat(email): consolidate correspondence routes
CI and Deploy / test (pull_request) Failing after 1m35s
CI and Deploy / deploy (pull_request) Has been skipped

This commit is contained in:
cesnimda
2026-08-09 21:19:27 +02:00
parent efacc3a06b
commit 6008b4afef
4 changed files with 59 additions and 22 deletions
@@ -1,7 +1,7 @@
import React from 'react';
import '@testing-library/jest-dom';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import { MemoryRouter, Navigate, Route, Routes } from 'react-router-dom';
import { ToastProvider } from './toast';
import { I18nProvider } from './i18n/I18nProvider';
import CorrespondenceInboxPage from './views/CorrespondenceInboxPage';
@@ -35,8 +35,8 @@ function renderPage() {
describe('CorrespondenceInboxPage', () => {
beforeEach(() => {
mockedApi.get.mockResolvedValue({
data: [
mockedApi.get.mockImplementation((url: string) => {
if (url === '/correspondence') return Promise.resolve({ data: [
{
id: 1,
jobApplicationId: 42,
@@ -54,8 +54,13 @@ describe('CorrespondenceInboxPage', () => {
labelCount: 2,
attachmentCount: 1,
},
],
} as any);
] } as any);
if (url === '/gmail/review-candidates') return Promise.resolve({ data: {
queries: [], candidateThreadCount: 0, autoLinkThreadCount: 0, reviewThreadCount: 0, unmatchedThreadCount: 0, threads: [],
} } as any);
if (url === '/gmail/suggested-jobs') return Promise.resolve({ data: { count: 0, items: [] } } as any);
return Promise.resolve({ data: {} } as any);
});
});
afterEach(() => {
@@ -65,7 +70,7 @@ describe('CorrespondenceInboxPage', () => {
test('renders correspondence inbox items and reloads with filters', async () => {
renderPage();
expect(await screen.findByText(/correspondence inbox/i)).toBeInTheDocument();
expect(await screen.findByRole('heading', { name: /job email/i })).toBeInTheDocument();
expect(await screen.findByText(/1 items/i)).toBeInTheDocument();
expect(await screen.findByText(/acme systems/i)).toBeInTheDocument();
expect(await screen.findByText(/backend engineer/i)).toBeInTheDocument();
@@ -85,4 +90,31 @@ describe('CorrespondenceInboxPage', () => {
}));
});
});
test('uses one hub for linked messages and recruitment suggestions', async () => {
renderPage();
fireEvent.click(await screen.findByRole('button', { name: /review suggestions/i }));
expect(await screen.findByRole('heading', { name: /recruitment message review/i })).toBeInTheDocument();
expect(mockedApi.get).toHaveBeenCalledWith('/gmail/review-candidates');
expect(screen.getByRole('button', { name: /linked messages/i })).toBeInTheDocument();
});
test('legacy Gmail review route redirects into the consolidated hub filter', async () => {
render(
<ToastProvider>
<I18nProvider>
<MemoryRouter initialEntries={['/correspondence/review']} future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>
<Routes>
<Route path="/correspondence/review" element={<Navigate to="/correspondence?view=review" replace />} />
<Route path="/correspondence" element={<CorrespondenceInboxPage />} />
</Routes>
</MemoryRouter>
</I18nProvider>
</ToastProvider>,
);
expect(await screen.findByRole('heading', { name: /recruitment message review/i })).toBeInTheDocument();
expect(mockedApi.get).not.toHaveBeenCalledWith('/correspondence', expect.anything());
});
});