feat(ai): add ADR-036 unified OCR architecture and frontend test coverage
- Add ADR-036 unified OCR architecture (typhoon-ocr via Ollama) - Extend AI execution profiles for OCR sandbox configuration - Add comprehensive frontend test coverage (components, hooks, services) - Add backend test coverage for document-numbering services - Update OCR sidecar with typhoon-ocr integration - Add AI policy service and execution profile management - Update AGENTS.md and architecture documentation
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
// File: frontend/lib/services/__tests__/contract.service.test.ts
|
||||
// Change Log:
|
||||
// - 2026-06-13: Initial creation - test coverage for contractService
|
||||
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import apiClient from '@/lib/api/client';
|
||||
import { contractService } from '../contract.service';
|
||||
|
||||
describe('contractService', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
describe('getAll', () => {
|
||||
it('ควรดึงข้อมูลสัญญาและประมวลผลรูปแบบอาร์เรย์ได้อย่างถูกต้อง', async () => {
|
||||
const mockContracts = [
|
||||
{
|
||||
publicId: '019505a1-7c3e-7000-8000-contract111',
|
||||
contractName: 'Contract Alpha',
|
||||
project: {
|
||||
publicId: '019505a1-7c3e-7000-8000-project111',
|
||||
projectName: 'Project Alpha',
|
||||
},
|
||||
},
|
||||
];
|
||||
vi.mocked(apiClient.get).mockResolvedValue({ data: mockContracts });
|
||||
const result = await contractService.getAll();
|
||||
expect(apiClient.get).toHaveBeenCalledWith('/contracts', { params: undefined });
|
||||
expect(result).toEqual(mockContracts);
|
||||
});
|
||||
|
||||
it('ควรดึงข้อมูลและประมวลผลรูปแบบ nested data ได้อย่างถูกต้อง', async () => {
|
||||
const mockContracts = [
|
||||
{
|
||||
publicId: '019505a1-7c3e-7000-8000-contract111',
|
||||
contractName: 'Contract Alpha',
|
||||
project: {
|
||||
publicId: '019505a1-7c3e-7000-8000-project111',
|
||||
projectName: 'Project Alpha',
|
||||
},
|
||||
},
|
||||
];
|
||||
vi.mocked(apiClient.get).mockResolvedValue({ data: { data: mockContracts } });
|
||||
const result = await contractService.getAll({ projectId: 1 });
|
||||
expect(apiClient.get).toHaveBeenCalledWith('/contracts', { params: { projectId: 1 } });
|
||||
expect(result).toEqual(mockContracts);
|
||||
});
|
||||
|
||||
it('ควรส่งกลับอาร์เรย์ว่างหากข้อมูลที่ได้รับไม่ใช่รูปแบบอาร์เรย์', async () => {
|
||||
vi.mocked(apiClient.get).mockResolvedValue({ data: null });
|
||||
const result = await contractService.getAll();
|
||||
expect(result).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getByUuid', () => {
|
||||
it('ควรดึงรายละเอียดสัญญาตาม UUID สำเร็จ', async () => {
|
||||
const mockContract = {
|
||||
publicId: '019505a1-7c3e-7000-8000-contract111',
|
||||
contractName: 'Contract Alpha',
|
||||
};
|
||||
vi.mocked(apiClient.get).mockResolvedValue({ data: mockContract });
|
||||
const result = await contractService.getByUuid('019505a1-7c3e-7000-8000-contract111');
|
||||
expect(apiClient.get).toHaveBeenCalledWith('/contracts/019505a1-7c3e-7000-8000-contract111');
|
||||
expect(result).toEqual(mockContract);
|
||||
});
|
||||
});
|
||||
|
||||
describe('create', () => {
|
||||
it('ควรส่งคำขอ POST เพื่อสร้างสัญญาใหม่สำเร็จ', async () => {
|
||||
const createDto = { contractName: 'New Contract', contractCode: 'C-001', projectId: 1 };
|
||||
vi.mocked(apiClient.post).mockResolvedValue({ data: { publicId: 'new-uuid', ...createDto } });
|
||||
const result = await contractService.create(createDto);
|
||||
expect(apiClient.post).toHaveBeenCalledWith('/contracts', createDto);
|
||||
expect(result.contractName).toBe('New Contract');
|
||||
});
|
||||
});
|
||||
|
||||
describe('update', () => {
|
||||
it('ควรส่งคำขอ PATCH เพื่ออัปเดตสัญญาสำเร็จ', async () => {
|
||||
const updateDto = { contractName: 'Updated Contract' };
|
||||
vi.mocked(apiClient.patch).mockResolvedValue({ data: { publicId: 'uuid', ...updateDto } });
|
||||
const result = await contractService.update('uuid', updateDto);
|
||||
expect(apiClient.patch).toHaveBeenCalledWith('/contracts/uuid', updateDto);
|
||||
expect(result.contractName).toBe('Updated Contract');
|
||||
});
|
||||
});
|
||||
|
||||
describe('delete', () => {
|
||||
it('ควรส่งคำขอ DELETE เพื่อลบสัญญาสำเร็จ', async () => {
|
||||
vi.mocked(apiClient.delete).mockResolvedValue({ data: { success: true } });
|
||||
const result = await contractService.delete('uuid');
|
||||
expect(apiClient.delete).toHaveBeenCalledWith('/contracts/uuid');
|
||||
expect(result).toEqual({ success: true });
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user