| Version | 2.0 |
| Date | 20th February 2026 |
| Prepared By | Sumba Group Limited |
| Developed By | Sumba Group Limited |
| Testing Period | Feb 17–28, 2026 |
| Classification | Internal — Confidential |
This UAT plan defines the testing strategy, schedule, and test cases for the E-Learning Platform overhaul. UAT validates that the system meets all functional requirements, maintains backward compatibility with the production database, and delivers a reliable experience across all user roles and client applications.
salvation.sql.| Document | Location |
|---|---|
| Database Schema (salvation.sql) | Salvation-Army-Backend-main/src/main/resources/ |
| Flyway Migrations V1–V5 | Salvation-Army-Backend-main/src/main/resources/db/migration/ |
| API Base URL (Production) | https://app.saltcollegeandresourcecentre.com/SaltELearnAppApi |
| API Base URL (Staging) | https://stagging.saltcollegeandresourcecentre.com/SaltELearnAppApi |
| Web Admin (Production) | https://app.saltcollegeandresourcecentre.com |
| Web Admin (Staging) | https://stagging.saltcollegeandresourcecentre.com |
/opt/salt_files fallback)SaltElearning/ directory — being deprecated)| Component | Technology | Port | Purpose |
|---|---|---|---|
| Backend API | Spring Boot 3.4.2 (Java 21) | 8091 | REST API at /SaltELearnAppApi |
| Database | PostgreSQL 17 | 5432 | Database: salvation |
| Cache | Redis 7 (Alpine) | 6379 | Session & data caching |
| File Storage | MinIO (S3-compatible) | 9000 / 9001 | Object storage + legacy fallback |
| Web Admin | Next.js (TypeScript, Tailwind CSS 4) | 8081 | Admin panel — 4 roles |
| Mobile App | Flutter (Riverpod 3.x) | — | Android APK / iOS |
| Exec Dashboard | Flutter (fl_chart) | — | Analytics |
| Staging | EC2 (Ubuntu) | 443 | stagging.saltcollegeandresourcecentre.com |
docker-compose up -d from project root (PostgreSQL, Redis, MinIO)psql -U postgres -d salvation — tables have dataredis-cli ping returns PONGhttp://localhost:9001cd Salvation-Army-Backend-main && mvn clean install -DskipTestsmvn spring-boot:runGET https://stagging.saltcollegeandresourcecentre.com/SaltELearnAppApicd web-admin && npm install && npm run devhttps://stagging.saltcollegeandresourcecentre.comcd mobile && flutter runcd executive_dashboard && flutter run -d chrome| Role | Access Level | Description | Test Account | Territory |
|---|---|---|---|---|
| Admin | 5 (highest) | Full platform management | Use existing admin from salvation.sql | All / SALT-College |
| Tutor | 8 | Subject teaching, marking | Use existing tutor from salvation.sql | Assigned territory |
| ETO | 9 | Territory oversight, approvals | Use existing ETO from salvation.sql | Assigned territory |
| Student | 12 (lowest) | Learning, exams, assignments | Adm# 2018333 (Esther Mwangale) | Kenya (+254) |
| Student | 12 | Additional test student | Adm# 2024053 (Tebogo Nkotane) | As assigned |
| Student | 12 | Additional test student | Adm# 2024054 (Andile Matukane) | As assigned |
| Day | Date | Focus Area | Test Cases | Testers |
|---|---|---|---|---|
| Mon | Feb 17 | Environment Setup & Smoke Testing | Verify all infrastructure, smoke tests | Dev + QA |
| Tue | Feb 18 | Authentication & Security (7.1) | AUTH-001 to AUTH-012 | All roles |
| Wed | Feb 19 | Student Enrollment & Approval (7.2) | ENR-001 to ENR-018 | Admin, ETO, Student |
| Thu | Feb 20 | Subject Registration (7.3) + Assignments (7.4) | SUB-001 to SUB-012, ASG-001 to ASG-010 | Admin, Tutor, Student |
| Fri | Feb 21 | Exam Lifecycle (7.5) | EXM-001 to EXM-026 | Admin, Tutor, Student |
| Day | Date | Focus Area | Test Cases | Testers |
|---|---|---|---|---|
| Mon | Feb 24 | Grading (7.6) + Billing (7.7) | GRD-001 to GRD-014, BIL-001 to BIL-008 | Admin |
| Tue | Feb 25 | Secondary Checklists: Dashboard, Chat, Files, Sessions | Checklists 1–5 | All roles |
| Wed | Feb 26 | Secondary Checklists: Suspension, Reports, i18n, Theme, Exec Dashboard | Checklists 6–12 | All roles |
| Thu | Feb 27 | End-to-End Flows (Section 9) + Assignment Lifecycle (ASG-011 to ASG-020) | E2E-001 to E2E-003, remaining ASG | All roles |
| Fri | Feb 28 | Regression + Bug Fixes + Final Sign-Off | Re-test failed cases, regression | All stakeholders |
Each test case uses this format:
| Field | Description |
|---|---|
| Test Case ID | PREFIX-NNN |
| Description | What is being tested |
| Priority | Critical / High / Medium |
| Preconditions | Required state before test |
| Client | Web Admin / Mobile / Both |
| Role | Which user role executes |
| Steps | Numbered step-by-step instructions |
| Expected Result | Observable outcome |
| Actual Result | [Tester fills in] |
| Status | Pass / Fail / Blocked |
| Defect ID | [If fail, reference defect] |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Active admin account exists in tbl_sys_users |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to https://app.saltcollegeandresourcecentre.com 2. Enter admin username and password 3. Click “Login” 4. System sends OTP to registered email/SMS 5. Enter the received OTP access code 6. Click “Verify” |
| Expected Result | User is redirected to /dashboard/admin with 6 stat cards visible. JWT token stored in localStorage as salt_token. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Active student account (Adm# 2018333) |
| Client | Mobile |
| Role | Student |
| Steps | 1. Open the College mobile app 2. Enter admission number 2018333 and password 3. Tap “Login” 4. Enter OTP received via email 5. Tap “Verify” |
| Expected Result | Student dashboard loads with 5 bottom tabs (Home, Subjects, Assignments, Exams, More). Welcome message displays student name. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | None |
| Client | Both |
| Role | Any |
| Steps | 1. Navigate to login page 2. Enter non-existent username INVALID_USER_999 3. Enter any password 4. Click “Login” |
| Expected Result | Error message displayed: “Invalid credentials” or similar. No OTP sent. User remains on login page. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Active user account exists |
| Client | Both |
| Role | Any |
| Steps | 1. Enter valid username 2. Enter wrong password 3. Click “Login” |
| Expected Result | Error message displayed. No OTP sent. Failed attempt logged in brute force tracker. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Step 1 of login completed, OTP received |
| Client | Both |
| Role | Any |
| Steps | 1. Complete Step 1 (credentials validated) 2. Check email/SMS for OTP 3. Enter correct access code 4. Click “Verify” |
| Expected Result | JWT token returned. User redirected to role-appropriate dashboard. Token stored securely. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Step 1 completed |
| Client | Both |
| Role | Any |
| Steps | 1. Complete Step 1 2. Enter incorrect access code 000000 3. Click “Verify” |
| Expected Result | Error message: “Invalid access code”. User remains on OTP screen. Can retry. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | User account with mcp="yes" flag (first login or admin-reset password) |
| Client | Both |
| Role | Any |
| Steps | 1. Login with valid credentials 2. Enter valid OTP 3. System detects mcp=“yes” and shows password change form 4. Enter current password 5. Enter new password (min 8 characters) 6. Confirm new password 7. Submit |
| Expected Result | Password changed. mcp flag updated. User can now login with new password. Redirected to login page. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | User account with mcp="no" |
| Client | Both |
| Role | Any |
| Steps | 1. Login with valid credentials 2. Enter valid OTP |
| Expected Result | No password change prompt. Directly redirected to dashboard. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | User account with valid email |
| Client | Both |
| Role | Student |
| Steps | 1. Click “Forgot Password” on login page 2. Enter registered email address 3. Submit |
| Expected Result | Password reset instructions sent to email. User informed to check email. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in as Admin. Target user account exists. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to Users page 2. Find target user 3. Click “Reset Password” 4. Confirm action |
| Expected Result | Password reset. Target user's mcp set to “yes”. User must change password on next login. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Logged in. Timeout configured in tbl_sys_settings. |
| Client | Both |
| Role | Any |
| Steps | 1. Login successfully 2. Leave application idle beyond configured timeout period 3. Attempt to navigate to a protected page |
| Expected Result | JWT expired. User redirected to login page. Appropriate message shown. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in |
| Client | Both |
| Role | Any |
| Steps | 1. Click logout (Web: user menu; Mobile: More > Logout) 2. Confirm logout 3. Attempt to access a protected page via URL |
| Expected Result | Session cleared. JWT removed from storage. Redirected to login. Cannot access protected pages. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Valid admission number uploaded by admin |
| Client | Mobile |
| Role | Student |
| Steps | 1. Open mobile app 2. Tap “Register” 3. Select “New Student” 4. Enter email address 5. Submit registration (POST /student/enroll) |
| Expected Result | Registration submitted. Student record created with status “N” (New). Confirmation message displayed. Student receives email with credentials. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student has existing record in system |
| Client | Mobile |
| Role | Student |
| Steps | 1. Open mobile app 2. Tap “Register” 3. Select “Continuing Student” 4. Enter email and registration number 5. Submit (POST /student/register_student) |
| Expected Result | System finds existing record. Student re-enrolled for next level. Status set to pending approval. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Admission number already actively enrolled |
| Client | Mobile |
| Role | Student |
| Steps | 1. Attempt registration with admission number that already has active enrollment |
| Expected Result | Error message: duplicate or already registered. Registration blocked. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | None |
| Client | Mobile |
| Role | Student |
| Steps | 1. Attempt registration with admission number not in system |
| Expected Result | Error message: admission number not found. Registration blocked. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Logged in as Admin. CSV file with 1 column of admission numbers. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to Student Management 2. Click “Upload Admissions” 3. Select CSV file 4. Submit (POST /admin/upload_admission/{userId}) |
| Expected Result | Admission numbers imported. Students created with status “U” (Uploaded). Count of imported records shown. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Logged in as Admin |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Attempt upload with malformed CSV (wrong columns, empty file) |
| Expected Result | Validation error. No records imported. Clear error message. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Logged in as ETO. Students pending in ETO's territory. |
| Client | Web Admin |
| Role | ETO |
| Steps | 1. Navigate to /dashboard/eto/approvals 2. View list of pending students |
| Expected Result | List shows only students from ETO's territory. Expandable cards display: name, admission #, email, contact, application date. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Pending students visible |
| Client | Web Admin |
| Role | ETO |
| Steps | 1. Click to expand a student card 2. Review expanded details |
| Expected Result | Expanded view shows: gender, marital status, ID number, rank, session, entry type, past performance table with previous subjects and grades. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Pending students available |
| Client | Web Admin |
| Role | ETO |
| Steps | 1. Click “Download Student List” button 2. Save Excel file |
| Expected Result | Excel file downloads with student data. Approve/reject buttons become enabled after download. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student list downloaded. Pending student visible. |
| Client | Web Admin |
| Role | ETO |
| Steps | 1. Click “Approve” on student card 2. Confirm approval (POST /v2/bridge/students/{id}/approve) |
| Expected Result | Student status updated. Student moves to Admin's pending queue. Success message shown. Student removed from ETO's pending list. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student list downloaded. Pending student visible. |
| Client | Web Admin |
| Role | ETO |
| Steps | 1. Click “Reject” on student card 2. Enter rejection remarks (mandatory) 3. Confirm (POST /v2/bridge/students/{id}/reject) |
| Expected Result | Student status set to rejected. Remarks saved. Student notified. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Logged in as Admin. ETO-approved students exist. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to /dashboard/admin/students 2. Filter by pending status |
| Expected Result | List shows students approved by ETO, pending Admin's final decision. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | ETO-approved student in queue |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Select student 2. Click “Approve” 3. Confirm |
| Expected Result | Student status set to “D” (Done/Approved). Student can now login and access learning features. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student in admin pending queue |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Select student 2. Click “Reject” 3. Enter remarks 4. Confirm |
| Expected Result | Student status set to rejected. Remarks saved. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student fully approved (status “D”) |
| Client | Both |
| Role | Student |
| Steps | 1. Login as approved student 2. Complete OTP 3. View dashboard |
| Expected Result | Dashboard loads. Enrolled subjects visible. Can access assignments, exams, materials. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student was rejected |
| Client | Both |
| Role | Student |
| Steps | 1. Attempt login as rejected student |
| Expected Result | Login blocked or restricted access. Cannot view subjects/assignments/exams. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Logged in as Admin. Student exists. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to student details 2. Click “Update Email” 3. Enter new email 4. Submit (POST /admin/update_student_email) |
| Expected Result | Email updated in both tbl_student and tbl_sys_users. Student can receive OTP at new email. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Logged in as Admin. 17-column CSV with historical data. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Upload CSV (POST /admin/restore_students/{userId}) 2. CSV: subject_code, learning_level_id, reg_year, exam_date, 10 assignments, avg, exam total, final |
| Expected Result | Historical data imported. Student performance records created. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Approved student. Subjects available for student's academic level. |
| Client | Mobile |
| Role | Student |
| Steps | 1. Login as student 2. Navigate to Subjects 3. Select available subjects for current level 4. Submit registration (POST /student/register_subjects) |
| Expected Result | Subject selections created in tbl_student_subjects_selection. Status set to pending approval. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student has registered subjects |
| Client | Both |
| Role | Student |
| Steps | 1. Navigate to Subjects page 2. View subject list/grid |
| Expected Result | Shows all registered subjects with: name, code, status (A/P/E/N), assignment score, exam score, pass mark. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Student has pending subject selections |
| Client | Both |
| Role | Student |
| Steps | 1. Check subjects with pending status |
| Expected Result | Pending subjects shown with “P” status badge. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student at Foundation level |
| Client | Mobile |
| Role | Student |
| Steps | 1. Attempt to register for Diploma-level subjects (D* prefix) |
| Expected Result | Registration blocked. Error message about level mismatch. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in as ETO. Students have pending selections. |
| Client | Web Admin |
| Role | ETO |
| Steps | 1. Navigate to subject approvals 2. View pending selections (POST /admin/un_approved_subjects) |
| Expected Result | List of students with pending subject selections for ETO's territory. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Pending subject selection exists |
| Client | Web Admin |
| Role | ETO / Admin |
| Steps | 1. Select student's subject selection 2. Click “Approve” 3. Confirm (POST /admin/subjects_approval) |
| Expected Result | Selection status updated to approved. Student can now see subject as “Active”. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Pending subject selection exists |
| Client | Web Admin |
| Role | ETO / Admin |
| Steps | 1. Select student's subject selection 2. Click “Reject” 3. Enter remarks 4. Confirm |
| Expected Result | Selection rejected. Remarks saved. Student notified. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in as Admin |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to /dashboard/admin/subjects 2. Click “Add Subject” 3. Enter: code (e.g., CF999), name, learning level, pass mark, cost 4. Submit (POST /subject/create_subject) |
| Expected Result | Subject created in tbl_subjects. Visible in subject list with correct details. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Subject exists |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Find subject in list 2. Click “Edit” 3. Modify details (name, cost, pass mark) 4. Save (POST /subject/modify_subject) |
| Expected Result | Subject updated. Changes reflected immediately. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Subjects exist at multiple levels |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to subjects page 2. Filter by Foundation level 3. Filter by Certificate level 4. Filter by Diploma level |
| Expected Result | Foundation shows F* subjects. Certificate shows C* subjects. Diploma shows D* subjects. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in as Tutor with assigned subjects |
| Client | Both |
| Role | Tutor |
| Steps | 1. Navigate to dashboard 2. View “My Subjects” count 3. Navigate to Students page |
| Expected Result | Shows only subjects assigned to this tutor. Student list shows only students enrolled in those subjects. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student has a failed subject |
| Client | Mobile |
| Role | Student |
| Steps | 1. View failed subjects (POST /student/failed_subjects) 2. Select subject to retake 3. Submit application (POST /student/apply_failed_exam) |
| Expected Result | Retake application created. Pending approval. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Logged in as Tutor. Has assigned subjects. PDF file ready. |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Navigate to Materials/Assignments 2. Select subject 3. Upload PDF file 4. Set due date and instructions 5. Submit (POST /file_handler/upload, file_type=“A”) |
| Expected Result | Assignment uploaded. Record created in tbl_materials_upload. File stored in MinIO. Students can see assignment. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in as Tutor |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Upload assignment 2. Set due_date to a future date 3. Submit |
| Expected Result | Assignment created with due date visible to students. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Logged in as Tutor |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Attempt to upload .exe or .zip file as assignment |
| Expected Result | Upload rejected. Error message about unsupported format. Only PDF and Word allowed. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Logged in as Tutor |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Attempt to upload 0-byte file |
| Expected Result | Upload rejected with error message. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Assignments uploaded for student's subjects |
| Client | Both |
| Role | Student |
| Steps | 1. Navigate to Assignments page 2. View assignment list 3. Mobile: check “Pending” tab |
| Expected Result | Assignments visible with: title, subject, status (N=New), due date. Download button available. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Assignment available |
| Client | Both |
| Role | Student |
| Steps | 1. Click download on assignment 2. File downloads (GET /file_handler/read/{id}/D/A) |
| Expected Result | PDF file downloads successfully. Content matches uploaded assignment. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Assignment exists. Student has PDF ready. |
| Client | Mobile |
| Role | Student |
| Steps | 1. Navigate to Assignments 2. Select subject 3. Choose PDF file 4. Submit (POST /file_handler/submit_assignment) |
| Expected Result | Assignment submitted. File stored at {territory_code}/assignments/. Status shows as submitted. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Assignment exists. Student has .docx file. |
| Client | Mobile |
| Role | Student |
| Steps | 1. Select Word (.docx) file 2. Submit assignment |
| Expected Result | Word document automatically converted to PDF. Stored as PDF. Submission successful. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Assignment with past due date |
| Client | Mobile |
| Role | Student |
| Steps | 1. Attempt to submit assignment after due date |
| Expected Result | Submission blocked. Error message about deadline passed. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Logged in as Admin. Assignment past due. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to assignment management 2. Find the overdue assignment 3. Click “Allow Late Submission” (POST /admin/allow_late_assignment) |
| Expected Result | Student can now submit despite past deadline. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Students have submitted assignments |
| Client | Both |
| Role | Tutor |
| Steps | 1. Navigate to Assignments page 2. View pending/unmarked list (POST /admin/un_tutor_marked_assignments) |
| Expected Result | Table shows: student name, admission #, subject, submission date, status “N”. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student has submitted an assignment |
| Client | Both |
| Role | Tutor |
| Steps | 1. Click download on student's submission (GET /file_handler/read_assignment/{id}/D) |
| Expected Result | Student's PDF downloads. Content readable. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Unmarked assignment exists |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Click “Mark” on assignment row 2. Enter score (0–100) in inline input 3. Click “Save” (POST /v2/bridge/assignments/{id}/mark) |
| Expected Result | Score saved. Status changes to “T” (Tutor Marked). Assignment moves to admin approval queue. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Unmarked assignment on mobile |
| Client | Mobile |
| Role | Tutor |
| Steps | 1. Tap assignment 2. Enter score (0–100) in dialog 3. Enter comments 4. Tap “Submit” |
| Expected Result | Score and comments saved. Status changes to “T”. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Tutor has marked assignments |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to pending assignment approvals (POST /admin/pending_assignment_approval) |
| Expected Result | List shows tutor-marked assignments with student, subject, score, tutor name. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Tutor-marked assignment in queue |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Review tutor's marking 2. Click “Approve” |
| Expected Result | Assignment status changes to “P” (Admin Approved). Score finalized. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Logged in as Admin |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Find assignment 2. Click “Manual Mark” (POST /admin/manual_mark_assignment) 3. Enter score 4. Save |
| Expected Result | Admin's score saved, overriding tutor mark if any. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Assignments have been marked |
| Client | Both |
| Role | Student |
| Steps | 1. Navigate to Assignments 2. Mobile: tap “Marked” tab 3. View scores |
| Expected Result | Marked assignments show score and status. Green “T” or yellow “P” badges. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in as Tutor |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Navigate to Materials 2. Select subject 3. Upload PDF (POST /file_handler/upload, file_type=“R”) |
| Expected Result | Material uploaded. Stored in student_reading/. Students can download. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Reading materials uploaded for student's subjects |
| Client | Both |
| Role | Student |
| Steps | 1. Navigate to Materials page 2. Find material grouped by subject 3. Click download |
| Expected Result | PDF/document downloads successfully. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Logged in as Tutor. Has assigned subjects. |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Navigate to /dashboard/tutor/exams 2. Click “Create Exam” 3. Select subject 4. Enter: title, type (MCQ or Essay), max score, duration 5. Submit (POST /exam/create_paper) |
| Expected Result | Exam paper created in tbl_exam_paper. Status: pending approval. Visible in tutor's paper list. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | MCQ exam paper created |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Open exam paper 2. Click “Add Question” 3. Enter question text 4. Enter 4 answer options 5. Select correct answer 6. Save (POST /exam/set_questions) 7. Repeat for multiple questions |
| Expected Result | Questions saved in tbl_questions. Each linked to paper_id. Correct answer stored. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Exam paper has questions |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. View questions for paper 2. Click “Delete” on a question (POST /exam/delete_question) |
| Expected Result | Question removed. Question count decrements. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Tutor has created papers |
| Client | Both |
| Role | Tutor |
| Steps | 1. Navigate to Exams page (POST /exam/tutor_paper) |
| Expected Result | Table shows: paper ID, subject, title, type badge (MCQ/Essay), max score, status. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Tutor has created papers |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to /dashboard/admin/exams/approvals 2. View pending list (POST /exam/admin_load_exams_for_approval) |
| Expected Result | Shows papers awaiting approval with details. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Pending paper exists |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Select paper 2. Click “Approve” (POST /v2/bridge/exams/papers/{id}/approve) |
| Expected Result | Paper approved. Can now be posted/scheduled for students. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Approved exam paper exists |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to /dashboard/admin/exams/dates 2. Click “New Exam Date” 3. Select subject and date 4. Submit (POST /admin/new_exam_date) |
| Expected Result | Exam date created. Students can now apply to sit exam on this date. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Exam date with no student bookings |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Select exam date 2. Click “Remove” (POST /admin/remove_exam_date) |
| Expected Result | Exam date removed. Only possible if no students booked. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Approved essay-type exam paper |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Select paper 2. Upload exam PDF (POST /v2/exam/paper/{id}/upload-pdf) 3. Set answer submission deadline |
| Expected Result | PDF stored. Paper marked as downloadable. Deadline saved. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student has approved subject. Exam date exists. |
| Client | Mobile |
| Role | Student |
| Steps | 1. Navigate to Exams 2. View available exams 3. Select exam to apply (POST /exam/exam_applications) |
| Expected Result | Application submitted. Status: pending approval. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student exam application exists |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to student exam approvals 2. Select application 3. Approve (POST /exam/approve_exam_requests) |
| Expected Result | Application approved. Student can take exam. Validation code sent. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student exam application exists |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Select application 2. Reject with remarks |
| Expected Result | Application rejected. Student notified. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Exam application approved |
| Client | Mobile |
| Role | Student |
| Steps | 1. Check email/SMS for validation code |
| Expected Result | Validation code received. Can be used to start exam. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Has validation code |
| Client | Mobile |
| Role | Student |
| Steps | 1. Enter validation code (POST /exam/validate_exam_code) |
| Expected Result | Code accepted. Exam ready to start. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Exam approved but code lost |
| Client | Mobile |
| Role | Student |
| Steps | 1. Click “Resend Code” (POST /exam/resend_exam_code) |
| Expected Result | New code sent. Previous code invalidated. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Code validated |
| Client | Mobile |
| Role | Student |
| Steps | 1. Click “Start Exam” (POST /exam/start_quiz) 2. Timer starts counting down 3. Questions display one at a time |
| Expected Result | Quiz session created. Timer visible. Questions load from tbl_questions. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Quiz in progress |
| Client | Mobile |
| Role | Student |
| Steps | 1. Answer all questions 2. Click “Submit” (POST /exam/submit_exam) |
| Expected Result | Answers compared to correct answers. Score calculated automatically. Results shown immediately. Record saved in tbl_student_quiz. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Downloadable exam exists and is approved |
| Client | Both |
| Role | Student |
| Steps | 1. Navigate to Exams 2. Find downloadable exam 3. Click “Download” (GET /v2/exam/paper/{id}/download) |
| Expected Result | Exam PDF downloads. Content matches uploaded exam. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Downloadable exam downloaded. Answer prepared as PDF. |
| Client | Both |
| Role | Student |
| Steps | 1. Click “Upload Answer” 2. Select PDF file 3. Submit (POST /v2/exam/paper/{id}/upload-answer) |
| Expected Result | Answer uploaded before deadline. Record created. Status: pending marking. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Deadline has passed |
| Client | Both |
| Role | Student |
| Steps | 1. Attempt to upload answer after deadline |
| Expected Result | Upload blocked. Error message about deadline. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Downloadable exam with deadline |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Find exam paper 2. Click “Enable Late” (POST /v2/exam/paper/{id}/enable-late) |
| Expected Result | Deadline extended. Student can now upload. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Students have submitted answers |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. View submitted answers (GET /v2/exam/paper/{id}/answers) |
| Expected Result | List of students who submitted answers with submission date. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student answer submitted |
| Client | Web Admin |
| Role | Tutor |
| Steps | 1. Download student's answer (GET /v2/exam/paper/{id}/answers/{studentId}) 2. Review answer 3. Enter score and remarks (POST /v2/exam/paper/{id}/answers/{studentId}/mark) |
| Expected Result | Score saved. Marking recorded. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Exam has been marked |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Review marks 2. Award final score (POST /exam/award_max) |
| Expected Result | Final score saved. Student can view result. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student has completed exams |
| Client | Both |
| Role | Student |
| Steps | 1. Navigate to exam history (POST /exam/past_quiz) |
| Expected Result | List of completed exams with scores and dates. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student has failed same exam 3 times |
| Client | Both |
| Role | Admin / Student |
| Steps | 1. Check retake eligibility (GET /v2/exam/retake/{studentId}/{subjectId}) 2. Verify suspension triggered after 3rd failure |
| Expected Result | After 3 failures: student account suspended for that subject. Suspension logged. Admin can view in suspension management. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in as Admin |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to /dashboard/admin/grading 2. View grading config (GET /v2/grading/config) |
| Expected Result | 6-tier scale displayed: High Distinction (85–100), Distinction (75–84.99), Credit (65–74.99), Merit (55–64.99), Pass (50–54.99), Fail (0–49.99). |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Logged in as Admin |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Modify grade boundaries 2. Save (PUT /v2/grading/config) 3. Reload page |
| Expected Result | Changes saved. New boundaries reflected on reload. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student has assignment and exam scores for a subject |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Query grade calculation (GET /v2/grading/student/{id}/subject/{id}) |
| Expected Result | Returns: assignment average, exam score, weighted total (50/50), grade tier name. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student with total weighted score of exactly 85.00 |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Calculate grade for student with 85.00 score |
| Expected Result | Grade = “High Distinction” (not “Distinction”). Boundary inclusive. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student with total weighted score of 49.99 |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Calculate grade for student with 49.99 score |
| Expected Result | Grade = “Fail” (below 50.00 Pass threshold). |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student with total weighted score of exactly 50.00 |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Calculate grade for student with 50.00 score |
| Expected Result | Grade = “Pass” (meets minimum threshold). |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student has grades in multiple subjects |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Query grade summary (GET /v2/grading/student/{id}/summary) |
| Expected Result | Returns all subjects with scores and grades. Overall average calculated. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Student has existing grade |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Edit final score (PUT /v2/grading/student/{id}/subject/{id}/final) 2. Enter new score |
| Expected Result | Score overridden. Grade recalculated based on new score. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student completed all subjects in academic level. All graded. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to Certificates 2. Select student and academic level 3. Generate (POST /v2/certificates/generate/{studentId}/{levelId}) |
| Expected Result | Certificate PDF generated with: student name, level, date, serial number, QR code. Stored in MinIO. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Certificate generated |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Download certificate PDF 2. Inspect for QR code |
| Expected Result | QR code present on certificate. Encodes verification URL with serial number. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Certificate generated |
| Client | Both |
| Role | Any |
| Steps | 1. Download certificate (GET /v2/certificates/download/{serialNumber}) |
| Expected Result | PDF downloads. Content matches generated certificate. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Certificate with QR code |
| Client | Any browser |
| Role | Public (no login) |
| Steps | 1. Scan QR code or visit verification URL 2. GET /v2/certificates/verify/{serialNumber} |
| Expected Result | Public page shows: student name, level, date, institution. Confirms certificate is genuine. No authentication required. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Student has certificates |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Query certificates (GET /v2/certificates/student/{studentId}) |
| Expected Result | List of all certificates with serial numbers, levels, dates. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student has graded subjects |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Generate transcript (GET /v2/transcripts/{studentId}) |
| Expected Result | PDF generated with: all subjects, assignment scores, exam scores, total, grade tier for each. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Logged in as Admin. Student enrolled in subjects with costs. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to /dashboard/admin/billing 2. Enter student ID 3. Click “Calculate” (POST /v2/billing/calculate/{studentId}) |
| Expected Result | Billing calculated. Shows: student name, total amount, billing date, line items (each subject + cost). |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Critical |
| Preconditions | Student enrolled in subjects with known costs in tbl_subjects |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Calculate billing 2. Compare line item costs to tbl_subjects.cost |
| Expected Result | Each line item cost matches the subject's cost in database. Total = sum of all subject costs. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Billing record exists |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Query billing (GET /v2/billing/{billingId}) |
| Expected Result | Full billing details returned. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student has multiple billing records |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Query history (GET /v2/billing/student/{studentId}) |
| Expected Result | List of all billing records for student across terms/levels. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Billing records exist |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Set date range filter (fromDate, toDate) 2. Click “Export” (GET /v2/billing/export) |
| Expected Result | Excel file downloads with billing data within date range. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Student billing exists |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Set studentId filter 2. Export |
| Expected Result | Excel contains only that student's billing records. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Student already has billing. New subject added. |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Add new subject to student 2. Recalculate billing |
| Expected Result | New total includes the additional subject cost. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | Medium |
| Preconditions | Student has billing |
| Client | Web Admin |
| Role | Admin |
| Steps | 1. Navigate to student detail page 2. Check billing section |
| Expected Result | Billing summary visible in student detail view. |
| Actual Result | |
| Status |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | Admin: Total Students card matches DB count | Web Admin | Count matches SELECT COUNT(*) FROM tbl_student | ||
| 2 | Admin: Pending Approvals card is accurate | Web Admin | Matches pending student count | ||
| 3 | Admin: Active Subjects count is correct | Web Admin | Matches active subjects in tbl_subjects | ||
| 4 | Admin: Suspended Students count is correct | Web Admin | Matches suspension records | ||
| 5 | ETO: Territory Students filtered correctly | Web Admin | Only shows students from ETO's territory | ||
| 6 | Tutor: Pending Assignments count correct | Web Admin | Matches unmarked assignments for tutor | ||
| 7 | Student: Enrolled Subjects count correct | Both | Matches student's active selections | ||
| 8 | Student: Average Score is accurate | Both | Matches calculated average |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | WebSocket connection establishes | Both | Chat connects on /ws | ||
| 2 | Send message to another user | Both | Message delivered | ||
| 3 | Receive real-time message | Both | Appears without refresh | ||
| 4 | Chat history loads correctly | Both | Previous messages shown | ||
| 5 | Unread message count updates | Both | Counter increments on new message | ||
| 6 | Chat pagination works | Web Admin | Load older messages on scroll | ||
| 7 | User chat list loads | Both | Recent conversations visible | ||
| 8 | Cross-role chat works (student-tutor) | Both | Messages flow between roles | ||
| 9 | AI chatbot responds to keywords | Mobile | Bot replies to “assignment”, “exam”, etc. | ||
| 10 | Chatbot escalation offer works | Mobile | Offers human support on unknown query |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | Upload PDF reading material | Web Admin | Stored in MinIO | ||
| 2 | Upload Word doc (auto-convert to PDF) | Web Admin | Converted and stored as PDF | ||
| 3 | Download inline view | Both | Opens in browser | ||
| 4 | Download with attachment header | Both | Saves as file | ||
| 5 | 100MB max size enforced | Both | Files > 100MB rejected | ||
| 6 | Unsupported formats rejected | Both | Non-PDF/Word blocked | ||
| 7 | MinIO storage verified | Backend | File exists in salt-files bucket | ||
| 8 | Legacy filesystem fallback works | Backend | Old files at /opt/salt_files accessible |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | ETO Progressive Report generates | Web Admin | Excel downloads | ||
| 2 | Pending Approval Report generates | Web Admin | Excel downloads | ||
| 3 | Pending Subject Approval Report | Web Admin | Excel downloads | ||
| 4 | Pending Exam Approval Report | Web Admin | Excel downloads | ||
| 5 | Tutor Students Report | Web Admin | Excel downloads | ||
| 6 | Tutor Subjects with Assignments | Web Admin | Excel downloads | ||
| 7 | Exam Register (Approved Exams) | Web Admin | Excel downloads | ||
| 8 | Final Course Update (Marked Exams) | Web Admin | Excel downloads |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | List active sessions | Web Admin | Sessions display | ||
| 2 | Create new session | Web Admin | Session created with name/status | ||
| 3 | Update session name/status | Web Admin | Changes saved | ||
| 4 | Search sessions by name | Web Admin | Filter works | ||
| 5 | View intake config | Web Admin | Configuration displays | ||
| 6 | Check intake period open/closed | Web Admin | Correct status returned |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | View suspended students list | Web Admin | Suspended students shown | ||
| 2 | Lift suspension with comments | Web Admin | Suspension lifted, student reactivated | ||
| 3 | Decline suspension appeal | Web Admin | Appeal declined, student stays suspended | ||
| 4 | Auto-suspend after 3 exam failures | Backend | Suspension triggered automatically | ||
| 5 | Suspended student blocked from exams | Both | Cannot access exam features | ||
| 6 | Legacy suspended accounts load | Web Admin | Historical suspensions visible |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | Admin creates announcement | Web Admin | Announcement saved | ||
| 2 | Active announcements display on dashboards | Both | Visible to all roles | ||
| 3 | Announcements load on mobile | Mobile | Displayed correctly | ||
| 4 | Old announcements archived | Web Admin | Only active shown by default |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | List all countries | Web Admin | Countries displayed | ||
| 2 | Create new country | Web Admin | Country added | ||
| 3 | Update country details | Web Admin | Changes saved | ||
| 4 | List territories by country | Web Admin | Filtered correctly | ||
| 5 | Create new territory | Web Admin | Territory added with code | ||
| 6 | Update territory | Web Admin | Changes saved |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | Schema status check | Web Admin | Status returned | ||
| 2 | Run integrity validation | Web Admin | Validation completes | ||
| 3 | View integrity log | Web Admin | Log entries displayed | ||
| 4 | Fix duplicates | Web Admin | Duplicates resolved | ||
| 5 | Export students backup (Excel) | Web Admin | File downloads | ||
| 6 | Export full backup (ZIP) | Web Admin | ZIP file downloads |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | Switch to English (en) | Mobile | All UI text in English | ||
| 2 | Switch to French (fr) | Mobile | All UI text in French | ||
| 3 | Switch to Kiswahili (sw) | Mobile | All UI text in Kiswahili | ||
| 4 | Switch to Portuguese (pt) | Mobile | All UI text in Portuguese | ||
| 5 | Error messages in selected language | Both | Backend errors translated | ||
| 6 | Language preference persists | Mobile | Same language after restart |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | Toggle to dark mode | Mobile | Dark theme applied | ||
| 2 | Toggle to light mode | Mobile | Light theme applied | ||
| 3 | Theme persists after restart | Mobile | Same theme on relaunch | ||
| 4 | All screens render in both themes | Mobile | No visual glitches |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | Overview metrics load | Exec Dashboard | Stat cards populated | ||
| 2 | Enrollment trends chart renders | Exec Dashboard | Line chart visible (12 months) | ||
| 3 | Territory breakdown chart renders | Exec Dashboard | Bar chart visible | ||
| 4 | Assignment analytics display | Exec Dashboard | Data populated | ||
| 5 | Exam analytics display | Exec Dashboard | Data populated | ||
| 6 | Approval workflow stats display | Exec Dashboard | Data populated | ||
| 7 | Subject-territory matrix loads | Exec Dashboard | Table/grid visible | ||
| 8 | New vs continuing chart | Exec Dashboard | Chart visible | ||
| 9 | Marking progress tracker | Exec Dashboard | Progress bars visible | ||
| 10 | Date range filter works | Exec Dashboard | Data updates on filter change |
| # | Check | Client | Expected | Pass/Fail | Notes |
|---|---|---|---|---|---|
| 1 | FCM topic subscription on app launch | Exec Dashboard | App subscribes to salt_exec_events topic on startup | ||
| 2 | Notification bell visible in AppBar | Exec Dashboard | Bell icon displayed next to date filter and refresh buttons | ||
| 3 | Badge count starts at zero | Exec Dashboard | No badge shown when there are no unread notifications |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Executive Dashboard open and subscribed to salt_exec_events. Student has an assignment to submit. |
| Client | Exec Dashboard + Mobile |
| Role | Student (trigger) / Admin (observe on dashboard) |
| Steps | 1. Open Executive Dashboard and verify bell icon is visible 2. On a separate device, log in as Student 3. Student submits an assignment for subject FPNT01 4. Observe the Executive Dashboard within 30 seconds |
| Expected Result | Bell icon badge increments by 1. Opening the notification panel shows a notification with message indicating the student name, subject, and that an assignment was submitted. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Executive Dashboard open. A student is pending Admin approval (ETO already approved). |
| Client | Exec Dashboard + Web Admin |
| Role | Admin (trigger and observe) |
| Steps | 1. Open Executive Dashboard on one browser tab 2. Open Web Admin on another tab, navigate to pending students 3. Admin approves a pending student 4. Observe the Executive Dashboard within 30 seconds |
| Expected Result | Bell icon badge increments. Notification panel shows message indicating the student name, admission number, and that they were approved by Admin. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Executive Dashboard open. A student is pending ETO approval. |
| Client | Exec Dashboard + Web Admin |
| Role | ETO (trigger) / Admin (observe on dashboard) |
| Steps | 1. Open Executive Dashboard 2. Log in to Web Admin as ETO 3. ETO approves a pending student from their territory 4. Observe the Executive Dashboard within 30 seconds |
| Expected Result | Bell icon badge increments. Notification panel shows message indicating the student name, admission number, and that they were approved by ETO. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Executive Dashboard open. A submitted (unmarked) assignment exists. |
| Client | Exec Dashboard + Web Admin |
| Role | Tutor (trigger) / Admin (observe on dashboard) |
| Steps | 1. Open Executive Dashboard 2. Log in to Web Admin as Tutor 3. Tutor marks a student’s assignment with a score 4. Observe the Executive Dashboard within 30 seconds |
| Expected Result | Bell icon badge increments. Notification panel shows message indicating the tutor name, student name, subject, and score awarded. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Executive Dashboard open with zero unread notifications. |
| Client | Exec Dashboard |
| Role | Admin |
| Steps | 1. Verify badge count is 0 (no badge shown) 2. Trigger 3 events (e.g., submit assignment, mark assignment, approve student) in sequence 3. Observe badge count after each event |
| Expected Result | Badge count increments from 0 to 1, then 2, then 3 as each event is received. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Executive Dashboard has 3 or more unread notifications (badge shows count). |
| Client | Exec Dashboard |
| Role | Admin |
| Steps | 1. Verify badge shows unread count (e.g., 3) 2. Tap the bell icon to open notification panel 3. Tap “Mark All as Read” |
| Expected Result | All notifications change to read state. Badge count resets to zero (badge disappears). Notifications remain in the list but are no longer highlighted. |
| Actual Result | |
| Status |
| Field | Content |
|---|---|
| Priority | High |
| Preconditions | Executive Dashboard has notifications in the panel (read or unread). |
| Client | Exec Dashboard |
| Role | Admin |
| Steps | 1. Open notification panel 2. Verify notifications are listed 3. Tap “Clear All” |
| Expected Result | All notifications removed from the panel. The list is empty. Badge count resets to zero. |
| Actual Result | |
| Status |
Scenario: New student from registration to certification.
| Step | Action | Role | Expected Outcome |
|---|---|---|---|
| 1 | Admin bulk uploads admission number | Admin | Student created with status “U” |
| 2 | Student self-registers on mobile | Student | Status changes to “N” |
| 3 | ETO reviews and approves | ETO | Status moves toward “P” |
| 4 | Admin gives final approval | Admin | Status = “D” (Done) |
| 5 | Student logs in | Student | Dashboard accessible |
| 6 | Student registers for Foundation subjects | Student | Subjects pending approval |
| 7 | ETO/Admin approves subjects | ETO/Admin | Subjects active |
| 8 | Student downloads reading materials | Student | Materials accessible |
| 9 | Student submits assignments | Student | Assignments recorded |
| 10 | Tutor marks assignments | Tutor | Scores entered |
| 11 | Admin approves marks | Admin | Marks finalized |
| 12 | Student takes MCQ exam | Student | Auto-marked, score recorded |
| 13 | Student downloads essay exam, uploads answer | Student | Answer submitted |
| 14 | Tutor marks essay | Tutor | Score entered |
| 15 | Admin awards final exam score | Admin | Score finalized |
| 16 | Grade calculated (50% assignment + 50% exam) | System | Grade tier assigned |
| 17 | Student completes all Foundation subjects | Student | Level complete |
| 18 | Admin generates certificate | Admin | PDF with QR code |
| 19 | Certificate QR verified publicly | Public | Verification confirms authenticity |
Pass/Fail: _____ Tester: _____________ Date: _____________
Scenario: Multiple students from different territories processed by different ETOs.
| Step | Action | Role | Expected Outcome |
|---|---|---|---|
| 1 | Students register from Kenya (+254) and Rwanda (+250) | Students | Status “N” for both |
| 2 | Kenya ETO logs in | ETO (+254) | Sees only Kenya students |
| 3 | Kenya ETO approves student | ETO (+254) | Kenya student moves to admin queue |
| 4 | Rwanda ETO logs in | ETO (+250) | Sees only Rwanda students, NOT Kenya |
| 5 | Rwanda ETO approves student | ETO (+250) | Rwanda student moves to admin queue |
| 6 | Admin sees both students | Admin | Both territories visible |
| 7 | Admin approves both | Admin | Both students status “D” |
Pass/Fail: _____ Tester: _____________ Date: _____________
Scenario: Student fails exam 3 times, gets suspended, then reinstated.
| Step | Action | Role | Expected Outcome |
|---|---|---|---|
| 1 | Student takes exam — attempt 1 | Student | Score below pass mark, fail |
| 2 | Student applies for retake | Student | Retake approved |
| 3 | Student takes exam — attempt 2 | Student | Score below pass mark, fail |
| 4 | Student applies for retake | Student | Retake approved |
| 5 | Student takes exam — attempt 3 | Student | Score below pass mark, fail |
| 6 | System auto-suspends student | System | Suspension created in tbl_suspension_log |
| 7 | Student cannot access exam features | Student | Exam features blocked |
| 8 | Admin views suspended students | Admin | Student visible in suspension list |
| 9 | Admin lifts suspension with comments | Admin | Student reactivated |
| 10 | Student can access exams again | Student | Features restored |
Pass/Fail: _____ Tester: _____________ Date: _____________
| Field | Description |
|---|---|
| Defect ID | DEF-NNN |
| Title | Short description |
| Severity | P1 (Critical) / P2 (High) / P3 (Medium) / P4 (Low) |
| Test Case ID | Related test case (e.g., AUTH-005) |
| Client | Web Admin / Mobile / Exec Dashboard / Backend |
| Steps to Reproduce | Numbered steps |
| Expected Result | What should happen |
| Actual Result | What actually happened |
| Screenshots | Attach if applicable |
| Assigned To | Developer name |
| Status | Open / In Progress / Fixed / Verified / Closed |
| Found Date | Date discovered |
| Fixed Date | Date resolved |
| Severity | Definition | Resolution |
|---|---|---|
| P1 — Critical | System crash, data loss, security breach, complete feature failure | Must fix before UAT can continue |
| P2 — High | Major feature broken, workaround exists but impractical | Must fix before sign-off |
| P3 — Medium | Minor feature issue, reasonable workaround exists | Fix before production, may defer |
| P4 — Low | Cosmetic, typo, minor UX improvement | Log for future release |
| Risk ID | Description | Probability | Impact | Mitigation |
|---|---|---|---|---|
| R-001 | Production database (salvation.sql) has inconsistent data | Medium | High | Test with actual production data dump. Document edge cases. |
| R-002 | MinIO not accessible / files missing | Low | High | Verify dual-read fallback to /opt/salt_files works. |
| R-003 | OTP delivery fails (SMS/email gateway down) | Medium | Critical | Test with test accounts that have verified email. Admin can reset passwords manually. |
| R-004 | Mobile app crashes on specific Android/iOS versions | Medium | Medium | Test on multiple devices. Document minimum versions. |
| R-005 | Concurrent user access causes data conflicts | Low | Medium | Test with multiple simultaneous users. Verify optimistic locking. |
| R-006 | Flyway migrations fail on production data | Low | Critical | Test migrations against salvation.sql dump first. Never modify existing migrations. |
| R-007 | Redis cache returns stale data | Low | Medium | Verify cache TTL settings. Test manual refresh. |
| R-008 | File upload exceeds 100MB limit | Low | Low | Verify server-side validation. Test with large files. |
| R-009 | JWT token expiry causes mid-operation failure | Medium | Medium | Verify graceful redirect to login. Check token refresh logic. |
| R-010 | i18n translations incomplete | Medium | Low | Verify all 4 languages have complete bundles. Document missing translations. |
| Metric | Value |
|---|---|
| Total Critical Test Cases | 112 |
| Total Checklist Items | 82 |
| Critical Tests Passed | _____ / 112 |
| Checklist Items Passed | _____ / 82 |
| P1 Defects Open | _____ |
| P2 Defects Open | _____ |
| P3 Defects Open | _____ |
| P4 Defects Open | _____ |
| Role | Name | Signature | Date |
|---|---|---|---|
| Project Manager | |||
| QA Lead | |||
| Development Lead | |||
| Business Owner (Salvation Army) | |||
| IT Manager |
_________________________________________________________________________
_________________________________________________________________________
_________________________________________________________________________