← Click here to go back to Home Page Documentation
College Logo
SALT
Salvation Army SALT College of Africa

User Acceptance Testing Plan

E-Learning Platform Overhaul — Comprehensive UAT

Document ID:SALT-UAT-2026-001
Version:1.0
Date:20th February 2026
Testing Period:February 17 – 28, 2026
Prepared By:Sumba Group Limited
Developed BySumba Group Limited
Classification:Internal — Confidential

Table of Contents

1. Introduction & Objectives 2. Scope & Out-of-Scope 3. Test Environment & Setup Checklist 4. User Roles & Test Accounts 5. Testing Schedule (2-Week Breakdown) 6. Test Cases 6.1 Authentication & Security 6.2 Student Enrollment 6.3 Subject & Curriculum Management 6.4 Assignment Management 6.5 Exam Management 6.6 Grading System 6.7 Billing Module 6.8 Suspension Management 6.9 Intake Configuration 6.10 Certificates & Transcripts 6.11 Chat System 6.12 Chatbot 6.13 File Storage 6.14 Notifications 6.15 Reports & Analytics 6.16 Data Integrity 6.17 Internationalization 6.18 Mobile App 6.19 Executive Dashboard 6.20 Sessions Management 6.21 Search Optimization 6.22 Tutor Reallocation 6.23 Marking Progress & Visibility 6.24 Profile Update 6.25 Day/Night Mode 6.26 Previous Performance CSV Upload 6.27 End-to-End Process Flows 7. Bug Report Template 8. Entry & Exit Criteria 9. Risk Register 10. Sign-Off

1. Introduction & Objectives

1.1 Purpose

This User Acceptance Testing (UAT) plan defines the testing strategy, schedule, and test cases for the E-Learning Platform overhaul. The UAT validates that the overhauled system meets all functional requirements, maintains backward compatibility with the production database, and delivers a reliable experience across all user roles and client applications.

1.2 Objectives

  1. Verify all features work correctly for each user role (Admin, ETO, Tutor, Student).
  2. Confirm backward compatibility with existing production data in salvation.sql.
  3. Validate the complete student lifecycle: registration → enrollment → study → assessment → certification.
  4. Test all three client applications: Web Admin (Next.js), Mobile App (Flutter), Executive Dashboard (Flutter).
  5. Confirm infrastructure components (PostgreSQL, Redis, MinIO) operate correctly.
  6. Ensure data integrity constraints and migration scripts (Flyway V1–V7) function without errors.
  7. Validate multi-language support (English, French, Kiswahili, Portuguese).
  8. Obtain formal sign-off from stakeholders before production deployment.

1.3 References

DocumentLocation
Database Schema (salvation.sql)Salvation-Army-Backend-main/src/main/resources/
Flyway Migrations V1–V7Salvation-Army-Backend-main/src/main/resources/db/migration/
API Base URL (Staging)https://stagging.saltcollegeandresourcecentre.com/SaltELearnAppApi
API Base URL (Production)https://app.saltcollegeandresourcecentre.com/SaltELearnAppApi
Web Admin (Staging)https://stagging.saltcollegeandresourcecentre.com
Web Admin (Production)https://app.saltcollegeandresourcecentre.com

2. Scope & Out-of-Scope

2.1 In Scope

2.2 Out of Scope

3. Test Environment & Setup Checklist

3.1 Environment Summary

Note: For full architecture details, CI/CD pipeline, EC2 deployment guide, and infrastructure diagrams, see the Technical Documentation (SALT_Technical_Documentation.html).
ComponentTechnologyPortPurpose
Backend APISpring Boot 3.4.2 (Java 17)8091REST API — /SaltELearnAppApi
DatabasePostgreSQL 175432DB Name: salvation
CacheRedis 7 (Alpine)6379Session & data caching
File StorageMinIO (S3-compatible)9000 / 9001Object storage + legacy fallback
Web AdminNext.js 16 (TypeScript, Tailwind 4)8081Admin panel — 35 pages, 4 roles
Mobile AppFlutter (Riverpod 3.x)Student-facing, 9 screens + chatbot
Exec DashboardFlutter (fl_chart)Analytics & reporting
StagingEC2 (Ubuntu)443stagging.saltcollegeandresourcecentre.com

3.2 UAT Environment Setup Checklist

4. User Roles & Test Accounts

RoleAccess LevelDescriptionTest AccountTerritory
Admin5 (highest)Full platform management, cross-territory accessUse existing admin from salvation.sqlAll / SALT-College
Tutor8Subject teaching, exam creation, assignment markingUse existing tutor from salvation.sqlAssigned territory
ETO9Education Training Officer, territory-level oversight and approvalsUse existing ETO from salvation.sqlAssigned territory
Student12 (lowest)Learning, exams, assignments, chatAdm# 2018333 (Esther Mwangale)Kenya (+254)
Student12Additional test studentAdm# 2024053 (Tebogo Nkotane)As assigned
Student12Additional test studentAdm# 2024054 (Andile Matukane)As assigned
Note: Lower access_level number = higher authority. All passwords are BCrypt hashed. Use the password reset flow via Admin if test account credentials are unknown.

5. Testing Schedule (2-Week Breakdown)

Week 1: February 17–21, 2026

DayDateFocus AreaTest CasesTesters
MonFeb 17Environment Setup & Smoke TestingVerify all infrastructure, run smoke tests on each applicationDev Team + QA
TueFeb 18Authentication & Security (6.1)AUTH-001 through AUTH-012All roles
WedFeb 19Student Enrollment (6.2)ENR-001 through ENR-021Admin, ETO, Student
ThuFeb 20Subject & Curriculum (6.3) + Assignment Mgmt (6.4)SUB-001 to SUB-010, ASG-001 to ASG-010Admin, Tutor, Student
FriFeb 21Exam Management (6.5) + RetakesEXM-001 through EXM-014Admin, Tutor, Student

Week 2: February 24–28, 2026

DayDateFocus AreaTest CasesTesters
MonFeb 24Grading (6.6) + Billing (6.7) + Suspension (6.8)GRD-001 to GRD-006, BIL-001 to BIL-005, SUS-001 to SUS-005Admin, Tutor
TueFeb 25Intake (6.9) + Certificates (6.10) + Chat (6.11) + Chatbot (6.12)INT-001 to INT-005, CRT-001 to CRT-005, CHT-001 to CHT-004, BOT-001 to BOT-005All roles
WedFeb 26File Storage (6.13) + Notifications (6.14) + Reports (6.15) + Sessions (6.20)FIL-001 to FIL-005, NTF-001 to NTF-005, RPT-001 to RPT-008, SES-001 to SES-003All roles
ThuFeb 27Data Integrity (6.16) + i18n (6.17) + Mobile App (6.18) + Exec Dashboard (6.19) + Search (6.21) + Tutor Realloc (6.22) + Marking (6.23) + Profile (6.24)DAT-001 to DAT-006, I18-001 to I18-003, MOB-001 to MOB-010, EXD-001 to EXD-005, SRC-001 to SRC-004, TRA-001 to TRA-003, MRK-001 to MRK-004, PRF-001 to PRF-004All roles
FriFeb 28Regression + Bug Fixes + Final Sign-OffRe-test all failed cases, full regression on critical pathsAll stakeholders
Important: Any critical (P1) bugs found during the first week must be fixed and retested before proceeding to Week 2. Non-critical bugs are logged and tracked for resolution before sign-off on Feb 28.

6. Test Cases

6.1 Authentication & Security

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
AUTH-001Valid login with OTP (2-step)Active user account exists
  1. Navigate to login page
  2. Enter valid username and password
  3. Submit credentials
  4. Receive OTP/access code
  5. Enter access code
  6. Submit
User is authenticated and redirected to role-appropriate dashboard. JWT token issued.
AUTH-002Invalid password login attemptActive user account exists
  1. Navigate to login page
  2. Enter valid username, wrong password
  3. Submit
Error message displayed. Login denied. Failed attempt logged in tbl_login_logs.
AUTH-003Brute-force protection lockoutActive user account exists; brute-force configured
  1. Attempt login with wrong password N times (where N = configured threshold)
  2. Attempt with correct password
Account is locked after N failed attempts. Even correct credentials are rejected until lockout period expires.
AUTH-004Must-Change-Password (MCP) flowNew user or admin-reset password
  1. Login with temporary password
  2. System prompts password change
  3. Enter new password (meeting complexity rules)
  4. Confirm new password
  5. Submit
Password updated successfully. User redirected to dashboard. Old password no longer works.
AUTH-005Password reset via AdminAdmin logged in; target user exists
  1. Admin navigates to user management
  2. Selects target user
  3. Clicks reset password
  4. Confirms action
Target user's password is reset. MCP flag set. User must change password on next login.
AUTH-006Session timeoutUser logged in; idle_time_out configured in tbl_sys_settings
  1. Login successfully
  2. Remain idle for duration exceeding idle_time_out
  3. Attempt any action
Session expired. User redirected to login page with appropriate message.
AUTH-007Role-based access — AdminAdmin logged in
  1. Access admin-only pages (user mgmt, system settings, billing)
  2. Verify all admin menus are visible
Full access to all platform features. All admin menu items visible and functional.
AUTH-008Role-based access — ETOETO logged in
  1. Access ETO pages (enrollment approvals, territory reports)
  2. Attempt to access admin-only pages
ETO can access territory-scoped features. Admin-only pages are inaccessible or hidden.
AUTH-009Role-based access — TutorTutor logged in
  1. Access tutor pages (assignments, exams, chat)
  2. Attempt to access admin or ETO pages
Tutor can access teaching features only. Admin/ETO pages inaccessible.
AUTH-010Role-based access — StudentStudent logged in
  1. Access student pages (subjects, assignments, exams, grades)
  2. Attempt to access tutor/admin pages
Student has access to learning features only. Higher-role pages inaccessible.
AUTH-011JWT token expiryUser logged in; token_expiry configured
  1. Login and note JWT token
  2. Wait for token to expire
  3. Make API request with expired token
API returns 401 Unauthorized. Client redirects to login.
AUTH-012Invalid/tampered JWTAPI running
  1. Craft a request with a modified/invalid JWT
  2. Send to a protected endpoint
API returns 401 Unauthorized. Request is rejected.

6.2 Student Enrollment

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
ENR-001Student self-registration (web)Web admin accessible; intake period open
  1. Navigate to registration page
  2. Fill all required fields (name, email, phone, territory, rank, session)
  3. Select entry type: N (New)
  4. Submit registration
Student record created with admission_status = "U" (Uploaded). Admission number generated. Confirmation displayed.
ENR-002Student self-registration (mobile)Mobile app installed; intake period open
  1. Open mobile app
  2. Tap Register
  3. Fill all required fields
  4. Submit
Student record created with admission_status = "U". Admission number generated. Success screen shown.
ENR-003Admission status flow: U → NStudent registered (status U)
  1. Verify student record has status "U"
  2. System or admin processes upload
  3. Status changes to "N" (Pending ETO)
Student status transitions from U to N. Student appears in ETO's pending approval queue.
ENR-004ETO approves enrollmentETO logged in; student in territory with status "N"
  1. ETO navigates to enrollment approvals
  2. Filters by territory
  3. Selects student (e.g., 2018333 Esther Mwangale)
  4. Reviews details and approves
Student status changes to "EP" (ETO Passed). Student moves to Admin approval queue.
ENR-005ETO rejects enrollmentETO logged in; student in territory with status "N"
  1. ETO navigates to enrollment approvals
  2. Selects a student
  3. Enters rejection reason
  4. Clicks Reject
Student status changes to "ER" (ETO Rejected). Rejection reason stored. Student notified.
ENR-006ETO territory scopingETO logged in; students from multiple territories exist
  1. ETO navigates to enrollment approvals
  2. Verify only students from ETO's territory are visible
  3. Attempt to approve student from different territory
ETO can only see and approve students within their assigned territory. Cross-territory students not visible.
ENR-007Admin approves enrollment (EP → P)Admin logged in; student with status "EP"
  1. Admin navigates to enrollment approvals
  2. Selects student with "EP" status
  3. Reviews and approves
Student status changes to "P" (Admin Approved). Student can now access learning features. Login credentials generated.
ENR-008Admin rejects enrollmentAdmin logged in; student with status "EP"
  1. Admin selects student
  2. Enters rejection reason
  3. Clicks Reject
Student status changes to "AR" (Admin Rejected). Rejection reason stored.
ENR-009Search student by admission numberAdmin/ETO logged in; student 2018333 exists
  1. Navigate to student search
  2. Enter admission number "2018333"
  3. Submit search
Esther Mwangale's record is returned with all details.
ENR-010Search student by emailAdmin logged in; student with known email exists
  1. Navigate to student search
  2. Search by email address
Matching student record(s) returned.
ENR-011Search student by phone numberAdmin logged in; student with known phone exists
  1. Navigate to student search
  2. Search by phone number
Matching student record(s) returned.
ENR-012Continuing student enrollment (entry type C)Previously approved student exists
  1. Student or admin initiates continuing enrollment
  2. Select entry type "C" (Continuing)
  3. Select next academic level
  4. Submit
Student enrolled at next level. Previous records preserved. Billing differentiates new vs continuing.
ENR-013ETO views student biodata and previous performance during approvalETO logged in; continuing student (entry type C) with previous performance data exists in territory
  1. ETO navigates to enrollment approvals
  2. Clicks on a pending student record
  3. Verify biodata section shows: full name, email, phone, DOB, gender, marital status, rank, country, territory, admission number, registration channel
  4. Verify previous performance section shows: previously completed subjects, grades/scores, pass/fail status
  5. Verify selected subjects for current enrollment are listed
ETO can see full student biodata AND previous academic performance on the approval review screen. Performance data includes subject names, scores, and grades from prior enrollment levels. This enables informed approval/rejection decisions.
ENR-014ETO must download student list before approvalETO logged in; pending students exist in territory
  1. ETO navigates to enrollment approvals
  2. Click "Download Student List" (Excel export)
  3. Verify downloaded Excel contains: admission number, name, email, phone, entry type (N/C), territory, registration date, admission status
  4. Filter download by New students only
  5. Filter download by Continuing students only
  6. Verify the download includes all pending students in territory
Excel file downloads successfully with all student data. Filtering by New (N) and Continuing (C) entry types works correctly. The list is a prerequisite for the ETO before performing any approvals.
ENR-015ER (ETO Rejected) allows re-registrationStudent with status "ER" exists
  1. Student with ER status attempts to re-register
  2. Complete registration form with same email
  3. Submit enrollment
Student can re-register successfully. New enrollment record created. Status set to "N" (pending ETO). Previous ER record is not affected.
ENR-016AR (Admin Rejected) allows re-registrationStudent with status "AR" exists
  1. Student with AR status attempts to re-register
  2. Complete registration form
  3. Submit enrollment
Student can re-register successfully. New enrollment record created with status "N". Previous AR record unaffected.
ENR-017ETO tracks application progress through all stagesETO logged in; students at various stages exist in territory
  1. ETO views student list — verify students with status U, N, EP, P, ER, AR are all visible
  2. Click on a student with status EP — verify ETO approval date and remarks are shown
  3. Click on a student with status P — verify both ETO and Admin approval dates/remarks shown
  4. Click on a student with status ER — verify rejection reason and date are shown
  5. Verify status history audit trail shows every status transition with timestamps and officer names
ETO has full visibility into each student's application progress through ALL registration stages. Status history shows a complete JSON audit trail of every status change (U→N→EP→P or U→N→ER etc.) with who performed each action and when.
ENR-018Student tallying: total students with new/continuing breakdown per territoryAdmin or ETO logged in; students exist across territories with entry_type N and C
  1. Navigate to student tallying/dashboard
  2. View total number of students
  3. View breakdown: total new students vs total continuing students
  4. View breakdown per territory
  5. Verify ETO sees only their own territory's tallies
  6. Verify Admin sees all territories
Dashboard shows cumulative totals: total students, new students (entry_type=N), continuing students (entry_type=C). Per-territory breakdown is accurate. ETO is scoped to their territory; Admin sees all.
ENR-019ETO approval view shows new, continuing-registered, and continuing-unregistered studentsETO logged in; territory has mixed student types
  1. Navigate to student approvals
  2. Verify ETO can see: new students (first-time enrollees)
  3. Verify ETO can see: continuing students who are already registered in the system
  4. Verify ETO can see: continuing students who are NOT yet registered
  5. Verify each category is clearly labeled or filterable
ETO approval page distinguishes between three categories: (1) New students, (2) Continuing students already registered, (3) Continuing students not yet registered. Each is clearly identifiable and filterable.
ENR-020Auto-capture registration number for continuing students (no "NA")Continuing student enrolls; they previously had an admission_no in the system
  1. Continuing student starts enrollment process
  2. Student enters their existing registration number
  3. Verify the system captures and stores the registration number entered by the student
  4. Verify the system does NOT default to "NA" for continuing students
  5. Verify ETO/Admin see the correct registration number during approval
The system automatically captures the registration number entered by the continuing student. No "NA" placeholder is used. This avoids rejection and repetition of the enrollment process, especially when handling large numbers of students.
ENR-021Re-upload previous performance records after approvalContinuing student has been approved at both ETO and Admin levels; some subjects are missing from previous performance
  1. Admin identifies a continuing student with missing subjects in their previous performance records
  2. Navigate to the student's performance management page
  3. Upload/re-upload previous performance records (subjects and scores)
  4. Verify the newly uploaded subjects appear in the student's record
  5. Verify this can be done AFTER the student has already been approved
System allows re-uploading of previous performance records for continuing students even after approval at both ETO and Admin levels. Missing subjects can be added without requiring the student to re-enroll. Previously uploaded data is preserved.

6.3 Subject & Curriculum Management

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
SUB-001View learning levelsAdmin logged in
  1. Navigate to curriculum management
  2. View available learning levels
Three levels displayed: Foundation, Certificate, Diploma. Each with correct subjects.
SUB-002Create new subjectAdmin logged in
  1. Navigate to subject management
  2. Click Add Subject
  3. Enter subject code (e.g., FPNT02), name, learning level, cost
  4. Save
Subject created with correct code format. Appears in subject list under appropriate level.
SUB-003Soldier progression pathStudent with Soldier rank, approved enrollment
  1. Verify Foundation subjects available
  2. Complete Foundation level
  3. Verify Certificate subjects become available
  4. Complete Certificate
  5. Verify Diploma subjects become available
Soldiers follow Foundation → Certificate → Diploma path. Each level unlocks sequentially.
SUB-004Non-Soldier progression pathStudent without Soldier rank, approved enrollment
  1. Verify Foundation is skipped
  2. Certificate subjects available directly
  3. Complete Certificate
  4. Diploma subjects become available
Non-Soldiers follow Certificate → Diploma path (no Foundation). Correct subjects displayed.
SUB-005Student selects subjectsStudent logged in; enrolled at a learning level
  1. Navigate to subject selection
  2. View available subjects for current level
  3. Select subjects
  4. Confirm selection
Records created in tbl_student_subjects_selection. Subject costs calculated. Selection status = "P" (Pending).
SUB-006Subject cost trackingAdmin logged in; subjects with costs configured
  1. View subject details
  2. Verify cost field is populated
  3. Enroll student in subject
  4. Verify cost appears in billing
Subject costs correctly tracked and reflected in student billing calculations.
SUB-007Subject level gating — student cannot access next level before completing currentStudent enrolled at Foundation level with incomplete subjects
  1. Student views subjects — only Foundation subjects visible
  2. Attempt to apply for Certificate level while Foundation subjects are incomplete
  3. Verify system rejects the request
  4. Complete all Foundation subjects with passing grades
  5. Apply for Certificate level again
System blocks access to next level subjects until ALL subjects in current level are completed with passing grades. After completion, next level subjects become visible and enrollment is allowed.
SUB-008Admin configures subject grouping and level countAdmin logged in
  1. Navigate to Learning Levels configuration
  2. View existing levels (Foundation, Certificate, Diploma)
  3. Verify subject counts per level are accurate
  4. Verify admin can adjust level configuration
Admin can view and configure learning levels. Subject-to-level assignments are correct. Level progression depends on the number of levels configured by admin.
SUB-009Student can only view subjects in their current levelStudent enrolled at Certificate level; Foundation completed
  1. Student logs in and navigates to Subjects
  2. Verify only Certificate-level subjects are shown for selection
  3. Verify Foundation subjects show as "Completed" (view only)
  4. Verify Diploma subjects are NOT visible until Certificate is completed
Students see only their current level subjects for active enrollment. Completed level subjects are viewable but read-only. Next level subjects are hidden until progression criteria are met.
SUB-010Tutor-subject assignment during student approvalAdmin approving student; subjects selected by student
  1. Admin reviews student's selected subjects during approval
  2. For each subject, assign a tutor from available tutors
  3. Approve all subjects
  4. Verify tutor receives the student in their assigned subject list
Tutor-subject-student relationship created correctly. Tutor can see the student under their assigned subjects. Student can access materials/assignments for the subject.

6.4 Assignment Management

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
ASG-001Tutor uploads assignmentTutor logged in; assigned to subject
  1. Navigate to assignment management
  2. Select subject
  3. Upload assignment file (PDF/DOCX)
  4. Set title and instructions
  5. Save
Assignment created in tbl_materials_upload. File stored in MinIO. Visible to enrolled students.
ASG-002Monthly upload limit enforcementTutor has uploaded 3 assignments for a subject this month (max configured)
  1. Attempt to upload a 4th assignment for same subject in same month
System prevents upload. Error message: maximum assignments per month reached.
ASG-003Student downloads assignmentStudent enrolled in subject; assignment uploaded
  1. Navigate to assignments
  2. Select subject
  3. View assignment
  4. Download assignment file
Assignment file downloaded successfully. Content matches uploaded file.
ASG-004Student submits assignmentStudent enrolled; assignment available
  1. Navigate to assignment submission
  2. Select assignment
  3. Upload completed work (PDF/DOCX)
  4. Submit
Submission recorded. Status = "N" (New). File stored in MinIO under student_assignments/. Timestamp recorded.
ASG-005Tutor marks assignmentTutor logged in; student submission exists
  1. Navigate to unmarked assignments
  2. Select student submission
  3. Download and review
  4. Enter score and remarks
  5. Submit marking
Mark recorded in tbl_assignment_marking. Status changes to "R" (Reviewed). Student can view score.
ASG-006Late assignment handlingAssignment deadline passed; student attempts submission
  1. Student attempts to submit after deadline
  2. System flags as late
  3. Admin reviews late submission request
  4. Admin approves/rejects
Late submission requires admin approval. If approved, submission proceeds. If rejected, student notified.
ASG-007Assignment retake (failed)Student scored below pass threshold; retakes < 3
  1. Student requests assignment retake
  2. System verifies retake count < 3
  3. Student submits new work
Retake allowed (up to 3 attempts). New submission recorded with retake count incremented. Previous scores preserved.
ASG-008Assignment reports (marked/unmarked)Admin/Tutor logged in; assignments exist in various states
  1. Navigate to assignment reports
  2. Filter by marked/unmarked status
  3. Filter by subject/territory
Report shows accurate counts and details for marked and unmarked assignments. Filters work correctly.
ASG-009Student monthly submission limit (configurable)Admin has configured max_assignments_per_month=3 in System Settings; student logged in
  1. Student submits 3 assignments for the same subject in the current month
  2. Student attempts to submit a 4th assignment for the same subject in the same month
  3. Admin changes max_assignments_per_month to 5 in System Settings
  4. Student can now submit additional assignments
System enforces the admin-configured monthly submission limit per subject. After 3 submissions (default), further submissions are blocked with a clear message. Changing the limit in System Settings takes effect immediately.
ASG-010Assignment date filter accuracyAssignments uploaded across multiple months; Admin/Tutor logged in
  1. Navigate to assignment reports
  2. Filter by upload month (e.g., September)
  3. Verify only September assignments are displayed (not August or October)
  4. Repeat for other months to confirm accuracy
System displays assignments from the exact selected month. No off-by-one errors in date filtering. The filter matches the actual upload timestamp, not a shifted month.

6.5 Exam Management

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
EXM-001Create MCQ exam paperTutor logged in; subject assigned
  1. Navigate to exam management
  2. Click Create Exam Paper
  3. Select subject, set title, duration
  4. Add MCQ questions with options and correct answers
  5. Save paper
Exam paper created in tbl_exam_paper. Questions stored in tbl_questions. Paper linked to subject.
EXM-002Create essay exam paperTutor logged in; subject assigned
  1. Create exam paper
  2. Add essay-type questions
  3. Save
Essay exam paper created. Questions do not have auto-grading options.
EXM-003Schedule exam dateExam paper created; admin/tutor logged in
  1. Navigate to exam scheduling
  2. Select exam paper
  3. Set date, start time, end time
  4. Confirm schedule
Exam date recorded in tbl_exam_dates. Enrolled students can see scheduled exam.
EXM-004Student takes online MCQ examExam scheduled; student enrolled; exam window open
  1. Student navigates to exams
  2. Clicks Start Exam
  3. Answers MCQ questions
  4. Submits exam before time expires
Answers saved in tbl_paper_answer. MCQ auto-graded. Score calculated and displayed. Quiz record in tbl_student_quiz.
EXM-005Exam timer enforcementStudent taking timed exam
  1. Start exam
  2. Let timer reach zero without submitting
Exam auto-submitted when time expires. Answered questions graded; unanswered marked as incorrect.
EXM-006Downloadable exam (PDF)Tutor creates downloadable exam with PDF upload
  1. Tutor creates exam paper with downloadable=true
  2. Uploads exam PDF
  3. Sets submission deadline
  4. Student downloads exam PDF
  5. Student uploads answer PDF before deadline
Exam PDF downloadable. Student uploads answer file. Submission timestamp recorded. Late submissions blocked after deadline.
EXM-007Exam retake (failed)Student failed exam; retake count < 3
  1. Student requests exam retake
  2. System verifies retake eligibility
  3. Student takes exam again
Retake allowed (up to 3 attempts). New quiz record created. Previous attempt preserved. Retake count incremented.
EXM-008Oral exam score entryTutor logged in; student completed oral exam
  1. Navigate to exam marking
  2. Select student and oral exam
  3. Enter oral exam score
  4. Save
Oral score saved. Contributes to overall grade calculation alongside written exam and assignments.
EXM-009Quiz auto-populationExam paper created; students enrolled in subject
  1. Admin/Tutor creates exam for subject
  2. Verify quiz records auto-created for all enrolled students
Quiz records in tbl_student_quiz auto-generated for each enrolled student. All have pending status.
EXM-010Tutor marks essay examStudent submitted essay answers
  1. Tutor navigates to exam marking
  2. Selects essay submission
  3. Reviews answers
  4. Enters scores per question
  5. Submits marks
Essay scores recorded. Total calculated. Student can view results.
EXM-011Exam results view (student)Student completed and graded exam
  1. Student navigates to results/grades
  2. Views exam results
Student can see score, grade, and correct/incorrect answers for MCQ. Essay scores visible after tutor marking.
EXM-012Exam report generationAdmin/Tutor logged in; completed exams exist
  1. Navigate to exam reports
  2. Filter by subject, date range, territory
  3. View/export report
Report shows exam performance metrics: pass rate, average score, distribution. Export to Excel/PDF works.
EXM-013Retake limit enforcement (3 attempts max)Student has failed an exam 3 times for a subject
  1. Student attempts a 4th retake of the same exam
  2. Verify system blocks the retake
  3. Verify student can no longer access online assignments and exams for that subject
After 3 failed attempts, student is blocked from further online exam/assignment access for the subject. System displays a clear message explaining the retake limit has been reached and oral examination is required.
EXM-014Oral exam after 3 failed attemptsStudent has exhausted 3 retake attempts; Admin/Tutor logged in
  1. Tutor/Admin navigates to oral exam score entry
  2. Selects the student who has exhausted retakes
  3. Enters oral assignment score and oral exam score manually
  4. Saves the scores
  5. Verify the scores contribute to the final grade calculation
Oral scores are manually entered for both assignments and exams. Scores are recorded and integrated into the grading formula. The student's final grade reflects the oral assessment results alongside any previous scores.

6.6 Grading System

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
GRD-001Verify grading thresholdsGrading config seeded (Flyway V5)
  1. Query tbl_grading_config
  2. Verify 6 tiers: High Distinction (85-100), Distinction (75-84.99), Credit (65-74.99), Merit (55-64.99), Pass (50-54.99), Fail (0-49.99)
All 6 grading tiers present with correct ranges. No gaps or overlaps.
GRD-002Weighted grade calculationStudent has assignment score and exam score for a subject
  1. Verify assignment_weight_pct + exam_weight_pct = 100% in system settings
  2. Calculate expected weighted grade manually
  3. Compare with system-calculated grade
System grade matches manual calculation: (assignment_score * assignment_weight / 100) + (exam_score * exam_weight / 100).
GRD-003Grade tier assignmentStudent has calculated weighted score
  1. Check student's weighted score
  2. Verify correct grade tier assigned based on thresholds
Score of 87 = High Distinction, 76 = Distinction, 66 = Credit, 56 = Merit, 51 = Pass, 45 = Fail.
GRD-004Student grade summaryStudent logged in; has grades in multiple subjects
  1. Navigate to grades/performance page
  2. View summary across all subjects
All subjects listed with individual scores, weighted grades, and grade tiers. Overall GPA/average displayed.
GRD-005Admin edits final scoreAdmin logged in; student has a calculated grade
  1. Navigate to grade management
  2. Select student and subject
  3. Edit final score
  4. Save with reason
Final score updated. Audit trail records the change with admin name and reason. Grade tier recalculated.
GRD-006Configurable grading weightsAdmin logged in
  1. Navigate to system settings
  2. Change assignment_weight_pct and exam_weight_pct
  3. Save
  4. Verify new weights applied to future calculations
Weight changes saved. New calculations use updated weights. Existing grades not retroactively changed.

6.7 Billing Module

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
BIL-001New student billing calculationNew student enrolled in subjects with costs
  1. Student enrolls in 3 subjects (each with defined cost)
  2. View billing page
Total billing = sum of selected subject costs. New student rate applied. Line items shown per subject.
BIL-002Continuing student billingContinuing student enrolled in new subjects
  1. Continuing student selects subjects for next level
  2. View billing
Continuing student rate applied (may differ from new student). Billing history shows previous + current charges.
BIL-003Billing history per studentAdmin logged in; student has billing records
  1. Navigate to student's billing page
  2. View billing history
Complete billing history displayed with dates, amounts, subjects, and payment status.
BIL-004Excel export (single student)Admin logged in; student has billing data
  1. Navigate to student billing
  2. Click Export to Excel
  3. Open downloaded file
Excel file generated with correct billing data. Columns match display. File opens without errors.
BIL-005Excel export (date range)Admin logged in; billing records exist
  1. Navigate to billing reports
  2. Set date range
  3. Click Export to Excel
Excel file contains all billing records within date range. Totals accurate. File format correct.

6.8 Suspension Management

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
SUS-0011-year deadline trackingStudent enrolled in subject with start date > 1 year ago
  1. Verify subject selection record has start date
  2. Check if 1-year deadline has passed
System correctly identifies students past the 1-year completion deadline.
SUS-002Automatic suspension (scheduled job)Daily scheduler configured; student past deadline
  1. Wait for scheduled job to run (or trigger manually)
  2. Verify student with expired deadline is suspended
Student's subject selection flagged as suspended. Suspension log entry created with auto-generated comment.
SUS-003Admin lifts suspensionAdmin logged in; student is suspended
  1. Navigate to suspension management
  2. Select suspended student
  3. Enter reason for lifting
  4. Click Lift Suspension
Suspension removed. Student can resume subject. Log entry records who lifted and why.
SUS-004Admin declines suspension liftAdmin logged in; student requests suspension lift
  1. Review suspension lift request
  2. Enter decline reason
  3. Click Decline
Suspension remains. Student notified of decline. Log entry records decision and reason.
SUS-005Suspension log audit trailAdmin logged in; suspensions have been processed
  1. Navigate to suspension logs
  2. View history for a specific student
Complete log showing: suspension date, reason, who lifted/declined, timestamps, comments.
SUS-006Admin searches for suspended studentsAdmin logged in; multiple students have expired subject deadlines
  1. Navigate to Suspension Management
  2. View list of all suspended students
  3. Search/filter by territory, subject, or suspension date
  4. Verify each entry shows: student name, admission number, subject, enrollment date, suspension date, territory
Admin sees a searchable list of all students who failed to complete their subject within 1 year. List includes all relevant details for decision-making.
SUS-007ETO notification of suspensionStudent in ETO's territory has been suspended
  1. Verify ETO has been formally communicated about the suspension
  2. ETO can view suspended students in their territory
ETO is notified of student suspensions in their territory. The communication includes student details and suspension reason.
SUS-008Lifted suspension resets 1-year deadlineAdmin has lifted a student's suspension
  1. Admin lifts suspension with comments
  2. Verify student's subject enrollment is re-activated
  3. Verify a new 1-year deadline is set from the lift date
  4. Student can access subject materials and submit assignments again
After suspension is lifted, student starts over with a fresh 1-year completion window. Previous progress is preserved but the deadline counter resets.

6.9 Intake Configuration

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
INT-001Configure intake periodAdmin logged in
  1. Navigate to intake configuration
  2. Set active months for enrollment
  3. Set behavior: BLOCK or WARNING
  4. Save configuration
Intake periods saved. Configuration reflected immediately in enrollment availability.
INT-002BLOCK mode enforcementIntake set to BLOCK; current month not in intake period
  1. Student attempts registration outside intake period
Registration blocked. Clear message: "Enrollment is not open. Next intake: [month]."
INT-003WARNING mode behaviorIntake set to WARNING; current month not in intake period
  1. Student attempts registration outside intake period
Warning displayed but registration allowed to proceed. Warning logged.
INT-004Intake dates visible to students during enrollmentAdmin has configured intake periods with specific months and dates
  1. Student opens registration/enrollment form
  2. View the available intake periods displayed on the form
  3. Verify intake periods show month, start date, and end date
  4. Verify only active intake periods are displayed
Students can see all configured intake periods during enrollment. Each period shows the month, start date, and end date. Only active periods are visible. Students can apply during any open intake period within the year.
INT-005Admin configures monthly intake with specific datesAdmin logged in
  1. Navigate to Intake Configuration
  2. Create an intake for a specific month (e.g., March 2026)
  3. Set start date and end date within that month
  4. Set year (or leave empty for recurring every year)
  5. Save configuration
  6. Verify the intake appears in the list
Intake period saved with specific month and dates. Configuration supports both one-time (specific year) and recurring (every year) intake periods. Students see this configuration when enrolling.

6.10 Certificates & Transcripts

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
CRT-001Generate certificate PDFStudent completed all subjects in a level with passing grades
  1. Admin navigates to certificate generation
  2. Selects eligible student
  3. Clicks Generate Certificate
  4. Downloads PDF
PDF generated with: student name, level completed, date, unique serial number, QR code. Format is professional and correct.
CRT-002Certificate serial number uniquenessMultiple certificates generated
  1. Generate certificates for 3 different students
  2. Compare serial numbers
Each certificate has a unique serial number. No duplicates in tbl_certificates.
CRT-003QR code verification (public)Certificate with QR code generated
  1. Scan QR code on certificate
  2. Follow URL (no authentication required)
Public verification page displays: student name, level, date, serial number. Confirms certificate authenticity. No login required.
CRT-004Generate transcript PDFStudent has grades across multiple subjects
  1. Navigate to transcript generation
  2. Select student
  3. Generate transcript
  4. Download PDF
Transcript PDF contains: all subjects, individual scores, weighted grades, grade tiers, overall average. Formatted professionally.
CRT-005Certificate for ineligible studentStudent has incomplete or failed subjects
  1. Attempt to generate certificate for student who hasn't completed level
System prevents certificate generation. Message indicates which requirements are not met.

6.11 Chat System

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
CHT-001Student sends message to tutorStudent and tutor logged in; both have active accounts
  1. Student opens chat
  2. Selects tutor
  3. Types and sends message
Message delivered. Appears in tutor's chat. Timestamp recorded. Stored in tbl_chat.
CHT-002Tutor responds to studentStudent message received
  1. Tutor opens chat
  2. Reads student message
  3. Types and sends reply
Reply delivered to student. Conversation thread maintained. Both can see full history.
CHT-003Unread message countMessages sent to a user who hasn't read them
  1. Send 3 messages to a user
  2. Check recipient's unread count
  3. Recipient reads messages
  4. Check count again
Unread count shows 3. After reading, count resets to 0.
CHT-004Message history persistencePrevious chat messages exist
  1. Open chat with a contact
  2. Scroll through message history
  3. Verify old messages are present
Full message history available. Messages ordered chronologically. No data loss.

6.12 Chatbot

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
BOT-001FAQ keyword matchingFAQs seeded in tbl_chatbot_faq
  1. Open chatbot
  2. Type a keyword matching an FAQ (e.g., "enrollment")
  3. Submit
Chatbot returns matching FAQ answer(s). Relevant and accurate response.
BOT-002Category filteringFAQs categorized (enrollment, exams, billing, etc.)
  1. Open chatbot
  2. Select a category
  3. View available FAQs in category
Only FAQs from selected category displayed. Categories match expected groupings.
BOT-003Multi-language supportFAQs available in multiple languages
  1. Set language to French
  2. Query chatbot
  3. Repeat for Kiswahili and Portuguese
Responses returned in selected language. Language switching works seamlessly.
BOT-004Escalation to human supportChatbot cannot answer query
  1. Ask a question not in FAQs
  2. Chatbot offers escalation option
  3. Select escalate
  4. Enter additional details
  5. Submit
Escalation record created in tbl_chatbot_escalations. Admin/support notified. Student receives confirmation.
BOT-005Image upload for supportStudent in escalation flow
  1. During escalation, click attach image
  2. Select screenshot or photo
  3. Submit with description
Image uploaded and attached to escalation record. Stored in MinIO. Viewable by support staff.

6.13 File Storage

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
FIL-001Upload file to MinIOMinIO running; salt-files bucket exists
  1. Upload a file via any upload feature (assignment, reading material)
  2. Verify in MinIO console
File stored in MinIO salt-files bucket. Path follows territory-based structure. File accessible via API.
FIL-002Download file from MinIOFile previously uploaded to MinIO
  1. Request file download via API
  2. Verify file content
File downloaded correctly. Content matches original upload. Correct MIME type returned.
FIL-003Dual-read fallback to filesystemFile exists in /opt/salt_files but NOT in MinIO
  1. Ensure file exists only in legacy path
  2. Request file download
System tries MinIO first, falls back to /opt/salt_files. File returned successfully from legacy path.
FIL-004File size limit (100MB)Server configured with max-file-size=100MB
  1. Upload a file just under 100MB
  2. Upload a file over 100MB
Under-limit file uploads successfully. Over-limit file rejected with clear error message.
FIL-005File path structure verificationFiles uploaded for different territories
  1. Upload files for Kenya (+254) and Rwanda (+250) territories
  2. Check MinIO/filesystem paths
Files organized by territory code: +254/, +250/. Structure matches legacy salt_files/ layout.
FIL-006Material reuse across multiple intakesAdmin logged in; existing reading material or assignment available
  1. Navigate to an existing reading material or assignment
  2. Click Reuse Material
  3. Select multiple intake periods (months) for which the material should be reused
  4. Confirm the reuse
  5. Verify the material appears in the selected intake periods
Admin can reuse materials on a monthly basis across multiple intake periods within a year. Material is linked to selected intakes without re-uploading. Students in the target intakes can access the reused material.
FIL-007Marking comments/remarks downloadable as marking schemeTutor has marked assignments/exams with comments; student and admin logged in
  1. Tutor marks an assignment with detailed comments/remarks
  2. Student views the marked assignment — verify comments are visible
  3. Admin views the marked assignment — verify comments are visible
  4. Download the assignment record with marking comments
  5. Verify the downloaded file includes all tutor comments
All tutor comments on marked assignments and exams are treated as the marking scheme. Comments are accessible to the student, tutor, and admin. The archived comments/marking scheme are downloadable.

6.14 Notifications

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
NTF-001SMS notification deliverySMS gateway configured; student has phone number
  1. Trigger an action that sends SMS (e.g., enrollment approval)
  2. Check tbl_sms_log
  3. Verify SMS received on phone
SMS record logged. Delivery status tracked. Student receives SMS on phone.
NTF-002Email notification deliverySMTP configured in system settings
  1. Trigger an action that sends email
  2. Check recipient's inbox
Email delivered to recipient. Content is correct and formatted properly.
NTF-003Notification channel configurationAdmin logged in
  1. Navigate to system settings
  2. Change notification channel (PUSH, SMS, EMAIL, SMS_EMAIL, ALL)
  3. Trigger notification
  4. Verify correct channels used
Notifications sent via selected channel(s) only. Configuration change takes effect immediately.
NTF-004System announcementAdmin logged in
  1. Navigate to announcements
  2. Create new announcement with title and content
  3. Publish
  4. Login as student/tutor
Announcement visible to all users. Appears on dashboard. Stored in tbl_announcements.
NTF-005Push notification (FCM)Mobile app installed with FCM configured
  1. Trigger push notification
  2. Check mobile device
Push notification received on mobile device. Tapping opens relevant screen in app.

6.15 Reports & Analytics

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
RPT-001Admin dashboard real-time statsAdmin logged in; data exists
  1. Navigate to admin dashboard
  2. Review displayed statistics
Dashboard shows: total students, active enrollments, pending approvals, recent activity. Data is current.
RPT-002Enrollment trends reportAdmin logged in; enrollment data across multiple periods
  1. Navigate to enrollment reports
  2. Select date range
  3. View trends
Chart/table showing enrollment numbers over time. Filterable by territory, level, status.
RPT-003Assignment submission analyticsAdmin/Tutor logged in; assignment data exists
  1. Navigate to assignment reports
  2. View submission rates
Report shows: total assigned, submitted, pending, late submissions. Per subject and per territory breakdowns.
RPT-004Exam performance metricsAdmin logged in; exam results exist
  1. Navigate to exam reports
  2. View performance metrics
Metrics include: pass rates, average scores, score distributions, highest/lowest performers.
RPT-005Territory-level breakdownAdmin logged in; multi-territory data exists
  1. Navigate to territory reports
  2. Compare across territories
Side-by-side territory comparison: student counts, pass rates, assignment completion, active subjects.
RPT-006Student tallying (new vs continuing)Admin logged in; both new and continuing students exist
  1. Navigate to student tallying report
  2. Filter by entry type
Report distinguishes new (N) vs continuing (C) students. Totals per subject and per territory.
RPT-007Excel export from reportsAdmin logged in; report with data displayed
  1. Generate any report
  2. Click Export to Excel
  3. Open file
Excel file generated with Apache POI. Data matches on-screen report. Columns properly labeled. File opens correctly.
RPT-008PDF export from reportsAdmin logged in; report with data displayed
  1. Generate report
  2. Click Export to PDF
  3. Open file
PDF generated with OpenPDF. Formatted professionally. Data matches on-screen report.

6.16 Data Integrity

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
DAT-001Partial UNIQUE indexes on active recordsFlyway V7 migration applied
  1. Attempt to create two active students with same admission_no
  2. Verify constraint violation
Database rejects duplicate active admission_no. Constraint applies only to active records (not deleted/archived).
DAT-002BOM cleanup triggerBOM triggers installed (remove_bom, remove_bom_on_users)
  1. Insert a student record with BOM characters in admission_no (e.g., "2011278#")
  2. Query the record
BOM characters automatically stripped by trigger. Stored value is clean (e.g., "2011278").
DAT-003Admission status audit trailStudent exists; status changes occur
  1. Change student admission status through approval flow
  2. Query audit trail (JSON history field)
Each status change recorded with: old status, new status, changed_by, timestamp, reason. Full history preserved.
DAT-004Daily integrity checks (scheduled)Scheduler configured; data exists
  1. Wait for daily integrity check to run (or trigger manually)
  2. Review integrity log
Check results logged in tbl_data_integrity_log. Issues identified and flagged. No false positives.
DAT-005Schema management admin pageAdmin logged in
  1. Navigate to schema management page
  2. View current schema status
  3. View Flyway migration history
Page shows applied migrations (V1-V7), current schema version, table statistics, and index status.
DAT-006Data export (full backup)Admin logged in
  1. Navigate to data export
  2. Select export type (students, users, enrollments, or full)
  3. Initiate export
  4. Download file
Export file generated in appropriate format. Data complete and accurate. File downloadable.

6.17 Internationalization

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
I18-001Language switching (web)Web admin accessible; message bundles for all 4 languages
  1. Login to web admin
  2. Switch language to French
  3. Navigate several pages
  4. Switch to Kiswahili
  5. Switch to Portuguese
  6. Switch back to English
All UI labels, messages, and error texts change to selected language. No untranslated strings visible. Layout not broken.
I18-002Language switching (mobile)Mobile app installed; language bundles available
  1. Open mobile app settings
  2. Change language to each of the 4 options
  3. Navigate all screens
Mobile app fully translated. All screens render correctly in each language.
I18-003Error messages in selected languageLanguage set to non-English
  1. Set language to French
  2. Trigger a validation error (e.g., empty required field)
  3. Verify error message language
Error messages displayed in selected language via LanguageTranslator. Correct and understandable translation.

6.18 Mobile App

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
MOB-001Student registration (mobile)App installed; intake open
  1. Open app
  2. Tap Register
  3. Fill: name, email, phone, territory, rank, session
  4. Submit
Registration successful. Confirmation screen displayed. Student record created in backend.
MOB-002Student login (mobile)Approved student account exists
  1. Open app
  2. Enter credentials
  3. Complete OTP step
Login successful. Student dashboard displayed with subjects, announcements, notifications.
MOB-003Subject selection and level viewStudent logged in; enrolled at a level
  1. Navigate to subjects
  2. View current level subjects
  3. Select available subjects
Subjects displayed for current level. Selection saved. Correct level progression enforced.
MOB-004Assignment upload (mobile)Student logged in; assignment available
  1. Navigate to assignments
  2. Select assignment
  3. Upload answer file from device
  4. Submit
File uploaded to MinIO. Submission recorded. Confirmation shown. File accessible by tutor.
MOB-005Online exam (mobile)Student logged in; exam scheduled and open
  1. Navigate to exams
  2. Start available exam
  3. Answer questions
  4. Submit
Exam loads correctly on mobile. Timer visible. Questions navigable. Submission successful. Score displayed for MCQ.
MOB-006Downloadable exam (mobile)Downloadable exam available
  1. Navigate to exams
  2. Download exam PDF
  3. Complete offline
  4. Upload answer PDF
PDF downloads to device. Answer upload works within deadline. Late upload blocked.
MOB-007Performance/grades viewStudent logged in; has grades
  1. Navigate to grades/performance
  2. View subject grades
All subject grades displayed with scores, weighted grades, and grade tiers. Charts/visuals render correctly.
MOB-008Chat with tutors (mobile)Student logged in; tutor assigned
  1. Open chat screen
  2. Select tutor
  3. Send message
  4. Receive reply
Messages send and receive. History persists. Unread count updates. No message loss.
MOB-009Chatbot with escalation (mobile)Student logged in; FAQs configured
  1. Open chatbot
  2. Ask question
  3. If unsatisfied, escalate
  4. Attach image if needed
Chatbot responds from FAQ. Escalation creates support ticket. Image attachment works.
MOB-010Profile update (mobile)Student logged in
  1. Navigate to profile
  2. Update allowed fields (phone, email)
  3. Save
Profile updated successfully. Changes reflected in backend. Non-editable fields (admission_no) remain locked.

6.19 Executive Dashboard

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
EXD-001Public overview access (no auth)Dashboard deployed; data exists
  1. Open executive dashboard URL without logging in
  2. View overview page
Public overview page loads. Shows high-level statistics (enrollment count, territory count, etc.). No sensitive data exposed.
EXD-002Authenticated detailed reportsAdmin logged in to dashboard
  1. Login to executive dashboard
  2. Access detailed reports section
Detailed analytics available: student demographics, performance breakdowns, financial summaries. Data accurate.
EXD-003Enrollment trends chartsDashboard accessible; enrollment data spans multiple periods
  1. Navigate to enrollment trends
  2. View charts (fl_chart)
  3. Interact with chart (hover, filter)
Charts render correctly. Data points accurate. Filtering by territory/date works. Responsive on different screen sizes.
EXD-004Performance metrics visualizationDashboard accessible; exam/assignment data exists
  1. Navigate to performance metrics
  2. View pass rates, averages, distributions
Metrics displayed as charts/graphs. Data matches backend reports. Visual representation clear and accurate.
EXD-005Territory breakdown viewDashboard accessible; multi-territory data
  1. Navigate to territory breakdown
  2. Compare territories
Each territory (Kenya, Rwanda, Burundi, Zimbabwe, etc.) shown with key metrics. Comparison view functional.

6.20 Sessions Management

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
SES-001Sessions dropdown on registration formSessions exist in tbl_sessions; student opens registration form
  1. Open student registration form (web or mobile)
  2. Locate the Sessions field
  3. Verify it is a dropdown with search functionality
  4. Verify sessions are listed alphabetically
  5. Search for a session by typing partial name (e.g., "Amb")
Sessions dropdown appears with search capability. Sessions are sorted alphabetically. Search filters sessions in real-time. Sessions include: A1 Out, Ambassadors of Grace, Ambassadors of Holiness, Ambassadors of Christ, Aux-Captains/Lieutenants, and others.
SES-002Admin creates and manages sessionsAdmin logged in
  1. Navigate to Sessions Management
  2. Click Add Session
  3. Enter session name
  4. Save
  5. Verify session appears in the list
  6. Edit existing session name
  7. Deactivate a session
Admin can create, edit, and deactivate sessions. New sessions appear immediately in registration dropdowns. Deactivated sessions are hidden from registration forms but preserved in historical data.
SES-003Session assigned to student during enrollmentSessions configured; student completing registration
  1. Student selects a session from the dropdown during registration
  2. Complete and submit registration
  3. Verify session_id is stored on the student record
  4. Admin can view student's session assignment
Selected session is linked to the student record via session_id. Session name appears in student details views for Admin, ETO, and the student.
IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
SRC-001Search student by email addressAdmin or ETO logged in; students exist with email addresses
  1. Navigate to student management or search
  2. Enter a student's email address in the search field
  3. Submit search
System finds and displays the matching student record. Search is case-insensitive and trims whitespace. Only the exact matching student is returned (email is a unique identifier).
SRC-002Search student by registration number (admission_no)Admin or ETO logged in; students exist with admission numbers
  1. Enter student registration number (e.g., "2024053") in search field
  2. Submit search
System returns the matching student. Search handles various admission_no formats (7-digit, 4-digit, phone format). Case-insensitive and BOM-cleaned.
SRC-003Search student by phone numberAdmin or ETO logged in; students exist with phone numbers
  1. Enter student's phone number in search field
  2. Submit search
System returns the matching student record. Phone number search works across tbl_sys_users.contact. Handles format variations (with/without country code).
SRC-004Multi-field search returns unique resultsAdmin logged in; students exist
  1. Search using email — verify unique match
  2. Search using registration number — verify unique match
  3. Search using phone number — verify unique match
  4. Verify these are the only three unique identifiers supported
Each search field returns the uniquely matching student. Email, registration number, and phone number are the only unique identifiers. No duplicate results returned.

6.22 Tutor Reallocation

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
TRA-001Admin reallocates student to different tutorAdmin logged in; student enrolled in subject with tutor assigned
  1. Navigate to student's subject enrollment
  2. Select the subject enrollment to reallocate
  3. Choose a new tutor from the dropdown
  4. Confirm reallocation
  5. Verify the student's tutor assignment is updated
Student's subject enrollment is reassigned to the new tutor. The change is logged for audit purposes. The new tutor can see the student in their student list. The old tutor no longer sees the student for that subject.
TRA-002Reallocation preserves student progressStudent has existing assignments and marks with the old tutor
  1. Admin reallocates student to a new tutor
  2. Verify student's existing assignment submissions are preserved
  3. Verify student's existing exam scores are preserved
  4. Verify the new tutor can view all prior submissions and marks
All student progress (assignments, marks, exam scores) is fully preserved after tutor reallocation. No data loss occurs. The new tutor has full visibility into the student's history.
TRA-003Only admin can reallocate tutorsETO or Tutor logged in
  1. ETO attempts to reallocate a student's tutor
  2. Tutor attempts to reallocate a student
Only Admin role has permission to reallocate tutors. ETO and Tutor receive an access denied error if they attempt this operation.

6.23 Marking Progress & Visibility

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
MRK-001Tutor views marking progress for their subjectsTutor logged in; students have submitted assignments and exams
  1. Navigate to marking dashboard or progress view
  2. View the list of subjects assigned to the tutor
  3. For each subject, verify counts of: total submissions, marked, pending
  4. Verify progress percentage is displayed
Tutor sees a clear breakdown of marking progress per subject: total assignments/exams submitted, number marked (status T or P), number pending (status N). Progress is trackable from beginning to completion.
MRK-002Admin views marking progress across all subjectsAdmin logged in; marking data exists across subjects and tutors
  1. Navigate to marking progress analytics
  2. View marking progress for all subjects
  3. Filter by tutor, subject, or territory
  4. Verify total, marked, and pending counts are accurate
Admin sees a platform-wide view of marking progress. Data is filterable by tutor, subject, and territory. Counts match actual data in tbl_assignment_marking. Admin can identify tutors who are behind on marking.
MRK-003Student views their own marking statusStudent logged in; has submitted assignments and exams
  1. Navigate to assignments/performance
  2. View the status of each submitted assignment (Pending, Marked, Approved)
  3. View the status of each submitted exam
Student can see the marking status for each submission: N (Pending marking), R (Reviewed by tutor), T (Tutor marked), P (Admin approved). Student has visibility into the marking process from submission to final approval.
MRK-004Marking progress updates in real-timeTutor marks an assignment; Admin and student are viewing progress
  1. Tutor marks a pending assignment
  2. Verify tutor's marking progress count updates
  3. Verify admin's marking progress dashboard reflects the change
  4. Verify student sees the updated status on their submission
After tutor marks an assignment, all three roles (Tutor, Admin, Student) see the updated status on their next page load. Progress tracking is consistent across all views.

6.24 Profile Update

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
PRF-001Student updates profile (web)Student logged in to web admin
  1. Navigate to Profile page
  2. Update first name, middle name, last name
  3. Update email address
  4. Update phone number
  5. Update marital status
  6. Update session preference
  7. Update Salvation Army rank
  8. Save changes
All editable fields are saved. Non-editable fields (admission number, territory) remain locked and cannot be changed. Updated values reflected immediately in the student's profile and visible to Admin/ETO.
PRF-002Student updates profile (mobile)Student logged in to mobile app
  1. Navigate to Profile screen
  2. Update name, email, phone, marital status, session, rank
  3. Tap Save
  4. Verify changes persist after app restart
Profile updated successfully on mobile. Changes synced to backend. Same fields editable/locked as web version. Changes persist after logout and re-login.
PRF-003Admin/ETO/Tutor updates their own profileNon-student user logged in
  1. Navigate to Profile settings
  2. Update name, email, phone number, preferred language
  3. Save changes
Non-student users can update their own profile information. Changes saved and reflected across the system. Email uniqueness is enforced (cannot use another user's email).
PRF-004Profile update validates unique fieldsUser logged in; another user exists with a known email/phone
  1. Attempt to change email to another user's email
  2. Attempt to change phone to another user's phone
System rejects duplicate email and phone number. Appropriate error messages displayed. Original profile remains unchanged.

6.25 Day/Night Mode (Dark Theme)

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
THM-001Toggle dark mode (mobile)Student logged in to mobile app
  1. Open app settings or profile
  2. Locate the theme toggle (day/night mode switch)
  3. Toggle to dark mode
  4. Verify all screens render correctly in dark theme
  5. Toggle back to light mode
Dark mode applies a dark color scheme across all screens. Text remains readable. SA branding colors (red, navy) are preserved. Toggle works reliably. Theme preference persists after app restart.
THM-002Dark mode persistence (mobile)Dark mode enabled in mobile app
  1. Enable dark mode
  2. Close the app completely
  3. Re-open the app
  4. Verify dark mode is still active
Theme preference is saved to local storage and persists across app restarts. No flash of light theme on startup.
THM-003Dark mode on executive dashboardExecutive dashboard app running
  1. Open executive dashboard
  2. Toggle dark mode
  3. Verify charts and graphs render correctly in dark theme
  4. Verify data labels are readable
Dark mode applies consistently to dashboard. Charts (fl_chart) adapt colors for dark background. All data is readable and visually clear.
THM-004Dark mode on web adminUser logged in to web admin (Next.js)
  1. Locate theme toggle in web admin
  2. Switch to dark mode
  3. Navigate through multiple pages
  4. Verify sidebar, tables, forms, and modals render correctly
Dark mode applies across all web admin pages. All UI components (tables, forms, cards, modals) are properly themed. Tailwind CSS dark variants render correctly.

6.26 Previous Performance CSV Upload

Endpoint: POST /admin/restore_students/{logged_user_id} — multipart file parameter: csv_file
CSV Format (hierarchical): Single-value rows = admission number (group header). 17-column rows = subject data: subject_code, learning_level_id, reg_year, exam_date(MM/dd/yyyy), assignment1–10, avg_assignment(0–50), total_exam(0–100), total_max_awarded(0–100)
Sample CSV:
201724911
CM106,7,2026,31/12/2026,60,59,60,63,57,60,65,70,69,68,32,32,64
DM201,3,2026,31/12/2026,58,68,68,68,70,70,69,62,69,65,33,37,70
COT101,7,2026,31/12/2026,68,68,59,64,74,70,71,74,65,64,34,34,68
IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
CSV-001Valid CSV upload with correct formatAdmin logged in; CSV file with valid admission numbers and 17-column subject rows prepared
  1. Navigate to student data restore / CSV upload
  2. Select a valid CSV file containing at least 2 students with multiple subject rows each
  3. Submit the upload via POST /admin/restore_students/{id}
  4. Verify response indicates success
  5. Query tbl_student_subjects_selection to confirm records created
All student-subject records created correctly. Assignment scores (1–10), avg_assignment, total_exam, and total_max_awarded stored accurately. Each single-value row correctly parsed as admission number header grouping subsequent subject rows.
CSV-002CSV with invalid column count (not 1 or 17)Admin logged in; CSV file with rows having incorrect column count (e.g., 10 columns)
  1. Prepare CSV with a row containing fewer or more than 17 columns (e.g., missing assignment columns)
  2. Upload via the endpoint
  3. Observe response
Server returns a clear error message identifying the malformed row(s). No partial data is persisted. Response indicates which line number(s) have invalid column counts.
CSV-003Assignment scores outside 0–100 rangeAdmin logged in; CSV file with assignment scores exceeding valid range (e.g., -5 or 150)
  1. Prepare CSV where one or more assignment1–10 values are outside 0–100
  2. Upload via the endpoint
  3. Observe validation response
Server rejects the upload with a validation error identifying the out-of-range score(s) and their row/column position. No records created for the invalid student block.
CSV-004Assignment average outside 0–50 rangeAdmin logged in; CSV file with avg_assignment value exceeding 50 (e.g., 55)
  1. Prepare CSV where avg_assignment (column 15) is greater than 50 or negative
  2. Upload via the endpoint
  3. Observe validation response
Server rejects the row with a validation error. The avg_assignment field must be in range 0–50. Error message clearly identifies the offending value.
CSV-005Invalid exam date formatAdmin logged in; CSV file with incorrectly formatted exam_date (e.g., 2026-12-31 instead of MM/dd/yyyy)
  1. Prepare CSV with exam_date in wrong format (ISO, dd-MM-yyyy, etc.)
  2. Upload via the endpoint
  3. Observe error handling
Server returns a parse error identifying the invalid date and expected format MM/dd/yyyy. No records created for that student block.
CSV-006Non-existent subject codeAdmin logged in; CSV file references a subject_code not in tbl_subjects
  1. Prepare CSV with a fabricated subject_code (e.g., ZZ999)
  2. Upload via the endpoint
  3. Observe error handling
Server returns an error indicating the subject code was not found in the system. The error identifies which admission number and subject code failed. Valid rows for other students may still be processed (or entire upload rejected, depending on implementation).
CSV-007Subject assigned to wrong learning levelAdmin logged in; CSV references a subject_code with a learning_level_id that does not match the subject's actual level in tbl_subjects
  1. Prepare CSV where subject_code exists but learning_level_id does not match (e.g., Foundation subject with Diploma level ID)
  2. Upload via the endpoint
  3. Observe validation
Server detects the mismatch between subject_code and learning_level_id. Returns error identifying the conflicting row. No incorrect enrollment created.
CSV-008Student not found (auto-create behavior)Admin logged in; CSV contains an admission_no that does not exist in tbl_student
  1. Prepare CSV with a non-existent admission number (e.g., 9999999)
  2. Upload via the endpoint
  3. Verify whether student record is auto-created or error returned
  4. If auto-created, verify minimal student record in tbl_student
System either (a) auto-creates a stub student record with the admission number and processes the subject data, or (b) returns an error listing the unrecognized admission number(s). Behavior must be consistent and documented.
CSV-009Duplicate upload (idempotency check)Admin logged in; same CSV file already uploaded once successfully
  1. Upload a valid CSV file and confirm success
  2. Upload the exact same CSV file a second time
  3. Check tbl_student_subjects_selection for duplicate records
System either (a) skips already-existing records and returns a summary (created vs. skipped counts), or (b) updates existing records without creating duplicates. No duplicate enrollment rows exist after the second upload.
CSV-010CSV with BOM characters in admission numbersAdmin logged in; CSV file saved with UTF-8 BOM encoding, or admission numbers contain # suffix artifacts
  1. Prepare CSV file with BOM byte prefix (common from Excel exports)
  2. Include admission numbers with trailing # (e.g., 2011278#)
  3. Upload via the endpoint
  4. Verify admission numbers are cleaned before lookup
BOM bytes stripped from first admission number. Trailing # characters removed. The remove_bom() database trigger and application-level cleaning ensure correct matching to existing student records.
CSV-011Zero assignment score zeroing behaviorAdmin logged in; CSV file where one or more assignment scores are 0
  1. Prepare CSV with one student where assignment3 = 0 (all others non-zero)
  2. Upload via the endpoint
  3. Check the stored avg_assignment and total_max_awarded values
  4. Prepare another CSV where all 10 assignments are 0
  5. Upload and verify totals
If any single assignment score is 0, verify whether the system zeros out all totals (avg_assignment and total_max_awarded become 0) or calculates the average excluding the zero. Document the observed behavior. The zeroing rule, if present, must be consistently applied.
CSV-012Large file with multiple studentsAdmin logged in; CSV file with 50+ students, each having 3–5 subject rows
  1. Prepare a large CSV file with at least 50 student groups
  2. Upload via the endpoint
  3. Monitor response time
  4. Verify all records created correctly
  5. Check for timeouts or partial failures
All student-subject records processed successfully without timeout. Response includes a summary (total students processed, total subject records created). Processing completes within reasonable time (< 30 seconds for 50 students).

6.27 End-to-End Process Flows

Purpose: These test cases validate complete business processes spanning multiple user roles, endpoints, and system components. Each test case traces a full lifecycle from initiation to completion.

A. Student Enrollment Flow

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
E2E-ENR-01New student self-registration through full approval chainRegistration endpoint accessible; ETO and Admin accounts exist for the student's territory
  1. Student registers via /auth/register with personal details and territory
  2. Verify student created in tbl_student with admission_status = P (Pending)
  3. ETO logs in, views pending students for their territory
  4. ETO approves the student
  5. Admin logs in, views ETO-approved students
  6. Admin approves the student
  7. Verify admission_status changes to D (Done)
  8. Verify admission_no is generated
  9. Student logs in and selects subjects for enrollment
  10. Verify selections appear in tbl_student_subjects_selection
Complete enrollment chain works: Registration → ETO approval → Admin approval → Admission number assigned → Student can log in and select subjects. Status transitions: PEP (ETO pending) → D (Done). Subject selections created with pending approval status.
E2E-ENR-02Continuing student enrollment (level progression)Student has completed all Foundation subjects; Admin logged in
  1. Verify student has passing grades in all Foundation subjects
  2. Admin or system advances student to Certificate level
  3. New academic level record created in tbl_academic_level
  4. Student logs in and sees Certificate-level subjects available
  5. Student selects Certificate subjects
  6. Verify enrollment at new level in tbl_student_subjects_selection
Student seamlessly progresses from Foundation to Certificate level. Previous Foundation grades preserved. New academic level record created. Certificate subjects available for selection. No data loss from previous level.
E2E-ENR-03Cross-territory admissionStudent registers under territory A; ETO exists for territory A; Admin has cross-territory access
  1. Student registers with a territory different from their physical location
  2. ETO of the target territory reviews and approves
  3. Admin reviews cross-territory request
  4. Admin approves with territory assignment
  5. Verify student is enrolled under the correct territory
  6. Verify territory-specific tutor can see the student
Cross-territory enrollment requires both ETO and Admin approval. Student is correctly assigned to the target territory. Territory-bound users (ETO, Tutor) in the target territory can see and manage the student. Territory code correctly recorded.
E2E-ENR-04Bulk CSV enrollment by adminAdmin logged in; CSV file with multiple new students prepared
  1. Admin prepares CSV with student data (names, territories, admission numbers)
  2. Admin uploads CSV via bulk enrollment endpoint
  3. Verify students created in tbl_student and tbl_sys_users
  4. Verify admission_status set to U (Uploaded)
  5. Admin reviews and activates bulk-uploaded students
  6. Students can log in with generated credentials
Bulk enrollment creates student records efficiently. Each student gets a user account and student record. Admission status is U (Uploaded) until admin activates. Generated credentials allow students to log in. Duplicate admission numbers are detected and reported.

B. Assignment Lifecycle

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
E2E-ASG-01Full assignment lifecycle: upload through gradingTutor assigned to subject; students enrolled in subject; Admin account available
  1. Tutor logs in and navigates to assignment management
  2. Tutor uploads a new assignment (PDF/DOCX) for their subject
  3. Verify assignment appears in tbl_materials_upload with correct subject linkage
  4. Student logs in and sees the new assignment listed
  5. Student downloads assignment, prepares answer, and uploads submission
  6. Verify submission recorded in tbl_assignment_marking with status N (New)
  7. Tutor views pending submissions and marks the assignment (score 0–100)
  8. Tutor submits the marks (status changes to T)
  9. Admin reviews and verifies the marks
  10. Verify final score appears in student's performance view
Complete assignment lifecycle functions end-to-end. Assignment uploaded to MinIO/file storage. Student submission stored correctly. Tutor marking saved. Admin verification completes the flow. Score contributes to the student's assignment average for that subject. Status transitions: NT (Tutor marked) → P (Published/verified).
E2E-ASG-02Late assignment submission (admin override)Assignment deadline has passed; Admin has enabled late submissions in tbl_sys_settings
  1. Verify assignment deadline has passed
  2. Student attempts to submit after deadline
  3. If late submission is disabled, verify rejection message
  4. Admin enables late submission in system settings
  5. Student re-attempts submission
  6. Verify submission accepted with late flag
  7. Tutor marks the late submission
Late submission behavior is controlled by system settings. When disabled, students see a clear deadline-passed message. When enabled by admin, late submissions are accepted and flagged. Tutor can see the late flag when marking. Score is recorded normally.
E2E-ASG-03Assignment rejection and resubmissionStudent has submitted an assignment; Tutor logged in
  1. Tutor reviews a student's assignment submission
  2. Tutor rejects the submission (status R) with feedback comments
  3. Student receives notification of rejection
  4. Student views rejection reason
  5. Student uploads a revised submission
  6. Tutor re-marks the resubmission
  7. Verify only the latest submission score is used
Rejection flow works correctly. Student notified of rejection with tutor feedback. Student can resubmit. New submission replaces or supplements the rejected one. Tutor can mark the resubmission. Status transitions: NR (Rejected) → N (resubmitted) → T (marked).
E2E-ASG-04Monthly limit enforcement (max 3 per month per subject)Student enrolled in a subject; system setting for monthly assignment limit is 3
  1. Tutor uploads 4 assignments for a subject within the same month
  2. Student submits assignments 1, 2, and 3 successfully
  3. Student attempts to submit assignment 4 in the same month
  4. Verify system enforces the monthly limit
  5. Wait for the next month (or adjust test date) and verify limit resets
System enforces the monthly assignment submission limit per subject per student. After reaching the limit (3), further submissions in the same calendar month are blocked with a clear message. Limit resets at the start of the next month. The limit value is configurable in system settings.
E2E-ASG-05Downloadable assignment report (marked/unmarked per tutor)Multiple assignment submissions exist across subjects; Admin or Tutor logged in
  1. Navigate to assignment reports
  2. Filter by tutor, subject, and date range
  3. Generate report showing marked vs. unmarked assignments
  4. Export report to Excel/PDF
  5. Verify counts match actual submission data
Report accurately shows the count of marked and unmarked assignments per tutor per subject. Export generates a valid Excel/PDF file. Data matches the underlying records in tbl_assignment_marking. Report helps identify tutors with marking backlogs.

C. Exam Lifecycle

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
E2E-EXM-01Full MCQ exam lifecycle: creation through resultsTutor assigned to subject; students enrolled; Admin account available
  1. Tutor creates a new exam paper for their subject
  2. Tutor adds MCQ questions with options and correct answers
  3. Admin reviews and approves the exam paper
  4. Exam date is scheduled in tbl_exam_dates
  5. Students are notified of the upcoming exam
  6. During exam window, student logs in and starts the exam
  7. Student answers MCQ questions and submits
  8. System auto-grades MCQ answers
  9. Tutor reviews auto-graded results
  10. Admin provides final approval on results
  11. Student views their exam score and grade
Complete exam lifecycle works end-to-end. Paper created in tbl_exam_paper, questions in tbl_questions. Quiz records auto-generated for enrolled students. MCQ auto-grading calculates correct scores. Results flow through tutor review and admin approval. Student can view final results. All records consistent across tables.
E2E-EXM-02Downloadable exam flow (PDF-based)Tutor logged in; subject has enrolled students; Admin account available
  1. Tutor creates exam paper with downloadable=true
  2. Tutor uploads exam PDF to the paper
  3. Tutor sets a submission deadline
  4. Student logs in and downloads the exam PDF
  5. Student prepares answers offline
  6. Student uploads answer PDF before deadline
  7. Verify submission timestamp is before deadline
  8. Tutor downloads student's answer PDF and marks it
  9. Tutor enters the score
  10. Admin verifies the marks
  11. Student views the final score
Downloadable exam flow works completely. Exam PDF stored in MinIO/file storage. Students can download and re-download. Answer upload respects deadline (blocked after expiry). Tutor can access student answers for marking. Scores recorded and visible to student after admin verification.
E2E-EXM-03Failed exam retake (up to 3 retakes, then oral)Student enrolled in subject with an exam; exam paper exists
  1. Student takes exam and fails (score below pass mark)
  2. Student requests retake (attempt 2) and fails again
  3. Student takes retake (attempt 3) and fails again
  4. Student attempts a 4th retake
  5. Verify system blocks the 4th online attempt
  6. Verify student is directed to oral examination
  7. Tutor/Admin enters oral exam score manually
  8. Verify oral score contributes to final grade
Retake counter increments correctly (1 → 2 → 3). Each attempt creates a new tbl_student_quiz record. After 3 failed attempts, online exam access is blocked for that subject. System clearly communicates that oral exam is required. Oral score entry works and integrates into grading formula. Previous attempt scores are preserved for audit.
E2E-EXM-04Oral exam score entryStudent has been directed to oral exam (3 retakes exhausted or admin decision); Tutor/Admin logged in
  1. Tutor navigates to oral exam score entry
  2. Selects the student and subject
  3. Enters oral assignment score (0–50)
  4. Enters oral exam score (0–100)
  5. Saves the oral scores
  6. Verify scores are stored in the system
  7. Verify the final grade recalculates incorporating oral scores
  8. Student views updated performance reflecting oral assessment
Oral scores are stored and clearly distinguished from online scores. Grade calculation incorporates oral scores using the configured weighting formula. Student's performance view shows the oral assessment results. Both oral assignment and oral exam scores are captured independently.
E2E-EXM-05Exam with late submission enabledDownloadable exam exists with deadline passed; Admin can enable late submission
  1. Verify exam submission deadline has passed
  2. Student attempts to upload answer after deadline — verify rejection
  3. Admin enables late submission for the exam/subject
  4. Student re-uploads answer after late submission is enabled
  5. Verify submission accepted with late flag
  6. Tutor marks the late submission
  7. Verify score is recorded and contributes to grade
Late submission control works for exams. Deadline enforcement is strict by default. Admin override enables late submissions. Late submissions are flagged in the system. Tutor can mark late submissions normally. Score contributes to grade calculation regardless of late flag.

D. Grading & Certificate Flow

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
E2E-GRD-01Full grading and certificate generationStudent has completed all subjects at a learning level (all assignments marked, exam taken and graded)
  1. Verify all 10 assignments for each subject are marked
  2. Verify exam scores exist for each subject
  3. System calculates weighted grade per subject (assignment avg + exam score using configured weights from tbl_sys_settings)
  4. Verify grade tier assigned (A/B/C/D/E/F) per tbl_grading_config
  5. Admin confirms student has completed all required subjects for the level
  6. Admin triggers certificate generation
  7. System generates PDF certificate with student details, grades, and QR code
  8. Download and open the PDF certificate
  9. Scan QR code to verify it links to valid verification URL
Grade calculation uses configured weights accurately. All grade tiers map correctly to score ranges. Certificate PDF generates without errors. PDF contains: student name, admission number, learning level, list of subjects with grades, date of completion, Salvation Army branding. QR code is scannable and links to a verification endpoint that confirms certificate authenticity.
E2E-GRD-02Admin overrides final scoreStudent has a calculated final score for a subject; Admin logged in
  1. Admin navigates to student performance management
  2. Admin selects a student and subject
  3. Admin views the system-calculated score
  4. Admin overrides the final score with a new value
  5. Admin provides justification/reason for the override
  6. Verify the overridden score is reflected in the student's record
  7. Verify audit trail captures the override (who, when, old value, new value)
Admin can override final scores. Override is recorded in tbl_student_subjects_selection (total_max_awarded). Audit trail in Auditable fields captures lastModifiedBy and lastModifiedDate. Student sees the updated score. Grade tier recalculates based on the overridden score.
E2E-GRD-03Transcript generation with all subjects and gradesStudent has completed multiple subjects across one or more learning levels
  1. Admin or student requests a transcript
  2. System queries all completed subjects and grades for the student
  3. PDF transcript is generated listing every subject, score, grade, and completion date
  4. Download and verify the transcript
  5. Verify it includes student details (name, admission number, territory)
  6. Verify all subjects and grades are present and accurate
Transcript PDF generates successfully. Contains all completed subjects organized by learning level. Each entry shows subject code, subject name, final score, grade tier, and completion date. Student details are accurate. PDF formatted with Salvation Army branding. Totals and GPA/average displayed if applicable.
E2E-GRD-04QR code verification on certificateCertificate PDF has been generated for a student
  1. Open the generated certificate PDF
  2. Locate the QR code on the certificate
  3. Scan the QR code with a mobile device or QR scanner
  4. Verify the URL resolves to a verification page
  5. Verify the verification page displays correct student and certificate details
  6. Try modifying the URL parameters to test for tampering detection
QR code encodes a verification URL with a unique certificate identifier. Scanning opens a web page confirming: student name, admission number, learning level, date of issuance, and certificate validity. Modified/tampered URLs return an invalid certificate response. QR code is generated using ZXing library and is clear/scannable.

E. Suspension & Reinstatement

IDDescriptionPreconditionStepsExpected ResultActual ResultStatus
E2E-SUS-01Subject suspension and reinstatement lifecycleStudent enrolled in a subject with 1-year deadline; deadline has expired or is approaching
  1. Verify student's subject enrollment has a deadline (1 year from enrollment date)
  2. Simulate or wait for deadline expiry
  3. System detects expired enrollment and auto-suspends the subject selection
  4. Verify suspension record created in tbl_suspension_log
  5. Student logs in and sees suspended status for the subject
  6. Student cannot access assignments or exams for the suspended subject
  7. Admin reviews suspension and decides to lift it
  8. Admin lifts the suspension with a new deadline
  9. Verify deadline is reset (new 1-year window)
  10. Student can now access the subject again
Auto-suspension triggers when enrollment deadline expires. Suspension is logged with reason and date. Suspended students are blocked from submitting assignments and taking exams for the affected subject. Admin can lift the suspension. Lifting resets the deadline to a new 1-year window from reinstatement date. Student regains full access after reinstatement. All transitions are auditable.
E2E-SUS-02Suspension decline by adminStudent subject enrollment is flagged for suspension; Admin logged in
  1. System flags a student's subject enrollment for suspension (deadline expired)
  2. Admin reviews the suspension recommendation
  3. Admin declines the suspension (e.g., student had valid extension reason)
  4. Verify the subject enrollment remains active
  5. Verify the decision is logged with admin's justification
  6. Student continues to access the subject normally
Admin can decline/override an auto-suspension recommendation. Subject enrollment stays active without interruption. Decision is logged in tbl_suspension_log with decline reason and admin ID. Student is unaffected and continues coursework. No suspension record marks the student's record negatively.

7. Bug Report Template

Use the following template when reporting bugs discovered during UAT.

FieldDescription / Example
Bug IDSALT-BUG-[NNN] (e.g., SALT-BUG-001)
TitleShort, descriptive title (e.g., "ETO cannot see students from assigned territory")
Related Test CaseTest case ID that exposed the bug (e.g., ENR-006)
SeverityCritical System crash, data loss, security breach
High Feature completely broken, no workaround
Medium Feature partially broken, workaround exists
Low Cosmetic issue, minor inconvenience
PriorityP1 (Fix immediately) / P2 (Fix before release) / P3 (Fix in next sprint) / P4 (Backlog)
EnvironmentOS, browser/device, app version, backend version
ReporterName and role of the person reporting
Date ReportedYYYY-MM-DD
PreconditionsState of the system before the bug was encountered
Steps to ReproduceNumbered steps to reproduce the issue
Expected ResultWhat should have happened
Actual ResultWhat actually happened
Screenshots / LogsAttach screenshots, console errors, or log excerpts
Assigned ToDeveloper responsible for the fix
StatusNew / In Progress / Fixed / Verified / Closed / Won't Fix
Resolution NotesDescription of the fix applied

8. Entry & Exit Criteria

8.1 Entry Criteria (UAT can begin when)

8.2 Exit Criteria (UAT is complete when)

8.3 Suspension & Resumption Criteria

ConditionAction
Backend API is down or unreachableSuspend UAT. Resume when API is restored and stable.
Database corruption or data lossSuspend UAT immediately. Restore from backup. Investigate root cause before resuming.
More than 5 Critical bugs found in a single daySuspend UAT. Dev team addresses critical bugs. Resume after fixes verified.
Test environment infrastructure failureSuspend UAT. Restore infrastructure. Resume when stable.

9. Risk Register

IDRiskImpactLikelihoodMitigation
R1Production data (salvation.sql) incompatible with Flyway migrationsHighLowTest migrations against fresh salvation.sql dump before UAT begins. Maintain rollback scripts for each migration.
R2MinIO file migration breaks existing file referencesHighMediumDual-read adapter (MinIO first, filesystem fallback) ensures backward compatibility. Test with legacy files.
R3Test accounts locked out or passwords unknownMediumMediumDocument all test credentials. Admin can reset passwords. Maintain backup admin account.
R4SMS/Email gateway unavailable during testingMediumMediumMock notification services for testing. Verify delivery in logs rather than requiring physical receipt.
R5Tester unavailability during scheduled testing daysMediumLowAssign backup testers. Prioritize critical path testing early in the schedule.
R6Docker environment differences from productionLowMediumDocument all environment differences. Run final validation on production-like environment.
R7ID format validation breaks for legacy data patternsHighLowTest with all known admission_no formats (7-digit, 4-digit, phone, UUID, BOM). Maintain format flexibility.
R8Redis cache inconsistencies masking data issuesMediumLowClear Redis cache before UAT. Test with caching enabled and disabled. Monitor cache hit/miss rates.

10. Sign-Off

Each designated approver must review the UAT results and provide their sign-off below. UAT is considered complete only when all required approvers have signed.

10.1 Project Sign-Off

Project Manager / Product Owner
Name: ________________________________________
Signature: ________________________________________
Date: ________________________________________
Decision:      
Comments: ________________________________________
Technical Lead / Development Team
Name: ________________________________________
Signature: ________________________________________
Date: ________________________________________
Decision:      
Comments: ________________________________________

10.2 Role-Based Sign-Off

Admin Role Tester

Tester Name: ________________________________________
Test Period: ________________________________________
Total Test Cases Executed: _______ Passed: _______ Failed: _______
Signature: ________________________________________
Date: ________________________________________
Verdict:      
Comments: ________________________________________

ETO Role Tester

Tester Name: ________________________________________
Test Period: ________________________________________
Total Test Cases Executed: _______ Passed: _______ Failed: _______
Signature: ________________________________________
Date: ________________________________________
Verdict:      
Comments: ________________________________________

Tutor Role Tester

Tester Name: ________________________________________
Test Period: ________________________________________
Total Test Cases Executed: _______ Passed: _______ Failed: _______
Signature: ________________________________________
Date: ________________________________________
Verdict:      
Comments: ________________________________________

Student Role Tester

Tester Name: ________________________________________
Test Period: ________________________________________
Total Test Cases Executed: _______ Passed: _______ Failed: _______
Signature: ________________________________________
Date: ________________________________________
Verdict:      
Comments: ________________________________________

10.3 Final Acceptance

FINAL UAT ACCEPTANCE DECISION

MetricTargetActualStatus
Total test cases171
Test cases passed≥ 163 (95%)
Test cases failed≤ 8 (5%)
Critical bugs open0
High bugs open0
Medium bugs openDocumented
Low bugs openDocumented

The College E-Learning is hereby:






Authorized By: ________________________________
Title: ________________________________
Signature: ________________________________
Date: ________________________________

© 2021-2026 College E-Learning — User Acceptance Testing Plan v1.0

Document ID: SALT-UAT-2026-001 | Prepared: 20th February 2026

© 2021-2026 College E-Learning — Developed by Sumba Group Limited for Salvation Army SALT College of Africa