Files
ss-tools/frontend/tests/maintenance-api.test.ts

65 lines
3.0 KiB
TypeScript

// #region MaintenanceApiTests [C:2] [TYPE Module] [SEMANTICS test, api, maintenance, url, contract]
// @BRIEF Verify that API client functions construct correct URLs (no double `/api/` etc.)
import { describe, it, expect, vi, beforeEach } from 'vitest';
const { mockRequestApi } = vi.hoisted(() => ({ mockRequestApi: vi.fn() }));
vi.mock('$lib/api.js', () => ({ requestApi: mockRequestApi }));
import { startMaintenance, endMaintenance, endAllMaintenance, getSettings, updateSettings, listEvents, listDashboardBanners } from '$lib/api/maintenance.js';
describe('MaintenanceApi URL construction', () => {
beforeEach(() => vi.clearAllMocks());
it('startMaintenance → POST /maintenance/start', async () => {
mockRequestApi.mockResolvedValue({ task_id: 't-1', maintenance_id: 'm-1', status: 'pending' });
await startMaintenance({ tables: ['raw.sales'], start_time: '2026-05-21T22:00:00Z', end_time: '2026-05-22T02:00:00Z' });
expect(mockRequestApi).toHaveBeenCalledWith('/maintenance/start', 'POST', expect.any(Object));
});
it('startMaintenance → forwards environment_id in params', async () => {
mockRequestApi.mockResolvedValue({ task_id: 't-1', maintenance_id: 'm-1', status: 'pending' });
await startMaintenance({
environment_id: 'env-prod',
tables: ['raw.sales'],
start_time: '2026-05-21T22:00:00Z',
});
expect(mockRequestApi).toHaveBeenCalledWith(
'/maintenance/start',
'POST',
expect.objectContaining({ environment_id: 'env-prod' }),
);
});
it('startMaintenance → rejects without environment_id (backend returns 422)', async () => {
mockRequestApi.mockRejectedValue({ status: 422, message: 'Field required' });
await expect(startMaintenance({
tables: ['raw.sales'],
start_time: '2026-05-21T22:00:00Z',
})).rejects.toBeTruthy();
});
it('endMaintenance → POST /maintenance/{id}/end', async () => {
mockRequestApi.mockResolvedValue({ task_id: 't-1', status: 'pending' });
await endMaintenance('ev-abc');
expect(mockRequestApi).toHaveBeenCalledWith('/maintenance/ev-abc/end', 'POST');
});
it('endAllMaintenance → POST /maintenance/end-all', async () => {
mockRequestApi.mockResolvedValue({ task_id: 't-1', status: 'pending' });
await endAllMaintenance();
expect(mockRequestApi).toHaveBeenCalledWith('/maintenance/end-all', 'POST');
});
it('listEvents → GET /maintenance/events', async () => {
mockRequestApi.mockResolvedValue({ active: [], completed: [] });
await listEvents();
expect(mockRequestApi).toHaveBeenCalledWith('/maintenance/events', 'GET');
});
it('listDashboardBanners → GET /maintenance/dashboard-banners', async () => {
mockRequestApi.mockResolvedValue([]);
await listDashboardBanners();
expect(mockRequestApi).toHaveBeenCalledWith('/maintenance/dashboard-banners', 'GET');
});
});