Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

14 - QA Checklist (Transport Module)

Module-specific quality gates on top of 00-shared/10 (QA baseline: performance budgets, offline matrix, a11y, motion, security). Every item is testable and maps to source.


1. Core flows (must pass)

#ScenarioExpectationSource
1.1Create vehicle -> appears in listPOST 201, doc in GET list, sorted by plateNumbertransport.controller.ts:30-40, transport.service.ts:71
1.2Create route with 3 stops -> detail shows order 1,2,3stops array round-trips {name, order}create-route.dto.ts:34-39, route.schema.ts:23-24
1.3Assign student -> student assignments shows populated routePOST + GET /assignments/:studentIdtransport.controller.ts:120-130, route-assignment.repository.ts:20-24
1.4Soft delete vehicle -> list excludes itisDeleted: true, filter base.repository.ts:20-30, 68-74transport.service.ts:100
1.5Update driver -> PATCH applies partial fields onlyuntouched fields unchangedupdate-driver.dto.ts:4, transport.service.ts:224-238

2. Validation & conflicts (negative paths)

#ScenarioExpectationSource
2.1Create vehicle with duplicate plateNumber409, message verbatim Vehicle "<plate>" already exists.transport.service.ts:38-45; index vehicle.schema.ts:50
2.2Create route with duplicate name409 Route "<name>" already exists.transport.service.ts:113-116; index route.schema.ts:44
2.3Create driver with duplicate licenseNumber409 Driver with license ...transport.service.ts:177-184; index driver.schema.ts:50
2.4Create driver with duplicate phone409 Driver with phone ...transport.service.ts:185-190; index driver.schema.ts:51
2.5Assign same (route, student) twice409 Student already assigned to this route.transport.service.ts:252-258; index route-assignment.schema.ts:42-45
2.6capacity = 0 or negative400 (DTO @Min(1))create-vehicle.dto.ts:14-17
2.7shift not in morning/evening/both400 (IsEnum)assign-route.dto.ts:13-15
2.8PATCH with invalid type value400 (enum)update-vehicle.dto.ts:4 -> create-vehicle.dto.ts:19-21
2.9Unauthenticated call401transport.controller.ts:23-26

3. Integrity gaps (flag to backend - NOT server-enforced)

#GapClient mitigationSource
3.1Capacity overflow: assignStudent never checks route vehicle capacity vs. count of studentsclient pre-check warn + QA manual test; server check (planned)transport.service.ts:251-266, vehicle.schema.ts:27-28
3.2Assign to inactive route / maintenance vehicle / inactive driver not blockedclient filters inactive options; server (planned)route.schema.ts:32-33, vehicle.schema.ts:33-34, driver.schema.ts:30-31
3.3Duplicate plate race (no DB unique index? index exists: {tenantId, plateNumber} unique - race window only via concurrent create)rely on 409; retry UXvehicle.schema.ts:50
3.4Updating a vehicle's plateNumber to an existing one -> 409 only via unique index (service check is create-only)expect 409 from index; surface verbatimtransport.service.ts:84-91, vehicle.schema.ts:50
3.5Driver licenseExpiry in the past acceptedclient warn; server (planned)create-driver.dto.ts:27-29

4. Soft-delete & reference integrity

#ScenarioExpectationSource
4.1Delete vehicle referenced by a route409 Vehicle is assigned to a route.transport.service.ts:94-99
4.2Delete driver referenced by a route409 Driver is assigned to a route.transport.service.ts:241-246
4.3Delete route with active assignments409 Route has active student assignments.transport.service.ts:168-171
4.4Delete already-deleted entity404 (scoped filter excludes deleted)transport.service.ts:101, 173, 248, 290, base.repository.ts:20-30
4.5Delete assignment -> removed from student listGET reflectstransport.service.ts:288-291

5. Multi-tenancy

#ScenarioExpectationSource
5.1Tenant B queries vehiclessees only B's rowsbase.repository.ts:20-30
5.2Cross-tenant duplicate plate allowedyes - uniqueness is per tenantvehicle.schema.ts:50
5.3tenantId from request body ignoredserver never reads it from bodybase.repository.ts:32-36, AGENTS.md

6. UI/UX (manual + golden)

#Check
6.1Pagination boundaries: page 1 Prev disabled; last page Next disabled (meta hasNext/hasPrevious)
6.2409 inline errors focus the offending field
6.3Delete 409 dialog offers "View related" navigation
6.4Stop reorder persists after save + reload
6.5Offline: lists render cached + banner; mutations blocked (00-shared/10 §2)
6.6Empty states for all 4 lists (vehicles/drivers/routes/assignments)
6.7Permission gating: read-only role sees no FAB/menu; 403 copy on direct route
6.8a11y: badges have semantics labels; dialogs trap focus (00-shared/09)
6.9Skeleton < 200 ms, content < 2 s on network (00-shared/10 §1)

7. E2E regression seeds (manual fixtures)

  • 2 tenants with identical plate numbers (proves isolation, 5.2).
  • Route with 20 stops (editor cap), 3 assignments on one route.
  • One vehicle in maintenance, one driver on_leave, one route inactive.
  • Deleted vehicle referenced by a soft-deleted route (delete guard must still 409 while route visible to admin).