# Test Scenarios

## Mục đích

Test Scenarios là danh sách các tình huống cần kiểm thử ở mức nghiệp vụ/chức năng. Tài liệu này trả lời câu hỏi: “QA cần kiểm những tình huống nào để đủ phủ hệ thống?”.

**Ghi chú cách đọc:** Mỗi dòng là một tình huống kiểm thử. Tình huống chưa phải là bước test chi tiết. Khi chạy thực tế, QA dùng tài liệu `Test Cases` để biết preconditions, steps và expected cụ thể.

## Tổng quan phạm vi

| Nhóm | Số lượng scenario | Ghi chú |
|---|---:|---|
| Website Public | 35 | Bao phủ trang chủ, search, PLP, PDP, cart, checkout, blog, static page, SEO, responsive |
| Backend API | 35 | Bao phủ health, catalog, collection, product enrichment, SEO, promotions, blog, user, security |
| Admin/CDP | 40 | Bao phủ auth, permission, CMS, product enrichment, coupon/voucher, SEO, upload, stocktake, variance |
| Non-functional | 15 | Bao phủ build, performance, cache, accessibility, security, browser |

**Ghi chú:** Tổng cộng 125 scenarios. Nếu release scope nhỏ hơn, QA có thể lọc theo module nhưng không nên xóa scenario khỏi tài liệu gốc.

## 1. Website Public

| ID | Module | Scenario | Kết quả mong đợi |
|---|---|---|---|
| WEB-SC-001 | Trang chủ | Mở trang chủ `/` | Header, banner, flash sale, danh mục, sản phẩm nổi bật, tin tức, footer hiển thị đúng |
| WEB-SC-002 | Trang chủ | Homepage bundle thiếu một section | Section thiếu được ẩn an toàn, trang không crash |
| WEB-SC-003 | Header | Click logo | Điều hướng về trang chủ |
| WEB-SC-004 | Header | Mở mega menu desktop | Menu hiển thị đúng danh mục, không che nội dung bất thường |
| WEB-SC-005 | Header | Đóng mega menu bằng click ngoài | Menu đóng đúng |
| WEB-SC-006 | Header | Mở menu mobile | Menu mobile hiển thị đúng, cuộn được, không overlap |
| WEB-SC-007 | Search | Nhập keyword có sản phẩm | Hiển thị kết quả phù hợp |
| WEB-SC-008 | Search | Nhập keyword không có sản phẩm | Hiển thị empty state rõ ràng |
| WEB-SC-009 | Collection | Mở `/collections/[slug]` hợp lệ | Breadcrumb, filter, sort, grid sản phẩm hiển thị đúng |
| WEB-SC-010 | Collection | Mở collection slug không tồn tại | Hiển thị 404 hoặc empty state đúng |
| WEB-SC-011 | Collection | Thay đổi filter | URL/state cập nhật, sản phẩm lọc đúng |
| WEB-SC-012 | Collection | Thay đổi sort | Thứ tự sản phẩm cập nhật đúng |
| WEB-SC-013 | Collection | Load more/pagination | Không trùng sản phẩm, không mất filter hiện tại |
| WEB-SC-014 | Product Card | Kiểm tra card sản phẩm | Ảnh, tên, giá, giá giảm, badge, CTA hiển thị đúng |
| WEB-SC-015 | PDP | Mở `/products/[slug]` hợp lệ | Gallery, giá, tồn kho, specs, promotion, CTA hiển thị đúng |
| WEB-SC-016 | PDP | Mở product slug không tồn tại | Hiển thị 404 đúng |
| WEB-SC-017 | PDP | Đổi ảnh trong gallery | Ảnh chính cập nhật đúng |
| WEB-SC-018 | PDP | Tăng/giảm số lượng | Không cho số lượng âm hoặc vượt giới hạn hợp lệ |
| WEB-SC-019 | PDP | Click thêm vào giỏ | Cart count tăng, item vào giỏ |
| WEB-SC-020 | Cart | Mở `/gio-hang` khi có item | Danh sách item, số lượng, giá, tổng tiền đúng |
| WEB-SC-021 | Cart | Mở `/gio-hang-trong` | Empty state và gợi ý sản phẩm hiển thị |
| WEB-SC-022 | Cart | Tăng/giảm số lượng item | Tổng tiền cập nhật đúng |
| WEB-SC-023 | Cart | Xóa item | Item bị xóa, tổng tiền cập nhật, empty state nếu hết item |
| WEB-SC-024 | Cart | Áp voucher hợp lệ | Discount áp dụng đúng |
| WEB-SC-025 | Cart | Áp voucher sai/không đủ điều kiện | Hiển thị lỗi rõ, không áp sai discount |
| WEB-SC-026 | Checkout | Checkout desktop | Flow 3 bước: giỏ hàng -> thông tin giao hàng -> xác nhận -> thành công |
| WEB-SC-027 | Checkout | Checkout mobile | Flow 2 bước đúng, bottom sheet không che nút chính |
| WEB-SC-028 | Checkout | Submit thiếu thông tin bắt buộc | Validate đúng field, không cho đặt hàng |
| WEB-SC-029 | Checkout | Đặt hàng thành công | Điều hướng `/thanh-toan-thanh-cong`, thông tin đơn hàng hiển thị |
| WEB-SC-030 | Blog | Mở `/tin-tuc` | Listing bài viết và category hiển thị đúng |
| WEB-SC-031 | Blog | Mở bài viết chi tiết | Nội dung, TOC/sidebar/product grid nếu có hiển thị đúng |
| WEB-SC-032 | Static Pages | Mở giới thiệu/liên hệ/cửa hàng/chính sách | Nội dung render đúng, header/footer không lỗi |
| WEB-SC-033 | 404 | Mở route không tồn tại | Trang 404 hiển thị và có đường quay lại |
| WEB-SC-034 | Responsive | Kiểm tra 375px, 768px, 1440px | Không overlap, text không bị cắt, CTA bấm được |
| WEB-SC-035 | SEO | Kiểm tra metadata/canonical/JSON-LD | Metadata đúng page, canonical đúng URL |

## 2. Backend API

| ID | Module | Scenario | Kết quả mong đợi |
|---|---|---|---|
| API-SC-001 | Health | `GET /ping` | 200, response success, data `pong` |
| API-SC-002 | Health | `GET /version` | 200, có service/version |
| API-SC-003 | Catalog | `GET /v1/catalog/search` với keyword hợp lệ | Trả danh sách sản phẩm phù hợp |
| API-SC-004 | Catalog | Search keyword rỗng/sai | Trả empty hoặc validation đúng, không 500 |
| API-SC-005 | Catalog | `GET /v1/catalog/brands` | Trả danh sách brand đúng schema |
| API-SC-006 | Catalog | `GET /v1/catalog/categories` | Trả danh sách category đúng schema |
| API-SC-007 | Catalog | `GET /v1/catalog/products` có page/limit | Pagination đúng, không trùng item |
| API-SC-008 | Catalog | `GET /v1/catalog/products/:slug` hợp lệ | Trả product detail + enrichment |
| API-SC-009 | Catalog | Product slug không tồn tại | 404 hoặc error contract đúng |
| API-SC-010 | Catalog | `GET /v1/catalog/products/by-collection-slug/:slug` | Trả products, breadcrumb, filter, SEO meta |
| API-SC-011 | Catalog | `GET /v1/catalog/products/by-sku/:sku/reviews` | Trả review đúng schema |
| API-SC-012 | Catalog | ERP DSN thiếu | Route phụ thuộc ERP trả lỗi kiểm soát, không panic |
| API-SC-013 | Navigation | `GET /v1/catalog/navigation` | Trả mega-menu tree đúng |
| API-SC-014 | Homepage | `GET /v1/homepage/bundle` | Bundle đủ section, section rỗng không fail toàn bộ |
| API-SC-015 | Collection | `GET /v1/collections` | Trả danh sách collection |
| API-SC-016 | Collection | `GET /v1/collections/nav` | Trả collection navigation |
| API-SC-017 | Collection | `GET /v1/collections/slug/:slug` | Trả detail đúng slug |
| API-SC-018 | Collection | Tạo collection bằng admin token | Tạo thành công, breadcrumb/hierarchy đúng |
| API-SC-019 | Collection | Tạo collection không token | Bị 401/403 |
| API-SC-020 | ProductExt | `GET /v1/product-details/slug/:slug` | Trả enrichment theo slug |
| API-SC-021 | ProductExt | Admin tạo product detail | Ghi dữ liệu thành công |
| API-SC-022 | ProductExt | List images/badges/colors/relations | Trả đúng productId |
| API-SC-023 | SEO | `GET /v1/seo/metadata` | Trả metadata đúng filter |
| API-SC-024 | SEO | Redirect lookup path có redirect | Trả target/status code đúng |
| API-SC-025 | SEO | Redirect lookup path không tồn tại | Trả miss đúng contract |
| API-SC-026 | SEO | Sitemap products cursor | Cursor ổn định, limit đúng, không lặp |
| API-SC-027 | SEO | Sitemap collections cursor | Cursor ổn định, lastmod đúng |
| API-SC-028 | Promotions | `GET /v1/promotions/public` | Trả promotions đang public |
| API-SC-029 | Blog | Featured articles | Trả bài viết nổi bật đúng schema |
| API-SC-030 | User | Tạo/list/get user | Status code và validation đúng |
| API-SC-031 | User | Tạo/list address user | Address gắn đúng user |
| API-SC-032 | Admin Catalog | Legacy sync controls | Chỉ admin được gọi |
| API-SC-033 | Error Handling | Payload thiếu required field | 400/422, message rõ |
| API-SC-034 | Error Handling | Query param sai kiểu | 400, không 500 |
| API-SC-035 | Security | Không leak SQL/raw stack trace | Error response an toàn |

## 3. Admin/CDP

| ID | Module | Scenario | Kết quả mong đợi |
|---|---|---|---|
| ADM-SC-001 | Auth | Vào protected route khi chưa đăng nhập | Redirect/login/auth check đúng |
| ADM-SC-002 | Auth | Đăng nhập user hợp lệ | Vào dashboard/admin shell |
| ADM-SC-003 | Auth | Token hết hạn | Logout/refresh/redirect đúng |
| ADM-SC-004 | Layout | Mở/thu sidebar | Layout không vỡ, active menu đúng |
| ADM-SC-005 | Layout | Đổi route trong sidebar | Header/sidebar giữ state đúng |
| ADM-SC-006 | Permission | User thiếu quyền mở menu restricted | Không thấy menu hoặc bị chặn |
| ADM-SC-007 | Permission | User thiếu quyền gọi mutation | API/UI chặn đúng |
| ADM-SC-008 | Collection CMS | Tạo collection root | Collection lưu đúng |
| ADM-SC-009 | Collection CMS | Tạo collection con | Parent/breadcrumb đúng |
| ADM-SC-010 | Collection CMS | Đổi parent collection | Closure hierarchy/breadcrumb không hỏng |
| ADM-SC-011 | Product Enrichment | Tạo/sửa product detail | Public PDP đọc được dữ liệu mới |
| ADM-SC-012 | Product Enrichment | Upload/thêm ảnh sản phẩm | Gallery public cập nhật đúng |
| ADM-SC-013 | Product Enrichment | Sắp xếp ảnh sản phẩm | Thứ tự gallery đúng |
| ADM-SC-014 | Product Enrichment | Tạo badge/color/relation | API list trả đúng, UI public hiển thị đúng |
| ADM-SC-015 | Homepage CMS | Sửa banner | Homepage public cập nhật sau cache hợp lệ |
| ADM-SC-016 | Homepage CMS | Sửa flash sale | Product/time/status hiển thị đúng |
| ADM-SC-017 | Homepage CMS | Section không có data | Public site ẩn section an toàn |
| ADM-SC-018 | Coupon | Tạo coupon cơ bản | Lưu được, preview đúng |
| ADM-SC-019 | Coupon | Coupon theo sản phẩm/category | Targeting đúng |
| ADM-SC-020 | Coupon | Coupon hết hạn/chưa tới giờ | Không áp dụng được |
| ADM-SC-021 | Voucher | Available vouchers checkout | Trả voucher đúng user/cart |
| ADM-SC-022 | Voucher | Preview discount | Discount tính đúng, không vượt rule |
| ADM-SC-023 | SEO | Tạo/sửa metadata | Public API/page nhận metadata đúng |
| ADM-SC-024 | SEO | Tạo redirect | Lookup redirect đúng |
| ADM-SC-025 | Upload | Upload file hợp lệ | Thành công, URL dùng được |
| ADM-SC-026 | Upload | Upload file sai định dạng/quá lớn | Bị chặn, message rõ |
| ADM-SC-027 | Stocktake | Tạo/mở phiên kiểm kê | Session hiển thị đúng trạng thái |
| ADM-SC-028 | Stocktake | Scan IMEI match | Counter tăng, SKU match |
| ADM-SC-029 | Stocktake | Scan thiếu/thừa | Variance hiển thị đúng |
| ADM-SC-030 | Stocktake | Scan duplicate IMEI | Cảnh báo duplicate, counter không tăng |
| ADM-SC-031 | Stocktake | Scan unknown IMEI | Cho chọn SKU thủ công hoặc bỏ qua |
| ADM-SC-032 | Stocktake | Xóa scan đã lưu | Counter và variance cập nhật lại |
| ADM-SC-033 | Variance | QLCH gửi checklist | Phiếu chuyển trạng thái đúng |
| ADM-SC-034 | Variance | QC duyệt/từ chối | Chỉ role QC thấy action, timeline cập nhật |
| ADM-SC-035 | Variance | KT hạch toán | Chỉ role KT thấy action, có đủ context/timeline |
| ADM-SC-036 | Variance | User sai role mở detail | Không thấy CTA sai quyền |
| ADM-SC-037 | Notification/Toast | API lỗi | Toast/message rõ, không mất form data |
| ADM-SC-038 | Form Validation | Thiếu required field | Field error đúng, không submit |
| ADM-SC-039 | Optimistic Update | Mutation fail | Rollback UI đúng |
| ADM-SC-040 | Audit/Logs | Action quan trọng | Có log hoặc evidence theo thiết kế |

## 4. Non-functional

| ID | Module | Scenario | Kết quả mong đợi |
|---|---|---|---|
| NF-SC-001 | Build | Website public `pnpm build` | Pass |
| NF-SC-002 | Build | Admin frontend build/type-check | Pass |
| NF-SC-003 | Build | Backend `go build` | Pass |
| NF-SC-004 | Test | Backend `go test ./...` | Pass hoặc lỗi có lý do rõ |
| NF-SC-005 | Performance | Homepage load | Không có request lỗi nghiêm trọng, asset hợp lý |
| NF-SC-006 | Performance | Hot API latency | Catalog/navigation/homepage phản hồi trong ngưỡng chấp nhận |
| NF-SC-007 | Cache | Navigation/homepage/sitemap/redirect | Cache-Control đúng policy |
| NF-SC-008 | Accessibility | Keyboard navigation | Menu, modal, form dùng được bằng keyboard |
| NF-SC-009 | Accessibility | Focus state | Focus visible, không kẹt focus trong modal |
| NF-SC-010 | Accessibility | Contrast | Text/nút đủ tương phản |
| NF-SC-011 | Security | Secret scan | Không commit `.env`, API key, token |
| NF-SC-012 | Security | XSS input | Input rich text/search không inject script |
| NF-SC-013 | Security | Auth admin | Route mutation admin luôn cần auth/quyền |
| NF-SC-014 | Reliability | API partial failure | FE có fallback/empty/error state rõ |
| NF-SC-015 | Browser | Chrome/Edge desktop/mobile responsive | Không lỗi layout nghiêm trọng |
