- 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
14 KiB
Tasks: Frontend Test Coverage — Phased Improvement
Input: Design documents from specs/300-others/303-frontend-test-coverage/
Prerequisites: plan.md ✅, spec.md ✅, research.md ✅
Branch: 303-frontend-test-coverage
Format: [ID] [P?] [Story] Description
- [P]: Can run in parallel (different files, no dependencies on each other)
- [Story]: Which Phase/User Story this task belongs to (US1=Phase1, US2=Phase2, US3=Phase3)
- Include exact file paths in descriptions
⚠️ Important Conventions (จาก research.md)
- Test extension:
.test.ts/.test.tsx(ไม่ใช่.spec.ts) — ตาม vitest.config.ts include pattern - Test location: วางใน
__tests__/subfolder ข้างๆ source (เช่นhooks/__tests__/use-foo.test.ts) - Coverage command:
npm run test:coverage(ไม่ใช่test:cov) - Mock helper: ใช้
createTestQueryClient()จาก@/lib/test-utilsสำหรับ hooks + components - apiClient: mock ไว้ใน
vitest.setup.tsแล้ว — ไม่ต้อง mock ซ้ำในแต่ละ service test - publicId: UUIDv7 เสมอในทุก mock data — ห้ามใช้
id: 1(ADR-019)
Phase 1: Setup (Shared Infrastructure)
Purpose: ตรวจสอบ test environment — helper มีอยู่แล้วใน codebase
- T001 อ่าน
frontend/vitest.config.tsยืนยัน include pattern และ coverage config — ไม่ต้องแก้ไข แค่ทำความเข้าใจ - T002 รัน
npm run test:coverageครั้งแรก เพื่อยืนยันว่า environment พร้อม และดู baseline coverage 13.54% - T003 อ่าน
frontend/lib/test-utils.tsxทำความเข้าใจcreateTestQueryClient()pattern - T004 อ่าน test file ตัวอย่าง
frontend/hooks/__tests__/use-correspondence.test.tsเพื่อ internalize pattern
Checkpoint: environment พร้อม, helper และ factory พร้อมใช้
Phase 2: Foundational (Blocking Prerequisites)
Purpose: สร้าง test patterns พื้นฐานที่ทุก Phase ใช้ร่วมกัน
⚠️ CRITICAL: Phase 3, 4, 5 ต้องรอให้ Phase นี้เสร็จก่อน
- T007 สร้าง test สำหรับ API client mock pattern ใน
frontend/__tests__/helpers/api-mock.ts— ตรวจสอบว่า vi.mock ทำงานได้ถูกต้อง - T008 [P] เขียน smoke test สำหรับ 1 hook ง่ายๆ ใน
frontend/hooks/use-auth.spec.tsเพื่อยืนยัน Vitest + RTL ทำงาน end-to-end - T009 กำหนด test naming convention และ file header format ใน
frontend/__tests__/README.md(Thai comments,// File:header)
Checkpoint: Foundation ready — สามารถเริ่ม Phase 3, 4, 5 ได้
Phase 3: User Story 1 — Phase 1 Coverage (13% → 30%) (Priority: P1) 🎯 MVP
Goal: ยก Statement Coverage รวมจาก 13.54% ขึ้นเป็น ≥ 30% โดยเน้น hooks/, lib/services/, components/correspondences/
Independent Test: รัน npm run test:coverage และดูว่า Statements ≥ 30%
hooks/ — Custom Hooks (19 ที่ยังขาด)
- T010 [P] [US1] เขียน
frontend/hooks/__tests__/use-master-data.test.ts— ครอบuseProjects,useOrganizations,useUsers(hook นี้ถูก import ในทุก form) - T011 [P] [US1] เขียน
frontend/hooks/__tests__/use-workflows.test.ts— ครอบ list + filter workflows, error state - T012 [P] [US1] เขียน
frontend/hooks/__tests__/use-transmittal.test.ts— ครอบ CRUD operations - T013 [P] [US1] เขียน
frontend/hooks/__tests__/use-numbering.test.ts— ครอบ document number generation - T014 [P] [US1] เขียน
frontend/hooks/__tests__/use-ai-prompts.test.ts— ครอบ list, activate prompt - T015 [P] [US1] เขียน
frontend/hooks/__tests__/use-delegation.test.ts— ครอบ delegation CRUD - T016 [P] [US1] เขียน
frontend/hooks/__tests__/use-dashboard.test.ts— ครอบ metrics fetch, error - T017 [P] [US1] เขียน
frontend/hooks/__tests__/use-review-teams.test.ts— ครอบ list + member management
lib/services/ — Services (25 ที่ยังขาด — เน้น high priority ก่อน)
- T018 [P] [US1] เขียน
frontend/lib/services/__tests__/rfa.service.test.ts— ครอบ getAll, getByUuid, create, submit (apiClient mock ใน setup.ts แล้ว) - T019 [P] [US1] เขียน
frontend/lib/services/__tests__/user.service.test.ts— ครอบ getAll, getById, update - T020 [P] [US1] เขียน
frontend/lib/services/__tests__/transmittal.service.test.ts— ครอบ CRUD - T021 [P] [US1] เขียน
frontend/lib/services/__tests__/circulation.service.test.ts— ครอบ CRUD - T022 [P] [US1] เขียน
frontend/lib/services/__tests__/dashboard.service.test.ts— ครอบ metrics endpoints
components/correspondences/ — ยังขาด 8 files
- T023 [P] [US1] เขียน
frontend/components/correspondences/__tests__/list.test.tsx— ครอบ render, empty state, loading - T024 [P] [US1] เขียน
frontend/components/correspondences/__tests__/circulation-status-card.test.tsx— ครอบทุก status - T025 [P] [US1] เขียน
frontend/components/correspondences/__tests__/tag-manager.test.tsx— ครอบ add/remove tags
components/common/ และ components/ui/
- T026 [P] [US1] เขียน test สำหรับ components ใน
frontend/components/common/__tests__/— ยก coverage จาก 26% ขึ้น ≥ 60% - T027 [P] [US1] เขียน test สำหรับ components ใน
frontend/components/ui/__tests__/— ยก coverage จาก 31% ขึ้น ≥ 60%
Checkpoint: รัน npm run test:coverage → ยืนยัน Statements ≥ 30% → merge Phase 1 PR
Phase 4: User Story 2 — Phase 2 Coverage (30% → 50%) (Priority: P2)
Goal: ยก Statement Coverage รวมจาก 30% ขึ้นเป็น ≥ 50% โดยเน้น rfas/, numbering/, lib/api/, drawings/
Independent Test: รัน npm run test:coverage และดูว่า Statements ≥ 50%
components/rfas/ — RFA (Critical Business Feature, 0% → ≥60%)
- T028 [P] [US2] เขียน
frontend/components/rfas/__tests__/list.test.tsx— ครอบ render, filter by status, empty state - T029 [P] [US2] เขียน
frontend/components/rfas/__tests__/detail.test.tsx— ครอบ header display, attachment list, action buttons - T030 [US2] เขียน
frontend/components/rfas/__tests__/form.test.tsx— ครอบ validation, submit (ไฟล์ใหญ่ 32KB — ต้องแบ่ง test เป็น describe blocks)
lib/services/ — Services ที่ยังขาด (ต่อจาก Phase 1)
- T031 [P] [US2] เขียน
frontend/lib/services/__tests__/workflow-engine.service.test.ts— ครอบ getAll, transition, getHistory - T032 [P] [US2] เขียน
frontend/lib/services/__tests__/document-numbering.service.test.ts— ครอบ generate, preview, format - T033 [P] [US2] เขียน
frontend/lib/services/__tests__/session.service.test.ts— ครอบ login, logout, refresh
components/numbering/ — Document Numbering
- T034 [P] [US2] เขียน
frontend/components/numbering/__tests__/tests — ครอบ format display, configuration form, preview
lib/api/ — API Client Layer (0.38% → ≥70%)
- T035 [P] [US2] เขียน
frontend/lib/api/__tests__/tests — ครอบ request interceptors, response handlers, error cases
components/auth/ และ components/drawings/
- T036 [P] [US2] เขียน
frontend/components/auth/__tests__/tests — ครอบ login form, validation - T037 [P] [US2] เขียน
frontend/components/drawings/__tests__/tests — ครอบ Shop Drawing list, upload, status - T038 [P] [US2] เขียน test เพิ่มสำหรับ
frontend/components/workflows/__tests__/— ยก coverage จาก 15% ขึ้น ≥ 60% - T039 [P] [US2] เขียน
frontend/hooks/__tests__/use-workflow-history.test.ts— ครอบ history fetch
Checkpoint: รัน npm run test:coverage → ยืนยัน Statements ≥ 50% → merge Phase 2 PR
Phase 5: User Story 3 — Phase 3 Coverage (50% → 70%) (Priority: P3)
Goal: ยก Statement Coverage รวมจาก 50% ขึ้นเป็น ≥ 70% โดยเน้น admin/, workflow/, layout/
Independent Test: รัน npm run test:cov และดูว่า Statements ≥ 70%
components/admin/ — Admin Panel
- T034 [P] [US3] เขียน test สำหรับ Admin dashboard components ใน
frontend/components/admin/— ครอบ render, data display - T035 [P] [US3] เขียน test สำหรับ AI Admin panel ใน
frontend/components/admin/ai/— ครอบ model selection, prompt management (ADR-027) - T036 [P] [US3] เขียน test สำหรับ Admin reference management ใน
frontend/components/admin/reference/ - T037 [P] [US3] เขียน test สำหรับ Admin security settings ใน
frontend/components/admin/security/
components/workflow/ — Workflow Engine UI
- T038 [P] [US3] เขียน test สำหรับ Workflow display components ใน
frontend/components/workflow/— ครอบ step display, status - T039 [P] [US3] เขียน test สำหรับ Workflow transition buttons — ครอบ disable state, confirmation, submit
components/layout/ และ Remaining
- T040 [P] [US3] เขียน test สำหรับ Layout components ใน
frontend/components/layout/— ครอบ nav, sidebar, header - T041 [P] [US3] เขียน test สำหรับ Transmittal components ใน
frontend/components/transmittal/ - T042 [P] [US3] เขียน test สำหรับ Circulation components ใน
frontend/components/circulation/ - T043 [P] [US3] เขียน test สำหรับ lib/stores/ — ครอบ state initialization, updates, selectors
- T044 [P] [US3] เขียน test สำหรับ lib/utils/ — ครอบ utility functions ทั้งหมด (เป็น pure function ควร coverage 100%)
- T045 [P] [US3] เขียน test สำหรับ lib/i18n/ — ครอบ translation loading, fallback
Checkpoint: รัน npm run test:coverage → ยืนยัน Statements ≥ 70% → merge Phase 3 PR
Phase 6: Polish & Cross-Cutting
Purpose: ทบทวนคุณภาพ test ทั้งหมด
- T050 ตรวจสอบ test files ทั้งหมดว่าไม่มี
anytype หรือconsole.log - T051 [P] ตรวจสอบว่า mock data ทุกที่ใช้
publicId(UUIDv7) ไม่ใช่idตัวเลข (ADR-019) - T052 [P] ตรวจสอบว่าทุก test file มี
// File:header และ// Change Logcomment - T053 รัน
npm run test:coverageครั้งสุดท้าย บันทึกตัวเลขสุดท้ายในspecs/300-others/303-frontend-test-coverage/plan.md
Dependencies & Execution Order
Phase Dependencies
- Phase 1 (Setup): ไม่มี dependencies — เริ่มได้ทันที
- Phase 2 (Foundational): ต้องรอ Phase 1 — BLOCKS Phase 3, 4, 5
- Phase 3 (US1): ต้องรอ Phase 2 — ทำงานคู่กับ Phase 4, 5 ได้ถ้ามีทีม
- Phase 4 (US2): ต้องรอ Phase 2 + Phase 3 merge แล้ว
- Phase 5 (US3): ต้องรอ Phase 2 + Phase 4 merge แล้ว
- Phase 6 (Polish): รอทุก Phase เสร็จ
User Story Dependencies
- US1 (Phase 1 13%→30%): เริ่มได้หลัง Foundational — ไม่ขึ้นกับ US อื่น
- US2 (Phase 2 30%→50%): เริ่มหลัง US1 merge เพื่อ coverage ต่อเนื่อง
- US3 (Phase 3 50%→70%): เริ่มหลัง US2 merge
Parallel Opportunities (ภายใน Phase)
Tasks ที่มีป้าย [P] ภายใน Phase เดียวกัน สามารถทำพร้อมกันได้เนื่องจากเป็นคนละไฟล์:
- T003, T004, T005 ทำพร้อมกันได้
- T010–T022 ทำพร้อมกันได้ (คนละ folder/file)
- T023–T033 ทำพร้อมกันได้
Implementation Strategy
MVP First (Phase 3 / US1 เท่านั้น)
- Phase 1: Setup ✓
- Phase 2: Foundational ✓
- Phase 3: US1 (hooks + services + correspondences)
- STOP & VALIDATE: รัน
npm run test:cov→ ดู ≥ 30% - Merge PR แล้วเริ่ม Phase 4
Incremental Delivery
- Setup + Foundational → environment พร้อม
- US1 → Coverage ≥ 30% → Merge
- US2 → Coverage ≥ 50% → Merge
- US3 → Coverage ≥ 70% → Merge
Notes
[P]= tasks ต่างไฟล์, ไม่ depends กัน → ทำพร้อมกันได้- ทุก test file ต้องมี
// File: path/filenameบรรทัดแรก - Mock data ต้องใช้
publicIdเสมอ — ตัวเลือกidใดๆ ถือเป็น Tier 1 violation (ADR-019) - หากพบ bug ระหว่างเขียน test → fix ทันที อย่า skip
- Manual verify coverage ก่อน merge ทุก Phase