test(frontend): raise overall statement coverage to 30.42% for Phase 1 MVP

This commit is contained in:
2026-06-13 22:33:11 +07:00
parent 190b9a3af5
commit 9c5df0abdb
37 changed files with 6128 additions and 24 deletions
@@ -0,0 +1,118 @@
// File: frontend/lib/services/__tests__/document-numbering.service.test.ts
// Change Log:
// - 2026-06-13: Refactor to use static imports instead of require, fixing ESM module resolution errors
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { documentNumberingService } from '../document-numbering.service';
import apiClient from '@/lib/api/client';
// Mock apiClient
vi.mock('@/lib/api/client', () => ({
default: {
get: vi.fn(),
post: vi.fn(),
},
}));
describe('documentNumberingService', () => {
beforeEach(() => {
vi.clearAllMocks();
});
describe('Admin Dashboard Metrics', () => {
it('should get metrics', async () => {
const mockMetrics = {
totalNumbers: 100,
activeReservations: 5,
recentActivity: [],
};
(apiClient.get as any).mockResolvedValue({ data: mockMetrics });
const result = await documentNumberingService.getMetrics();
expect(result).toEqual(mockMetrics);
expect(apiClient.get).toHaveBeenCalledWith('/admin/document-numbering/metrics');
});
});
describe('Admin Tools', () => {
it('should perform manual override', async () => {
const mockDto = {
documentNumber: 'DOC-001',
newSequence: 100,
reason: 'Manual override',
};
(apiClient.post as any).mockResolvedValue({ data: { success: true } });
await documentNumberingService.manualOverride(mockDto);
expect(apiClient.post).toHaveBeenCalledWith(
'/admin/document-numbering/manual-override',
mockDto
);
});
it('should void and replace number', async () => {
const mockDto = {
documentNumber: 'DOC-001',
reason: 'Void',
replace: true,
};
const mockResponse = { documentNumber: 'DOC-002' };
(apiClient.post as any).mockResolvedValue({ data: mockResponse });
const result = await documentNumberingService.voidAndReplace(mockDto);
expect(result).toEqual(mockResponse);
expect(apiClient.post).toHaveBeenCalledWith(
'/admin/document-numbering/void-and-replace',
mockDto
);
});
it('should cancel number', async () => {
const mockDto = {
documentNumber: 'DOC-001',
reason: 'Cancel',
projectId: 1,
};
(apiClient.post as any).mockResolvedValue({ data: { success: true } });
await documentNumberingService.cancelNumber(mockDto);
expect(apiClient.post).toHaveBeenCalledWith(
'/admin/document-numbering/cancel',
mockDto
);
});
it('should bulk import with FormData', async () => {
const mockFormData = new FormData();
mockFormData.append('file', new Blob(['test']), 'test.csv');
const mockResponse = { imported: 10, errors: [] };
(apiClient.post as any).mockResolvedValue({ data: mockResponse });
const result = await documentNumberingService.bulkImport(mockFormData);
expect(result).toEqual(mockResponse);
expect(apiClient.post).toHaveBeenCalledWith(
'/admin/document-numbering/bulk-import',
mockFormData,
{ headers: { 'Content-Type': 'multipart/form-data' } }
);
});
it('should bulk import with array data', async () => {
const mockData = [
{ documentNumber: 'DOC-001', projectId: 1, sequenceNumber: 1 },
{ documentNumber: 'DOC-002', projectId: 1, sequenceNumber: 2 },
];
const mockResponse = { imported: 2, errors: [] };
(apiClient.post as any).mockResolvedValue({ data: mockResponse });
const result = await documentNumberingService.bulkImport(mockData);
expect(result).toEqual(mockResponse);
expect(apiClient.post).toHaveBeenCalledWith(
'/admin/document-numbering/bulk-import',
mockData,
{}
);
});
});
describe('Audit Logs', () => {
it('should get audit logs (currently returns empty)', async () => {
const result = await documentNumberingService.getAuditLogs();
expect(result).toEqual([]);
});
});
});