# Test Cases

## 1. Mục đích

Test Cases mô tả cách kiểm thử cụ thể: điều kiện trước khi test, các bước thực hiện, dữ liệu cần dùng, kết quả mong đợi và ghi chú khi đánh giá.

**Ghi chú:** Test Scenario chỉ nói “cần kiểm tình huống gì”, còn Test Case nói “kiểm như thế nào”. QA khi chạy test cần ghi Pass/Fail, evidence và bug ID nếu fail.

## 2. Quy ước

| Trường | Ý nghĩa |
|---|---|
| ID | Mã test case để tracking |
| Priority | P0 blocker, P1 high, P2 medium, P3 low |
| Preconditions | Điều kiện cần có trước khi chạy test |
| Steps | Các bước thực hiện |
| Expected Result | Kết quả mong đợi |
| Notes | Ghi chú thêm, rủi ro hoặc điểm cần quan sát |

## 3. Smoke Test Cases

| ID | Priority | Preconditions | Steps | Expected Result | Notes |
|---|---|---|---|---|---|
| TC-SMOKE-001 | P0 | Backend đã start | Gọi `GET /ping` | HTTP 200, `success=true`, `data=pong` | Health fail thì dừng test API |
| TC-SMOKE-002 | P0 | Backend đã start | Gọi `GET /version` | HTTP 200, có service/version | Dùng xác nhận đúng service |
| TC-SMOKE-003 | P0 | Website đã start | Mở `/` | Trang chủ render, không blank screen | Kiểm console error |
| TC-SMOKE-004 | P0 | Website đã start | Mở `/gio-hang` | Trang giỏ hàng render, không crash | Dù giỏ rỗng vẫn phải render |
| TC-SMOKE-005 | P0 | Website đã start | Mở route collection hợp lệ | PLP render đúng | Cần slug test |
| TC-SMOKE-006 | P0 | Website đã start | Mở route product hợp lệ | PDP render đúng | Cần slug test |
| TC-SMOKE-007 | P0 | Admin đã start | Mở admin protected route | Auth/protected shell hoạt động | Nếu chưa login phải redirect |
| TC-SMOKE-008 | P0 | Dependency đã cài | Chạy build website | Build pass | Build fail là blocker |
| TC-SMOKE-009 | P0 | Dependency đã cài | Chạy build admin | Build/type-check pass | Nếu script khác README thì ghi chú |
| TC-SMOKE-010 | P0 | Go deps sẵn | Chạy backend build | Build pass | `go build` fail là blocker |

## 4. Website Public Test Cases

| ID | Priority | Module | Preconditions | Steps | Expected Result | Notes |
|---|---|---|---|---|---|---|
| TC-WEB-001 | P1 | Header | Website chạy | Mở `/`, click logo | Điều hướng về `/` | Không reload lỗi |
| TC-WEB-002 | P1 | Header | Website chạy desktop | Mở mega menu | Menu hiển thị đủ danh mục | Kiểm không che CTA chính |
| TC-WEB-003 | P1 | Header | Mega menu đang mở | Click ngoài menu | Menu đóng | Không để overlay treo |
| TC-WEB-004 | P1 | Mobile Menu | Viewport 375px | Mở menu mobile | Menu hiển thị, cuộn được | Không overlap logo/cart |
| TC-WEB-005 | P1 | Search | Có sản phẩm test | Nhập keyword có sản phẩm | Danh sách kết quả phù hợp | Kiểm debounce/loading |
| TC-WEB-006 | P2 | Search | Website chạy | Nhập keyword không có sản phẩm | Empty state rõ | Không crash |
| TC-WEB-007 | P1 | Homepage | Homepage API/mock có data | Mở `/` | Các section chính render đúng | Section rỗng phải ẩn |
| TC-WEB-008 | P1 | Homepage | API lỗi một section | Mở `/` | Trang không crash, có fallback | Ghi network error |
| TC-WEB-009 | P1 | Collection | Có collection slug | Mở `/collections/[slug]` | Breadcrumb, filter, grid, sort đúng | Kiểm title/meta |
| TC-WEB-010 | P1 | Collection | Có filter data | Chọn filter | URL/state và list sản phẩm cập nhật | Không mất sort |
| TC-WEB-011 | P1 | Collection | Có sort data | Đổi sort | Thứ tự sản phẩm thay đổi đúng | Kiểm reload |
| TC-WEB-012 | P1 | Collection | Có nhiều sản phẩm | Load more/pagination | Không trùng item | Không mất filter |
| TC-WEB-013 | P2 | Collection | Slug không tồn tại | Mở URL sai | 404 hoặc empty state đúng | Không blank |
| TC-WEB-014 | P1 | Product Card | Có list sản phẩm | Kiểm card | Ảnh, tên, giá, badge, CTA đúng | Giá sai là High |
| TC-WEB-015 | P0 | PDP | Có product slug | Mở PDP | Gallery, giá, tồn kho, specs, CTA đúng | Core flow |
| TC-WEB-016 | P1 | PDP | PDP có nhiều ảnh | Click thumbnail | Ảnh chính cập nhật | Không vỡ layout |
| TC-WEB-017 | P1 | PDP | PDP có quantity | Tăng/giảm số lượng | Không âm, không vượt rule | Kiểm disabled state |
| TC-WEB-018 | P0 | PDP/Cart | Product còn hàng | Click thêm vào giỏ | Cart count tăng, item vào cart | Core flow |
| TC-WEB-019 | P0 | Cart | Cart có item | Mở `/gio-hang` | Item, quantity, giá, tổng tiền đúng | Tổng tiền sai là blocker/high |
| TC-WEB-020 | P1 | Cart | Cart có item | Tăng/giảm quantity | Tổng tiền cập nhật đúng | Không tạo quantity âm |
| TC-WEB-021 | P1 | Cart | Cart có item | Xóa item | Item biến mất, total cập nhật | Nếu hết item show empty |
| TC-WEB-022 | P1 | Cart | Cart rỗng | Mở `/gio-hang-trong` | Empty state và gợi ý sản phẩm hiển thị | Không crash |
| TC-WEB-023 | P1 | Voucher | Có voucher hợp lệ | Áp voucher | Discount đúng | Kiểm điều kiện min order |
| TC-WEB-024 | P1 | Voucher | Voucher sai/hết hạn | Áp voucher | Message lỗi, không giảm tiền | Không để discount âm |
| TC-WEB-025 | P0 | Checkout Desktop | Cart có item, viewport desktop | Hoàn tất flow 3 bước | Điều hướng trang thành công | Core release gate |
| TC-WEB-026 | P0 | Checkout Mobile | Cart có item, viewport 375px | Hoàn tất flow mobile | Flow 2 bước đúng | Không che nút đặt hàng |
| TC-WEB-027 | P1 | Checkout Validation | Cart có item | Submit thiếu field | Field error đúng, không submit | Không mất data đã nhập |
| TC-WEB-028 | P2 | Blog | Có bài viết | Mở `/tin-tuc` | Listing/category render đúng | Ảnh không vỡ |
| TC-WEB-029 | P2 | Blog Detail | Có slug bài viết | Mở bài viết | Nội dung/TOC/sidebar đúng | Không lỗi HTML |
| TC-WEB-030 | P2 | Static Pages | Website chạy | Mở giới thiệu/liên hệ/cửa hàng/chính sách | Nội dung, header, footer đúng | Kiểm link |
| TC-WEB-031 | P1 | 404 | Route sai | Mở URL không tồn tại | 404 có CTA quay lại | Không blank |
| TC-WEB-032 | P1 | Responsive | Viewport 375/768/1440 | Kiểm homepage/PLP/PDP/cart | Không overlap, text không cắt, CTA bấm được | Chụp screenshot |
| TC-WEB-033 | P1 | SEO | Page có metadata | Kiểm title/meta/canonical/JSON-LD | Đúng page | Dùng DevTools/view-source |

## 5. Backend API Test Cases

| ID | Priority | Endpoint/Module | Preconditions | Steps | Expected Result | Notes |
|---|---|---|---|---|---|---|
| TC-API-001 | P0 | `/ping` | Server chạy | GET `/ping` | 200 success | Smoke |
| TC-API-002 | P0 | `/version` | Server chạy | GET `/version` | 200 có service/version | Smoke |
| TC-API-003 | P1 | Catalog search | Có data/ERP | GET search keyword hợp lệ | List sản phẩm phù hợp | Nếu ERP thiếu ghi skip có điều kiện |
| TC-API-004 | P1 | Catalog search | Server chạy | GET keyword rỗng/sai | 400 hoặc empty đúng contract | Không 500 |
| TC-API-005 | P1 | Brands | Có data | GET `/v1/catalog/brands` | Schema đúng | Kiểm empty safe |
| TC-API-006 | P1 | Categories | Có data | GET `/v1/catalog/categories` | Schema đúng | |
| TC-API-007 | P1 | Products list | Có data | GET page/limit | Pagination đúng | Không trùng |
| TC-API-008 | P0 | Product detail | Có slug | GET `/v1/catalog/products/:slug` | Product + enrichment | Core |
| TC-API-009 | P1 | Product detail | Slug sai | GET slug sai | 404/error đúng | Không panic |
| TC-API-010 | P0 | Collection products | Có collection slug | GET by collection slug | Products, breadcrumb, filters, SEO meta | Core PLP |
| TC-API-011 | P1 | Reviews | Có SKU | GET reviews by SKU | Schema đúng | |
| TC-API-012 | P1 | Navigation | Có nav data | GET navigation | Tree đúng | Cache header nếu có |
| TC-API-013 | P1 | Homepage | Có site config | GET bundle | Sections đúng | Không fail toàn bộ vì section rỗng |
| TC-API-014 | P1 | Collections | Có data | GET list/nav/detail | Schema đúng | Slug sai handled |
| TC-API-015 | P1 | Collection admin | Admin token | POST create collection | Tạo thành công | Breadcrumb/hierarchy đúng |
| TC-API-016 | P0 | Collection admin auth | Không token | POST create collection | 401/403 | Security gate |
| TC-API-017 | P1 | ProductExt | Có product | GET details/images/badges/colors/relations | Data đúng productId | |
| TC-API-018 | P1 | ProductExt admin | Admin token | POST create/update enrichment | Ghi thành công | Public đọc được |
| TC-API-019 | P1 | SEO metadata | Có metadata | GET metadata | Data đúng filter | |
| TC-API-020 | P1 | Redirect lookup | Có redirect | GET lookup path | Target/status đúng | Cache 300s theo docs |
| TC-API-021 | P1 | Redirect miss | Path không có redirect | GET lookup | Miss đúng contract | Không 500 |
| TC-API-022 | P1 | Sitemap products | Có nhiều product | GET limit/cursor | Cursor ổn định | Không lặp |
| TC-API-023 | P1 | Sitemap collections | Có collection | GET limit/cursor | Cursor/lastmod đúng | |
| TC-API-024 | P2 | Promotions | Có promotion | GET public promotions | Chỉ promotion public/hợp lệ | |
| TC-API-025 | P2 | Blog | Có bài viết | GET featured/articles | Schema đúng | |
| TC-API-026 | P1 | User | Có user data | Create/list/get user/address | Validation/status đúng | Không leak sensitive |
| TC-API-027 | P1 | Validation | Payload thiếu required | POST mutation | 400/422 message rõ | |
| TC-API-028 | P1 | Security | Query/payload sai kiểu | Gọi API | Không raw SQL/stack trace | |

## 6. Admin/CDP Test Cases

| ID | Priority | Module | Preconditions | Steps | Expected Result | Notes |
|---|---|---|---|---|---|---|
| TC-ADM-001 | P0 | Auth | Chưa login | Mở protected route | Redirect/login/auth check đúng | |
| TC-ADM-002 | P0 | Auth | Account hợp lệ | Login | Vào dashboard/admin shell | |
| TC-ADM-003 | P1 | Auth | Token hết hạn | Mở route protected | Logout/refresh/redirect đúng | |
| TC-ADM-004 | P2 | Layout | Đã login | Thu/mở sidebar | Layout không vỡ | |
| TC-ADM-005 | P2 | Layout | Đã login | Click nhiều menu | Active menu đúng | |
| TC-ADM-006 | P0 | Permission | User thiếu quyền | Mở route/action restricted | Không thấy hoặc bị chặn | Security gate |
| TC-ADM-007 | P1 | Collection CMS | Admin token | Tạo collection root | Lưu đúng | |
| TC-ADM-008 | P1 | Collection CMS | Có parent | Tạo collection con | Breadcrumb đúng | |
| TC-ADM-009 | P1 | Collection CMS | Có hierarchy | Đổi parent | Closure/breadcrumb không hỏng | Rủi ro cao |
| TC-ADM-010 | P1 | Product Detail | Có product | Tạo/sửa detail | Public PDP đọc được | |
| TC-ADM-011 | P1 | Product Images | Có product | Upload/thêm/sắp xếp ảnh | Gallery public đúng | |
| TC-ADM-012 | P1 | Badges/Colors/Relations | Có product | Tạo/sửa/xóa | API/UI cập nhật đúng | |
| TC-ADM-013 | P1 | Homepage CMS | Admin | Sửa banner | Homepage cập nhật | Chú ý cache |
| TC-ADM-014 | P1 | Flash Sale | Admin | Sửa flash sale/time | Public hiển thị đúng trạng thái | |
| TC-ADM-015 | P1 | Coupon | Admin | Tạo coupon basic | Lưu và preview đúng | |
| TC-ADM-016 | P1 | Coupon Targeting | Product/category data | Set targeting | Apply đúng sản phẩm/category | |
| TC-ADM-017 | P1 | Voucher | Có cart/user | Preview/apply discount | Discount đúng rule | |
| TC-ADM-018 | P1 | SEO Admin | Admin | Tạo metadata/redirect | Public API lookup đúng | |
| TC-ADM-019 | P1 | Upload | File hợp lệ | Upload | Thành công, URL dùng được | |
| TC-ADM-020 | P1 | Upload | File sai/quá lớn | Upload | Bị chặn, message rõ | |
| TC-ADM-021 | P0 | Stocktake | Có session | Scan IMEI match | Counter tăng, SKU match | |
| TC-ADM-022 | P1 | Stocktake | Có session | Scan duplicate | Warning, counter không tăng | |
| TC-ADM-023 | P1 | Stocktake | Có session | Scan unknown | Cho chọn SKU/bỏ qua | |
| TC-ADM-024 | P1 | Stocktake | Có scan | Xóa scan | Counter/variance cập nhật | |
| TC-ADM-025 | P0 | Variance Workflow | Role QLCH | Gửi checklist | State chuyển đúng | |
| TC-ADM-026 | P0 | Variance Workflow | Role QC | Duyệt/từ chối | Chỉ QC thấy action, timeline cập nhật | Existing risk |
| TC-ADM-027 | P0 | Variance Workflow | Role KT | Hạch toán | Chỉ KT thấy action, đủ context | Existing risk |
| TC-ADM-028 | P0 | Role Gating | Sai role | Mở detail/action | Không thấy CTA sai quyền | Gate blocker nếu fail |
| TC-ADM-029 | P1 | Forms | Thiếu required | Submit | Field error đúng, không submit | |
| TC-ADM-030 | P1 | API Error | API fail | Submit form | Toast rõ, không mất data | |
| TC-ADM-031 | P2 | Optimistic Update | Mutation fail | Thao tác update | Rollback UI đúng | |

## 7. Non-functional Test Cases

| ID | Priority | Module | Steps | Expected Result | Notes |
|---|---|---|---|---|---|
| TC-NF-001 | P0 | Build | Chạy website build | Pass | Node >= 24 |
| TC-NF-002 | P0 | Build | Chạy admin build/type-check | Pass | |
| TC-NF-003 | P0 | Build | Chạy backend build | Pass | |
| TC-NF-004 | P1 | Backend tests | Chạy `go test ./...` | Pass hoặc lỗi có lý do | |
| TC-NF-005 | P1 | Performance | Kiểm homepage/network | Không request lỗi nghiêm trọng | |
| TC-NF-006 | P1 | Performance | Kiểm hot API latency | Trong ngưỡng chấp nhận | Cần team định ngưỡng |
| TC-NF-007 | P1 | Cache | Kiểm cache headers | Đúng policy | Navigation/homepage/sitemap/redirect |
| TC-NF-008 | P1 | Accessibility | Keyboard menu/modal/form | Dùng được bằng keyboard | |
| TC-NF-009 | P1 | Accessibility | Kiểm focus/contrast | Focus visible, contrast đủ | |
| TC-NF-010 | P0 | Security | Scan secret | Không commit `.env`, API key | |
| TC-NF-011 | P1 | Security | Input search/rich text | Không XSS cơ bản | |
| TC-NF-012 | P0 | Security | Admin mutation | Luôn cần auth/quyền | |

## 8. Ghi kết quả test

Mỗi test case khi chạy cần ghi:

- Status: Pass / Fail / Blocked / Not Run.
- Evidence: screenshot, video, log, API response.
- Bug ID nếu fail.
- Môi trường: local/staging/production smoke.
- Người test và ngày test.
