Files
sys-analysis-design/ba-output/e-commerce/03-specification/AC_US-002_v1.0.md
Leonard-ThindPad-P50 2c7bcde741 improve BA skill
2026-09-09 06:34:57 +07:00

216 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AC — Acceptance Criteria — US-002 Xem giỏ hàng nhóm theo seller
| | |
|---|---|
| **Version** | 1.0 |
| **Date** | 2026-09-08 |
| **Author** | BA (qua skill ba-3-specification) |
| **Status** | 🟡 Draft |
| **Approved by** | QA: — *(chưa có QA thật tham gia lần chạy này)* |
| **Source** | `SRS_US002-003_v1.0.md` · `RBAC_CartCheckout_v1.0.md` §2, §6 |
| **Scope** | US-002 |
## Change Log
| Version | Date | Người sửa | Thay đổi | CR |
|---|---|---|---|---|
| 1.0 | 2026-09-08 | BA (qua skill ba-3-specification) | Bản đầu — 6 AC, 4 nhóm | — |
---
## 1. Bốn nhóm bắt buộc
| Nhóm | Nội dung | Tối thiểu | Số AC đã viết |
|---|---|---|---|
| 1. Luồng thành công | Xem giỏ hàng nhóm theo seller | 1/hành động | 2 |
| 2. Validation | Không áp dụng — US-002 không có input do người dùng nhập, chỉ hiển thị (xem lý do dưới) | — | 0 (N/A có lý do) |
| 3. Lỗi hệ thống | Timeout, 5xx, phân biệt "rỗng thật" vs "không tải được" | ≥1 | 2 |
| 4. Phân quyền | Không đủ quyền, hết phiên | ≥1/vai trò bị chặn | 2 |
**Vì sao Nhóm 2 (Validation) ghi N/A:** US-002 là hành động **xem** thuần tuý (`SCR-04` khi mở màn hình) — không có trường nào do người dùng nhập trong phạm vi US-002 (nhập số lượng thuộc US-003, xem `AC_US-003_v1.0.md`). Đây không phải "chỉ có nhóm 1" (vi phạm nguyên tắc), vì Nhóm 3 và Nhóm 4 đã viết đủ.
---
## 2. Danh sách AC
### Nhóm 1 — Luồng thành công
#### AC-US002-01 — Xem giỏ hàng có nhiều seller
| | |
|---|---|
| **Liên quan** | SCR-04 · C01, C02, C03–C06, C08, C09, C11 |
| **Vai trò** | ROLE-02 Customer (hành vi tương tự với ROLE-01 Guest, khác ở định danh `X-Guest-Session-Id` thay JWT) |
```
Given tôi đăng nhập với ROLE-02 (Customer) và giỏ hàng của tôi (Cart.status=active) có 5 CartItem:
3 CartItem thuộc seller "Shop A", 2 CartItem thuộc seller "Shop B"
When tôi mở SCR-04 (Giỏ hàng)
Then hệ thống hiển thị đúng 2 nhóm theo seller ("Shop A", "Shop B"), mỗi nhóm hiển thị đúng
số CartItem thuộc nhóm đó
And tạm tính mỗi nhóm (C08) bằng Σ (quantity × đơn giá hiển thị) của các CartItem trong
nhóm đó
And tổng cộng giỏ hàng (C09) bằng Σ tất cả C08
And nút "Tiến hành Checkout" (C11) hiển thị và không bị disable
```
**Dữ liệu mẫu để test:**
| Field | Giá trị |
|---|---|
| Shop A — CartItem 1 | quantity=2, đơn giá=100.000 ₫ |
| Shop A — CartItem 2 | quantity=1, đơn giá=50.000 ₫ |
| Shop A — CartItem 3 | quantity=1, đơn giá=75.000 ₫ |
| Shop A — tạm tính (C08) kỳ vọng | 2×100.000 + 1×50.000 + 1×75.000 = 325.000 ₫ |
| Shop B — CartItem 1 | quantity=1, đơn giá=200.000 ₫ |
| Shop B — CartItem 2 | quantity=2, đơn giá=30.000 ₫ |
| Shop B — tạm tính (C08) kỳ vọng | 1×200.000 + 2×30.000 = 260.000 ₫ |
| Tổng cộng (C09) kỳ vọng | 325.000 + 260.000 = 585.000 ₫ |
#### AC-US002-02 — Xem giỏ hàng rỗng
| | |
|---|---|
| **Liên quan** | SCR-04 · C10, C11 |
| **Vai trò** | ROLE-01, ROLE-02 |
```
Given tôi đăng nhập với ROLE-02 và giỏ hàng của tôi không có CartItem nào (Cart.status=active,
0 dòng)
When tôi mở SCR-04
Then hệ thống hiển thị trạng thái "Giỏ hàng trống" (khoá cart.empty.title) và nút
"Tiếp tục mua sắm" (C10)
And nút "Tiến hành Checkout" (C11) không hiển thị/bị disable — theo §2.A.3.6 của SRS
```
---
### Nhóm 2 — Validation
*N/A — xem lý do ở mục 1.*
---
### Nhóm 3 — Lỗi hệ thống
#### AC-US002-03 — Lỗi hệ thống khi tải giỏ hàng
| | |
|---|---|
| **Liên quan** | SCR-04 · C12, C13 |
| **Vai trò** | ROLE-01, ROLE-02 |
```
Given tôi đăng nhập với ROLE-02
When tôi mở SCR-04 và GET /v1/cart trả về 500/503 hoặc timeout (ngưỡng — xem NFR §1, OQ-033)
Then hệ thống hiển thị banner lỗi "Không tải được dữ liệu, thử lại." (E-CART-0004) tại vùng
danh sách
And nút "Thử lại" (C13) hiển thị; bấm vào gọi lại GET /v1/cart
```
Ba tình huống tối thiểu của nhóm này:
| # | Tình huống | AC |
|---|---|---|
| 1 | Server trả 5xx | AC-US002-03 |
| 2 | Timeout / mất mạng | AC-US002-03 |
| 3 | Dữ liệu bị người khác sửa/xoá trong lúc mình đang mở | Không áp dụng ở US-002 (chỉ xem, không sửa) — xem `AC_US-003_v1.0.md` §3 Nhóm 3 (`AC-US003-11`) cho trường hợp này khi có thao tác sửa/xoá |
#### AC-US002-04 — Phân biệt "giỏ hàng chưa từng có dữ liệu" và "không tải được"
| | |
|---|---|
| **Liên quan** | SCR-04 · C10, C12 |
| **Vai trò** | ROLE-02 |
```
Given tôi đăng nhập với ROLE-02 lần đầu, chưa từng thêm sản phẩm nào vào giỏ (Cart mới tạo,
0 CartItem); GET /v1/cart trả 200 với danh sách rỗng
When tôi mở SCR-04
Then hệ thống hiển thị trạng thái "Giỏ hàng trống" (không phải banner lỗi C12)
And hai trạng thái "giỏ hàng trống thật" (AC-US002-02/04) và "không tải được" (AC-US002-03)
dùng hai khối hiển thị khác nhau (data-state khác nhau trong WF), không dùng chung một
thông điệp — kiểm chứng bằng cách tắt mạng khi mở màn hình lần đầu (kỳ vọng thấy banner
lỗi, KHÔNG phải "Giỏ hàng trống")
```
---
### Nhóm 4 — Phân quyền
#### AC-US002-05 — Guest chỉ thấy giỏ hàng của session mình
| | |
|---|---|
| **Liên quan** | SCR-04 |
| **Vai trò** | ROLE-01 |
```
Given tôi là Guest với X-Guest-Session-Id = S1; một Guest khác có giỏ hàng thuộc session S2
(không phải của tôi)
When tôi gọi GET /v1/cart với header X-Guest-Session-Id: S1
Then hệ thống chỉ trả về giỏ hàng gắn với S1 (dữ liệu của chính tôi), không có cách nào lộ
dữ liệu của S2 qua endpoint này (endpoint không nhận cartId của người khác qua tham số)
```
#### AC-US002-06 — Customer hết phiên đăng nhập cố xem giỏ hàng
| | |
|---|---|
| **Liên quan** | SCR-04, SCR-08 (đăng nhập) |
| **Vai trò** | ROLE-02 |
```
Given tôi trước đó đã đăng nhập và có giỏ hàng theo customer_id; nay access token đã hết hạn
(401 ERR_AUTH_INVALID_TOKEN)
When tôi mở SCR-04
Then hệ thống chuyển hướng về màn đăng nhập (SCR-08)
And giữ đường dẫn quay lại SCR-04 sau khi đăng nhập thành công (theo UICONV §2)
```
---
## 3. Bảng dữ liệu biên
*N/A — US-002 không có field nhập liệu (chỉ xem). Xem `AC_US-003_v1.0.md` §4 cho F01 (số lượng).*
---
## 4. Kịch bản kết hợp
| # | Kịch bản | Các bước | AC liên quan |
|---|---|---|---|
| S1 | Mở giỏ hàng nhiều seller rồi tiến hành checkout | SCR-04 (mở, kiểm tra tổng đúng) → bấm "Tiến hành Checkout" (C11) → điều hướng SCR-05 (chỉ kiểm tra điều hướng, ngoài phạm vi hành vi SCR-05) | AC-US002-01 |
---
## 5. Truy vết
| AC | US | BR | Field/Thành phần | Mã lỗi | Test case (QA điền) | Kết quả (QA điền) |
|---|---|---|---|---|---|---|
| AC-US002-01 | US-002 | — | C01, C02, C03–C06, C08, C09, C11 | — | | |
| AC-US002-02 | US-002 | BR §3 CART | C10, C11 | — | | |
| AC-US002-03 | US-002 | — | C12, C13 | E-CART-0004 | | |
| AC-US002-04 | US-002 | — | C10, C12 | E-CART-0004 | | |
| AC-US002-05 | US-002 | RBAC §2 | — | — | | |
| AC-US002-06 | US-002 | — | — | — | | |
---
## 6. Xác nhận của QA
| | |
|---|---|
| **Người xác nhận** | *(chưa có — chưa có QA thật tham gia lần chạy này)* |
| **Ngày** | — |
| ☐ Mọi AC đều test được (không có AC mô tả cảm tính) | |
| ☐ Đủ 4 nhóm (Nhóm 2 N/A có lý do) | |
| ☐ Bảng dữ liệu biên đủ dùng để viết test case (N/A — không có field ở US-002) | |
| ☐ Không có AC nào mâu thuẫn với AC khác | |
**AC bị QA từ chối:**
| AC | Lý do từ chối | BA sửa thế nào |
|---|---|---|
| | | |