113 lines
4.0 KiB
TypeScript
113 lines
4.0 KiB
TypeScript
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
|
|
vi.mock('../../resources/js/api/client', () => ({
|
|
apiClient: {
|
|
get: vi.fn(),
|
|
post: vi.fn(),
|
|
patch: vi.fn(),
|
|
delete: vi.fn(),
|
|
},
|
|
ensureCsrfCookie: vi.fn(),
|
|
}));
|
|
|
|
import {
|
|
listReportJobs,
|
|
createReportJob,
|
|
retryReportJob,
|
|
cancelReportJob,
|
|
deleteReportJob,
|
|
} from '../../resources/js/api/reports';
|
|
import { apiClient, ensureCsrfCookie } from '../../resources/js/api/client';
|
|
|
|
const FAKE_JOB = {
|
|
id: 1,
|
|
type: 'deals_export' as const,
|
|
parameters: { format: 'csv' as const, date_from: '2026-05-01', date_to: '2026-05-12' },
|
|
status: 'pending' as const,
|
|
file_path: null,
|
|
file_size: null,
|
|
generation_seconds: null,
|
|
error_message: null,
|
|
created_at: '2026-05-12T20:00:00Z',
|
|
finished_at: null,
|
|
expires_at: null,
|
|
is_expired: false,
|
|
download_url: null,
|
|
retry_count: 0,
|
|
retry_max: 3,
|
|
};
|
|
|
|
describe('api/reports', () => {
|
|
beforeEach(() => vi.clearAllMocks());
|
|
|
|
it('listReportJobs() без params → все undefined', async () => {
|
|
vi.mocked(apiClient.get).mockResolvedValue({
|
|
data: {
|
|
jobs: [],
|
|
total: 0,
|
|
limit: 50,
|
|
offset: 0,
|
|
counts: { pending: 0, processing: 0, done: 0, failed: 0 },
|
|
quota: { active: 0, max_active: 5 },
|
|
},
|
|
});
|
|
await listReportJobs();
|
|
expect(apiClient.get).toHaveBeenCalledWith('/api/reports/jobs', {
|
|
params: { status: undefined, limit: undefined, offset: undefined },
|
|
});
|
|
});
|
|
|
|
it('listReportJobs({status, limit, offset}) → passes params', async () => {
|
|
vi.mocked(apiClient.get).mockResolvedValue({
|
|
data: {
|
|
jobs: [FAKE_JOB],
|
|
total: 1,
|
|
limit: 25,
|
|
offset: 0,
|
|
counts: { pending: 1, processing: 0, done: 0, failed: 0 },
|
|
quota: { active: 1, max_active: 5 },
|
|
},
|
|
});
|
|
const r = await listReportJobs({ status: 'pending', limit: 25, offset: 0 });
|
|
expect(apiClient.get).toHaveBeenCalledWith('/api/reports/jobs', {
|
|
params: { status: 'pending', limit: 25, offset: 0 },
|
|
});
|
|
expect(r.jobs).toHaveLength(1);
|
|
});
|
|
|
|
it('createReportJob() POSTs /api/reports/jobs + unwraps data.job', async () => {
|
|
vi.mocked(apiClient.post).mockResolvedValue({ data: { job: FAKE_JOB } });
|
|
const payload = {
|
|
type: 'deals_export' as const,
|
|
format: 'csv' as const,
|
|
parameters: { date_from: '2026-05-01', date_to: '2026-05-12', project_id: 7 },
|
|
};
|
|
const r = await createReportJob(payload);
|
|
expect(ensureCsrfCookie).toHaveBeenCalledOnce();
|
|
expect(apiClient.post).toHaveBeenCalledWith('/api/reports/jobs', payload);
|
|
expect(r.id).toBe(1);
|
|
});
|
|
|
|
it('retryReportJob() POSTs /api/reports/jobs/{id}/retry', async () => {
|
|
vi.mocked(apiClient.post).mockResolvedValue({ data: { job: { ...FAKE_JOB, retry_count: 1 } } });
|
|
const r = await retryReportJob(42);
|
|
expect(ensureCsrfCookie).toHaveBeenCalledOnce();
|
|
expect(apiClient.post).toHaveBeenCalledWith('/api/reports/jobs/42/retry');
|
|
expect(r.retry_count).toBe(1);
|
|
});
|
|
|
|
it('cancelReportJob() POSTs /api/reports/jobs/{id}/cancel', async () => {
|
|
vi.mocked(apiClient.post).mockResolvedValue({ data: { job: { ...FAKE_JOB, status: 'failed' as const } } });
|
|
await cancelReportJob(42);
|
|
expect(ensureCsrfCookie).toHaveBeenCalledOnce();
|
|
expect(apiClient.post).toHaveBeenCalledWith('/api/reports/jobs/42/cancel');
|
|
});
|
|
|
|
it('deleteReportJob() DELETE /api/reports/jobs/{id}', async () => {
|
|
vi.mocked(apiClient.delete).mockResolvedValue({ data: undefined });
|
|
await deleteReportJob(7);
|
|
expect(ensureCsrfCookie).toHaveBeenCalledOnce();
|
|
expect(apiClient.delete).toHaveBeenCalledWith('/api/reports/jobs/7');
|
|
});
|
|
});
|