Files
Leonard-ThindPad-P50 2c7bcde741 improve BA skill
2026-09-09 06:34:57 +07:00

11 KiB

AC — Acceptance Criteria — US-003 Sửa số lượng / xoá sản phẩm trong giỏ hàng

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 §6 · BR_CartCheckout_v1.0.md §3
Scope US-003

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 — 13 AC, 4 nhóm (2 AC còn mở chờ OQ-028/OQ-032, ghi rõ thay vì bịa) —

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 Tăng/giảm số lượng, xoá dòng, xoá nhóm, xoá giỏ, huỷ modal 1/hành động 6
2. Validation Số lượng không hợp lệ; số lượng về 0 1/rule 2 (1 còn mở — OQ-028)
3. Lỗi hệ thống 5xx cập nhật, timeout xoá, item bị xoá đồng thời ≥1 3
4. Phân quyền Sửa/xoá CartItem không thuộc quyền sở hữu (Customer, Guest) ≥1/vai trò 2 (1 còn mở — OQ-032)

2. Danh sách AC

Nhóm 1 — Luồng thành công

AC-US003-01 — Tăng số lượng CartItem thành công

Liên quan SCR-04 · F01, C08, C09
Vai trò ROLE-02 (tương tự ROLE-01)
Given  CartItem X có quantity=2, Cart.status=active
When   tôi bấm nút "+" (F01) để tăng số lượng lên 3
Then   hệ thống gọi PATCH /v1/cart/items/{X} với quantity=3, nhận 200 OK
 And   F01 hiển thị 3; tạm tính nhóm (C08) và tổng cộng (C09) cập nhật lại ngay theo giá trị mới

AC-US003-02 — Giảm số lượng CartItem thành công (còn ≥1)

Given  CartItem X có quantity=3
When   tôi bấm nút "-" (F01) để giảm còn 2
Then   PATCH thành công, F01=2, C08/C09 cập nhật

AC-US003-03 — Xoá CartItem thành công (đã xác nhận modal)

Liên quan SCR-04 · C07, C08, C09
Vai trò ROLE-02
Given  CartItem X tồn tại trong nhóm seller "Shop A" (nhóm đang có 2 CartItem)
When   tôi bấm "Xoá" (C07) trên CartItem X, modal xác nhận hiện ra (theo UICONV §5), tôi bấm
       nút xác nhận trong modal
Then   hệ thống gọi DELETE /v1/cart/items/{X}, nhận 200/204
 And   dòng CartItem X biến mất khỏi danh sách; tạm tính nhóm "Shop A" (C08) cập nhật (còn
       1 CartItem); tổng cộng (C09) cập nhật

AC-US003-04 — Xoá CartItem cuối cùng của một nhóm seller

Given  nhóm seller "Shop B" chỉ có 1 CartItem
When   tôi xoá CartItem đó (đã xác nhận modal)
Then   toàn bộ khối nhóm "Shop B" (C02 + dòng CartItem) biến mất khỏi màn hình — không hiển
       thị một nhóm rỗng không có dòng nào

AC-US003-05 — Xoá CartItem cuối cùng của toàn giỏ hàng

Given  giỏ hàng chỉ còn duy nhất 1 CartItem (1 nhóm, 1 dòng)
When   tôi xoá CartItem đó (đã xác nhận modal)
Then   màn hình chuyển sang trạng thái "Giỏ hàng trống" (theo SRS §2.A.3.6); nút
       "Tiến hành Checkout" (C11) ẩn/disable
 And   Cart.status vẫn là active (KHÔNG tự chuyển abandoned — theo BR §3, chỉ hết hạn phiên
       mới chuyển abandoned)

AC-US003-06 — Huỷ modal xác nhận xoá

Given  modal xác nhận xoá CartItem X đang mở
When   tôi bấm nút huỷ hoặc đóng modal (không xác nhận)
Then   CartItem X vẫn còn nguyên trong danh sách; không có request DELETE nào được gửi

Nhóm 2 — Validation

AC-US003-07 — Nhập số lượng không phải số nguyên dương hợp lệ

Liên quan SCR-04 · F01
Vai trò ROLE-02
Given  CartItem X có quantity=2
When   tôi nhập trực tiếp vào F01 giá trị không hợp lệ (VD "-1", "1.5", "abc", để trống)
Then   hệ thống hiện lỗi inline dưới F01: "Số lượng phải là số nguyên từ 1 trở lên."
       (E-CART-0002)
 And   không gửi request PATCH; F01 giữ nguyên giá trị hợp lệ trước đó (không lưu giá trị lỗi)

AC-US003-08 — Giảm số lượng về 0 (🔴 chưa viết được đầy đủ — chờ OQ-028)

Given  CartItem X có quantity=1 (đã ở mức tối thiểu)
When   tôi bấm nút "-" hoặc nhập trực tiếp "0" vào F01
Then   🔴 CHƯA XÁC ĐỊNH — phụ thuộc OQ-028 (PO chưa chốt: (a) chặn nút "-"/nhập 0, hiện
       thông báo giữ tối thiểu 1, hay (b) tự động mở modal xác nhận xoá dòng)

QA không viết test case cho AC này cho tới khi OQ-028 được trả lời — đây là chỗ SRS chưa viết xong, không phải QA bỏ sót.


Nhóm 3 — Lỗi hệ thống

AC-US003-09 — Server lỗi 5xx khi cập nhật số lượng

Liên quan SCR-04 · F01
Vai trò ROLE-02
Given  CartItem X có quantity=2
When   tôi đổi thành 5 (bấm "+" 3 lần hoặc nhập tay) và PATCH /v1/cart/items/{X} trả 500
Then   hệ thống hiện banner lỗi tại dòng CartItem: "Không thể cập nhật giỏ hàng, thử lại."
       (E-CART-0006)
 And   🔴 F01 trở về giá trị trước đó (2), KHÔNG giữ giá trị đã nhập lỗi (5); nút +/- mở lại
       được bấm ngay

AC-US003-10 — Timeout khi xoá CartItem

Given  tôi bấm "Xoá" trên CartItem X (đã xác nhận modal)
When   request DELETE bị timeout theo ngưỡng NFR §1 (xem OQ-033)
Then   hệ thống hiện banner lỗi tại dòng: "Không thể cập nhật giỏ hàng, thử lại." (E-CART-0006)
 And   CartItem X vẫn hiển thị trong danh sách (không xoá khỏi giao diện khi chưa có xác nhận
       từ server); nút "Xoá" bấm lại được

AC-US003-11 — CartItem đã bị xoá bởi thao tác khác (đồng thời, VD 2 tab)

Given  CartItem X đang hiển thị trên màn hình của tôi, nhưng đã bị xoá khỏi giỏ hàng ở một
       tab/thiết bị khác trước đó
When   tôi bấm sửa số lượng (F01) hoặc bấm "Xoá" (C07) trên CartItem X
Then   PATCH/DELETE trả 404 ERR_NOT_FOUND hoặc 409 ERR_CONFLICT (xem API §4)
 And   hệ thống hiện banner "Sản phẩm này đã được xoá khỏi giỏ hàng trước đó." (E-CART-0003),
       sau đó ẩn dòng CartItem X khỏi danh sách và cập nhật lại C08/C09

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-US003-09
2 Timeout / mất mạng AC-US003-10
3 Dữ liệu bị người khác sửa/xoá trong lúc mình đang mở AC-US003-11

Nhóm 4 — Phân quyền

AC-US003-12 — Gọi thẳng API sửa/xoá CartItem không thuộc quyền sở hữu (Customer)

Liên quan SCR-04
Vai trò ROLE-02
Given  tôi đăng nhập ROLE-02 với customerId = A; CartItem Y thuộc Cart của customerId = B
When   tôi gọi thẳng PATCH /v1/cart/items/{Y} với token của A
Then   hệ thống trả 403 ERR_FORBIDDEN_OWNERSHIP (E-CART-0005), không cập nhật CartItem Y
 And   không có thông tin nào của CartItem Y bị lộ ra trong response lỗi

AC-US003-13 — Guest cố sửa/xoá CartItem không thuộc session của mình (🔴 chưa viết được đầy đủ — chờ OQ-032)

Given  tương tự AC-US003-12 nhưng với ROLE-01 (Guest): X-Guest-Session-Id = S1 của tôi,
       CartItem Z thuộc Cart của session S2
When   tôi gọi thẳng PATCH /v1/cart/items/{Z} với X-Guest-Session-Id: S1
Then   🔴 CHƯA XÁC ĐỊNH — đề xuất BA: trả 403 ERR_FORBIDDEN_OWNERSHIP (E-CART-0005) giống hệt
       AC-US003-12, cần Tech Lead xác nhận cơ chế đối chiếu session_id (OQ-032) trước khi coi
       AC này là chốt

🔴 Chặn ở giao diện là trải nghiệm, chặn ở backend mới là bảo mật. Cả hai AC nhóm này đều kiểm tra gọi thẳng API, không chỉ kiểm tra ẩn nút trên giao diện.


3. Bảng dữ liệu biên

Field Dưới ngưỡng Ngưỡng dưới Trong khoảng Ngưỡng trên Trên ngưỡng Rỗng Ký tự đặc biệt Khoảng trắng đầu/cuối
F01 Số lượng (≥1, ngưỡng trên chưa chốt — OQ-030) 0 → lỗi E-CART-0002 (hành vi cụ thể — OQ-028) 1 → OK 5 → OK 🔴 chưa có ngưỡng trên xác nhận — OQ-030 🔴 chưa có ngưỡng trên — OQ-030 Xoá trắng ô nhập → lỗi bắt buộc (E-CART-0002) "abc", "1.5", "-1" → lỗi E-CART-0002 N/A — F01 là input dạng số (type=number), không nhận khoảng trắng

4. Kịch bản kết hợp

# Kịch bản Các bước AC liên quan
S1 Sửa số lượng rồi xoá hết một nhóm seller SCR-04 (mở) → sửa số lượng CartItem của "Shop B" (tổng cập nhật) → xoá cả 2 CartItem còn lại của "Shop B" → nhóm "Shop B" biến mất, tổng cộng chỉ còn của "Shop A" AC-US003-01, 03, 04

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-US003-01 US-003 BR §3 CART F01, C08, C09 —
AC-US003-02 US-003 BR §3 CART F01, C08, C09 —
AC-US003-03 US-003 BR §3 CART C07, C08, C09 —
AC-US003-04 US-003 — C02, C07 —
AC-US003-05 US-003 BR §3 CART C07, C10, C11 —
AC-US003-06 US-003 — C07 —
AC-US003-07 US-003 — F01 E-CART-0002
AC-US003-08 US-003 — F01 E-CART-0002 (dự kiến) (chờ OQ-028)
AC-US003-09 US-003 — F01 E-CART-0006
AC-US003-10 US-003 — C07 E-CART-0006
AC-US003-11 US-003 — F01, C07 E-CART-0003
AC-US003-12 US-003 RBAC §6 — E-CART-0005
AC-US003-13 US-003 RBAC §6 — E-CART-0005 (dự kiến) (chờ OQ-032)

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 (2 AC còn mở, chờ OQ trước khi viết test case)
☐ Đủ 4 nhóm
☐ Bảng dữ liệu biên đủ dùng để viết test case
☐ 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