# Phân Hệ Quản Lý Chấm Thủ Công (Web Exam Grading)
## 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ử chi tiết chức năng giao diện (UI/UX) và luồng nghiệp vụ chấm bài thi lần 1 (`assign_type = 1`) dành cho QA/QC Tester, Giáo viên chấm thi và Cán bộ Vận hành nghiệm thu phân hệ Quản lý chấm thủ công (`exam-grading.index`).

---

## 📋 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. Phân quyền hiển thị theo Role** | 4 | P0 | Giáo viên chỉ thấy bài của mình vs Admin xem toàn bộ (`viewAllGrading`) |
| **2. Tra cứu & Bộ lọc bài chấm** | 5 | P0, P1 | Lọc Trạng thái (Chờ chấm, Đã chấm), Hạn chót (Còn hạn, Quá hạn), Kỹ năng, Học viên |
| **3. Đối soát điểm Trước vs Sau review** | 4 | P0, P1 | Hiển thị điểm AI chấm (`before_review`) vs Điểm GV chấm (`after_review`), Độ lệch điểm |
| **4. Thao tác chấm bài trên Modal** | 5 | P0, P1 | Mở modal chấm, Điền Rubric & Feedback, Lưu nháp, Chốt nộp điểm |
| **5. Cảnh báo bài thi bất thường** | 3 | P1, P2 | Badge `abnormal`, Tooltip lý do chênh lệch, Lọc danh sách bất thường |
| **6. Cảnh báo Hạn chót & Quá hạn** | 3 | P1 | Badge màu cảnh báo thời hạn (`expires_at`), Đếm ngược thời gian |
| **7. Xuất báo cáo dữ liệu 25 cột** | 3 | P1, P2 | Nút xuất, Thanh tiến độ Async Queue, Định dạng file tải về |
| **8. Kịch bản Ranh giới & Ngoại lệ** | 5 | P0, P1 | Chấm khi bài đã bị Admin thu hồi, Hết hạn khi đang thao tác lưu, Trùng phiên chấm |

---

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

### 2.1. Phân Quyền Hiển Thị Theo Role (Role-Based Access)

| 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_EG_001** | Giáo viên đăng nhập xem danh sách bài chấm của mình | Tài khoản Giáo viên A, được gán 5 bài thi | 1. Đăng nhập bằng tài khoản GV A.<br>2. Truy cập menu **Quản lý chấm thủ công**. | Bảng chỉ hiển thị đúng 5 bài thi được phân công cho GV A. Không xuất hiện dropdown chọn "Tất cả giáo viên". | **P0** |
| **TC_EG_002** | Quản trị viên (`viewAllGrading`) xem toàn bộ bài chấm hệ thống | Tài khoản Admin có quyền `exam-grading.viewAllGrading` | 1. Đăng nhập tài khoản Admin.<br>2. Truy cập màn hình Chấm thủ công. | Bảng hiển thị toàn bộ bài thi của tất cả các giáo viên. Xuất hiện dropdown **Chọn Giáo Viên** để lọc theo từng cá nhân. | **P0** |
| **TC_EG_003** | Chặn giáo viên truy cập hoặc sửa bài của giáo viên khác | Đang đăng nhập GV A | 1. Cố tình mở bài thi được phân công cho GV B (qua link trực tiếp hoặc thao tác). | Hệ thống từ chối truy cập, hiển thị thông báo lỗi 403 Forbidden hoặc: *"Bạn không có quyền chấm bài thi này"*. | **P0** |
| **TC_EG_004** | Kiểm tra quyền truy cập không đủ | Tài khoản học viên thông thường | 1. Thử truy cập URL `/exam-grading`. | Hệ thống lập tức chuyển hướng về trang chủ hoặc hiển thị thông báo không có quyền truy cập. | **P1** |

---

### 2.2. Tra Cứu & Bộ Lọc Bài Chấm (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_EG_005** | Lọc danh sách bài thi `Chờ chấm` | Đang ở màn hình Chấm thủ công | 1. Chọn bộ lọc **Trạng thái** = `Chờ chấm`.<br>2. Nhấn nút **Lọc**. | Danh sách chỉ hiển thị các bài thi chưa được hoàn thành chấm điểm (badge màu vàng/cam). | **P0** |
| **TC_EG_006** | Lọc danh sách bài thi `Đã hoàn thành` | Có bài thi đã được giáo viên submit | 1. Chọn Trạng thái = `Đã chấm / Hoàn thành`.<br>2. Nhấn **Lọc**. | Chỉ hiển thị các bài thi giáo viên đã nộp điểm, cột Điểm sau review hiển thị đầy đủ điểm số. | **P0** |
| **TC_EG_007** | Lọc theo Kỹ năng (Writing / Speaking) | Có cả bài thi Viết và Nói | 1. Chọn dropdown **Kỹ năng** = `Writing`.<br>2. Nhấn Lọc. | Danh sách chỉ lọc ra các bài thi tự luận Writing. Cột loại bài hiển thị đúng biểu tượng chiếc bút. | **P1** |
| **TC_EG_008** | Lọc theo Hạn chót nộp bài (`Deadline Filter`) | Có bài thi sắp hết hạn và bài còn dài hạn | 1. Chọn bộ lọc thời gian: `Hôm nay`, `Trong 24h tới`, `Đã quá hạn`. | Hệ thống lọc chính xác các bài thi theo ngưỡng deadline tương ứng. | **P1** |
| **TC_EG_009** | Tìm kiếm bài chấm theo Tên học viên hoặc Mã bài thi | Có nhiều bài trong danh sách | 1. Nhập Mã bài thi hoặc Tên học viên vào ô tìm kiếm.<br>2. Nhấn **Enter**. | Danh sách hiển thị đúng bài thi cần tìm trong vòng dưới 1 giây. | **P1** |

---

### 2.3. Đối Soát Điểm 2 Lớp: Trước Review vs Sau Review

| 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_EG_010** | Hiển thị điểm AI chấm sơ bộ (`score_before_review`) | Bài thi tự luận đã qua bước AI chấm | 1. Quan sát cột **Điểm Trước Review** trên danh sách. | Hiển thị chính xác điểm AI đã chấm (ví dụ: `6.0`) kèm chú thích nguồn điểm AI. | **P1** |
| **TC_EG_011** | Cập nhật điểm sau khi Giáo viên chấm (`score_after_review`) | Bài thi vừa được GV chấm 6.5 | 1. Mở modal và submit điểm 6.5.<br>2. Quay lại danh sách. | Cột **Điểm Sau Review** hiển thị `6.5`. Cột chênh lệch hiển thị `+0.5` (màu xanh dương). | **P0** |
| **TC_EG_012** | Đánh dấu độ lệch điểm lớn (Deviation Alert) | Điểm AI là 5.0, GV chấm 7.0 (lệch 2.0 band) | 1. Xem dòng bài thi có chênh lệch >= 1.5 band. | Cột Chênh lệch hiển thị màu cam/đỏ cảnh báo độ lệch điểm lớn để cán bộ vận hành lưu ý. | **P1** |

---

### 2.4. Thao Tác Chấm Bài Trên Modal (Grading Action)

| 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_EG_013** | Mở Modal chấm bài thi Writing | Bài thi ở trạng thái `Chờ chấm` | 1. Nhấp nút **Chấm bài** tại cột Thao tác.<br>2. Quan sát giao diện modal mở ra. | Modal mở nhanh chóng, hiển thị chia 2 khung: Khung bên trái là bài làm của thí sinh, khung bên phải là bảng Rubric chấm điểm và ô nhận xét. | **P0** |
| **TC_EG_014** | Chấm đầy đủ các tiêu chí và nộp điểm hoàn tất | Modal chấm đang mở | 1. Chọn điểm cho cả 4 tiêu chí theo thang điểm chuẩn.<br>2. Nhập nhận xét tối thiểu 30 ký tự vào ô Feedback.<br>3. Nhấn **Nộp bài & Hoàn tất**. | 1. Modal hiển thị pop-up xác nhận nộp điểm.<br>2. Bấm Xác nhận.<br>3. Toast thông báo: *"Chấm bài thi thành công!"*.<br>4. Dòng bài thi chuyển sang trạng thái `Đã hoàn thành`. | **P0** |
| **TC_EG_015** | Bỏ sót tiêu chí khi bấm Nộp bài | Modal chấm đang mở | 1. Chỉ chọn 3 tiêu chí, bỏ trống 1 tiêu chí.<br>2. Nhấn nút Nộp bài. | Hệ thống chặn submit, highlight đỏ tiêu chí bị thiếu và hiển thị thông báo: *"Vui lòng chấm đủ tất cả các tiêu chí trong Rubric"*. | **P0** |
| **TC_EG_016** | Chức năng Lưu nháp (Save Draft) | GV đang chấm nhưng cần tạm dừng | 1. Chấm dở dang 2 tiêu chí.<br>2. Nhấn nút **Lưu nháp**.<br>3. Đóng modal và mở lại sau đó. | Điểm và ghi chú đã lưu nháp được giữ nguyên khi mở lại bài thi, trạng thái vẫn là `Đang chấm`. | **P1** |
| **TC_EG_017** | Chỉnh sửa lại điểm trước khi bài thi được duyệt chốt | Bài thi vừa chấm xong, chưa quá 30 phút và chưa duyệt | 1. Nhấp nút **Sửa bài chấm**.<br>2. Điều chỉnh lại điểm tiêu chí.<br>3. Nhấn Cập nhật. | Điểm mới được cập nhật thành công, hệ thống ghi nhận lịch sử chỉnh sửa vào nhật ký chấm bài. | **P1** |

---

### 2.5. Cảnh Báo Bài Thi Bất Thường (`Abnormal`) & Hạn Chót (`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_EG_018** | Hiển thị cờ bài thi Bất thường (`abnormal`) | Bài thi bị nghi vấn copy mạng hoặc nộp bài quá nhanh | 1. Quan sát danh sách bài thi. | Dòng bài thi xuất hiện nhãn màu đỏ `Bất thường`. Di chuột vào nhãn hiển thị tooltip lý do: *"Thời gian làm bài dưới 5 phút"* hoặc *"Nghi vấn đạo văn"*. | **P1** |
| **TC_EG_019** | Cảnh báo bài thi Sắp hết hạn chấm (Dưới 6 giờ) | Bài thi có hạn chót sắp đến | 1. Xem cột Hạn chấm (`Deadline`). | Thời gian hiển thị chữ màu cam kèm icon đồng hồ nhấp nháy: *"Còn 4 giờ 30 phút"*. | **P1** |
| **TC_EG_020** | Cảnh báo bài thi Quá hạn chấm (Overdue) | Đã vượt qua `expires_at` | 1. Xem bài thi quá hạn. | Cột Hạn chấm chuyển sang chữ màu đỏ đậm kèm nhãn `Quá hạn`. Bài thi được ưu tiên đẩy lên đầu danh sách chờ chấm. | **P0** |

---

### 2.6. Xuất Báo Cáo Chấm Thi (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_EG_021** | Xuất báo cáo danh sách chấm bài | Có dữ liệu bài chấm trong hệ thống | 1. Lọc theo tháng hiện tại.<br>2. Nhấn nút **Xuất Báo Cáo Chấm Bài**. | Thanh tiến độ hiển thị % xử lý. Khi đạt 100%, tự động tải file zip/csv về máy. | **P1** |
| **TC_EG_022** | Kiểm tra cấu trúc 25 cột trong file CSV xuất ra | File CSV đã tải về máy | 1. Mở file CSV.<br>2. Kiểm tra các trường thông tin. | Đầy đủ 25 cột dữ liệu: Mã học viên, Tên học viên, Bài thi, Kỹ năng, Điểm Trước Review, Điểm Sau Review, Độ lệch, Giáo viên chấm, Hạn deadline, Thời điểm hoàn thành, Ghi chú feedback,... | **P1** |

---

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

1. **Bài thi bị Admin thu hồi đúng lúc Giáo viên đang mở Modal chấm**:
   - Khi GV nhấn nút "Nộp bài", hệ thống kiểm tra trạng thái và thông báo pop-up: *"Bài thi này đã được Cán bộ Vận hành thu hồi hoặc điều chuyển cho người khác. Không thể lưu kết quả"*, không làm mất tính toàn vẹn dữ liệu.
2. **Hạn chót chấm bài hết hạn đúng lúc giáo viên đang điền nhận xét**:
   - Hệ thống cho phép giáo viên nộp bài hoàn tất nếu phiên làm việc đã mở trước đó, nhưng ghi nhận cờ `Nộp muộn sau deadline` vào hệ thống đánh giá KPI chấm thi.
3. **Giáo viên mở 2 tab trình duyệt cùng lúc để chấm 2 bài khác nhau**:
   - Mỗi tab quản lý ID bài thi độc lập, không bị ghi đè nhận xét hoặc điểm số chéo giữa 2 bài thi.
