# Acceptance Criteria

## 1. Mục đích

Acceptance Criteria là tiêu chí chấp nhận. Tài liệu này trả lời câu hỏi: “Chức năng như thế nào thì được xem là đạt?”.

**Ghi chú:** Nếu một chức năng không đạt Acceptance Criteria quan trọng, QA không nên cho `GO` dù giao diện nhìn có vẻ chạy được.

## 2. Tiêu chí chung cho toàn hệ thống

| Nhóm | Tiêu chí chấp nhận | Ghi chú |
|---|---|---|
| Build | Website, admin và backend build được | Build fail là blocker |
| Runtime | App khởi động được theo README/config | Không chỉ chạy local bằng hack |
| Smoke | Route chính và health API pass | Dùng để xác nhận hệ thống sống |
| Data | Schema đúng, không thiếu field bắt buộc | FE không được phụ thuộc field không chắc chắn |
| Error | Lỗi trả message rõ, không raw stack trace | Quan trọng cho security |
| UI | Không blank, không overlap, không cắt CTA | Đặc biệt trên mobile |
| Security | Admin mutation bắt buộc auth/quyền | Không có ngoại lệ |
| Regression | Không phá flow đã có | Cần chạy trước release |

## 3. Website public

| Feature | Acceptance Criteria | Ghi chú |
|---|---|---|
| Trang chủ | Header, banner, flash sale, category, product sections, footer render đúng | Section không có data phải ẩn an toàn |
| Navigation | Logo, menu, mega menu, mobile menu, footer link điều hướng đúng | Không để dead link ở flow chính |
| Search | Keyword có kết quả hiển thị đúng; keyword không có kết quả có empty state | Không được crash khi keyword rỗng |
| Collection/PLP | Breadcrumb, filter, sort, grid, pagination đúng collection | Filter/sort phải giữ state khi reload nếu thiết kế yêu cầu |
| Product Card | Ảnh, tên, giá, discount, badge, CTA đúng | Giá sai là High/Critical tùy flow |
| Product Detail/PDP | Gallery, thông tin giá, tồn kho, specs, promotion, CTA và sticky bar đúng | Slug sai phải 404/empty rõ |
| Cart | Thêm/xóa/cập nhật số lượng đúng; tổng tiền đúng | Không cho số lượng âm |
| Voucher | Voucher hợp lệ áp đúng; voucher sai/hết hạn không áp | Message lỗi phải rõ |
| Checkout | Validation bắt buộc; desktop 3 bước, mobile 2 bước; đặt hàng thành công | Checkout fail là blocker |
| Blog/News | Listing, category, article detail render đúng | Không ảnh hưởng mua hàng nhưng cần ổn định |
| Static pages | Giới thiệu, liên hệ, cửa hàng, chính sách render đúng | Không thiếu header/footer |
| 404 | Route sai hiển thị 404 và có điều hướng về trang chính | Không blank screen |
| SEO | Title/meta/canonical/JSON-LD đúng theo page | Cần kiểm ít nhất homepage, PLP, PDP |
| Responsive | 375px, 768px, 1440px không overlap, CTA bấm được | Bắt buộc kiểm mobile |

## 4. Backend API

| Module | Acceptance Criteria | Ghi chú |
|---|---|---|
| Health | `/ping` và `/version` trả 200 | Dùng cho smoke/deploy check |
| Catalog Search | Search trả đúng kết quả/pagination; input sai không 500 | Nếu ERP thiếu phải có lỗi kiểm soát |
| Product Detail | Slug hợp lệ trả product + enrichment; slug sai trả 404/error đúng contract | Không để panic |
| Collection | Slug collection trả products, breadcrumb, filters, SEO metadata | Breadcrumb sai ảnh hưởng UX/SEO |
| Navigation | Mega-menu tree đúng schema, cache hợp lý | Hot path public |
| Homepage Bundle | Trả bundle nhiều section; section lỗi/rỗng không làm fail toàn bộ nếu có thể | Cần graceful degradation |
| ProductExt | Details/images/badges/colors/relations đọc/ghi đúng | Admin mutation cần auth |
| SEO | Metadata, redirects, sitemap cursor đúng | Sitemap không được lặp item |
| Promotions | Public promotions đúng thời gian/trạng thái | Không show promotion hết hạn |
| Blog | Featured/list articles đúng schema | 404 khi handle sai |
| User | CRUD/address validation đúng | Không leak thông tin nhạy cảm |
| Admin routes | Không token bị 401/403; token đủ quyền mới ghi được | Bắt buộc |
| Error format | 400/401/403/404/500 theo format thống nhất | Không raw SQL/stack trace |

## 5. Admin/CDP

| Module | Acceptance Criteria | Ghi chú |
|---|---|---|
| Auth | Anonymous không vào protected route; token hết hạn xử lý đúng | Không để user kẹt màn hình loading |
| Sidebar/Layout | Active menu đúng, sidebar thu/mở không vỡ layout | Giống form vận hành |
| Permission | Role/quyền điều khiển menu và action | Source đã có risk role gating nên phải test kỹ |
| Collection CMS | Tạo/sửa/đổi parent không làm hỏng breadcrumb/closure table | Direct SQL update parent là rủi ro |
| Product Enrichment | Detail/image/badge/color/relation lưu và public đọc đúng | Cần kiểm API và UI |
| Homepage CMS | Banner/flash sale/section cập nhật đúng public site | Chú ý cache |
| Coupon/Voucher | Rule, targeting, thời gian, preview, apply discount đúng | Không vượt rule discount |
| SEO Admin | Metadata/redirect tạo xong public lookup đúng | Chú ý cache propagation |
| Upload | File hợp lệ upload được; file sai bị chặn | Cần message rõ |
| Stocktake | Scan match/thừa/thiếu/duplicate/unknown đúng counter/status | Dựa trên test guide có sẵn |
| Variance Workflow | QLCH/QC/KT chỉ thấy action đúng role và đúng state | Fail role là High |
| Form Validation | Required field, sai format, submit fail hiển thị rõ | Không mất dữ liệu người dùng |
| Optimistic Update | Mutation fail rollback UI đúng | Tránh dữ liệu ảo |

## 6. Non-functional

| Nhóm | Acceptance Criteria | Ghi chú |
|---|---|---|
| Performance | Hot page/API phản hồi trong ngưỡng chấp nhận | Ngưỡng cụ thể cần team thống nhất |
| Accessibility | Keyboard navigation, focus visible, contrast đủ | Tối thiểu cho menu/form/modal |
| Security | Không commit secret, không XSS cơ bản, admin auth đúng | Không thay pentest |
| Browser | Chrome/Edge desktop/mobile render đúng | Ưu tiên browser khách hàng dùng |
| Logging | Lỗi server có log đủ trace nhưng response không leak | Cần hỗ trợ debug |

## 7. Definition of Done

- Build/lint/type-check/go test đã chạy hoặc có lý do chưa chạy.
- Smoke test pass.
- Test Cases P0/P1 pass.
- Không còn bug Critical/High.
- Bug Medium/Low còn lại có owner, deadline và workaround.
- QA Report cập nhật evidence.
- QC Gate có kết luận rõ: `GO`, `CONDITIONAL GO` hoặc `NO GO`.
