Polish settings and admin system pages

This commit is contained in:
2026-03-28 15:30:21 +01:00
parent 4103f84f85
commit 0694cba722
10 changed files with 604 additions and 217 deletions
+74 -3
View File
@@ -1,14 +1,26 @@
import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import AdminSystemPage from './pages/AdminSystemPage';
import { I18nProvider } from './i18n/I18nProvider';
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.',
}));
const mockedApi = api as jest.Mocked<typeof api>;
describe('AdminSystemPage', () => {
it('renders AI service health, latency, and OCR readiness', async () => {
beforeEach(() => {
mockedApi.get.mockImplementation((url: string) => {
if (url === '/admin/system') {
return Promise.resolve({
@@ -54,9 +66,45 @@ describe('AdminSystemPage', () => {
},
} as any);
}
if (url === '/admin/system/email-settings') {
return Promise.resolve({
data: {
enabled: true,
host: 'smtp.example.test',
port: 587,
user: 'mailer@example.test',
from: 'noreply@example.test',
fromName: 'Jobbjakt',
enableSsl: true,
timeoutMs: 15000,
usesOverrides: false,
hasPassword: true,
},
} as any);
}
return Promise.resolve({ data: {} } as any);
});
mockedApi.put.mockResolvedValue({
data: {
enabled: true,
host: 'smtp.changed.test',
port: 2525,
user: 'mailer@example.test',
from: 'noreply@example.test',
fromName: 'Jobbjakt',
enableSsl: true,
timeoutMs: 15000,
usesOverrides: true,
hasPassword: true,
},
} as any);
});
afterEach(() => {
jest.clearAllMocks();
});
it('renders AI service health, latency, and OCR readiness', async () => {
render(
<I18nProvider>
<AdminSystemPage />
@@ -64,7 +112,7 @@ describe('AdminSystemPage', () => {
);
await waitFor(() => {
expect(screen.getByText('AI service')).toBeTruthy();
expect(screen.getByText('Production')).toBeTruthy();
});
expect(screen.getByText(/25.8 ms probe/i)).toBeTruthy();
@@ -72,4 +120,27 @@ describe('AdminSystemPage', () => {
expect(screen.getByText('OCR avg latency')).toBeTruthy();
expect(screen.getByText('88.4 ms')).toBeTruthy();
});
it('loads and saves smtp settings from the settings tab', async () => {
render(
<I18nProvider>
<AdminSystemPage />
</I18nProvider>,
);
expect(await screen.findByText('AI service')).toBeTruthy();
fireEvent.click(screen.getByRole('tab', { name: /settings/i }));
const hostInput = await screen.findByLabelText(/host/i);
fireEvent.change(hostInput, { target: { value: 'smtp.changed.test' } });
fireEvent.change(screen.getByLabelText(/port/i), { target: { value: '2525' } });
fireEvent.click(screen.getByRole('button', { name: /save settings/i }));
await waitFor(() => {
expect(mockedApi.put).toHaveBeenCalledWith('/admin/system/email-settings', expect.objectContaining({
host: 'smtp.changed.test',
port: 2525,
}));
});
});
});