# Phân Hệ Quản Lý Danh Sách Học Viên Đến Lịch Thi (Web Exam Schedule)
## 05. Kịch Bản Kiểm Thử & Ma Trận Nghiệm Thu (Test Cases & QA Acceptance)

> **Mục tiêu**: Cung cấp tài liệu kiểm thử chức năng giao diện người dùng (UI/UX) và luồng nghiệp vụ chi tiết dành cho Đội ngũ Kiểm thử phần mềm (QA/QC), Cán bộ Vận hành và Giáo vụ khi nghiệm thu phân hệ Quản lý DSHV đến lịch thi.

---

## 📋 1. Ma Trận Bao Phủ Kiểm Thử (Test Coverage Matrix)

| Nhóm Chức Năng | Số Lượng Test Cases | Mức Độ Ưu Tiên | Phạm Vi Kiểm Thử Giao Diện |
| :--- | :---: | :---: | :--- |
| **1. Tra cứu & Bộ lọc danh sách** | 5 | P0, P1 | Thanh tìm kiếm text, bộ lọc dropdown (Trạng thái, Loại yêu cầu, Khóa học, Ngày), Phân trang |
| **2. Tạo mới lịch thi** | 5 | P0, P1 | Modal tạo lịch, Validate form, Chọn học viên, Chọn kỳ thi, Thời gian hiệu lực |
| **3. Đổi lịch thi (Update Schedule)** | 4 | P0, P1 | Modal đổi lịch, Thay đổi thời gian mở/đóng, Ghi nhận lý do đổi lịch, Lịch sử đổi |
| **4. Gia hạn hạn nộp (Extend Deadline)**| 4 | P0, P1 | Modal gia hạn, Chọn ngày hạn nộp mới, Kiểm tra thời gian sau gia hạn |
| **5. Hủy / Xóa lịch thi** | 3 | P1, P2 | Nút xóa dòng, Dialog xác nhận, Ràng buộc bài thi đã làm |
| **6. Xuất báo cáo dữ liệu (Export CSV)** | 4 | P1, P2 | Nút xuất dữ liệu, Thanh tiến độ ProgressBar, Tải file nén ZIP chứa CSV |
| **7. Nhắc lịch thi thủ công** | 3 | P2 | Nút gửi tin nhắn nhắc nhở, Toast thông báo, Kiểm tra log gửi |
| **8. Kiểm thử Ranh giới & Ngoại lệ (Edge Cases)** | 6 | P0, P1 | Ngày bắt đầu > Deadline, Trùng lặp lịch, Học viên đã hoàn thành bài thi |

---

## 🧪 2. Chi Tiết Kịch Bản Kiểm Thử (Test Cases Specification)

### 2.1. Tra Cứu & Bộ Lọc Dữ Liệu (Search & Filter)

| Mã TC | Tên Kịch Bản | Tiền Điều Kiện | Các Bước Thực Hiện Trên UI | Kết Quả Mong Đợi | Mức Độ |
| :--- | :--- | :--- | :--- | :--- | :---: |
| **TC_ES_001** | Tìm kiếm học viên theo Từ khóa (Tên / SĐT / Email) | Đang ở trang Danh sách lịch thi | 1. Nhập họ tên hoặc SĐT học viên vào ô tìm kiếm.<br>2. Nhấn nút **Tìm kiếm** hoặc phím **Enter**. | Bảng danh sách tải lại và chỉ hiển thị đúng các bản ghi khớp với thông tin học viên vừa nhập. Highlight từ khóa nếu có. | **P0** |
| **TC_ES_002** | Lọc danh sách theo Trạng thái (Tất cả / Đang mở / Đã đóng) | Đang ở trang danh sách | 1. Chọn dropdown **Trạng thái** = `Đang mở`.<br>2. Nhấn **Lọc**.<br>3. Chuyển sang `Đã đóng` và kiểm tra. | Bảng dữ liệu lọc chính xác: Khi chọn `Đang mở`, cột Trạng thái hiển thị badge màu xanh lá. Khi chọn `Đã đóng`, badge chuyển sang màu xám/đỏ. | **P0** |
| **TC_ES_003** | Lọc theo Phân loại yêu cầu (`requirement_type`) | Đang ở trang danh sách | 1. Chọn dropdown **Loại yêu cầu** lần lượt: `Đúng lộ trình`, `Thi lại`, `Thi sớm`.<br>2. Nhấn **Lọc**. | Danh sách hiển thị đúng học viên theo từng loại yêu cầu tương ứng. | **P1** |
| **TC_ES_004** | Lọc theo Khoảng thời gian thi (Từ ngày - Đến ngày) | Có dữ liệu lịch thi trải dài nhiều tháng | 1. Chọn **Từ ngày** = `01/10/2026` và **Đến ngày** = `15/10/2026`.<br>2. Nhấn **Lọc**. | Chỉ hiển thị các lịch thi có khoảng thời gian thi nằm trong hoặc giao thoa với khoảng ngày đã chọn. | **P1** |
| **TC_ES_005** | Phân trang danh sách (Pagination) | Tổng số bản ghi > 20 | 1. Kéo xuống cuối trang danh sách.<br>2. Nhấp vào trang số 2, số 3 hoặc nút **Next**.<br>3. Thay đổi kích thước trang (10, 25, 50 dòng/trang). | Chuyển trang mượt mà, không giật màn hình, giữ nguyên bộ lọc đang áp dụng, số thứ tự (STT) tính toán chính xác theo trang. | **P1** |

---

### 2.2. Tạo Mới Lịch Thi (Create Schedule)

| Mã TC | Tên Kịch Bản | Tiền Điều Kiện | Các Bước Thực Hiện Trên UI | Kết Quả Mong Đợi | Mức Độ |
| :--- | :--- | :--- | :--- | :--- | :---: |
| **TC_ES_006** | Tạo mới lịch thi thành công (Happy Path) | Có tài khoản cán bộ vận hành, đã chọn kỳ thi và học viên | 1. Nhấn nút **+ Tạo lịch thi mới** trên thanh công cụ.<br>2. Tìm và chọn Học viên.<br>3. Chọn Khóa học & Bài thi tương ứng.<br>4. Nhập Thời gian bắt đầu (`08:00 15/10/2026`) & Hạn nộp (`22:00 16/10/2026`).<br>5. Chọn Loại yêu cầu = `Đúng lộ trình`.<br>6. Nhấn nút **Lưu**. | 1. Hiển thị thông báo Toast thành công: *"Tạo lịch thi cho học viên thành công!"*.<br>2. Modal tự động đóng.<br>3. Bảng danh sách tự động reload và hiển thị dòng lịch thi mới ở đầu bảng. | **P0** |
| **TC_ES_007** | Bỏ trống các trường thông tin bắt buộc | Modal Tạo lịch đang mở | 1. Mở modal Tạo lịch thi.<br>2. Không điền bất kỳ thông tin nào, bấm ngay nút **Lưu**. | Form chặn submit và hiển thị cảnh báo đỏ dưới các trường: *"Vui lòng chọn học viên"*, *"Vui lòng chọn bài thi"*, *"Vui lòng nhập thời gian bắt đầu & kết thúc"*. | **P0** |
| **TC_ES_008** | Nhập Ngày bắt đầu lớn hơn Hạn chót nộp bài | Modal Tạo lịch đang mở | 1. Điền học viên và bài thi hợp lệ.<br>2. Nhập Ngày bắt đầu: `18/10/2026`.<br>3. Nhập Hạn nộp bài: `15/10/2026`.<br>4. Nhấn **Lưu**. | Hệ thống hiển thị cảnh báo lỗi: *"Hạn chót nộp bài phải diễn ra sau ngày bắt đầu thi!"*. Không cho phép lưu vào hệ thống. | **P0** |
| **TC_ES_009** | Tạo lịch thi lại (`Thi lại`) cho học viên | Học viên đã có 1 lần thi trước đó | 1. Mở modal Tạo lịch.<br>2. Chọn học viên.<br>3. Chọn Loại yêu cầu = `Thi lại`.<br>4. Nhập lý do: *"Học viên gặp sự cố mất điện lần 1"*. Nhấn **Lưu**. | Lịch thi mới được tạo với badge `Thi lại`, hệ thống ghi nhận và cấp lượt thi mới (`attempt_count` tăng tương ứng). | **P1** |
| **TC_ES_010** | Hủy bỏ thao tác tạo lịch thi | Modal Tạo lịch đang mở | 1. Nhập một số thông tin dở dang.<br>2. Nhấn nút **Hủy** hoặc biểu tượng dấu **(X)** hoặc bấm ra ngoài modal. | Modal đóng lại ngay lập tức, dữ liệu vừa nhập bị hủy, bảng danh sách không thay đổi. | **P2** |

---

### 2.3. Cập Nhật & Đổi Lịch Thi (Update / Reschedule)

| Mã TC | Tên Kịch Bản | Tiền Điều Kiện | Các Bước Thực Hiện Trên UI | Kết Quả Mong Đợi | Mức Độ |
| :--- | :--- | :--- | :--- | :--- | :---: |
| **TC_ES_011** | Đổi lịch thi cho học viên chưa làm bài | Học viên có lịch thi trạng thái `Đang mở`, chưa nộp bài | 1. Nhấn nút **Đổi lịch** (icon Calendar/Edit) tại dòng học viên.<br>2. Sửa Ngày bắt đầu và Hạn nộp mới.<br>3. Nhập ghi chú: *"Học viên xin đổi lịch do bận công tác"*. Nhấn **Xác nhận**. | 1. Toast báo *"Cập nhật lịch thi thành công!"*.<br>2. Bảng hiển thị thời gian mới.<br>3. Lịch cũ được lưu vào lịch sử thay đổi (Audit log). | **P0** |
| **TC_ES_012** | Đổi lịch thi khi học viên ĐÃ nộp bài thi hoàn tất | Học viên đã làm bài, có điểm thi | 1. Tìm học viên đã nộp bài.<br>2. Kiểm tra cột Thao tác trên giao diện. | Nút **Đổi lịch** bị vô hiệu hóa (disabled hoặc ẩn kèm tooltip: *"Bài thi đã được học viên hoàn thành, không thể đổi lịch"*). | **P0** |
| **TC_ES_013** | Xem Lịch sử đổi lịch (History Log) | Bản ghi lịch thi đã từng đổi ngày 2 lần | 1. Nhấp vào icon **Lịch sử** hoặc nhấp vào badge ngày thi.<br>2. Xem danh sách hiển thị trong popover/modal. | Hiển thị đầy đủ: Thời gian cũ ➔ Thời gian mới, Người thực hiện, Thời điểm thực hiện, Lý do ghi chú. | **P1** |
| **TC_ES_014** | Đổi trạng thái lịch thi từ Đóng sang Mở thủ công | Lịch thi đang ở trạng thái `Đã đóng` | 1. Nhấn nút Đổi lịch.<br>2. Kéo dài Hạn nộp vượt qua thời điểm hiện tại.<br>3. Bật toggle **Trạng thái** = `Mở`. Nhấn **Lưu**. | Trạng thái bản ghi chuyển thành badge xanh `Đang mở`, học viên có thể vào phòng thi lại bình thường. | **P1** |

---

### 2.4. Gia Hạn Hạn Nộp Bài (Extend Deadline)

| Mã TC | Tên Kịch Bản | Tiền Điều Kiện | Các Bước Thực Hiện Trên UI | Kết Quả Mong Đợi | Mức Độ |
| :--- | :--- | :--- | :--- | :--- | :---: |
| **TC_ES_015** | Gia hạn hạn nộp thành công | Lịch thi sắp hết hạn hoặc vừa đóng | 1. Nhấp nút **Gia hạn** (icon Đồng hồ).<br>2. Nhập Hạn nộp mới (hoặc chọn nhanh: `+24h`, `+48h`).<br>3. Nhập Lý do gia hạn.<br>4. Nhấn **Xác nhận gia hạn**. | 1. Toast báo *"Gia hạn lịch thi thành công!"*.<br>2. Cột Hạn nộp cập nhật thời gian mới.<br>3. Nếu lịch trước đó đang Đóng thì tự động chuyển sang Đang mở. | **P0** |
| **TC_ES_016** | Gia hạn lùi ngày (chọn ngày trước ngày hạn chót cũ) | Modal Gia hạn đang mở | 1. Chọn ngày gia hạn nhỏ hơn hạn nộp hiện tại.<br>2. Nhấn Xác nhận. | Giao diện báo lỗi: *"Hạn nộp gia hạn mới phải lớn hơn hạn nộp hiện tại!"*, không cho submit. | **P1** |
| **TC_ES_017** | Gia hạn hàng loạt nhiều học viên cùng lúc (Bulk Extend) | Chọn checkbox 3 học viên trong danh sách | 1. Tích chọn 3 học viên.<br>2. Nhấn nút **Gia hạn đã chọn** trên Action Bar.<br>3. Chọn hạn nộp mới và nhấn Xác nhận. | Cả 3 học viên đều được cập nhật thời gian hạn nộp mới đồng loạt, thông báo báo thành công 3/3 bản ghi. | **P1** |
| **TC_ES_018** | Đóng modal gia hạn mà không lưu | Modal Gia hạn đang mở | 1. Nhập hạn nộp mới.<br>2. Bấm nút Hủy. | Modal đóng, hạn nộp trên danh sách giữ nguyên giá trị ban đầu. | **P2** |

---

### 2.5. Hủy & Xóa Lịch Thi (Delete Schedule)

| Mã TC | Tên Kịch Bản | Tiền Điều Kiện | Các Bước Thực Hiện Trên UI | Kết Quả Mong Đợi | Mức Độ |
| :--- | :--- | :--- | :--- | :--- | :---: |
| **TC_ES_019** | Xóa lịch thi của học viên chưa làm bài | Lịch thi tạo nhầm, học viên chưa làm | 1. Nhấp biểu tượng **Thùng rác** (Xóa).<br>2. Dialog cảnh báo xuất hiện: *"Bạn có chắc chắn muốn xóa lịch thi này?"*.<br>3. Nhấn nút **Đồng ý xóa**. | 1. Thông báo Toast: *"Xóa lịch thi thành công!"*.<br>2. Dòng dữ liệu biến mất khỏi danh sách.<br>3. Tổng số lượng bản ghi giảm 1. | **P1** |
| **TC_ES_020** | Hủy xác nhận xóa | Dialog xác nhận xóa đang mở | 1. Nhấp biểu tượng Xóa.<br>2. Khi dialog xuất hiện, bấm **Hủy bỏ** hoặc bấm nút Close. | Dialog đóng lại, bản ghi lịch thi vẫn tồn tại nguyên vẹn trên màn hình. | **P2** |
| **TC_ES_021** | Chặn xóa lịch thi đã có bài làm / điểm số | Học viên đã nộp bài thi | 1. Quan sát dòng lịch thi của học viên đã có kết quả. | Nút Xóa bị ẩn hoặc disabled kèm cảnh báo: *"Không thể xóa lịch thi đã có phát sinh bài làm"*. | **P0** |

---

### 2.6. Xuất Báo Cáo Dữ Liệu (Export CSV)

| Mã TC | Tên Kịch Bản | Tiền Điều Kiện | Các Bước Thực Hiện Trên UI | Kết Quả Mong Đợi | Mức Độ |
| :--- | :--- | :--- | :--- | :--- | :---: |
| **TC_ES_022** | Xuất toàn bộ danh sách lịch thi theo bộ lọc | Có 500 bản ghi lịch thi | 1. Áp dụng bộ lọc (ví dụ: Tháng 10/2026).<br>2. Nhấn nút **Xuất Excel/CSV** trên góc phải. | 1. Xuất hiện thanh tiến độ (Progress Bar): `Đang chuẩn bị dữ liệu (0% -> 50% -> 100%)`.<br>2. Trình duyệt tự động tải xuống file nén `.zip` (hoặc file `.csv`). | **P1** |
| **TC_ES_023** | Kiểm tra tính chính xác của file dữ liệu tải về | File đã tải về máy | 1. Giải nén và mở file `.csv` bằng Excel.<br>2. Đối chiếu số dòng và các cột thông tin. | 1. Số lượng dòng khớp với số bản ghi đã lọc trên màn hình.<br>2. Hiển thị đúng font tiếng Việt UTF-8 (không bị lỗi font).<br>3. Các cột: Họ tên, Email, Khóa thi, Bắt đầu, Deadline, Trạng thái đều chính xác. | **P1** |
| **TC_ES_024** | Xuất dữ liệu khi danh sách rỗng (0 kết quả) | Bộ lọc không tìm thấy kết quả nào | 1. Nhập từ khóa không tồn tại.<br>2. Nhấn Xuất dữ liệu. | Thông báo Toast cảnh báo: *"Không có dữ liệu phù hợp để xuất báo cáo!"*, không gọi job ngầm. | **P2** |

---

### 2.7. Nhắc Thi Thủ Công (Manual Remind)

| Mã TC | Tên Kịch Bản | Tiền Điều Kiện | Các Bước Thực Hiện Trên UI | Kết Quả Mong Đợi | Mức Độ |
| :--- | :--- | :--- | :--- | :--- | :---: |
| **TC_ES_025** | Gửi tin nhắc thi cho 1 học viên thành công | Lịch thi trạng thái Đang mở | 1. Nhấp nút **Nhắc thi** (icon Chuông hoặc biểu tượng Zalo) trên dòng học viên.<br>2. Xác nhận gửi nhắc nhở. | 1. Toast thông báo: *"Đã gửi tin nhắn nhắc thi thành công đến học viên!"*.<br>2. Cột **Lần nhắc cuối** cập nhật thời gian vừa gửi (`Vừa xong`). | **P2** |
| **TC_ES_026** | Chặn gửi nhắc thi liên tục (Spam Protection) | Vừa nhấn gửi nhắc thi cách đây 1 phút | 1. Nhấn tiếp vào nút Nhắc thi cho cùng học viên đó. | Nút nhắc thi hiển thị trạng thái đếm ngược hoặc cảnh báo: *"Vừa gửi nhắc nhở, vui lòng thử lại sau 5 phút!"*. | **P2** |

---

## 🛑 3. Kịch Bản Kiểm Thử Ranh Giới & Ngoại Lệ (Edge Cases)

```mermaid
graph TD
    EC1["Edge Case 1: Đổi lịch khi thời gian hiệu lực trùng sát giờ thi"]
    EC2["Edge Case 2: Học viên VIP đổi lịch liên tiếp 3 lần"]
    EC3["Edge Case 3: Sự cố mạng chập chờn khi đang xuất file 10.000 dòng"]
    EC4["Edge Case 4: Lịch thi hết hạn đúng lúc học viên đang mở bài làm"]

    EC1 --> Check1["Hệ thống hiển thị cảnh báo sát giờ và tự động thông báo"]
    EC2 --> Check2["Kiểm tra bảng lịch sử (Audit Log) ghi nhận đủ 3 lần đổi"]
    EC3 --> Check3["Thanh Progress Bar giữ trạng thái, cho phép Retry tải lại"]
    EC4 --> Check4["Thời gian làm bài thực tế ưu tiên bảo lưu theo phiên thi của Moodle"]
```

1. **Học viên có 2 lịch thi song song ở 2 môn khác nhau**: Hệ thống vẫn hiển thị độc lập từng bản ghi theo từng môn, không bị ghi đè thông tin.
2. **Cán bộ vận hành mở tab đổi lịch nhưng không lưu, để qua ngày hôm sau mới bấm Lưu**: Hệ thống validate lại thời gian tại thời điểm bấm Lưu, nếu ngày chọn đã trôi về quá khứ so với thời điểm hiện tại thì yêu cầu chọn lại.
3. **Mất kết nối mạng khi đang gửi yêu cầu Gia hạn**: Hệ thống hiển thị popup: *"Mất kết nối máy chủ, vui lòng kiểm tra đường truyền và thử lại"*, không để nút bấm bị treo trạng thái loading vĩnh viễn.
