🔒 Bài 7: Login với khóa tài khoản tạm thời
Yêu cầu nghiệp vụ:
- Người dùng đăng nhập vào hệ thống bằng account và mật khẩu.
- Người dùng nhập sai mật khẩu 5 lần liên tiếp thì tài khoản sẽ bị khóa 30 phút.
- Sau 30 phút họ có thể thử lại 5 lần và tuân theo quy luật trên.
⏱️ Để tiện demo, lock duration trong bài này là 30 GIÂY (thay vì 30 phút). Mọi logic khác giữ nguyên. Khi bạn đếm ngược về 0 → tài khoản unlock và có thể thử lại 5 lần.
📌 Test data
- Account đúng:
admin
- Password đúng:
Pass123!
- Max attempts: 5
- Lock duration: 30 giây (demo) / 30 phút (spec gốc)
🔄 State Transition Diagram
| Trạng thái hiện tại |
Sự kiện |
Trạng thái kế tiếp |
Output mong đợi |
| S0 — Khởi tạo |
Login đúng |
SUCCESS |
Login successfully + form lock |
| S0 |
Login sai (lần 1) |
S1 |
Wrong password. 4 attempts remaining |
| S1 |
Login sai (lần 2) |
S2 |
Wrong password. 3 attempts remaining |
| S2 |
Login sai (lần 3) |
S3 |
Wrong password. 2 attempts remaining |
| S3 |
Login sai (lần 4) |
S4 |
Wrong password. 1 attempt remaining |
| S4 |
Login sai (lần 5) |
LOCKED |
Khóa 30s + countdown Account locked. Try again in 30 seconds |
| S1, S2, S3, S4 |
Login đúng |
SUCCESS + reset counter về 0 |
Login successfully |
| LOCKED |
Submit (kể cả đúng) |
LOCKED (giữ nguyên) |
Không xử lý — form bị disable + countdown đang chạy |
| LOCKED |
Hết 30 giây countdown |
S0 (unlock + reset counter về 0) |
Form mở lại, có thể thử 5 lần mới |
📝 Message expected
| Trường hợp | Message |
| Account để trống | Please input account |
| Password để trống | Please input password |
| Sai cặp account/password | Wrong password. N attempts remaining (số ít: 1 attempt remaining) |
| Tài khoản bị khóa | Account locked. Try again in N seconds (số ít: 1 second) |
| Login thành công | Login successfully |
🎯 Yêu cầu công việc
- Vẽ State Transition Diagram đầy đủ (S0–S4 + LOCKED + SUCCESS).
- Thiết kế test case cover ít nhất các transition sau:
- S0 → SUCCESS (login đúng ngay lần đầu).
- S0 → S1 → S2 → S3 → S4 → LOCKED (5 lần sai liên tiếp).
- Sx → SUCCESS với x = 1, 2, 3, 4 (login đúng giữa chừng — counter có reset không?).
- LOCKED → S0 sau khi hết countdown (counter có reset về 0 không?).
- LOCKED → submit (có bị disable không?).
- Test các edge case:
- Account/Password để trống → có bị tính như 1 attempt không?
- Login đúng sau khi đã sai vài lần → có reset counter không?
- Sau khi unlock (30s đã qua) → counter có thực sự về 0 chưa? Hay vẫn giữ 5 và sai 1 lần là block tiếp?
- Countdown timer hiển thị:
1 second (số ít) vs 2 seconds (số nhiều).
- Refresh trang khi đang lock → state bị mất hay vẫn lock?
- Sang tab "🧪 Form thực hành" để thực hiện test.
- Ghi nhận các bug phát hiện được.
💡 Gợi ý kỹ thuật test cho bài này:
- State Transition Testing với chú ý đặc biệt vào TIME-based transition (LOCKED → S0 sau 30s).
- Counter reset logic: spec yêu cầu "thử lại 5 lần" sau khi unlock — nghĩa là counter phải reset về 0. Test kỹ điều này.
- Login đúng sau khi sai vài lần: counter có reset không? Spec không nói rõ — nhưng chuẩn bảo mật yêu cầu reset (otherwise bị tính tích lũy lâu dài).
- Boundary của counter: test attempts = 4 (nên còn cho thử) và attempts = 5 (phải lock).
- Pluralization: 1 attempt vs 2 attempts; 1 second vs 2 seconds.
- Form behavior khi LOCKED: input và button có bị disable không?
⚠️ Lưu ý: Form có cài cắm bug ở các vùng: counter logic, time-based unlock, counter reset behavior, message text, form disable state. Đây là bài có nhiều logic time-based, hãy test kiên nhẫn và đợi countdown.