Test Cases: Helpdesk
| Module | CORE-13 | URD | Helpdesk URD |
|---|
NOTE
Module status is In-progress and the backend does not currently build, so these are planned/designed test cases — none have been executed against a running service. They define the verification target for when the build is repaired.
1. Coverage Summary
| Area | URD reqs | Test cases | Covered |
|---|---|---|---|
Ticket Management (TKT) | 12 | 17 | ✅ |
Ticket Messages (MSG) | 5 | 6 | ✅ |
Categories, Tags & Priorities (CAT) | 5 | 7 | ⚠️ |
SLA Management (SLA) | 10 | 9 | ⚠️ |
Agent Management (AGT) | 10 | 12 | ⚠️ |
Knowledge Base (KB) | 7 | 7 | ⚠️ |
Surveys & Feedback (SRV) | 6 | 5 | ⚠️ |
Feature Requests (FR) | 5 | 5 | ⚠️ |
Compensation (CMP) | 4 | 4 | ⚠️ |
Notifications (NTF) | 5 | 5 | ⚠️ |
| Access Control (cross-cutting) | — | 4 | — |
⚠️ flags areas where at least one Must requirement has no test case — see §3 Traceability.
2. Test Cases
TC-<AREA>-NNNlines up withURD-<AREA>-NNN. Priority = P1 (critical) / P2 (major) / P3 (minor).
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-TKT-001 | URD-TKT-001 | Create ticket | 1. As customer, create ticket with subject, description, category, priority Medium | Ticket saved as OPEN; merchant set; SLA tracker created with first-response deadline | P1 |
| TC-TKT-002 | URD-TKT-002 | Merchant scoping | 1. Customer of Merchant A creates a ticket | Ticket scoped to Merchant A; Merchant B agents cannot see it | P1 |
| TC-TKT-003 | URD-TKT-003 | Agent-raised ticket | 1. Agent creates a ticket on behalf of a customer | Ticket saved; reporter type = agent | P1 |
| TC-TKT-004 | URD-TKT-001 | Missing subject (negative) | 1. Create ticket with no subject | Rejected; validation error for missing subject | P1 |
| TC-TKT-005 | URD-TKT-001 | Invalid category (negative) | 1. Create ticket with invalid category | Rejected; error indicates invalid category | P1 |
| TC-TKT-006 | URD-TKT-004 | OPEN → ASSIGNED | 1. Assign an OPEN ticket to an agent | Status → ASSIGNED; assignee and time recorded | P1 |
| TC-TKT-007 | URD-TKT-004 | ASSIGNED → IN_PROGRESS | 1. Agent sends first reply | Status → IN_PROGRESS; first-response time recorded | P1 |
| TC-TKT-008 | URD-TKT-004 | IN_PROGRESS → WAITING_USER | 1. Agent sets waiting-on-customer | Status → WAITING_USER; customer notified | P1 |
| TC-TKT-009 | URD-TKT-004 | WAITING_USER → IN_PROGRESS | 1. Customer replies | Status → IN_PROGRESS; SLA clock updated | P1 |
| TC-TKT-010 | URD-TKT-004 | IN_PROGRESS → RESOLVED | 1. Agent marks resolved with note | Status → RESOLVED; resolution details saved | P1 |
| TC-TKT-011 | URD-TKT-010 | RESOLVED → CLOSED (confirm) | 1. Customer confirms resolution | Status → CLOSED; closure details recorded | P1 |
| TC-TKT-012 | URD-TKT-010 | Auto-close after 48h | 1. Resolved ticket; 48h pass with no response | Status → CLOSED; system message explains auto-close | P2 |
| TC-TKT-013 | URD-TKT-009 | Re-open on reply | 1. Customer replies after RESOLVED | Status → IN_PROGRESS (re-opened); event logged | P2 |
| TC-TKT-014 | URD-TKT-004 | Terminal state (negative) | 1. Attempt CLOSED → IN_PROGRESS | Rejected; CLOSED is terminal | P1 |
| TC-TKT-015 | URD-TKT-004 | Invalid transition (negative) | 1. Attempt OPEN → RESOLVED directly | Rejected; invalid transition | P1 |
| TC-TKT-016 | URD-TKT-008 | Audit trail | 1. Move ticket through full lifecycle 2. View events | All transitions logged with actor, from/to status, timestamp | P1 |
| TC-TKT-017 | URD-TKT-012 | Soft-delete | 1. Delete a ticket 2. Query active tickets | Ticket excluded from active queries; deletion timestamp set | P1 |
| TC-MSG-001 | URD-MSG-001 | Customer reply | 1. Customer sends a reply | Message type = customer reply; agent notified | P1 |
| TC-MSG-002 | URD-MSG-001 | Agent reply | 1. Agent sends a reply | Message type = agent reply; first-response time updated if first | P1 |
| TC-MSG-003 | URD-MSG-002 | Internal note hidden | 1. Agent adds internal note 2. Customer queries messages | Internal note not returned to customer | P1 |
| TC-MSG-004 | URD-MSG-002 | Note by non-agent (negative) | 1. Customer attempts to add an internal note | Rejected; only agents may add internal notes | P1 |
| TC-MSG-005 | URD-MSG-003 | Attachments | 1. Agent replies with 2 attachments | Attachments stored and returned in message details | P2 |
| TC-MSG-006 | URD-MSG-005 | System message on transition | 1. Trigger a state transition | System message auto-appended with transition detail | P2 |
| TC-CAT-001 | URD-CAT-001 | Create category | 1. Create category "Billing" with default priority High | Category saved; slug unique | P1 |
| TC-CAT-002 | URD-CAT-001 | Duplicate slug (negative) | 1. Create second category with same slug | Rejected; unique slug constraint | P1 |
| TC-CAT-003 | URD-CAT-001 | Sub-category | 1. Create "Refund" under "Billing" | Sub-category saved with parent set | P2 |
| TC-CAT-004 | URD-CAT-002 | Category SLA override | 1. Category has its own SLA policy 2. Create ticket in it | Tracker uses category SLA, not global default | P2 |
| TC-CAT-005 | URD-CAT-003 | Create tag | 1. Create tag "urgent" | Tag available for tickets | P1 |
| TC-CAT-006 | URD-CAT-004 | Add tag to ticket | 1. Agent adds "urgent" to a ticket | Tag mapping created | P2 |
| TC-CAT-007 | URD-CAT-004 | Remove tag | 1. Agent removes the tag | Tag mapping removed | P2 |
| TC-SLA-001 | URD-SLA-001 | Create SLA policy | 1. Create policy (response 60m, resolution 480m) | Saved; warning defaults 75%, critical 90% | P1 |
| TC-SLA-002 | URD-SLA-001 | Zero response time (negative) | 1. Create policy with response time 0 | Rejected; response time must be > 0 | P1 |
| TC-SLA-003 | URD-SLA-003 | Business-hours clock | 1. Policy business-hours-only 2. Ticket created Saturday 20:00 | SLA clock counts only business hours | P2 |
| TC-SLA-004 | URD-SLA-004 | Tracker on creation | 1. Create ticket under a policy | Tracker created; deadlines = created-at + policy times | P1 |
| TC-SLA-005 | URD-SLA-006 | First-response recorded | 1. Agent replies at T+30m | First-response time recorded; status OK | P1 |
| TC-SLA-006 | URD-SLA-005 | Warning threshold | 1. 75% of response time elapsed, no reply 2. Monitor runs | SLA status = warning; agent notified | P1 |
| TC-SLA-007 | URD-SLA-005 | Breach + L1 escalation | 1. Deadline elapsed, no reply 2. Monitor runs | Status = breached; L1 escalation created | P1 |
| TC-SLA-008 | URD-SLA-007 | L1 → L2 escalation | 1. L1 threshold elapsed 2. Monitor runs | L2 escalation created; manager notified | P1 |
| TC-SLA-009 | URD-SLA-008 | Manual escalation | 1. Manager manually escalates | Escalation type = manual; status → ESCALATED | P2 |
| TC-AGT-001 | URD-AGT-001 | Create agent | 1. Create agent for a user | Profile saved; status offline; available | P1 |
| TC-AGT-002 | URD-AGT-001 | Duplicate agent (negative) | 1. Create second agent for same user | Rejected; one agent per user | P1 |
| TC-AGT-003 | URD-AGT-002 | Set availability | 1. Agent sets status online | Status online; eligible for assignment | P1 |
| TC-AGT-004 | URD-AGT-003 | Skills + cap | 1. Set skills and max concurrent tickets | Fields saved; used by skill-based routing | P2 |
| TC-AGT-005 | URD-AGT-010 | Workload cap | 1. Agent at max tickets 2. Auto-assignment runs | Agent skipped; next eligible chosen | P1 |
| TC-AGT-006 | URD-AGT-004 | Create group | 1. Create "Billing Team" and add two agents | Group created; both members saved | P1 |
| TC-AGT-007 | URD-AGT-004 | Remove from group | 1. Remove an agent from the group | Membership removed (soft-deleted) | P1 |
| TC-AGT-008 | URD-AGT-006 | Round-robin routing | 1. Three tickets arrive in sequence | Assigned in rotation A → B → A | P1 |
| TC-AGT-009 | URD-AGT-006 | Skill-based routing | 1. Category requires "billing" 2. Auto-assign | Only billing-skilled agents considered; lowest load wins | P1 |
| TC-AGT-010 | URD-AGT-006 | Load-balanced routing | 1. Multiple agents available | Agent with lowest current load selected | P2 |
| TC-AGT-011 | URD-AGT-007 | Auto-assign timing | 1. Ticket arrives with rule configured | Assigned within 2 minutes; status → ASSIGNED | P1 |
| TC-AGT-012 | URD-AGT-007 | No agents available | 1. All agents offline/at max | Ticket stays OPEN; manager notified | P1 |
| TC-KB-001 | URD-KB-001 | Create article | 1. Create draft article | Saved; counts at zero | P2 |
| TC-KB-002 | URD-KB-002 | Publish | 1. Publish a draft | Status → published; published-at recorded | P2 |
| TC-KB-003 | URD-KB-002 | Archive | 1. Archive a published article | Status → archived; excluded from public search | P2 |
| TC-KB-004 | URD-KB-003 | Duplicate slug (negative) | 1. Create second article with same slug | Rejected; slug globally unique | P2 |
| TC-KB-005 | URD-KB-004 | View tracking | 1. Customer views an article | View recorded; view count incremented | P3 |
| TC-KB-006 | URD-KB-006 | Helpful feedback | 1. Submit "helpful" | Feedback saved; helpful count +1 | P3 |
| TC-KB-007 | URD-KB-006 | Not-helpful feedback | 1. Submit "not helpful" | Feedback saved; not-helpful count +1 | P3 |
| TC-SRV-001 | URD-SRV-001 | Create CSAT survey | 1. Create active CSAT survey, trigger post-resolution | Survey saved with type and trigger | P2 |
| TC-SRV-002 | URD-SRV-003 | Add questions | 1. Add 3 questions | Questions saved; order preserved | P2 |
| TC-SRV-003 | URD-SRV-004 | Auto-send on resolution | 1. Resolve ticket with active survey | Survey sent to reporter; response initialized | P2 |
| TC-SRV-004 | URD-SRV-005 | Submit response | 1. Customer submits rating and comment | Response saved; linked to ticket and survey | P2 |
| TC-SRV-005 | URD-SRV-004 | No active survey | 1. Resolve ticket with no active survey | No survey triggered | P2 |
| TC-FR-001 | URD-FR-001 | Submit feature request | 1. Customer submits a request | Created; status submitted; votes zero | P2 |
| TC-FR-002 | URD-FR-003 | Vote | 1. Customer votes on a request | Vote recorded; count +1 | P2 |
| TC-FR-003 | URD-FR-003 | Duplicate vote (negative) | 1. Same customer votes again | Rejected; one vote per customer | P2 |
| TC-FR-004 | URD-FR-003 | Unvote | 1. Customer who voted unvotes | Vote removed; count −1 | P2 |
| TC-FR-005 | URD-FR-002 | Status change | 1. Admin moves request to planned | Status → planned persisted | P2 |
| TC-CMP-001 | URD-CMP-001 | Issue on breach | 1. Breach exists 2. Agent issues store credit | Compensation created (pending); linked to ticket + escalation | P2 |
| TC-CMP-002 | URD-CMP-002 | Compensation type | 1. Agent issues a voucher with amount | Saved with correct type and amount | P2 |
| TC-CMP-003 | URD-CMP-003 | Completion | 1. Pending compensation processed | Status → completed; completed-at recorded | P2 |
| TC-CMP-004 | URD-CMP-003 | Expiry | 1. Pending compensation not processed in time | Status → expired | P2 |
| TC-NTF-001 | URD-NTF-001 | Real-time to agent | 1. Ticket assigned to a connected agent | Agent receives live event with ticket detail | P1 |
| TC-NTF-002 | URD-NTF-001 | Real-time to customer | 1. Agent replies; customer connected | Customer receives live reply notification | P1 |
| TC-NTF-003 | URD-NTF-002 | Email on creation | 1. Ticket created with email enabled | Email sent to reporter with ticket reference | P2 |
| TC-NTF-004 | URD-NTF-003 | Preference opt-out | 1. Customer opted out of assignment email 2. Ticket assigned | No email; live notification still sent | P2 |
| TC-NTF-005 | URD-NTF-005 | Batch delivery | 1. Queue 100 notifications 2. Batch worker runs | All delivered; per-recipient delivery log created | P2 |
| TC-ACC-001 | URD-TKT-002 | Cross-merchant block | 1. Merchant B agent queries Merchant A tickets | Forbidden / empty; no cross-merchant leak | P1 |
| TC-ACC-002 | URD-MSG-002 | Internal note hidden | 1. Customer queries messages incl. internal notes | Internal notes excluded | P1 |
| TC-ACC-003 | URD-AGT-001 | Agent scope | 1. Merchant A agent creates agent in Merchant B | Rejected; scoped to own merchant | P1 |
| TC-ACC-004 | URD-SLA-001 | SLA policy permission | 1. Non-admin modifies an SLA policy | Rejected; insufficient permission | P1 |
3. Traceability
Every Must requirement must map to ≥1 test case. Gaps flagged explicitly.
| URD requirement | Test case(s) | Status |
|---|---|---|
| URD-TKT-001 | TC-TKT-001, TC-TKT-004, TC-TKT-005 | ✅ Covered |
| URD-TKT-002 | TC-TKT-002, TC-ACC-001 | ✅ Covered |
| URD-TKT-003 | TC-TKT-003 | ✅ Covered |
| URD-TKT-004 | TC-TKT-006–010, TC-TKT-014, TC-TKT-015 | ✅ Covered |
| URD-TKT-005 | TC-TKT-006, TC-AGT-011 | ✅ Covered |
| URD-TKT-006 | TC-TKT-010, TC-TKT-011 | ✅ Covered |
| URD-TKT-007 | — | ⚠️ Uncovered (context enrichment not exercised) |
| URD-TKT-008 | TC-TKT-016 | ✅ Covered |
| URD-TKT-009 (S) | TC-TKT-013 | ✅ Covered |
| URD-TKT-010 (S) | TC-TKT-011, TC-TKT-012 | ✅ Covered |
| URD-TKT-011 (S) | — | ⚠️ Uncovered (enrichment worker) |
| URD-TKT-012 (S) | TC-TKT-017 | ✅ Covered |
| URD-MSG-001 | TC-MSG-001, TC-MSG-002 | ✅ Covered |
| URD-MSG-002 | TC-MSG-003, TC-MSG-004, TC-ACC-002 | ✅ Covered |
| URD-MSG-003 | TC-MSG-005 | ✅ Covered |
| URD-MSG-004 | — | ⚠️ Uncovered (author/author-type assertion implicit only) |
| URD-MSG-005 (S) | TC-MSG-006 | ✅ Covered |
| URD-CAT-001 | TC-CAT-001, TC-CAT-002, TC-CAT-003 | ✅ Covered |
| URD-CAT-002 | TC-CAT-004 | ✅ Covered |
| URD-CAT-003 | TC-CAT-005 | ✅ Covered |
| URD-CAT-004 (S) | TC-CAT-006, TC-CAT-007 | ✅ Covered |
| URD-CAT-005 | — | ⚠️ Uncovered (priority levels not directly tested) |
| URD-SLA-001 | TC-SLA-001, TC-SLA-002, TC-ACC-004 | ✅ Covered |
| URD-SLA-002 | TC-SLA-001 | ✅ Covered |
| URD-SLA-003 | TC-SLA-003 | ✅ Covered |
| URD-SLA-004 | TC-SLA-004 | ✅ Covered |
| URD-SLA-005 | TC-SLA-006, TC-SLA-007 | ✅ Covered |
| URD-SLA-006 | TC-SLA-005 | ✅ Covered |
| URD-SLA-007 | TC-SLA-008 | ✅ Covered |
| URD-SLA-008 | TC-SLA-009 | ✅ Covered |
| URD-SLA-009 (S) | — | ⚠️ Uncovered (policy escalation rules) |
| URD-SLA-010 (S) | TC-CAT-004 | ✅ Covered |
| URD-AGT-001 | TC-AGT-001, TC-AGT-002, TC-ACC-003 | ✅ Covered |
| URD-AGT-002 | TC-AGT-003 | ✅ Covered |
| URD-AGT-003 | TC-AGT-004 | ✅ Covered |
| URD-AGT-004 | TC-AGT-006, TC-AGT-007 | ✅ Covered |
| URD-AGT-005 | TC-AGT-008–010 | ✅ Covered |
| URD-AGT-006 | TC-AGT-008, TC-AGT-009, TC-AGT-010 | ✅ Covered |
| URD-AGT-007 | TC-AGT-011, TC-AGT-012 | ✅ Covered |
| URD-AGT-008 (S) | — | ⚠️ Uncovered (performance metrics) |
| URD-AGT-009 (S) | — | ⚠️ Uncovered (agent schedule) |
| URD-AGT-010 | TC-AGT-005 | ✅ Covered |
| URD-KB-001 (S) | TC-KB-001 | ✅ Covered |
| URD-KB-002 (S) | TC-KB-002, TC-KB-003 | ✅ Covered |
| URD-KB-003 (S) | TC-KB-004 | ✅ Covered |
| URD-KB-004 (S) | TC-KB-005 | ✅ Covered |
| URD-KB-005 (S) | — | ⚠️ Uncovered (article categories) |
| URD-KB-006 (C) | TC-KB-006, TC-KB-007 | ✅ Covered |
| URD-KB-007 (C) | TC-KB-005 | ✅ Covered |
| URD-SRV-001 (S) | TC-SRV-001 | ✅ Covered |
| URD-SRV-002 (S) | TC-SRV-001 | ✅ Covered |
| URD-SRV-003 (S) | TC-SRV-002 | ✅ Covered |
| URD-SRV-004 (S) | TC-SRV-003, TC-SRV-005 | ✅ Covered |
| URD-SRV-005 (S) | TC-SRV-004 | ✅ Covered |
| URD-SRV-006 (S) | — | ⚠️ Uncovered (satisfaction score feed) |
| URD-FR-001 (S) | TC-FR-001 | ✅ Covered |
| URD-FR-002 (S) | TC-FR-005 | ✅ Covered |
| URD-FR-003 (S) | TC-FR-002, TC-FR-003, TC-FR-004 | ✅ Covered |
| URD-FR-004 (S) | — | ⚠️ Uncovered (ticket linkage) |
| URD-FR-005 (C) | — | ⚠️ Uncovered (internal notes) |
| URD-CMP-001 (S) | TC-CMP-001 | ✅ Covered |
| URD-CMP-002 (S) | TC-CMP-002 | ✅ Covered |
| URD-CMP-003 (S) | TC-CMP-003, TC-CMP-004 | ✅ Covered |
| URD-CMP-004 (S) | TC-CMP-001 | ✅ Covered |
| URD-NTF-001 | TC-NTF-001, TC-NTF-002 | ✅ Covered |
| URD-NTF-002 (S) | TC-NTF-003 | ✅ Covered |
| URD-NTF-003 (S) | TC-NTF-004 | ✅ Covered |
| URD-NTF-004 (S) | — | ⚠️ Uncovered (templates) |
| URD-NTF-005 (S) | TC-NTF-005 | ✅ Covered |
Must-requirement gaps: URD-TKT-007, URD-MSG-004, URD-CAT-005 have no dedicated test case yet — add coverage when the build is repaired. Remaining gaps are Should/Could and can be deferred.