Test Cases: Device
| Module | CORE-04 | URD | Device URD |
|---|
Priority = P1 (critical) / P2 (major) / P3 (minor), inherited from the URD MoSCoW level (Must → P1, Should → P2, Could → P3). Steps follow GIVEN → WHEN; the Expected column is the THEN.
1. Coverage Summary
| Area | Code | URD reqs | Test cases | Covered |
|---|---|---|---|---|
| Device registration & management | DEV | 19 | 38 | ✅ |
| Mobile app | MOB | 6 | 15 | ✅ |
| Web app | WEB | 5 | 13 | ✅ |
| POS terminal | POS | 5 | 14 | ✅ |
| Printer | PRN | 12 | 29 | ✅ |
| Barcode scanner | SCN | 7 | 20 | ✅ |
| SoundBox | SBX | 6 | 19 | ✅ |
| SoftPOS / NFC | NFC | 4 | 7 | ✅ |
| Health monitoring | MON | 5 | 12 | ✅ |
| Total | 69 | 167 | ✅ |
Three test cases (TC-PRN-029, TC-SCN-014, plus the terminal cases) validate behavior that is not yet implemented — see the QE findings inline. They are written against expected behavior and remain failing until the gaps are fixed.
2. Test Cases
2.1 Device Registration & Management (DEV)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-DEV-001 | URD-DEV-002 | Identifier generated | Admin creates a device | Unique D_YYYYMMDD_<id> assigned; not editable | P1 |
| TC-DEV-002 | URD-DEV-002 | Same-day uniqueness | Create several devices same date | Distinct identifiers; no collision | P1 |
| TC-DEV-003 | URD-DEV-003 | i18n name stored | Create with VI + EN name | Both locales stored and retrievable | P1 |
| TC-DEV-004 | URD-DEV-003 | Single-locale name | Provide primary locale only | Empty locales stored as null; no error | P1 |
| TC-DEV-005 | URD-DEV-003 | Missing name rejected | Create with all locales empty | Rejected; primary-locale name required | P1 |
| TC-DEV-006 | URD-DEV-001 | Valid types | Create with each valid type | Each created; type stored as provided | P1 |
| TC-DEV-007 | URD-DEV-001 | Invalid type rejected | Create with type "KIOSK" | Rejected; accepted values listed | P1 |
| TC-DEV-008 | URD-DEV-004 | Default status | View a new device | Status is NEW | P1 |
| TC-DEV-009 | URD-DEV-005 | Activate | Activate a NEW device | Status ACTIVATED; available for POS | P1 |
| TC-DEV-010 | URD-DEV-006 | Deactivate | Deactivate an ACTIVATED device | Status DEACTIVATED; data preserved | P1 |
| TC-DEV-011 | URD-DEV-007 | Suspend | Suspend a device | Status SUSPENDED; cannot transact | P1 |
| TC-DEV-012 | URD-DEV-008 | Archive | Archive a SUSPENDED/DEACTIVATED device | Status ARCHIVED; hidden from active list | P1 |
| TC-DEV-013 | URD-DEV-004 | Archived is terminal | Reactivate an ARCHIVED device | Rejected; remains ARCHIVED | P1 |
| TC-DEV-014 | URD-DEV-004 | Invalid jump | NEW → ARCHIVED directly | Rejected as invalid transition | P1 |
| TC-DEV-015 | URD-DEV-001 | Org link | Create under ORG-001 | Device linked to ORG-001 | P1 |
| TC-DEV-016 | URD-DEV-001 | Org required | Create with no organization | Rejected; organization required | P1 |
| TC-DEV-017 | URD-DEV-016 | Assign merchant | Assign to merchant M1 | Linked to M1; retrievable by merchant filter | P1 |
| TC-DEV-018 | URD-DEV-016 | Unassign merchant | Remove merchant assignment | No merchant ref; still org-owned | P1 |
| TC-DEV-019 | URD-DEV-017 | Hardware info | Set full hardware info | All fields stored and returned | P2 |
| TC-DEV-020 | URD-DEV-017 | Partial hardware | Set manufacturer + model only | Empty fields null; no error | P2 |
| TC-DEV-021 | URD-DEV-018 | Software info | Set software info | All fields stored and returned | P2 |
| TC-DEV-022 | URD-DEV-011 | Code stored | Create with code "POS-STORE-01" | Code stored; retrievable | P1 |
| TC-DEV-023 | URD-DEV-011 | Duplicate code | Reuse "POS-STORE-01" | Rejected; code already in use | P1 |
| TC-DEV-024 | URD-DEV-011 | Null codes | Two devices with no code | Both created; nulls not duplicates | P1 |
| TC-DEV-025 | URD-DEV-009 | Soft delete | Delete a device | Soft-deleted; hidden from default list | P1 |
| TC-DEV-026 | URD-DEV-009 | Include-deleted | Query with include-deleted | Returned with data intact | P1 |
| TC-DEV-027 | URD-DEV-010 | Unauthenticated | Call any device endpoint | 401; no data returned | P1 |
| TC-DEV-028 | URD-DEV-010 | Valid JWT | List devices with JWT | Accepted; in-scope devices returned | P1 |
| TC-DEV-029 | URD-DEV-010 | Basic auth | Call endpoint with Basic Auth | Accepted; data returned | P1 |
| TC-DEV-030 | URD-DEV-013 | Auto-register | First app login on new device | Device auto-created, set ACTIVATED, linked | P1 |
| TC-DEV-031 | URD-DEV-013 | No duplicate | Login again on known device | Existing record reused | P1 |
| TC-DEV-032 | URD-DEV-012 | Maintenance info | Set purchase/warranty/maintenance | Stored and returned | P2 |
| TC-DEV-033 | URD-DEV-012 | Past warranty | Set past warranty date | Stored; past dates allowed | P2 |
| TC-DEV-034 | URD-DEV-014 | Name search | Search "POS Counter" | Matching devices returned; others excluded | P1 |
| TC-DEV-035 | URD-DEV-014 | Diacritic search | Search without diacritics | Matches if normalization configured; documented | P1 |
| TC-DEV-036 | URD-DEV-015 | CSV import | Upload valid CSV | Devices created; success/failure summary | P2 |
| TC-DEV-037 | URD-DEV-015 | CSV bad rows | Upload CSV with missing fields | Invalid rows rejected; valid imported; report lists reasons | P2 |
| TC-DEV-038 | URD-DEV-015 | CSV export | Request export | CSV of in-scope device records returned | P2 |
2.2 Mobile App (MOB)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-MOB-001 | URD-MOB-001 | iOS 14 | Install/launch on iOS 14 | Launches; core screens accessible | P1 |
| TC-MOB-002 | URD-MOB-001 | Android 8 | Install/launch on Android 8 | Launches; core screens accessible | P1 |
| TC-MOB-003 | URD-MOB-001 | iOS 13 blocked | Install on iOS 13 | Blocked / min-OS error | P1 |
| TC-MOB-004 | URD-MOB-001 | Android 7 blocked | Install on Android 7 | Blocked; min Android 8 | P1 |
| TC-MOB-005 | URD-MOB-002 | Owner screens | Owner navigates app | POS, Orders, Payments, Invoicing, Reporting accessible | P1 |
| TC-MOB-006 | URD-MOB-002 | Role restriction | Cashier opens reporting/invoicing | Restricted by role | P1 |
| TC-MOB-007 | URD-MOB-003 | Cashier screens | Cashier uses app | POS, order, payment, receipt accessible | P1 |
| TC-MOB-008 | URD-MOB-003 | Owner-only blocked | Cashier opens owner screens | Denied / hidden | P1 |
| TC-MOB-009 | URD-MOB-004 | BT printer | Open BT printer settings | Paired printer discovered and selectable | P2 |
| TC-MOB-010 | URD-MOB-004 | BT disabled | Connect peripheral with BT off | Prompt to enable BT; no crash | P2 |
| TC-MOB-011 | URD-MOB-005 | Offline order | Create sale while offline | Saved locally; offline indicator; queued | P2 |
| TC-MOB-012 | URD-MOB-005 | Sync on reconnect | Reconnect with pending orders | Queued orders auto-sync; status visible | P2 |
| TC-MOB-013 | URD-MOB-005 | Offline limits | Real-time op while offline | Clear unavailable message; no crash | P2 |
| TC-MOB-014 | URD-MOB-006 | Session on login | Log in on registered device | Session created and linked | P1 |
| TC-MOB-015 | URD-MOB-006 | New-device session | First login on new device | Auto-registered (URD-DEV-013); session linked | P1 |
2.3 Web App (WEB)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-WEB-001 | URD-WEB-001 | Chrome | Open in Chrome 90+ | Loads; modules functional | P1 |
| TC-WEB-002 | URD-WEB-001 | Firefox | Open in Firefox 88+ | Loads; modules functional | P1 |
| TC-WEB-003 | URD-WEB-001 | Safari | Open in Safari 14+ | Loads; modules functional | P1 |
| TC-WEB-004 | URD-WEB-001 | Edge | Open in Edge 90+ | Loads; modules functional | P1 |
| TC-WEB-005 | URD-WEB-001 | Old browser | Open in Chrome 89 | Unsupported-browser warning; no silent crash | P1 |
| TC-WEB-006 | URD-WEB-002 | Owner menu | Owner navigates back office | Dashboard, Catalog, Inventory, CRM, Reports, Settings accessible | P1 |
| TC-WEB-007 | URD-WEB-002 | Role restriction | Cashier opens Settings/Reports | Restricted; no data leak | P1 |
| TC-WEB-008 | URD-WEB-003 | Web POS | Activate Web POS mode | POS UI with product lookup + cart | P2 |
| TC-WEB-009 | URD-WEB-003 | Web POS no peripheral | Print with no BT/USB printer | Limited-support notice; PDF/email alternative | P2 |
| TC-WEB-010 | URD-WEB-004 | HTTPS upgrade | Access over HTTP | Redirected to HTTPS | P1 |
| TC-WEB-011 | URD-WEB-004 | Session expiry | Session expires | Invalidated; 401; redirect to login | P1 |
| TC-WEB-012 | URD-WEB-005 | 1024px | Window at 1024px | Full functionality; no clipping | P2 |
| TC-WEB-013 | URD-WEB-005 | Below min width | Window at 800px | Wider-viewport notice; reduced view usable | P2 |
2.4 POS Terminal (POS)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-POS-001 | URD-POS-001 | Min spec | Launch on Android 8, 2 GB RAM | Launches; POS functional | P1 |
| TC-POS-002 | URD-POS-001 | Below RAM | Launch on 1 GB RAM | Clear min-RAM error or documented degradation | P1 |
| TC-POS-003 | URD-POS-001 | iOS blocked | Install on iOS | Blocked; Android 8+ only | P1 |
| TC-POS-004 | URD-POS-002 | POS screen | Open POS screen | Full-screen UI; lookup + cart visible | P1 |
| TC-POS-005 | URD-POS-002 | Product search | Search by name | Matches shown; addable to cart | P1 |
| TC-POS-006 | URD-POS-002 | No match | Search with no results | Empty state; no crash | P1 |
| TC-POS-007 | URD-POS-003 | Card reader | Process card payment | Built-in reader invoked; payment processed | P1 |
| TC-POS-008 | URD-POS-003 | Built-in printer | Complete a sale | Receipt printed on built-in printer | P1 |
| TC-POS-009 | URD-POS-003 | Built-in scanner | Scan a barcode | Product looked up and added | P1 |
| TC-POS-010 | URD-POS-003 | Cash drawer | Complete cash payment | Drawer opens via printer trigger | P1 |
| TC-POS-011 | URD-POS-004 | VNPAY V-POS | Install on V-POS | All features + hardware integrations work | P2 |
| TC-POS-012 | URD-POS-004 | Sunmi T2 | Install on Sunmi T2 | All POS features work | P2 |
| TC-POS-013 | URD-POS-005 | Peripheral setup | Open Settings > Devices | BT devices listed and connectable | P1 |
| TC-POS-014 | URD-POS-005 | BT disabled | Add BT peripheral with BT off | Prompt to enable; screen stays functional | P1 |
2.5 Printer (PRN)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-PRN-001 | URD-PRN-001 | BT pairing | Pair a BT printer | Discovered; pairs; shows connected | P1 |
| TC-PRN-002 | URD-PRN-001 | USB connect | Connect USB printer | Auto-detected; selectable | P1 |
| TC-PRN-003 | URD-PRN-001 | Network connect | Configure by IP | Connects; test print succeeds | P1 |
| TC-PRN-004 | URD-PRN-001 | Printer off | Connect powered-off BT printer | Unreachable message; retry; no crash | P1 |
| TC-PRN-005 | URD-PRN-002 | USB class 0x07 | Scan USB devices | Printer detected via class 0x07 | P1 |
| TC-PRN-006 | URD-PRN-002 | HID excluded | Scan with HID keyboard attached | HID not listed as printer | P1 |
| TC-PRN-007 | URD-PRN-003 | Mixed receipt | Print text + image + QR + barcode | All elements print correctly | P1 |
| TC-PRN-008 | URD-PRN-003 | Bad command | Send unsupported sequence | Handled gracefully; user notified; no crash | P1 |
| TC-PRN-009 | URD-PRN-004 | Markup styles | Print aligned/bold/underline/double-height | Each style rendered correctly | P1 |
| TC-PRN-010 | URD-PRN-004 | Per-line align | Consecutive L/C lines | Independent alignment; no bleed | P1 |
| TC-PRN-011 | URD-PRN-005 | PDF raster | Print a PDF invoice | Floyd–Steinberg dithered; legible | P1 |
| TC-PRN-012 | URD-PRN-005 | Color PDF | Print full-color photo | Dithered monochrome; no crash | P1 |
| TC-PRN-013 | URD-PRN-006 | Vietnamese text | Print "Cà phê sữa đá" | Correct via code page 28; no substitution | P1 |
| TC-PRN-014 | URD-PRN-006 | Mixed charset | VI + ASCII on one line | Both render correctly | P1 |
| TC-PRN-015 | URD-PRN-007 | 58mm | Print on 58mm | Formatted for 58mm; no cut-off | P1 |
| TC-PRN-016 | URD-PRN-007 | 80mm | Print on 80mm | Full-width 80mm layout | P1 |
| TC-PRN-017 | URD-PRN-007 | Width mismatch | 80mm template to 58mm | Reformat or warn; no silent truncation | P1 |
| TC-PRN-018 | URD-PRN-008 | Auto-cut | Print on cutter printer | Auto-cut command sent | P2 |
| TC-PRN-019 | URD-PRN-008 | No cutter | Print on non-cutter printer | Completes; no cut command; no crash | P2 |
| TC-PRN-020 | URD-PRN-009 | Drawer | Complete cash payment | Drawer trigger sent via printer; opens | P2 |
| TC-PRN-021 | URD-PRN-010 | Connect | Call connect | Connected; jobs routed here | P1 |
| TC-PRN-022 | URD-PRN-010 | Disconnect | Call disconnect | Disconnected; handled gracefully | P1 |
| TC-PRN-023 | URD-PRN-010 | Send job | Send valid receipt | Queued, printed; success returned | P1 |
| TC-PRN-024 | URD-PRN-010 | No printer | Send job with none connected | Error returned; surfaced; no silent fail | P1 |
| TC-PRN-025 | URD-PRN-011 | WS connect | Add network printer | WebSocket connects; test print succeeds | P2 |
| TC-PRN-026 | URD-PRN-011 | WS drop | Printer unreachable mid-job | Error detected; user notified; reconnect offered | P2 |
| TC-PRN-027 | URD-PRN-012 | WebUSB | Print in Web POS with USB | WebUSB used; receipt printed | P1 |
| TC-PRN-028 | URD-PRN-012 | No WebUSB | Print where WebUSB unsupported | Informative message; alternatives offered | P1 |
| TC-PRN-029 | URD-PRN-010 | Confirm & print invoice | Tap "Confirm & Print Invoice" on success screen | Job sent; invoice printed; draft order created | P1 |
QE Finding — TC-PRN-029 currently fails
apps/sale-renderer/.../payment-dialog/stepper/success/PaymentSuccess.tsx — the print branch logs "Print invoice functionality to be implemented" and does not send a print job. "Confirm & Print Invoice" silently skips printing. TC-PRN-029 validates the expected behavior once implemented.
2.6 Barcode Scanner (SCN)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-SCN-001 | URD-SCN-001 | USB HID | Scan with USB HID scanner | Detected without setup; lookup fires | P1 |
| TC-SCN-002 | URD-SCN-001 | BT HID | Scan with BT HID scanner | Received as keyboard events; lookup fires | P1 |
| TC-SCN-003 | URD-SCN-002 | 13-char | EAN-13 + Enter within 100ms | Full barcode captured; search fires | P1 |
| TC-SCN-004 | URD-SCN-002 | Manual typing | Type 8 chars slowly, no Enter | Hook does not fire; treated as text input | P1 |
| TC-SCN-005 | URD-SCN-002 | Min 10 | Exactly 10 chars + Enter | Accepted; search fires | P1 |
| TC-SCN-006 | URD-SCN-002 | Max 20 | Exactly 20 chars + Enter | Accepted; search fires | P1 |
| TC-SCN-007 | URD-SCN-002 | Below min | 9 chars | No search; below threshold | P1 |
| TC-SCN-008 | URD-SCN-002 | Above max | 21 chars | No search; documented behavior | P1 |
| TC-SCN-009 | URD-SCN-003 | Enter trigger | 13 chars + Enter | Search fires immediately on Enter | P1 |
| TC-SCN-010 | URD-SCN-003 | Timeout trigger | 13 chars, no Enter, pause 100ms | Timeout completes scan; search fires | P1 |
| TC-SCN-011 | URD-SCN-004 | Camera open | Open QR scanner with permission | Viewfinder shown; scanning starts | P1 |
| TC-SCN-012 | URD-SCN-004 | Permission denied | Open QR scanner, permission off | Error; guided to grant permission | P1 |
| TC-SCN-013 | URD-SCN-004 | Decode QR | Present a QR code | Captured; callback fires; scanner closes | P1 |
| TC-SCN-014 | URD-SCN-004 | Torch toggle | Tap torch in dark | Torch on; viewfinder lit; tap again off | P1 |
| TC-SCN-015 | URD-SCN-005 | Add to cart | Scan known barcode on POS | Product looked up; addable in one tap | P1 |
| TC-SCN-016 | URD-SCN-005 | Not found | Scan unknown barcode | "Product not found"; cart unchanged | P1 |
| TC-SCN-017 | URD-SCN-006 | 1D formats | Scan EAN-13 + Code 128 | Both decoded; correct products | P2 |
| TC-SCN-018 | URD-SCN-006 | 2D formats | Scan QR + Data Matrix | Both decoded; correct data | P2 |
| TC-SCN-019 | URD-SCN-007 | Product context | Scan on product search | Result populated; product returned | P2 |
| TC-SCN-020 | URD-SCN-007 | Invoice context | Scan invoice QR on lookup | Result populated; invoice returned | P2 |
QE Finding — TC-SCN-014 currently fails
apps/sale-renderer/.../modal/QRScannerModal.tsx — the torch invocation invoke('plugin:barcode-scanner|toggle_torch') is commented out. The toggle UI flips isTorchOn but the torch does not actually activate. TC-SCN-014 validates the expected behavior once re-enabled.
2.7 SoundBox (SBX)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-SBX-001 | URD-SBX-001 | Pair | Pair SoundBox in pairing mode | Pairs; shows connected; LED solid blue | P1 |
| TC-SBX-002 | URD-SBX-001 | Already paired | Pair one bound to another device | Fails or prompts to clear; no silent fail | P1 |
| TC-SBX-003 | URD-SBX-001 | Powered off | Pair a powered-off SoundBox | Not found; instructed to power on; no crash | P1 |
| TC-SBX-004 | URD-SBX-002 | VI announce | Cash payment, VI locale | Announces amount + method in Vietnamese | P1 |
| TC-SBX-005 | URD-SBX-002 | EN announce | Card payment, EN locale | Announces amount + method in English | P1 |
| TC-SBX-006 | URD-SBX-002 | No SoundBox | Payment with none connected | Payment completes; no announcement; no error | P1 |
| TC-SBX-007 | URD-SBX-003 | VI config | VI-configured SoundBox | Announcements in Vietnamese; correct numerals | P1 |
| TC-SBX-008 | URD-SBX-003 | EN config | EN-configured SoundBox | Announcements in English | P1 |
| TC-SBX-009 | URD-SBX-003 | Switch lang | Switch VI→EN mid-session | Next announcement in English; no reconnect | P1 |
| TC-SBX-010 | URD-SBX-004 | Pairing LED | Not yet paired | Blue blinking | P2 |
| TC-SBX-011 | URD-SBX-004 | Connected LED | Paired | Blue solid | P2 |
| TC-SBX-012 | URD-SBX-004 | Success LED | Successful announcement | Green flash | P2 |
| TC-SBX-013 | URD-SBX-004 | Error LED | Error/failure event | Red flash | P2 |
| TC-SBX-014 | URD-SBX-005 | Min volume | Set volume 1 | Plays at minimum; audible | P2 |
| TC-SBX-015 | URD-SBX-005 | Max volume | Set volume 10 | Plays at maximum; clear | P2 |
| TC-SBX-016 | URD-SBX-005 | Out of range | Set 0 or 11 | Rejected/clamped to 1–10 | P2 |
| TC-SBX-017 | URD-SBX-005 | Toggle amount | Disable amount announcement | Announcement omits amount; rest unaffected | P2 |
| TC-SBX-018 | URD-SBX-006 | At range | 10 m from device | Announcement received without dropout | P2 |
| TC-SBX-019 | URD-SBX-006 | Beyond range | 11 m from device | Connection may drop; handled gracefully | P2 |
2.8 SoftPOS / NFC (NFC)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-NFC-001 | URD-NFC-001 | NFC present | Open SoftPOS settings, NFC on | NFC confirmed; activation enabled | P1 |
| TC-NFC-002 | URD-NFC-001 | No NFC | Open SoftPOS settings, no NFC | Detected unavailable; activation disabled/hidden; message | P1 |
| TC-NFC-003 | URD-NFC-003 | NFC off | Activate with NFC turned off | Directed to enable NFC; activation halts | P1 |
| TC-NFC-004 | URD-NFC-002 | KYC done | Activate with KYC complete | SoftPOS activated; payment can start | P1 |
| TC-NFC-005 | URD-NFC-002 | KYC missing | Activate without KYC | Blocked; KYC-required message | P1 |
| TC-NFC-006 | URD-NFC-004 | iOS hidden | Open SoftPOS on iOS | Option unavailable; Android-only message | P2 |
| TC-NFC-007 | URD-NFC-004 | Android flow | Start contactless payment | NFC/payment plugins invoked; waits for tap | P2 |
2.9 Health Monitoring (MON)
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-MON-001 | URD-MON-001 | Heartbeat | Active device over time | Heartbeat every 5 min; recorded; stays online | P1 |
| TC-MON-002 | URD-MON-001 | 5-min mark | 5 min since last heartbeat | Heartbeat sent; timestamp updated; timer reset | P1 |
| TC-MON-003 | URD-MON-001 | Lost network | Heartbeats cannot send | Failures logged; resumes on reconnect | P1 |
| TC-MON-004 | URD-MON-002 | Offline | 15 min without heartbeat | Status → offline; dashboard reflects it | P1 |
| TC-MON-005 | URD-MON-002 | 14-min | 14 min without heartbeat | Still online; threshold not crossed | P1 |
| TC-MON-006 | URD-MON-002 | Back online | Heartbeat after offline | Status → online immediately | P1 |
| TC-MON-007 | URD-MON-003 | Status list | Open device list (mixed status) | Each device shows online/offline | P1 |
| TC-MON-008 | URD-MON-003 | Filter | Filter online-only | Only online devices shown | P1 |
| TC-MON-009 | URD-MON-004 | Remote deactivate | Remotely deactivate active device | Status DEACTIVATED; session terminated; logged | P1 |
| TC-MON-010 | URD-MON-004 | Already off | Deactivate a DEACTIVATED device | Handled gracefully; stays DEACTIVATED | P1 |
| TC-MON-011 | URD-MON-005 | Remote wipe | Trigger wipe on online device | Cached data deleted; device deactivated; logged | P2 |
| TC-MON-012 | URD-MON-005 | Queued wipe | Trigger wipe on offline device | Queued; executes on reconnect | P2 |
2.10 Terminal — QE Findings
These cases concern the VNPAY Terminal flow, which is out of scope for this URD version (the entity exists but is not wired). They are recorded so the gaps are not lost.
| TC ID | URD ref | Scenario | Steps | Expected | P |
|---|---|---|---|---|---|
| TC-CON-017 | URD-POS-002 | Terminal list | Open Terminal list with existing records | Terminals shown with name/code/status/type; pagination works | P1 |
| TC-CON-018 | URD-MOB-006 | Terminal metadata | Initiate checkout on a known terminal | Payment body carries the real terminal name/code, not a placeholder | P1 |
QE Findings — TC-CON-017 / TC-CON-018 currently fail
apps/client/.../terminal/list/TerminalTable.tsx— rendered with hardcodedrowCount={0},data={[]}; no data provider wired, so the table is always empty.apps/sale-renderer/.../apis/payment/payment.api.ts—metadata.terminalis hardcoded ({ name: 'SDHVJK11', code: 'SDHVJK11', serviceCode: '03' }) and sent to VNPAY for every transaction, risking reconciliation failures with multiple terminals.
3. Traceability
Every Must requirement maps to ≥1 test case. No Must requirement is uncovered.
| URD area | Requirements | Test cases | Status |
|---|---|---|---|
DEV (URD-DEV-001…019) | 19 | TC-DEV-001…038 | ✅ Covered |
MOB (URD-MOB-001…006) | 6 | TC-MOB-001…015 | ✅ Covered |
WEB (URD-WEB-001…005) | 5 | TC-WEB-001…013 | ✅ Covered |
POS (URD-POS-001…005) | 5 | TC-POS-001…014, TC-CON-017 | ✅ Covered |
PRN (URD-PRN-001…012) | 12 | TC-PRN-001…029 | ✅ Covered* |
SCN (URD-SCN-001…007) | 7 | TC-SCN-001…020 | ✅ Covered* |
SBX (URD-SBX-001…006) | 6 | TC-SBX-001…019 | ✅ Covered |
NFC (URD-NFC-001…004) | 4 | TC-NFC-001…007 | ✅ Covered |
MON (URD-MON-001…005) | 5 | TC-MON-001…012 | ✅ Covered |
*
PRNandSCNcoverage includes TC-PRN-029 and TC-SCN-014, which validate behavior that is not yet implemented (see QE findings). These are expected-failing until the gaps are fixed. TC-CON-017/018 cover the unwired Terminal flow, which is out of scope for v0.1.