Test Checklist · MVP
Quick Reference — Tick từng ô. Mục tiêu pass ≥ 95% (≥ 76/80). Bug P0 = 0.
Quy ước:
- ✅ Pass · ❌ Fail · ⏭ Skip (lý do)
- Severity: P0 block release · P1 high · P2 medium · P3 cosmetic
1. Authentication & Authorization (8 cases)
| # | Test case | Expected | Sev |
|---|---|---|---|
| 1.1 | Login đúng email + mật khẩu | Redirect /, sidebar hiện | P0 |
| 1.2 | Login sai mật khẩu | Hiện error toast, không redirect | P0 |
| 1.3 | Login email không tồn tại | Hiện error chung (không leak existence) | P1 |
| 1.4 | Mở trang protected khi chưa login | Redirect /login | P0 |
| 1.5 | Logout từ avatar menu | Redirect /login, session xoá | P0 |
| 1.6 | KAM login → không thấy menu Cấu hình | Sidebar không có nhóm "Cấu hình" | P1 |
| 1.7 | Auditor login → mọi action chỉ read-only | Nút duyệt/sửa/save disabled hoặc ẩn | P1 |
| 1.8 | Admin login → thấy đủ menu | Tất cả nhóm hiển thị | P1 |
2. Import lịch sử (10 cases)
| # | Test case | Expected | Sev |
|---|---|---|---|
| 2.1 | Download template Excel | File .xlsx đúng tên, có header chuẩn | P1 |
| 2.2 | Upload file đúng format | Preview hiện đúng N dòng | P0 |
| 2.3 | Upload file sai format (.txt) | Error rõ ràng, không crash | P1 |
| 2.4 | Upload file thiếu cột bắt buộc | Liệt kê cột thiếu | P1 |
| 2.5 | Customer_code không tồn tại | Báo dòng nào sai, không insert | P0 |
| 2.6 | Date format sai (15/06/2026) | Báo lỗi parser kèm dòng | P1 |
| 2.7 | Qty âm hoặc 0 | Bỏ qua dòng, báo summary | P2 |
| 2.8 | Duplicate (cust, wh, date) trong file | Upsert, ghi note "overwritten" | P1 |
| 2.9 | File > 10MB | Vẫn parse được hoặc báo size limit rõ ràng | P2 |
| 2.10 | Confirm "Nhập" → audit log ghi 1 row IMPORT_HISTORICAL | Có row trong audit_log | P0 |
3. Submit Adjustment — KAM (12 cases)
| # | Test case | Expected | Sev |
|---|---|---|---|
| 3.1 | Upload Excel 5 dòng valid | Toast OK, 5 row state=NEW | P0 |
| 3.2 | Nhập form 1 dòng + submit | 1 row state=NEW | P0 |
| 3.3 | Target_date < hôm nay | Reject với error rõ ràng | P1 |
| 3.4 | Target_date > 30 ngày | Reject (ngoài cửa sổ forecast 14d) | P1 |
| 3.5 | Δ > 30% không note | Submit fail, yêu cầu note | P0 |
| 3.6 | Δ > 30% có note | Submit OK | P0 |
| 3.7 | Event_type không hợp lệ | Reject hoặc fallback NORMAL | P1 |
| 3.8 | Submit thành công → KAM thấy ở "Lịch sử gửi" | Row hiện state=NEW | P1 |
| 3.9 | KAM huỷ row state=NEW | Row biến mất / state=CANCELLED | P2 |
| 3.10 | KAM thử huỷ row state=ACCEPTED | Action disabled | P1 |
| 3.11 | Submit → audit log có SUBMIT_ADJUSTMENT | Row trong audit | P0 |
| 3.12 | KAM khác không thấy adjustment của KAM khác | RLS lọc đúng | P0 |
4. Forecast Engine (8 cases)
| # | Test case | Expected | Sev |
|---|---|---|---|
| 4.1 | Nightly job chạy → forecast_results upsert | Có row cho 14 ngày tới, mỗi pair | P0 |
| 4.2 | Forecast_qty = baseline_avg × monthly × event | Khớp công thức (verify 1 cell tay) | P0 |
| 4.3 | Sample size n < 10 → fallback_used=true | Cờ raised, event_type fallback NORMAL | P1 |
| 4.4 | Baseline_avg = 0 → forecast_qty = 0 | OK, không crash | P1 |
| 4.5 | Monthly multiplier = 0 → forecast = 0 | OK | P2 |
| 4.6 | P85 hiển thị đúng (verify 1 case tay) | Khớp với phân vị 85 của 90d | P1 |
| 4.7 | Audited_qty = null trước khi duyệt | Cột trống ở UI | P1 |
| 4.8 | Sau Planner accept → audited_qty = số duyệt | UI cập nhật real-time hoặc refresh | P0 |
5. Review pipeline (12 cases)
| # | Test case | Expected | Sev |
|---|---|---|---|
| 5.1 | Mở /planner/forecast/review → thấy queue NEW+SEEN | Bảng có đủ row | P0 |
| 5.2 | Filter Tier=KEY | Bảng còn KEY only | P1 |
| 5.3 | Sort theo target_date asc | Date sớm lên trên | P2 |
| 5.4 | AM bấm "Đã xem" → NEW → SEEN | State cập nhật, audit log row | P0 |
| 5.5 | Planner "Duyệt" Δ ≤ 15% (không note) | OK, state=ACCEPTED | P0 |
| 5.6 | Planner "Duyệt" Δ > 30% không note | UI block + yêu cầu note | P0 |
| 5.7 | Planner "Sửa & duyệt" với qty khác | audited_qty = số mới, 2 audit row | P0 |
| 5.8 | Planner "Từ chối" + note | state=REJECTED, audited_qty=baseline | P0 |
| 5.9 | Planner thử update row ACCEPTED | Disabled / error | P1 |
| 5.10 | Phím tắt A = duyệt nhanh | Hoạt động, focus next row | P2 |
| 5.11 | KAM tạo adjustment mới cùng (cust,wh,date) sau khi đã ACCEPTED | UI cho phép tạo, planner thấy override | P1 |
| 5.12 | 2 planner duyệt cùng row cùng lúc | Optimistic lock, người sau báo "đã được duyệt" | P1 |
6. Reports (10 cases)
Warehouse report
| # | Test case | Expected | Sev |
|---|---|---|---|
| 6.1 | Mở /planner/forecast/warehouse, chọn 1 kho | Bảng 14 ngày hiện | P0 |
| 6.2 | WLU_minutes > 0 cho ngày có forecast | OK | P0 |
| 6.3 | Headcount_8h = ceil(WLU / 480) | Verify 1 cell tay | P0 |
| 6.4 | PK breakdown SB+MIX+HVY = 100% | Tổng 3 cột = 100 | P1 |
| 6.5 | Export Excel | File 2 sheet, mở được | P1 |
Customer report
| # | Test case | Expected | Sev |
|---|---|---|---|
| 6.6 | Mở /planner/forecast/customer | List khách + summary | P0 |
| 6.7 | Click 1 khách → detail | Drawer / page riêng | P1 |
| 6.8 | Hiển thị lịch sử 90d + forecast 14d | Chart line/bar | P1 |
| 6.9 | Filter theo Tier | Bảng filter đúng | P2 |
| 6.10 | Export khách → CSV | File mở được | P2 |
7. Config (10 cases)
| # | Test case | Expected | Sev |
|---|---|---|---|
| 7.1 | Mở /admin/config/thamso → 12 row tháng | 12 row | P1 |
| 7.2 | Sửa T6 = 1.0 → 1.2, lưu | Toast OK, audit log CONFIG_CHANGE | P0 |
| 7.3 | Nhập số âm | Validation error | P1 |
| 7.4 | Sửa event MEGA_SALE = 4.5 → 5.0 | OK | P0 |
| 7.5 | Mở /admin/config/dinhmuc | Matrix UPH hiện | P1 |
| 7.6 | Sửa UPH cell + lưu | Audit row + WLU report cập nhật sau rerun | P0 |
| 7.7 | Admin khác thấy thay đổi (real-time hoặc refresh) | OK | P2 |
| 7.8 | KAM mở config | 403 hoặc menu ẩn | P0 |
| 7.9 | Audit log CONFIG_CHANGE có before/after JSON | Đủ field | P0 |
| 7.10 | "Rerun nightly" button | Engine recompute trong < 2' | P1 |
8. Audit (5 cases)
| # | Test case | Expected | Sev |
|---|---|---|---|
| 8.1 | Mở Audit Timeline 1 adjustment ACCEPTED | ≥ 2 row (state + qty) | P0 |
| 8.2 | Mỗi row có actor + timestamp + reason (nếu apply) | Đầy đủ | P0 |
| 8.3 | Auditor query audit_log qua SQL | Read OK | P1 |
| 8.4 | Auditor thử UPDATE audit_log | RLS từ chối | P0 |
| 8.5 | Auditor thử DELETE audit_log | RLS từ chối | P0 |
9. Performance & UX (5 cases)
| # | Test case | Expected | Sev |
|---|---|---|---|
| 9.1 | Load trang Overview với 100 khách × 14d | < 3s | P1 |
| 9.2 | Submit form không reload toàn trang | Optimistic update | P2 |
| 9.3 | Sidebar persist state khi navigate | OK | P2 |
| 9.4 | Toast error rõ ràng tiếng Việt | Không phải [object Object] | P1 |
| 9.5 | Console không có error đỏ trong happy path | 0 errors | P1 |
Tổng kết
| Mục | Pass | Fail | Skip | Total |
|---|---|---|---|---|
| Auth | __/8 | – | – | 8 |
| Import | __/10 | – | – | 10 |
| Adjustment | __/12 | – | – | 12 |
| Engine | __/8 | – | – | 8 |
| Review | __/12 | – | – | 12 |
| Reports | __/10 | – | – | 10 |
| Config | __/10 | – | – | 10 |
| Audit | __/5 | – | – | 5 |
| Perf/UX | __/5 | – | – | 5 |
| TỔNG | __/80 | – | – | 80 |
Verdict:
- [ ] ≥ 76/80 pass
- [ ] 0 P0 bug
- [ ] ≤ 3 P1 bug
- [ ] Audit complete
Tiếp: Scenarios