Thông tin chung
| Dự án | 24H Station → Chagee · mobile_food_delivery |
| Phase | Phase 1 |
| URL kiểm thử | http://localhost:5050 · API https://24h-api.batnuocdodi.xyz |
Nguyên nhân gốc — 78 dòng đỏ dồn về 17 gốc
Bấm vào một gốc để lọc ra đúng những dòng test liên đới. Cột Mở khoá là số dòng sẽ xanh lại sau khi sửa gốc đó.
Sửa nhanh — mở khoá nhiều
R1 R2 R3
tổng 50 phút → mở khoá 21 dòng, không phụ thuộc gì
Phải đụng code
8
gốc — R1 R4 R5 R8 R9 R10 R11 R14 R15
Chỉ nhập dữ liệu
3
gốc — R2 R3 R6 R7 · không cần lập trình viên
Không phải bug
28
dòng — R12 chờ quyết định · R13 cần thiết bị
| Gốc | Vấn đề | Sửa ở đâu | Ai sửa | Công sức | Mở khoá | Bị chặn bởi |
|---|---|---|---|---|---|---|
| R1 | 🔴 ?platform=mobile gắn vào mọi lời gọi — route lõi Medusa từ chối tham số lạ |
medusa_mobile_api.dart:58xoá hằng _platformQuery |
Dev mobile | 5 phút | 11 dòng | — |
|
Tái hiện curl -X POST "$API/store/carts?platform=mobile" -d '{"region_id":"…"}'
# hiện: 400 Unrecognized fields: 'platform'
# bỏ ?platform ra → 200Nghiệm thu sau khi sửa Chạy lại TC-CART13: bấm Thêm vào giỏ trong app → giỏ hiện 1 món, không còn nút "Create Basket" |
||||||
| R2 | 🔴 Ô cấu hình dịch vụ gửi tin bỏ trống → máy chủ gọi vào 127.0.0.1:9101 |
Admin → Settings → Integration Settings → Mock Notify display endpoint → bật active | Người vận hành | 15 phút | 7 dòng | — |
|
Tái hiện curl -X POST "$API/store/auth/otp/send" -d '{"phone":"0912345678"}'
# hiện: 502 otp_display_failed · "fetch failed"Nghiệm thu sau khi sửa Chạy lại TC-AUTH01: ra 202 kèm challenge_id, mã hiện ở mock-notify |
||||||
| R3 | 🔴 Khu vực VN không có phương thức giao hàng nào | Admin → Settings → Shipping → tạo option cho region VN | Người vận hành | 30 phút | 3 dòng | — |
|
Tái hiện curl "$API/store/shipping-options?cart_id=<cart>"
# hiện: {"shipping_options": []}Nghiệm thu sau khi sửa Chạy lại TC-CART09: POST /carts/{id}/complete tạo được đơn |
||||||
| R4 | 🔴 runAction nuốt mọi lỗi + _debugError tắt ở bản release |
:6344-6367 hiện ApiException.message:4972 bỏ chặn kDebugMode |
Dev mobile | nửa ngày | 1 dòng | — |
|
Tái hiện Bấm Đăng ký bằng email đã tồn tại trong app # hiện: "We couldn't complete that action." # máy chủ thật ra đã trả: "Identity with email already exists" Nghiệm thu sau khi sửa Chạy lại TC-AUTH05: app hiện đúng lý do từ máy chủ, không phải câu chung chung |
||||||
| R5 | 🔴 VNPay đọc nhầm trường tổng tiền | route store/carts/[id]/payment/vnpay — đọc cart.total hoặc payment_collection.amount |
Dev backend | nửa ngày | 1 dòng | R1 · R3 |
|
Tái hiện curl -X POST "$API/store/carts/<cart>/payment/vnpay" # hiện: 422 "Cart/order total must be a positive number" # dù cart.total = 60000 và payment_collection.amount = 60000 Nghiệm thu sau khi sửa Chạy lại TC-CART08: trả về link thanh toán VNPay |
||||||
| R6 | 🟠 ipos-fabi/modifiers trả rỗng → món không có Size / Mức đá / Độ ngọt |
Dữ liệu tích hợp iPOS, hoặc gắn option thủ công trong Admin | Người vận hành | 1 ngày | 3 dòng | — |
|
Tái hiện curl "$API/store/ipos-fabi/products/<prod>/modifiers"
# hiện: {"ipos_fabi":{"modifiers":[]}}Nghiệm thu sau khi sửa Chạy lại TC-WF08: màn chi tiết món hiện đủ 3 nhóm tuỳ chọn |
||||||
| R7 | 🟠 Thiếu dữ liệu vận hành — 0 cửa hàng · 4/100 sản phẩm chưa gắn giá · route mẫu còn sót | Admin: tạo cửa hàng · gắn giá · gỡ /store/custom |
Người vận hành | 1 giờ | 3 dòng | — |
|
Tái hiện curl "$API/store/stores" # {"count": 0}
curl "$API/store/custom" # OK (route mẫu Medusa)Nghiệm thu sau khi sửa TC-DAT04 trả count > 0 · TC-DAT12 trả 404 |
||||||
| R8 | 🟠 Thêm món chưa gắn giá vào giỏ làm máy chủ trả 500 thay vì báo lỗi rõ | route store/carts/[id]/line-items — bắt lỗi thiếu giá, trả 400 kèm thông báo |
Dev backend | 2 giờ | 1 dòng | — |
|
Tái hiện curl -X POST "$API/store/carts/<cart>/line-items" \
-d '{"variant_id":"variant_01KWY3DTV6RDSZ885N7Q44E27H"}'
# hiện: 500 unknown_errorNghiệm thu sau khi sửa Chạy lại TC-CART03: trả 400 kèm câu "sản phẩm chưa có giá ở khu vực này" |
||||||
| R9 | 🔴 Google chưa nối deep-link cho máy thật · chưa có Sign in with Apple | google_auth_launcher.dart thêm app_links + URL schemeBackend thêm route Apple |
Dev mobile | 2–3 ngày | 3 dòng | — |
|
Tái hiện grep -n 'not wired' lib/src/core/google_auth_launcher.dart # chú thích trong mã tự ghi nhận grep -ri apple lib/ src/api/ # 0 kết quả Nghiệm thu sau khi sửa Đăng nhập Google trên máy thật quay lại được app · có nút Apple hoạt động |
||||||
| R10 | 🔴 Thiếu màn trong app: đặt lại mật khẩu · mở link thanh toán | Viết 2 màn mới, nối resetPassword và createVnpayPayment |
Dev mobile | 1–2 ngày | 2 dòng | R2 |
|
Tái hiện grep -rn 'resetPassword' lib/src/app/ # 0 kết quả grep -rn 'launchUrl' lib/ # chỉ google_auth_launcher.dart:34 Nghiệm thu sau khi sửa TC-AUTH13 có màn nhập mã + mật khẩu mới · TC-CART12 mở được trang VNPay |
||||||
| R11 | 🔴 /store/mobile-bootstrap chạy production nhưng mất mã nguồn |
src/cloudflare/ chỉ còn __tests__ — tìm lại worker hoặc viết lại |
Dev backend | chưa rõ | 1 dòng | — |
|
Tái hiện curl "$API/store/mobile-bootstrap" # 200, chạy tốt ls src/cloudflare/ # chỉ có __tests__ Nghiệm thu sau khi sửa Có mã nguồn worker trong repo, deploy lại được |
||||||
| R12 | 🔴 App đang chạy là Speedy Chow, không phải Chagee — 33 màn thiết kế chưa khởi công | Quyết định phạm vi: viết mới app Chagee, hay cải tạo app hiện tại | Cần quyết định | dự án | 27 dòng | — |
|
Tái hiện grep -n "title: '" lib/src/app/mobile_food_delivery_app.dart:26 # title: 'Speedy Chow' find mobile-chagee-clone/lib mobile/lib -name '*.dart' # 0 file Nghiệm thu sau khi sửa Không phải bug — cần PM chốt hướng trước khi ước lượng |
||||||
| R13 | ⚪ Xoay ngang chỉ kiểm được trên máy thật — web cố tình khoá khung 393px | :3859 SpeedyPhoneFrame · cần simulator iOS hoặc máy thật |
QA / thiết bị | 2 giờ | 1 dòng | — |
|
Tái hiện // mobile_food_delivery_app.dart:3859 final tight = !kIsWeb || constraints.maxWidth <= 430; Nghiệm thu sau khi sửa Chạy TC-WF36 trên iPhone thật, nội dung phủ kín khi xoay ngang |
||||||
| R14 | 🟠 Lộ API Base URL ra bản khách dùng |
:3105 — gỡ dòng này khỏi màn Profile |
Dev mobile | 5 phút | 1 dòng | — |
|
Tái hiện // mobile_food_delivery_app.dart:3105 title: 'API Base URL' // hiện công khai ở màn Tôi Nghiệm thu sau khi sửa Chạy lại TC-WF35: màn Tôi không còn dòng địa chỉ máy chủ |
||||||
| R15 | 🟠 Chuỗi hiển thị lẫn tiếng Anh trong app tiếng Việt | Việt hoá: Profile · Orders · Liked · Notification · Sign In · Search… | Dev mobile | 1 ngày | 1 dòng | — |
|
Tái hiện grep -nE "'(Orders|Liked|Notification|Profile|Sign In)'" \ lib/src/app/mobile_food_delivery_app.dart Nghiệm thu sau khi sửa Chạy lại TC-WF37: không còn chuỗi tiếng Anh nào lọt ra |
||||||
| R16 | 🔴 8 nút bấm vào không có gì xảy ra — không đổi màn, không báo lỗi, không phản hồi gì | Nối sự kiện bấm cho: 4 bộ lọc đơn hàng · Refresh Orders · Tải lại · Lưu · gỡ hẳn dòng API Base URL | Dev mobile | 1 ngày | 8 dòng | — |
|
Tái hiện Mở app → tab Đơn hàng → bấm lần lượt All / Active / Completed / Cancelled # màn hình không đổi, nút không sáng lên, danh sách không lọc Đăng nhập → tab Tôi → sửa tên → bấm "Lưu" # không có gì xảy ra, không báo thành công cũng không báo lỗi Nghiệm thu sau khi sửa Chạy lại TC-UI01→TC-UI08: mỗi nút phải đổi trạng thái nhìn thấy được, hoặc hiện thông báo cho khách biết đã bấm trúng |
||||||
| R17 | 🟠 4 màn mở ra không có tiêu đề — khách không biết đang ở đâu, không có nút quay lại rõ ràng | Thêm SpeedyHeader cho màn chi tiết món và 3 màn Đổi SĐT / email / mật khẩu |
Dev mobile | 2 giờ | 4 dòng | — |
|
Tái hiện Trang chủ → bấm thẻ "Combo Thảm Dã Ngoại" # màn mở ra, không có tiêu đề Đăng nhập → tab Tôi → bấm "Đổi email" # màn mở ra, không có tiêu đề Nghiệm thu sau khi sửa Chạy lại TC-UI09→TC-UI12: mỗi màn hiện đúng tên ở thanh trên cùng |
||||||
Phase 1 — Kết quả kiểm thử (115 dòng)
Mục
Nguyên nhân
Ai sửa
Loại
| Mã | Gốc | Chức năng | Kịch bản | Kết quả mong đợi | Kết quả thực tế | Trạng thái | Hình ảnh minh họa |
|---|---|---|---|---|---|---|---|
| 1 · Hệ thốngmáy chủ · Admin · web · app còn sống không, và app gửi request có đúng chuẩn máy chủ nhận không12 dòng 6 đạt5 hỏng1 cảnh báo | |||||||
| TC-SYS01 | — | Hệ thốngHạ tầngAPI | Gọi GET /health trên máy chủ chính | HTTP 200 | HTTP 200 | Pass | ![]() |
| TC-SYS02 | — | Hệ thốngHạ tầngWeb | Mở trang Admin | Trả 200 hoặc chuyển hướng đăng nhập | HTTP 302 → trang đăng nhập | Pass | ![]() |
| TC-SYS03 | — | Hệ thốngHạ tầngWeb | Mở Storefront | HTTP 200 | HTTP 200 | Pass | ![]() |
| TC-SYS04 | — | Hệ thốngHạ tầngWeb | Mở Mobile web bản deploy | HTTP 200 | HTTP 200 | Pass | ![]() |
| TC-SYS05 | R2notify chưa cấu hình | Hệ thốngHạ tầngAPI | Gọi dịch vụ gửi tin nhắn notify.batnuocdodi.xyz | Trả 200, hoặc 401/403 khi thiếu khoá | HTTP 403 {"ok":false,"error":"forbidden"} — dịch vụ vẫn sống, đòi x-notify-key. Nhưng máy chủ chính không hề gọi tới địa chỉ này | Warning | ![]() |
| TC-API01 | R1tham số platform | Hệ thốngTương thích APIAPI | Gọi POST /store/carts kèm ?platform=mobile — đúng như app gửi | 200, tạo được giỏ | 400 "Unrecognized fields: 'platform'". Bỏ tham số đó ra thì 200 ngay | Fail | ![]() |
| TC-API02 | R1tham số platform | Hệ thốngTương thích APIAPI | Gọi GET /store/products kèm ?platform=mobile | 200, trả danh sách sản phẩm | 400 "Unrecognized fields: 'platform'" | Fail | ![]() |
| TC-API03 | R1tham số platform | Hệ thốngTương thích APIAPI | Gọi GET /store/regions kèm ?platform=mobile | 200, trả khu vực | 400 "Unrecognized fields: 'platform'" | Fail | ![]() |
| TC-API04 | — | Hệ thốngTương thích APIAPI | Gọi GET /store/mobile-menu kèm ?platform=mobile | 200 | 200 — route tự viết bỏ qua tham số lạ, nên nhóm route này không bị ảnh hưởng | Pass | ![]() |
| TC-API05 | R1tham số platform | Hệ thốngTương thích APIAPI | Quét toàn bộ 8 route lõi Medusa mà app gọi, có và không có ?platform=mobile | Cả 8 đều 200 trong cả hai trường hợp | 8/8 hỏng khi có tham số: products · regions · shipping-options · payment-providers · POST carts · GET carts/{id} · POST carts/{id} · payment-collections — tất cả 200 → 400 | Fail | ![]() |
| TC-API06 | — | Hệ thốngTương thích APIAPI | Quét toàn bộ 13 route tự viết của dự án, có và không có ?platform=mobile | Không bị ảnh hưởng bởi tham số lạ | 13/13 giữ nguyên kết quả — mobile-bootstrap, mobile-menu, sales-policy, stores, stores/nearest, google/config, account/me, account/orders, account/loyalty, vnpay/status, promotion-engine/evaluate, promotion-engine/apply, payment/vnpay | Pass | ![]() |
| TC-WF38 | R12app không phải Chagee | Hệ thốngDự ánMã nguồn | Kiểm 3 thư mục app trong dự án | App Chagee có mã nguồn và chạy được | mobile-food-delivery có mã nguồn nhưng là app "Speedy Chow" giao đồ ăn. mobile-chagee-clone và mobile đều 0 file .dart — 13 màn Chagee chưa được khởi công | Fail | ![]() |
| 2 · Dữ liệu nềntrong hệ thống đã có đủ sản phẩm, giá, cửa hàng, khu vực, cách giao hàng, tuỳ chọn món chưa12 dòng 6 đạt2 hỏng4 cảnh báo | |||||||
| TC-DAT01 | — | Dữ liệu nềnDữ liệuAPI | GET /store/products?limit=100 | Có danh sách sản phẩm | 200 — 100 sản phẩm | Pass | ![]() |
| TC-DAT02 | — | Dữ liệu nềnDữ liệuAPI | GET /store/mobile-menu | Có thực đơn cho app | 200 — item_count: 43 | Pass | ![]() |
| TC-DAT03 | — | Dữ liệu nềnDữ liệuAPI | GET /store/regions | Có khu vực dùng tiền VND | 200 — 2 khu vực, có VND | Pass | ![]() |
| TC-DAT04 | R7thiếu dữ liệu | Dữ liệu nềnDữ liệuAPI | GET /store/stores | Có ít nhất 1 cửa hàng | 200 — {"count": 0}, không có cửa hàng nào | Fail | ![]() |
| TC-DAT05 | R3thiếu giao hàng VN | Dữ liệu nềnDữ liệuAPI | GET /store/shipping-options?cart_id=… | Có ít nhất 1 phương thức giao hàng cho VN | 200 — {"shipping_options": []} rỗng | Fail | ![]() |
| TC-DAT06 | R7thiếu dữ liệu | Dữ liệu nềnDữ liệuAPI | Kiểm giá sản phẩm ở khu vực VND | 100/100 sản phẩm có giá | 99/100 có giá. Promotion E2E Coffee có calculated_price: null | Warning | ![]() |
| TC-DAT07 | R11mất mã nguồn | Dữ liệu nềnDữ liệuAPI | GET /store/mobile-bootstrap | Trả cache_version + region | 200 — trả đủ. Nhưng src/cloudflare/ chỉ còn __tests__, mất mã nguồn worker | Warning | ![]() |
| TC-DAT08 | — | Dữ liệu nềnDữ liệuAPI | GET /store/sales-policy | Trả chính sách bán hàng | 200 | Pass | ![]() |
| TC-DAT09 | — | Dữ liệu nềnDữ liệuAPI | GET /store/payment-providers?region_id=… | Có cổng thanh toán | 200 — pp_system_default | Pass | ![]() |
| TC-DAT10 | — | Dữ liệu nềnDữ liệuAPI | GET /store/stores/{id} với mã cửa hàng không tồn tại | 404 kèm thông báo rõ | 404 — {"stores":{"error":"Store not found"}} | Pass | ![]() |
| TC-DAT11 | R6modifiers rỗng | Dữ liệu nềnDữ liệuAPI | GET /store/ipos-fabi/products/{id}/modifiers — lấy topping / size / mức đá | Trả danh sách tuỳ chọn cho món | 200 nhưng modifiers: [] rỗng. Đây chính là lý do màn chi tiết món chỉ có 1 lựa chọn "Default" (xem TC-WF08, TC-WF18) | Warning | ![]() |
| TC-DAT12 | R7thiếu dữ liệu | Dữ liệu nềnDữ liệuAPI | GET /store/custom | Không nên tồn tại trên môi trường chạy thật | 200 — trả chuỗi OK. Route mẫu của Medusa còn sót trên production, chưa gỡ | Warning | ![]() |
| 3 · Tài khoảnđăng ký · đăng nhập (OTP, email, Google, Apple) · quên và đổi mật khẩu · đổi email/SĐT · hồ sơ · chặn người lạ xem dữ liệu42 dòng 18 đạt15 hỏng7 cảnh báo2 chưa test | |||||||
| TC-AUTH01 | R2notify chưa cấu hình | Tài khoảnĐăng nhập OTPAPI | POST /store/auth/otp/send với số hợp lệ | 202 + challenge_id, mã được gửi đi | 502 otp_display_failed — "fetch failed". Máy chủ tạo được mã nhưng không gửi được rồi vứt mã đi | Fail | ![]() |
| TC-AUTH02 | R2notify chưa cấu hình | Tài khoảnĐăng nhập OTPAPI | POST /store/auth/otp/verify với mã đúng | 200 + token phiên | Không thực hiện được — bước gửi mã đã hỏng nên không có mã nào để nhập | Chưa test | ![]() |
| TC-AUTH03 | — | Tài khoảnĐăng kýAPI | POST /store/auth/email/register với email mới | 201 + token + hồ sơ khách | 201 — tạo tài khoản thành công | Pass | ![]() |
| TC-AUTH04 | — | Tài khoảnĐăng kýAPI | Đăng ký với email đã tồn tại | Từ chối và nêu rõ lý do | 422 email_register_failed — "Identity with email already exists" | Pass | ![]() |
| TC-AUTH05 | R4app nuốt lỗi | Tài khoảnĐăng kýMobile web | Bấm Đăng ký trong app với email đã tồn tại | App hiện "Email này đã được đăng ký" | App hiện "We couldn't complete that action." — nuốt mất lý do thật máy chủ đã trả về | Fail | ![]() |
| TC-AUTH06 | — | Tài khoảnĐăng kýAPI | Đăng ký với mật khẩu rỗng | 400 nêu rõ yêu cầu mật khẩu | 400 invalid_email_register_payload — "email and password with at least 8 characters are required" | Pass | ![]() |
| TC-AUTH07 | — | Tài khoảnĐăng kýAPI | Đăng ký với tên chỉ 1 từ (last_name rỗng) | Chấp nhận, không chặn | 201 — last_name: null, không chặn | Pass | ![]() |
| TC-AUTH08 | — | Tài khoảnĐăng nhập emailAPI | POST /store/auth/email/login đúng mật khẩu | 200 + access_token + refresh_token | 200 — token 569 ký tự | Pass | ![]() |
| TC-AUTH09 | — | Tài khoảnĐăng nhập emailAPI | Đăng nhập sai mật khẩu | 401, không tiết lộ email có tồn tại hay không | 401 "Invalid email or password" — giống hệt nhau cho email có thật và email không tồn tại | Pass | ![]() |
| TC-AUTH10 | — | Tài khoảnĐăng nhập emailMobile web | Đăng nhập trong app rồi mở màn Tôi | Vào được hồ sơ khách | 200 → /account/me → /account/loyalty → hiện "AUD Probe · No tier · 0 Points" + Đổi SĐT / Đổi email / Đổi mật khẩu / Đăng xuất / Xoá tài khoản | Pass | ![]() |
| TC-AUTH11 | R2notify chưa cấu hình | Tài khoảnQuên mật khẩuAPI | POST /store/auth/password/forgot | 202 kèm delivery, mã tới tay khách | 202 nhưng thiếu trường delivery — giả vờ thành công, mã không bao giờ được gửi | Fail | ![]() |
| TC-AUTH12 | R2notify chưa cấu hình | Tài khoảnĐặt lại mật khẩuAPI | POST /store/auth/password/reset với mã hợp lệ | 200, đổi được mật khẩu | Không thực hiện được — không nhận được mã do TC-AUTH11 hỏng | Chưa test | ![]() |
| TC-AUTH13 | R10thiếu màn hình | Tài khoảnĐặt lại mật khẩuMobile web | Tìm màn đặt lại mật khẩu trong app | Có màn nhập mã + mật khẩu mới | Không tồn tại — resetPassword khai báo trong tầng dữ liệu nhưng không màn hình nào gọi. "Quên mật khẩu?" là ngõ cụt | Fail | ![]() |
| TC-AUTH14 | — | Tài khoảnPhiên đăng nhậpAPI | POST /store/auth/session/refresh với token rác | 401 | 401 "Invalid refresh token" | Pass | ![]() |
| TC-AUTH15 | — | Tài khoảnPhiên đăng nhậpAPI | POST /store/auth/session/logout | 200, thu hồi phiên | 200 — logged_out: true | Pass | ![]() |
| TC-AUTH16 | R9Google/Apple | Tài khoảnGoogleAPI | GET /store/auth/google/config | Trả client_id + redirect_uri đúng môi trường | 200 nhưng redirect_uri = http://localhost:5050 — địa chỉ máy local, không phải domain đã deploy | Warning | ![]() |
| TC-AUTH17 | — | Tài khoảnGoogleAPI | POST /store/auth/google/callback với mã rác | 401 | 401 "Google token exchange failed: 400" | Pass | ![]() |
| TC-AUTH18 | R9Google/Apple | Tài khoảnGoogleMobile app | Đăng nhập Google trên iOS/Android thật | Sau khi đồng ý, quay lại app kèm mã | Chưa nối deep-link nên mã không quay lại được. Chính chú thích trong mã nguồn ghi "native round-trip is not wired yet" | Fail | ![]() |
| TC-AUTH19 | R9Google/Apple | Tài khoảnAppleMobile app | Đăng nhập bằng Apple | Có nút và luồng hoạt động | Không tồn tại — 0 route phía máy chủ, 0 nút phía app. Apple guideline 4.8 sẽ từ chối phát hành | Fail | ![]() |
| TC-AUTH20 | — | Tài khoảnBảo mậtAPI | GET /store/account/me không kèm token | 401 | 401 | Pass | ![]() |
| TC-AUTH21 | — | Tài khoảnBảo mậtAPI | GET /store/account/orders không kèm token | 401 | 401 | Pass | ![]() |
| TC-AUTH22 | — | Tài khoảnBảo mậtAPI | GET /store/account/loyalty không kèm token | 401 | 401 | Pass | ![]() |
| TC-AUTH23 | — | Tài khoảnBảo mậtMobile web | App ở localhost:5050 gọi API khác domain | Preflight cho phép | 204 + Access-Control-Allow-Origin: http://localhost:5050 | Pass | ![]() |
| TC-AUTH24 | — | Tài khoảnHồ sơAPI | GET /store/account/me có token | Trả thông tin khách | 200 — đúng email đã đăng nhập | Pass | ![]() |
| TC-AUTH25 | — | Tài khoảnHồ sơAPI | GET /store/account/orders có token | Trả danh sách đơn | 200 — count: 0 | Pass | ![]() |
| TC-AUTH26 | — | Tài khoảnHồ sơAPI | GET /store/account/loyalty có token | Trả điểm thưởng | 200 — 0 điểm, chưa có hạng | Pass | ![]() |
| TC-AUTH27 | R2notify chưa cấu hình | Tài khoảnĐổi emailAPI | POST /store/account/email/change/send — gửi mã xác thực để đổi email | 202, mã tới tay khách | 502 email_change_otp_failed — "fetch failed". Cùng gốc với lỗi OTP: máy chủ không gọi được dịch vụ gửi tin | Fail | ![]() |
| TC-AUTH28 | R2notify chưa cấu hình | Tài khoảnĐổi số điện thoạiAPI | POST /store/account/phone/change/send — gửi mã xác thực để đổi SĐT | 202, mã tới tay khách | 502 phone_change_otp_failed — "fetch failed". Cùng gốc với lỗi OTP | Fail | ![]() |
| TC-AUTH29 | — | Tài khoảnĐổi mật khẩuAPI | POST /store/auth/password/change khi đang đăng nhập | 200, đổi được và thu hồi phiên cũ | 200 — password_changed: true, session_revoked: true. Các lời gọi sau đó bằng token cũ trả 401 customer_session_revoked, đúng chuẩn bảo mật | Pass | ![]() |
| TC-WF04 | R12app không phải Chagee | Tài khoảnĐăng nhậpMobile web | Mở luồng đăng nhập | Bảng trượt lên từ dưới, tiêu đề "CHÀO MỪNG": chọn mã vùng +84 · số điện thoại · mã giới thiệu · nút TIẾP TỤC · icon Email / Apple · 2 ô tick đồng ý điều khoản | Trang riêng chiếm cả màn, tiêu đề "Đăng nhập": 2 nút Điện thoại/Email · ô số điện thoại không có chọn +84 · "Gửi mã OTP" · "Tiếp tục với Google". Thiếu mã giới thiệu, Apple, 2 ô tick | Fail | ![]() |
| TC-WF05 | R12app không phải Chagee | Tài khoảnĐăng nhậpMobile web | Chọn đăng nhập bằng Email | Bảng "Nhập địa chỉ email": email · mã giới thiệu · TIẾP TỤC — không dùng mật khẩu | Tab Email: chọn Đăng nhập/Đăng ký · email · mật khẩu · "Quên mật khẩu?" — khác hẳn mô hình thiết kế | Fail | ![]() |
| TC-WF09 | R12app không phải Chagee | Tài khoảnChặn đăng nhậpMobile web | Bấm thêm vào giỏ khi chưa đăng nhập | Bật bảng "CHÀO MỪNG" mời đăng nhập | Có chặn thật — nhưng đẩy sang trang đăng nhập riêng thay vì bảng trượt lên. Đúng logic, sai hình thức | Warning | ![]() |
| TC-WF12 | R12app không phải Chagee | Tài khoảnTài khoảnMobile web | Bấm tab "Tôi" khi chưa đăng nhập | Bật bảng "CHÀO MỪNG" | Ra màn "Profile" · thẻ "Chào bạn 👋" · nút "Đăng nhập / Đăng ký" | Fail | ![]() |
| TC-WF13 | R12app không phải Chagee | Tài khoảnTài khoảnMobile web | Xem màn "Tôi" ở chế độ khách vãng lai | Hạng FRIEND · Tea Leaves 0 · Voucher 0 · Câu hỏi thường gặp | Có "Help Center" + "API Base URL — https://24h-api.batnuocdodi.xyz". Không có FRIEND, Tea Leaves, Voucher, FAQ | Fail | ![]() |
| TC-WF28 | R12app không phải Chagee | Tài khoảnTài khoản (đã ĐN)Mobile web | Mở màn "Tôi" sau khi đăng nhập | FRIEND · hạng thành viên + tiến trình lên hạng · ô Tea Leaves / Voucher · FAQ · icon QR | Màn "Profile": tên khách · No tier · 0 Points · 0 Lifetime · History · Đổi SĐT / Đổi email / Đổi mật khẩu / Đăng xuất / Xoá tài khoản. Thiếu: hạng FRIEND, tiến trình lên hạng, ô Tea Leaves/Voucher, FAQ, QR | Warning | ![]() |
| TC-WF31 | R12app không phải Chagee | Tài khoảnCài đặtMobile web | Mở màn Cài đặt từ icon ⚙ | Quốc gia · Ngôn ngữ · Quyền truy cập · Xóa tài khoản · Điều khoản · ĐĂNG XUẤT | Không có icon ⚙, không có màn Cài đặt riêng. Chỉ có Đăng xuất + Xoá tài khoản nằm rời trong màn Profile. Thiếu Quốc gia, Ngôn ngữ, Quyền truy cập, Điều khoản | Warning | ![]() |
| TC-UI06 | R16nút không phản hồi | Tài khoảnHồ sơMobile web | Sửa tên rồi bấm Lưu | Lưu thành công và báo cho khách biết | Không có gì xảy ra — không báo thành công, không báo lỗi. Khách không biết đã lưu hay chưa | Fail | ![]() |
| TC-UI07 | R16nút không phản hồi | Tài khoảnHồ sơMobile web | Bấm Tải lại ở màn hồ sơ | Nạp lại thông tin từ máy chủ | Không có gì xảy ra | Fail | ![]() |
| TC-UI08 | R16nút không phản hồi | Tài khoảnHồ sơMobile web | Bấm dòng API Base URL | Dòng này không nên bấm được — là thông tin kỹ thuật | Trông như nút bấm được nhưng bấm không làm gì. Xem thêm TC-WF35 | Fail | ![]() |
| TC-UI10 | R17màn thiếu tiêu đề | Tài khoảnĐổi số điện thoạiMobile web | Tab Tôi → bấm Đổi số điện thoại | Màn hiện tiêu đề "Đổi số điện thoại" | Màn không có tiêu đề | Warning | ![]() |
| TC-UI11 | R17màn thiếu tiêu đề | Tài khoảnĐổi emailMobile web | Tab Tôi → bấm Đổi email | Màn hiện tiêu đề "Đổi email" | Màn không có tiêu đề | Warning | ![]() |
| TC-UI12 | R17màn thiếu tiêu đề | Tài khoảnĐổi mật khẩuMobile web | Tab Tôi → bấm Đổi mật khẩu | Màn hiện tiêu đề "Đổi mật khẩu" | Màn không có tiêu đề | Warning | ![]() |
| 4 · Xem thực đơntrang chủ · danh mục · chi tiết món — so cả trước và sau khi đăng nhập12 dòng 11 hỏng1 cảnh báo | |||||||
| TC-WF01 | R12app không phải Chagee | Xem thực đơnMàn chàoMobile web | Mở app lần đầu | Màn chào CHAGEE + bảng chọn quốc gia (Indonesia / Malaysia / Singapore…), bấm CONTINUE | Không có màn này — vào thẳng trang chủ. Tìm toàn bộ mã nguồn: 0 kết quả cho "select market", "country", "welcome to" | Fail | ![]() |
| TC-WF02 | R12app không phải Chagee | Xem thực đơnTrang chủMobile web | Xem trang chủ khi chưa đăng nhập | Nút Đăng nhập · cờ VN · 2 ô lớn TỰ ĐẾN LẤY / GIAO HÀNG · 4 phím tắt (Voucher, Giới Thiệu, Sưu Tập, Calories) · 4 tab dưới | "Deliver to / Select Your Location" · banner ICE CREAM DAY 40% OFF · ô Search · 8 ô danh mục · "Special Offers" · 5 tab. Thiếu nút Đăng nhập, TỰ ĐẾN LẤY/GIAO HÀNG, 4 phím tắt | Fail | ![]() |
| TC-WF03 | R12app không phải Chagee | Xem thực đơnTrang chủMobile web | Cuộn trang chủ xuống | Dải banner khuyến mãi: combo cổ điển · sưu tập tem · thưởng giới thiệu | Cuộn ra lưới sản phẩm. Không có banner nào trong 3 loại đó | Fail | ![]() |
| TC-WF06 | R12app không phải Chagee | Xem thực đơnThực đơnMobile web | Mở tab "Đặt món" | Thực đơn chia đôi: TỰ ĐẾN LẤY / GIAO HÀNG · chọn cửa hàng · cột danh mục bên trái + thẻ combo bên phải | Không có tab "Đặt món". Bấm ô danh mục ở trang chủ ra lưới 2 cột, chỉ có nút Quay lại + Làm mới | Fail | ![]() |
| TC-WF07 | R12app không phải Chagee | Xem thực đơnThực đơnMobile web | Cuộn thực đơn | Danh sách dọc: ảnh · tên · nhãn "Bestseller" · giá · nút + thêm nhanh | Lưới 2 cột, không có nút + trên thẻ sản phẩm | Fail | ![]() |
| TC-WF08 | R6modifiers rỗng | Xem thực đơnChi tiết mónMobile web | Bấm vào 1 món trong thực đơn | Chọn Size · Mức đá · Độ ngọt · số lượng · 2 nút riêng THÊM VÀO GIỎ và ĐẶT HÀNG | Chỉ có 1 lựa chọn duy nhất ghi "Default" · nút −/+ · 1 nút hiện giá tiền. Không có Size, Mức đá, Độ ngọt | Fail | ![]() |
| TC-WF14 | R12app không phải Chagee | Xem thực đơnTrang chủ (đã ĐN)Mobile web | Xem trang chủ ngay sau khi đăng nhập | "Xin chào, Friend" + chip hạng thành viên · ô Tea Leaves / Voucher · PICKUP/DELIVERY · 4 phím tắt · icon QR góc phải | Trang chủ giống hệt lúc chưa đăng nhập — vẫn "Deliver to / Select Your Location", banner kem, 8 ô danh mục. Không có lời chào, không hạng, không Tea Leaves/Voucher, không QR | Fail | ![]() |
| TC-WF15 | R12app không phải Chagee | Xem thực đơnTrang chủ (đã ĐN)Mobile web | Cuộn trang chủ xuống sau khi đăng nhập | Danh sách banner khuyến mãi (combo · sưu tập tem · giới thiệu…) | Lưới sản phẩm, giống hệt trạng thái chưa đăng nhập | Fail | ![]() |
| TC-WF16 | R12app không phải Chagee | Xem thực đơnThực đơn (đã ĐN)Mobile web | Mở thực đơn sau khi đăng nhập | Thực đơn chia đôi + "Chuẩn bị N ly · ~N phút" (sức chứa/thời gian chờ) + "thu thập tem 0/6" | Không có tab thực đơn. Không có thông tin thời gian chờ, không có tem | Fail | ![]() |
| TC-WF17 | R12app không phải Chagee | Xem thực đơnThực đơn (đã ĐN)Mobile web | Xem thực đơn dạng danh sách sau khi đăng nhập | Danh sách dọc có ảnh · tên · giá · nút thêm nhanh | Lưới 2 cột, không đổi so với lúc chưa đăng nhập | Fail | ![]() |
| TC-WF18 | R6modifiers rỗng | Xem thực đơnChi tiết món (đã ĐN)Mobile web | Bấm 1 món để tuỳ chỉnh | Chọn Size · Mức đá · Độ ngọt · số lượng · 2 nút Thêm vào giỏ / Đặt hàng | Vẫn chỉ 1 lựa chọn "Default 499,000 VND" · nút −/+ · 1 nút giá. Không đổi so với lúc chưa đăng nhập | Fail | ![]() |
| TC-UI09 | R17màn thiếu tiêu đề | Xem thực đơnChi tiết mónMobile web | Từ trang chủ bấm thẻ combo để mở chi tiết món | Màn hiện tên món ở thanh trên cùng | Màn không có tiêu đề — chỉ có nút Back trơn | Warning | ![]() |
| 5 · Đặt đồtạo giỏ → thêm món → điền địa chỉ → chọn cách giao → bấm đặt hàng9 dòng 4 đạt5 hỏng | |||||||
| TC-CART01 | — | Đặt đồGiỏ hàngAPI | POST /store/carts với khu vực VND | Tạo giỏ, tiền tệ vnd | 200 — cart_01KZ31CQ…, currency vnd | Pass | ![]() |
| TC-CART02 | — | Đặt đồGiỏ hàngAPI | Thêm 2 phần "Burger Gà Yo" (có giá) vào giỏ | Giỏ có 1 dòng, tổng 60.000đ | 200 — total = 60000, items = 1 | Pass | ![]() |
| TC-CART03 | R8lỗi 500 khi thiếu giá | Đặt đồGiỏ hàngAPI | Thêm món chưa gắn giá vào giỏ | Báo lỗi rõ: "sản phẩm chưa có giá ở khu vực này" | 500 unknown_error — máy chủ lỗi, không nêu lý do. Tái hiện với variant_01KWY3DTV6RDSZ885N7Q44E27H | Fail | ![]() |
| TC-CART04 | — | Đặt đồĐặt hàngAPI | Điền địa chỉ giao hàng (quốc gia vn) | Lưu được địa chỉ | 200 | Pass | ![]() |
| TC-CART05 | R3thiếu giao hàng VN | Đặt đồĐặt hàngAPI | Lấy phương thức giao hàng cho giỏ đã có địa chỉ | Có ít nhất 1 lựa chọn để chọn | 200 — {"shipping_options": []}. Không có gì để chọn | Fail | ![]() |
| TC-CART09 | R3thiếu giao hàng VN | Đặt đồĐặt hàngAPI | POST /store/carts/{id}/complete | Tạo được đơn hàng | 400 — "No shipping method selected but the cart contains items that require shipping." KHÔNG TẠO ĐƯỢC ĐƠN | Fail | ![]() |
| TC-CART10 | — | Đặt đồKhuyến mãiAPI | POST /store/promotion-engine/evaluate | Trả mức giảm giá | 200 — totalDiscount: 0 | Pass | ![]() |
| TC-CART13 | R1tham số platform | Đặt đồGiỏ hàngMobile web | Bấm "Thêm vào giỏ" ngay trong app (đã đăng nhập) | Tạo giỏ và thêm món vào giỏ | App không tạo nổi giỏ hàng. POST /store/carts?platform=mobile → 400 "Invalid request: Unrecognized fields: 'platform'". Màn giỏ hiện "Create Basket" + "0 VND" + câu lỗi chung chung. Không mua được gì từ app | Fail | ![]() |
| TC-WF19 | R1tham số platform | Đặt đồGiỏ hàngMobile web | Bấm THÊM VÀO GIỎ HÀNG → xem giỏ trượt lên | Sheet giỏ hàng: "✓ 1 SẢN PHẨM" · Xóa Tất Cả · dòng món (ảnh · tên · tuỳ chọn · ✎ sửa · giá · số lượng) · thanh dưới túi + tổng tiền + KIỂM TRA LẠI | Không vào được giỏ. Màn "My Basket" hiện nút "Create Basket" + "0 VND" + câu lỗi chung chung. Nguyên nhân: POST /store/carts?platform=mobile trả 400 | Fail | ![]() |
| 6 · Thanh toánmở phiên thanh toán · chọn cổng · VNPay · màn quét mã QR9 dòng 3 đạt6 hỏng | |||||||
| TC-CART06 | — | Thanh toánThanh toánAPI | POST /store/payment-collections | Tạo phiên đúng số tiền của giỏ | 200 — amount = 60000 | Pass | ![]() |
| TC-CART07 | — | Thanh toánThanh toánAPI | Chọn cổng thanh toán pp_system_default | Tạo được payment session | 200 | Pass | ![]() |
| TC-CART08 | R5VNPay sai tiền | Thanh toánThanh toánAPI | POST /store/carts/{id}/payment/vnpay | Trả link thanh toán VNPay | 422 payment_creation_failed — "Cart/order total must be a positive number" dù cart.total = 60000 và payment_collection.amount = 60000. Route đang đọc nhầm trường | Fail | ![]() |
| TC-CART11 | — | Thanh toánThanh toánAPI | GET /store/vnpay/status?cart_id=… | Trả trạng thái thanh toán | 200 — status: pending | Pass | ![]() |
| TC-CART12 | R10thiếu màn hình | Thanh toánThanh toánMobile web | Tìm chỗ mở link thanh toán VNPay trong app | App mở trình duyệt sang trang VNPay | Không tồn tại — createVnpayPayment và getVnpayStatus khai báo nhưng không màn hình nào gọi. url_launcher chỉ dùng cho đăng nhập Google | Fail | ![]() |
| TC-WF20 | R1tham số platform | Thanh toánĐặt hàngMobile web | Xem màn tóm tắt "Đơn hàng của bạn" | Cửa hàng + địa chỉ · thời gian nhận món · tóm tắt đơn · phí bao bì · voucher · tem · chi tiết thanh toán · nút THANH TOÁN | Không tới được — chặn từ bước tạo giỏ (TC-WF19) | Fail | ![]() |
| TC-WF21 | R1tham số platform | Thanh toánThanh toánMobile web | Cuộn xuống phần chọn phương thức thanh toán | Tổng thanh toán · Thẻ Quốc tế / Thẻ Nội địa / VietQR · Liên hệ · Ghi chú đơn hàng | Không tới được — chặn từ bước tạo giỏ | Fail | ![]() |
| TC-WF22 | R1tham số platform | Thanh toánThanh toánMobile web | Khách chưa liên kết SĐT bấm thanh toán | Sheet gợi ý liên kết số điện thoại để nhận voucher (+84 · SĐT · TIẾP TỤC) | Không tới được — chặn từ bước tạo giỏ | Fail | ![]() |
| TC-WF23 | R1tham số platform | Thanh toánThanh toánMobile web | Thanh toán bằng quét mã QR | Màn Quét mã QR: thẻ THANH TOÁN ĐA NĂNG chứa mã QR + mã giao dịch · Chia sẻ / Tải xuống · danh sách app ngân hàng hỗ trợ | Không tới được — chặn từ bước tạo giỏ. Ngoài ra app cũng không có chỗ nào mở link thanh toán (xem TC-CART12) | Fail | ![]() |
| 7 · Đơn hàng của tôilịch sử đơn · 4 bộ lọc trạng thái · đánh giá đơn · đặt hàng lại11 dòng 10 hỏng1 cảnh báo | |||||||
| TC-WF10 | R12app không phải Chagee | Đơn hàng của tôiĐơn hàngMobile web | Bấm tab "Đơn hàng" khi chưa đăng nhập | Bật bảng "CHÀO MỪNG" | Ra màn "Orders" viết tiếng Anh · bộ lọc All/Active/Completed/Cancelled · nút "Sign In" · dòng "Sign in to view your orders." | Fail | ![]() |
| TC-WF11 | R12app không phải Chagee | Đơn hàng của tôiĐơn hàngMobile web | Bỏ qua đăng nhập rồi xem danh sách đơn | "KHÔNG CÓ ĐƠN HÀNG." + Bạn chưa đặt mua bất cứ thứ gì + nút Đặt ngay | Không có trạng thái rỗng này, không có nút Đặt ngay | Fail | ![]() |
| TC-WF24 | R12app không phải Chagee | Đơn hàng của tôiĐơn hàng (đã ĐN)Mobile web | Khách mới chưa có đơn, mở tab Đơn hàng | Trạng thái rỗng "KHÔNG CÓ ĐƠN HÀNG" | Có trạng thái rỗng nhưng viết tiếng Anh: màn "Orders" · "No orders — You haven't placed any orders yet." · nút "Refresh Orders" | Warning | ![]() |
| TC-WF25 | R1tham số platform | Đơn hàng của tôiĐơn hàng (đã ĐN)Mobile web | Xem đơn đã hoàn thành / bị huỷ | Thẻ đơn: cửa hàng · ngày giờ · trạng thái · dòng món (tuỳ chọn · giá · số lượng) + 2 nút ĐÁNH GIÁ / ĐẶT HÀNG LẠI | Không kiểm được — không tạo nổi đơn nào để có dữ liệu (TC-CART09, TC-WF19) | Fail | ![]() |
| TC-WF26 | R12app không phải Chagee | Đơn hàng của tôiĐánh giáMobile web | Bấm ĐÁNH GIÁ trên một đơn đã xong | Màn đánh giá: cửa hàng · 5 sao · ô Thêm bình luận (0/500) · thêm ảnh 0/3 · dòng đồng ý liên hệ · nút Gửi | Không tồn tại — không có màn đánh giá trong app | Fail | ![]() |
| TC-WF27 | R12app không phải Chagee | Đơn hàng của tôiĐặt lại đơnMobile web | Bấm ĐẶT HÀNG LẠI trên đơn cũ | Quay về thực đơn + giỏ hàng đã nạp sẵn món cũ, số lượng cộng dồn, tổng tiền cập nhật | Không tồn tại — không có nút đặt lại đơn | Fail | ![]() |
| TC-UI01 | R16nút không phản hồi | Đơn hàng của tôiĐơn hàngMobile web | Bấm bộ lọc All ở màn Đơn hàng | Nút sáng lên, danh sách lọc lại | Không có gì xảy ra — màn hình không đổi, nút không đổi trạng thái | Fail | ![]() |
| TC-UI02 | R16nút không phản hồi | Đơn hàng của tôiĐơn hàngMobile web | Bấm bộ lọc Active | Nút sáng lên, chỉ hiện đơn đang xử lý | Không có gì xảy ra | Fail | ![]() |
| TC-UI03 | R16nút không phản hồi | Đơn hàng của tôiĐơn hàngMobile web | Bấm bộ lọc Completed | Nút sáng lên, chỉ hiện đơn đã xong | Không có gì xảy ra | Fail | ![]() |
| TC-UI04 | R16nút không phản hồi | Đơn hàng của tôiĐơn hàngMobile web | Bấm bộ lọc Cancelled | Nút sáng lên, chỉ hiện đơn đã huỷ | Không có gì xảy ra | Fail | ![]() |
| TC-UI05 | R16nút không phản hồi | Đơn hàng của tôiĐơn hàngMobile web | Bấm Refresh Orders khi đã đăng nhập | Tải lại danh sách đơn, có dấu hiệu đang tải | Không có gì xảy ra — không quay vòng, không gọi API nào | Fail | ![]() |
| 8 · Khách hàng thân thiếtTea Leaves (điểm thưởng) · ví Voucher2 dòng 2 hỏng | |||||||
| TC-WF29 | R12app không phải Chagee | Khách hàng thân thiếtTea LeavesMobile web | Ở màn Tôi bấm ô TEA LEAVES | Màn điểm: tổng điểm · Xem chi tiết · 2 tab Lịch sử Tea Leaves / Lịch sử quy đổi · lưới ưu đãi đổi điểm (có trạng thái BÁN HẾT) | Không tồn tại — không có ô Tea Leaves để bấm, không có màn điểm thưởng | Fail | ![]() |
| TC-WF30 | R12app không phải Chagee | Khách hàng thân thiếtVoucherMobile web | Ở màn Tôi bấm ô VOUCHER | Màn voucher: nút Thêm Voucher + · lịch sử 🕐 · trạng thái rỗng "KHÔNG CÓ PHIẾU GIẢM GIÁ." | Không tồn tại — không có ô Voucher, không có ví voucher | Fail | ![]() |
| 9 · Giao diện & điều hướngthanh tab dưới · ngôn ngữ hiển thị · xoay ngang màn hình · lộ thông tin kỹ thuật ra bản khách6 dòng 4 hỏng1 cảnh báo1 chưa test | |||||||
| TC-WF32 | R12app không phải Chagee | Giao diện & điều hướngThông báoMobile web | Mở màn Thông báo từ icon 🔔 | Danh sách thông báo (nội dung để placeholder) | Có màn "Notification" nhưng viết tiếng Anh, mở từ tab dưới chứ không phải icon 🔔. Nội dung rỗng: "No notifications yet — Order updates and offers will appear here when available." | Warning | ![]() |
| TC-WF33 | R12app không phải Chagee | Giao diện & điều hướngChọn quốc giaMobile web | Mở bảng chọn quốc gia từ icon tròn hình cờ | Sheet chọn quốc gia + nút GỬI | Không tồn tại — không có icon cờ, không có bảng chọn quốc gia ở bất kỳ đâu | Fail | ![]() |
| TC-WF34 | R12app không phải Chagee | Giao diện & điều hướngĐiều hướngMobile web | Đếm số tab ở thanh dưới cùng | 4 tab: Trang chủ · Đặt món · Đơn hàng · Tôi | 5 tab: Trang chủ · Đơn hàng · Yêu thích · Thông báo · Tôi. Thiếu "Đặt món", thừa 2 tab và cả hai đều rỗng | Fail | ![]() |
| TC-WF35 | R14lộ URL máy chủ | Giao diện & điều hướngBảo mậtMobile web | Kiểm thông tin kỹ thuật lộ ra bản khách dùng | Không hiển thị địa chỉ máy chủ hay thông tin gỡ lỗi | Màn "Tôi" hiển thị công khai "API Base URL — https://24h-api.batnuocdodi.xyz" | Fail | ![]() |
| TC-WF36 | R13cần máy thật | Giao diện & điều hướngGiao diệnMobile app | Xoay ngang màn hình | Nội dung phủ kín màn hình, không thừa viền hai bên | Không kiểm được qua web — app cố tình khoá khung 393px khi chạy trình duyệt rộng > 430px. Cần máy thật hoặc simulator iOS. Lỗi ghi nhận 16/07 chưa thể xác nhận lại | Chưa test | ![]() |
| TC-WF37 | R15lẫn tiếng Anh | Giao diện & điều hướngNgôn ngữMobile web | Kiểm ngôn ngữ hiển thị toàn app | Toàn bộ tiếng Việt | Lẫn tiếng Anh: Profile · Orders · Liked · Notification · Sign In · Search · View All · "No favourites yet" · "Order history" · "We couldn't complete that action." | Fail | ![]() |
Kết luận
Chặn phát hành
- App không tạo nổi giỏ hàng — nặng nhất. App gắn
?platform=mobilevào mọi lời gọi, mà route lõi Medusa từ chối tham số lạ và trả 400. Hậu quả: không thêm được món, không mua được gì, và toàn bộ 10 màn giỏ/thanh toán trong thiết kế không tới được (TC-CART13,TC-API01→TC-API03,TC-WF19→TC-WF23). Sửa: bỏ_platformQueryởmedusa_mobile_api.dart:58— đã có sẵn headerx-24h-platformlàm đúng việc này. - Không tạo được đơn hàng — khu vực Việt Nam không có phương thức giao hàng nào, nên bước cuối bị chặn cứng (
TC-CART05,TC-CART09). - Đăng nhập bằng OTP chết hoàn toàn — máy chủ không biết địa chỉ dịch vụ gửi tin nhắn. Cùng một ô cấu hình bỏ trống này làm chết 4 chức năng: đăng nhập OTP, quên mật khẩu, đổi email, đổi số điện thoại (
TC-AUTH01). - VNPay đọc nhầm số tiền — báo "tổng tiền phải lớn hơn 0" dù giỏ có 60.000đ (
TC-CART08). - App đang chạy không phải app trong thiết kế — thiết kế vẽ Chagee, app thật là "Speedy Chow" (
TC-WF38). - Thiếu đăng nhập bằng Apple — Apple guideline 4.8 sẽ từ chối (
TC-AUTH19).
Việc chỉ cần nhập dữ liệu, không cần lập trình viên
- Tạo phương thức giao hàng cho khu vực Việt Nam — quan trọng nhất, làm xong là khách đặt được hàng.
- Điền địa chỉ dịch vụ gửi tin nhắn: Admin → Settings → Integration Settings → mục "Mock Notify display endpoint" → bật trạng thái active.
- Tạo dữ liệu cửa hàng (hiện đang 0 cửa hàng).
- Gỡ hoặc gắn giá cho sản phẩm test cũ
Promotion E2E Coffee.
Phần chạy tốt
- Đăng nhập bằng email + mật khẩu chạy hoàn hảo, đã thử thật trên app và vào được hồ sơ (
TC-AUTH10). - Chặn truy cập dữ liệu khách khác hoạt động đúng — 3/3 route trả 401 khi không có token (
TC-AUTH20→TC-AUTH22). - Giỏ hàng, tính tiền, phiên thanh toán đều đúng số tiền (
TC-CART01,TC-CART02,TC-CART06).
Vấn đề khiến khó tìm ra lỗi
- App hiện cùng một câu tiếng Anh cho mọi loại lỗi, và bản phát hành không ghi lại nhật ký nào. Máy chủ trả về lý do chính xác nhưng app vứt đi (
TC-AUTH05). /store/mobile-bootstrapđang chạy trên production nhưng không còn mã nguồn trong dự án (TC-DAT07).- Cách kiểm màn hình ngang mà quy định dự án đưa ra không thể phát hiện được lỗi nó đang truy (
TC-WF36).
Dữ liệu thử đã tạo trên máy chủ dev
- 2 tài khoản:
aud007-probe-20260803@example.com,aud007-probe-b-20260803@example.com - 5 giỏ hàng thử + 1 phiên thanh toán. Không có đơn hàng nào được tạo.
- Chưa xoá — chờ xác nhận.





































































































