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 SettingsView from './components/SettingsView';
import { I18nProvider } from './i18n/I18nProvider';
import { ToastProvider } from './toast';
import { api } from './api';
jest.mock('./api', () => ({
api: {
get: jest.fn(),
post: jest.fn(),
put: jest.fn(),
patch: jest.fn(),
delete: jest.fn(),
interceptors: { request: { use: jest.fn() }, response: { use: jest.fn() } },
},
getApiErrorMessage: (error: any, fallback?: string) => fallback || 'Request failed.',
}));
jest.mock('./components/ImportExportJobs', () => () =>
Import Export Stub
);
jest.mock('./components/GoogleAuthCard', () => () => Google Auth Stub
);
jest.mock('./components/BackupCard', () => () => Backup Stub
);
jest.mock('./components/AuthStatusCard', () => () => Auth Status Stub
);
const mockedApi = api as jest.Mocked;
function renderView(onAccentColorChange = jest.fn()) {
return {
onAccentColorChange,
...render(
,
),
};
}
beforeEach(() => {
mockedApi.get.mockImplementation((url: string) => {
if (url === '/rules') {
return Promise.resolve({
data: {
id: 1,
appliedFollowUpDays: 14,
appliedGhostDays: 30,
offerFollowUpDays: 7,
offerGhostDays: 14,
feedbackFollowUpDays: 7,
feedbackGhostDays: 14,
},
} as any);
}
return Promise.resolve({ data: {} } as any);
});
window.localStorage.clear();
});
afterEach(() => {
jest.clearAllMocks();
});
test('settings view uses one follow-up section, one notification section, and staged accent apply', async () => {
const { onAccentColorChange } = renderView();
fireEvent.click(screen.getByRole('button', { name: /#15803D/i }));
const accentInput = (await screen.findAllByLabelText('Accent'))[1] as HTMLInputElement;
fireEvent.change(accentInput, { target: { value: '#2563eb' } });
expect(onAccentColorChange).not.toHaveBeenCalled();
fireEvent.click(screen.getByRole('button', { name: /^save$/i }));
expect(onAccentColorChange).toHaveBeenCalledWith('#2563eb');
fireEvent.click(screen.getByRole('tab', { name: /follow-ups/i }));
expect(await screen.findByText(/follow-up rules by scenario/i)).toBeInTheDocument();
expect(screen.queryAllByText(/open reminders/i)).toHaveLength(0);
fireEvent.click(screen.getByRole('tab', { name: /notifications/i }));
expect(screen.getByText(/notification settings/i)).toBeInTheDocument();
expect(screen.getAllByText(/check system status/i).length).toBe(1);
expect(screen.getByLabelText(/email reminders for follow-ups/i)).toBeInTheDocument();
expect(screen.getByLabelText(/email alerts for ghosted jobs/i)).toBeInTheDocument();
});