← Quay lại mục lục

Bài 26 — Đăng ký → Admin duyệt → Đăng nhập

Luồng nghiệp vụ end-to-end với 5 màn hình: register → pending → admin approve/reject → login → dashboard. Test state transition, auth guard, validation cross-screen.

Khó #system #multi-screen #state-transition #auth-guard #end-to-end #validation

🏢 Bài 26: Đăng ký tài khoản → Admin duyệt → Đăng nhập

Đây là bài system-level đầu tiên — không còn 1 form đơn lẻ, mà là một luồng nghiệp vụ end-to-end với nhiều màn hình. Học viên cần test toàn bộ luồng, bao gồm cả chuyển trạng thái, bypass URL, ràng buộc cross-screen.

📊 Sơ đồ flow

    ┌──────────┐  submit   ┌──────────┐  admin    ┌──────────┐
    │ register │ ────────→ │ pending  │  approve  │  login   │
    │ (Screen 1)│           │(Screen 2)│ ────────→ │(Screen 4)│
    └──────────┘           └────┬─────┘           └────┬─────┘
                                │                       │ login OK
                          "Tôi là admin"               ↓
                                ↓                ┌──────────┐
                          ┌──────────┐           │dashboard │
                          │  admin   │           │(Screen 5)│
                          │(Screen 3)│           └──────────┘
                          └──────────┘

📋 Đặc tả từng màn hình

🟦 Screen 1 — Register (Đăng ký)

FieldYêu cầu
EmailBắt buộc, đúng format x@y.z, tối đa 150 ký tự, KHÔNG có khoảng trắng đầu/cuối (phải trim()).
Họ và tênBắt buộc, 2–150 ký tự.
Số điện thoạiBắt buộc, đúng 10 chữ số bắt đầu bằng 0. VD: 0901234567.
Mật khẩuBắt buộc, tối thiểu 6 ký tự, tối đa 72.
Nhập lại mật khẩuPhải khớp với mật khẩu.
Email trùngNếu email đã tồn tại trong hệ thống → báo lỗi Email đã tồn tại.

Submit thành công → hiện message Đăng ký thành công! Vui lòng chờ admin duyệt. rồi chuyển sang Screen 2 (pending). Account được tạo với status = pending.

🟨 Screen 2 — Pending (Chờ duyệt)

  • Hiển thị: Tài khoản <email> đang chờ admin duyệt.
  • Có nút "Kiểm tra trạng thái" để refresh — hiển thị status hiện tại.
  • Có link "Đăng nhập" dẫn đến Screen 4.
  • Có link "Tôi là admin" dẫn đến Screen 3.

🟧 Screen 3 — Admin Panel

  • Hiển thị bảng danh sách các account có status = pending: email, họ tên, số điện thoại, ngày tạo.
  • Mỗi dòng có 2 nút:
    • ✅ Approve — set status = active. Sau approve, account biến mất khỏi danh sách pending.
    • ❌ Reject — set status = rejected. Account vẫn lưu trong hệ thống nhưng không cho login. Sau reject, account biến mất khỏi danh sách pending.
  • Có thể xem cả tab "Đã duyệt" và "Đã từ chối" để track lịch sử.

🟩 Screen 4 — Login (Đăng nhập)

Tình huốngXử lý mong đợi
Email rỗng / password rỗngBáo lỗi Vui lòng nhập đầy đủ email và mật khẩu.
Email không tồn tạiBáo lỗi Email hoặc mật khẩu không đúng.
Sai mật khẩuBáo lỗi Email hoặc mật khẩu không đúng.
Account pendingBáo lỗi Tài khoản chưa được duyệt. Vui lòng chờ admin. — KHÔNG cho login.
Account rejectedBáo lỗi Tài khoản đã bị từ chối. Liên hệ admin.
Account active + đúng passwordLogin thành công → chuyển sang Screen 5 (dashboard).

🟪 Screen 5 — Dashboard

  • Hiển thị: Welcome, <Họ tên>!
  • Có nút "Đăng xuất" → trở về Screen 4.
  • Auth guard: Nếu chưa login mà gõ trực tiếp URL ?screen=dashboard, phải bị redirect về Screen 4.

🎯 Test scenarios cần cover

  1. Happy path: Register → admin Approve → Login → Dashboard → Logout.
  2. Pending login: Register → KHÔNG approve → Login ngay → phải bị chặn.
  3. Rejected login: Register → admin Reject → Login → phải bị chặn với message khác.
  4. Validation: Test biên các field (email format, phone đủ/thiếu số, password dưới 6 ký tự, tên 1 ký tự…).
  5. Email duplicate: Đăng ký 2 lần cùng email → lần 2 phải bị chặn.
  6. Email whitespace: Nhập " user@gmail.com " → kiểm tra hệ thống có trim không.
  7. Direct URL access: Khi chưa login, gõ ?screen=dashboard trên thanh URL → phải bị redirect.
  8. Reject persistence: Account bị reject → admin có thể xem lại trong tab "Đã từ chối"?
  9. Approve sau Reject: Reject 1 account, sau đó admin có thể approve lại không?

💡 Kỹ thuật test áp dụng

  • End-to-end: Test toàn bộ flow từ A → Z.
  • State Transition: Account đi qua các state pending → active, pending → rejected. Mỗi state có hành vi khác.
  • Equivalence Partitioning: Phone đúng/thiếu/dư số, email valid/invalid format.
  • Boundary Value: Tên 1, 2, 150, 151 ký tự; password 5, 6, 72, 73 ký tự.
  • Security: Direct URL access bypass, login với account chưa duyệt.
  • UX: Đọc kỹ tất cả message — chính tả, đúng nội dung.

📝 Template bug report

STTMô tảBước tái hiệnThực tếMong đợiMức độ
1(học viên điền)
⚠️ Lưu ý: Bài này có cài cắm 6 bug phân bố ở nhiều màn hình khác nhau. Đặc biệt chú ý các bug giao tiếp giữa screen (luồng nghiệp vụ) — đó là khác biệt chính so với bài form đơn.
💡 Mẹo: Dùng nút "↺ Reset scenario" ở đầu form để xóa toàn bộ state và bắt đầu lại từ đầu — rất hữu ích khi muốn test lại flow nhiều lần với data sạch.
🔐

Vui lòng đăng nhập để nộp bài.

Đăng nhập
🔐

Tab dành cho giảng viên

Tab này chứa danh sách các lỗi đã cài cắm trong form. Vui lòng nhập mã giảng viên để mở khóa. Mã sẽ ghi nhớ trong phiên làm việc — chỉ cần nhập 1 lần cho cả 3 bài.