Skip to content

Test Cases: Device

ModuleCORE-04URDDevice 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

AreaCodeURD reqsTest casesCovered
Device registration & managementDEV1938
Mobile appMOB615
Web appWEB513
POS terminalPOS514
PrinterPRN1229
Barcode scannerSCN720
SoundBoxSBX619
SoftPOS / NFCNFC47
Health monitoringMON512
Total69167

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 IDURD refScenarioStepsExpectedP
TC-DEV-001URD-DEV-002Identifier generatedAdmin creates a deviceUnique D_YYYYMMDD_<id> assigned; not editableP1
TC-DEV-002URD-DEV-002Same-day uniquenessCreate several devices same dateDistinct identifiers; no collisionP1
TC-DEV-003URD-DEV-003i18n name storedCreate with VI + EN nameBoth locales stored and retrievableP1
TC-DEV-004URD-DEV-003Single-locale nameProvide primary locale onlyEmpty locales stored as null; no errorP1
TC-DEV-005URD-DEV-003Missing name rejectedCreate with all locales emptyRejected; primary-locale name requiredP1
TC-DEV-006URD-DEV-001Valid typesCreate with each valid typeEach created; type stored as providedP1
TC-DEV-007URD-DEV-001Invalid type rejectedCreate with type "KIOSK"Rejected; accepted values listedP1
TC-DEV-008URD-DEV-004Default statusView a new deviceStatus is NEWP1
TC-DEV-009URD-DEV-005ActivateActivate a NEW deviceStatus ACTIVATED; available for POSP1
TC-DEV-010URD-DEV-006DeactivateDeactivate an ACTIVATED deviceStatus DEACTIVATED; data preservedP1
TC-DEV-011URD-DEV-007SuspendSuspend a deviceStatus SUSPENDED; cannot transactP1
TC-DEV-012URD-DEV-008ArchiveArchive a SUSPENDED/DEACTIVATED deviceStatus ARCHIVED; hidden from active listP1
TC-DEV-013URD-DEV-004Archived is terminalReactivate an ARCHIVED deviceRejected; remains ARCHIVEDP1
TC-DEV-014URD-DEV-004Invalid jumpNEW → ARCHIVED directlyRejected as invalid transitionP1
TC-DEV-015URD-DEV-001Org linkCreate under ORG-001Device linked to ORG-001P1
TC-DEV-016URD-DEV-001Org requiredCreate with no organizationRejected; organization requiredP1
TC-DEV-017URD-DEV-016Assign merchantAssign to merchant M1Linked to M1; retrievable by merchant filterP1
TC-DEV-018URD-DEV-016Unassign merchantRemove merchant assignmentNo merchant ref; still org-ownedP1
TC-DEV-019URD-DEV-017Hardware infoSet full hardware infoAll fields stored and returnedP2
TC-DEV-020URD-DEV-017Partial hardwareSet manufacturer + model onlyEmpty fields null; no errorP2
TC-DEV-021URD-DEV-018Software infoSet software infoAll fields stored and returnedP2
TC-DEV-022URD-DEV-011Code storedCreate with code "POS-STORE-01"Code stored; retrievableP1
TC-DEV-023URD-DEV-011Duplicate codeReuse "POS-STORE-01"Rejected; code already in useP1
TC-DEV-024URD-DEV-011Null codesTwo devices with no codeBoth created; nulls not duplicatesP1
TC-DEV-025URD-DEV-009Soft deleteDelete a deviceSoft-deleted; hidden from default listP1
TC-DEV-026URD-DEV-009Include-deletedQuery with include-deletedReturned with data intactP1
TC-DEV-027URD-DEV-010UnauthenticatedCall any device endpoint401; no data returnedP1
TC-DEV-028URD-DEV-010Valid JWTList devices with JWTAccepted; in-scope devices returnedP1
TC-DEV-029URD-DEV-010Basic authCall endpoint with Basic AuthAccepted; data returnedP1
TC-DEV-030URD-DEV-013Auto-registerFirst app login on new deviceDevice auto-created, set ACTIVATED, linkedP1
TC-DEV-031URD-DEV-013No duplicateLogin again on known deviceExisting record reusedP1
TC-DEV-032URD-DEV-012Maintenance infoSet purchase/warranty/maintenanceStored and returnedP2
TC-DEV-033URD-DEV-012Past warrantySet past warranty dateStored; past dates allowedP2
TC-DEV-034URD-DEV-014Name searchSearch "POS Counter"Matching devices returned; others excludedP1
TC-DEV-035URD-DEV-014Diacritic searchSearch without diacriticsMatches if normalization configured; documentedP1
TC-DEV-036URD-DEV-015CSV importUpload valid CSVDevices created; success/failure summaryP2
TC-DEV-037URD-DEV-015CSV bad rowsUpload CSV with missing fieldsInvalid rows rejected; valid imported; report lists reasonsP2
TC-DEV-038URD-DEV-015CSV exportRequest exportCSV of in-scope device records returnedP2

2.2 Mobile App (MOB)

TC IDURD refScenarioStepsExpectedP
TC-MOB-001URD-MOB-001iOS 14Install/launch on iOS 14Launches; core screens accessibleP1
TC-MOB-002URD-MOB-001Android 8Install/launch on Android 8Launches; core screens accessibleP1
TC-MOB-003URD-MOB-001iOS 13 blockedInstall on iOS 13Blocked / min-OS errorP1
TC-MOB-004URD-MOB-001Android 7 blockedInstall on Android 7Blocked; min Android 8P1
TC-MOB-005URD-MOB-002Owner screensOwner navigates appPOS, Orders, Payments, Invoicing, Reporting accessibleP1
TC-MOB-006URD-MOB-002Role restrictionCashier opens reporting/invoicingRestricted by roleP1
TC-MOB-007URD-MOB-003Cashier screensCashier uses appPOS, order, payment, receipt accessibleP1
TC-MOB-008URD-MOB-003Owner-only blockedCashier opens owner screensDenied / hiddenP1
TC-MOB-009URD-MOB-004BT printerOpen BT printer settingsPaired printer discovered and selectableP2
TC-MOB-010URD-MOB-004BT disabledConnect peripheral with BT offPrompt to enable BT; no crashP2
TC-MOB-011URD-MOB-005Offline orderCreate sale while offlineSaved locally; offline indicator; queuedP2
TC-MOB-012URD-MOB-005Sync on reconnectReconnect with pending ordersQueued orders auto-sync; status visibleP2
TC-MOB-013URD-MOB-005Offline limitsReal-time op while offlineClear unavailable message; no crashP2
TC-MOB-014URD-MOB-006Session on loginLog in on registered deviceSession created and linkedP1
TC-MOB-015URD-MOB-006New-device sessionFirst login on new deviceAuto-registered (URD-DEV-013); session linkedP1

2.3 Web App (WEB)

TC IDURD refScenarioStepsExpectedP
TC-WEB-001URD-WEB-001ChromeOpen in Chrome 90+Loads; modules functionalP1
TC-WEB-002URD-WEB-001FirefoxOpen in Firefox 88+Loads; modules functionalP1
TC-WEB-003URD-WEB-001SafariOpen in Safari 14+Loads; modules functionalP1
TC-WEB-004URD-WEB-001EdgeOpen in Edge 90+Loads; modules functionalP1
TC-WEB-005URD-WEB-001Old browserOpen in Chrome 89Unsupported-browser warning; no silent crashP1
TC-WEB-006URD-WEB-002Owner menuOwner navigates back officeDashboard, Catalog, Inventory, CRM, Reports, Settings accessibleP1
TC-WEB-007URD-WEB-002Role restrictionCashier opens Settings/ReportsRestricted; no data leakP1
TC-WEB-008URD-WEB-003Web POSActivate Web POS modePOS UI with product lookup + cartP2
TC-WEB-009URD-WEB-003Web POS no peripheralPrint with no BT/USB printerLimited-support notice; PDF/email alternativeP2
TC-WEB-010URD-WEB-004HTTPS upgradeAccess over HTTPRedirected to HTTPSP1
TC-WEB-011URD-WEB-004Session expirySession expiresInvalidated; 401; redirect to loginP1
TC-WEB-012URD-WEB-0051024pxWindow at 1024pxFull functionality; no clippingP2
TC-WEB-013URD-WEB-005Below min widthWindow at 800pxWider-viewport notice; reduced view usableP2

2.4 POS Terminal (POS)

TC IDURD refScenarioStepsExpectedP
TC-POS-001URD-POS-001Min specLaunch on Android 8, 2 GB RAMLaunches; POS functionalP1
TC-POS-002URD-POS-001Below RAMLaunch on 1 GB RAMClear min-RAM error or documented degradationP1
TC-POS-003URD-POS-001iOS blockedInstall on iOSBlocked; Android 8+ onlyP1
TC-POS-004URD-POS-002POS screenOpen POS screenFull-screen UI; lookup + cart visibleP1
TC-POS-005URD-POS-002Product searchSearch by nameMatches shown; addable to cartP1
TC-POS-006URD-POS-002No matchSearch with no resultsEmpty state; no crashP1
TC-POS-007URD-POS-003Card readerProcess card paymentBuilt-in reader invoked; payment processedP1
TC-POS-008URD-POS-003Built-in printerComplete a saleReceipt printed on built-in printerP1
TC-POS-009URD-POS-003Built-in scannerScan a barcodeProduct looked up and addedP1
TC-POS-010URD-POS-003Cash drawerComplete cash paymentDrawer opens via printer triggerP1
TC-POS-011URD-POS-004VNPAY V-POSInstall on V-POSAll features + hardware integrations workP2
TC-POS-012URD-POS-004Sunmi T2Install on Sunmi T2All POS features workP2
TC-POS-013URD-POS-005Peripheral setupOpen Settings > DevicesBT devices listed and connectableP1
TC-POS-014URD-POS-005BT disabledAdd BT peripheral with BT offPrompt to enable; screen stays functionalP1

2.5 Printer (PRN)

TC IDURD refScenarioStepsExpectedP
TC-PRN-001URD-PRN-001BT pairingPair a BT printerDiscovered; pairs; shows connectedP1
TC-PRN-002URD-PRN-001USB connectConnect USB printerAuto-detected; selectableP1
TC-PRN-003URD-PRN-001Network connectConfigure by IPConnects; test print succeedsP1
TC-PRN-004URD-PRN-001Printer offConnect powered-off BT printerUnreachable message; retry; no crashP1
TC-PRN-005URD-PRN-002USB class 0x07Scan USB devicesPrinter detected via class 0x07P1
TC-PRN-006URD-PRN-002HID excludedScan with HID keyboard attachedHID not listed as printerP1
TC-PRN-007URD-PRN-003Mixed receiptPrint text + image + QR + barcodeAll elements print correctlyP1
TC-PRN-008URD-PRN-003Bad commandSend unsupported sequenceHandled gracefully; user notified; no crashP1
TC-PRN-009URD-PRN-004Markup stylesPrint aligned/bold/underline/double-heightEach style rendered correctlyP1
TC-PRN-010URD-PRN-004Per-line alignConsecutive L/C linesIndependent alignment; no bleedP1
TC-PRN-011URD-PRN-005PDF rasterPrint a PDF invoiceFloyd–Steinberg dithered; legibleP1
TC-PRN-012URD-PRN-005Color PDFPrint full-color photoDithered monochrome; no crashP1
TC-PRN-013URD-PRN-006Vietnamese textPrint "Cà phê sữa đá"Correct via code page 28; no substitutionP1
TC-PRN-014URD-PRN-006Mixed charsetVI + ASCII on one lineBoth render correctlyP1
TC-PRN-015URD-PRN-00758mmPrint on 58mmFormatted for 58mm; no cut-offP1
TC-PRN-016URD-PRN-00780mmPrint on 80mmFull-width 80mm layoutP1
TC-PRN-017URD-PRN-007Width mismatch80mm template to 58mmReformat or warn; no silent truncationP1
TC-PRN-018URD-PRN-008Auto-cutPrint on cutter printerAuto-cut command sentP2
TC-PRN-019URD-PRN-008No cutterPrint on non-cutter printerCompletes; no cut command; no crashP2
TC-PRN-020URD-PRN-009DrawerComplete cash paymentDrawer trigger sent via printer; opensP2
TC-PRN-021URD-PRN-010ConnectCall connectConnected; jobs routed hereP1
TC-PRN-022URD-PRN-010DisconnectCall disconnectDisconnected; handled gracefullyP1
TC-PRN-023URD-PRN-010Send jobSend valid receiptQueued, printed; success returnedP1
TC-PRN-024URD-PRN-010No printerSend job with none connectedError returned; surfaced; no silent failP1
TC-PRN-025URD-PRN-011WS connectAdd network printerWebSocket connects; test print succeedsP2
TC-PRN-026URD-PRN-011WS dropPrinter unreachable mid-jobError detected; user notified; reconnect offeredP2
TC-PRN-027URD-PRN-012WebUSBPrint in Web POS with USBWebUSB used; receipt printedP1
TC-PRN-028URD-PRN-012No WebUSBPrint where WebUSB unsupportedInformative message; alternatives offeredP1
TC-PRN-029URD-PRN-010Confirm & print invoiceTap "Confirm & Print Invoice" on success screenJob sent; invoice printed; draft order createdP1

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 IDURD refScenarioStepsExpectedP
TC-SCN-001URD-SCN-001USB HIDScan with USB HID scannerDetected without setup; lookup firesP1
TC-SCN-002URD-SCN-001BT HIDScan with BT HID scannerReceived as keyboard events; lookup firesP1
TC-SCN-003URD-SCN-00213-charEAN-13 + Enter within 100msFull barcode captured; search firesP1
TC-SCN-004URD-SCN-002Manual typingType 8 chars slowly, no EnterHook does not fire; treated as text inputP1
TC-SCN-005URD-SCN-002Min 10Exactly 10 chars + EnterAccepted; search firesP1
TC-SCN-006URD-SCN-002Max 20Exactly 20 chars + EnterAccepted; search firesP1
TC-SCN-007URD-SCN-002Below min9 charsNo search; below thresholdP1
TC-SCN-008URD-SCN-002Above max21 charsNo search; documented behaviorP1
TC-SCN-009URD-SCN-003Enter trigger13 chars + EnterSearch fires immediately on EnterP1
TC-SCN-010URD-SCN-003Timeout trigger13 chars, no Enter, pause 100msTimeout completes scan; search firesP1
TC-SCN-011URD-SCN-004Camera openOpen QR scanner with permissionViewfinder shown; scanning startsP1
TC-SCN-012URD-SCN-004Permission deniedOpen QR scanner, permission offError; guided to grant permissionP1
TC-SCN-013URD-SCN-004Decode QRPresent a QR codeCaptured; callback fires; scanner closesP1
TC-SCN-014URD-SCN-004Torch toggleTap torch in darkTorch on; viewfinder lit; tap again offP1
TC-SCN-015URD-SCN-005Add to cartScan known barcode on POSProduct looked up; addable in one tapP1
TC-SCN-016URD-SCN-005Not foundScan unknown barcode"Product not found"; cart unchangedP1
TC-SCN-017URD-SCN-0061D formatsScan EAN-13 + Code 128Both decoded; correct productsP2
TC-SCN-018URD-SCN-0062D formatsScan QR + Data MatrixBoth decoded; correct dataP2
TC-SCN-019URD-SCN-007Product contextScan on product searchResult populated; product returnedP2
TC-SCN-020URD-SCN-007Invoice contextScan invoice QR on lookupResult populated; invoice returnedP2

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 IDURD refScenarioStepsExpectedP
TC-SBX-001URD-SBX-001PairPair SoundBox in pairing modePairs; shows connected; LED solid blueP1
TC-SBX-002URD-SBX-001Already pairedPair one bound to another deviceFails or prompts to clear; no silent failP1
TC-SBX-003URD-SBX-001Powered offPair a powered-off SoundBoxNot found; instructed to power on; no crashP1
TC-SBX-004URD-SBX-002VI announceCash payment, VI localeAnnounces amount + method in VietnameseP1
TC-SBX-005URD-SBX-002EN announceCard payment, EN localeAnnounces amount + method in EnglishP1
TC-SBX-006URD-SBX-002No SoundBoxPayment with none connectedPayment completes; no announcement; no errorP1
TC-SBX-007URD-SBX-003VI configVI-configured SoundBoxAnnouncements in Vietnamese; correct numeralsP1
TC-SBX-008URD-SBX-003EN configEN-configured SoundBoxAnnouncements in EnglishP1
TC-SBX-009URD-SBX-003Switch langSwitch VI→EN mid-sessionNext announcement in English; no reconnectP1
TC-SBX-010URD-SBX-004Pairing LEDNot yet pairedBlue blinkingP2
TC-SBX-011URD-SBX-004Connected LEDPairedBlue solidP2
TC-SBX-012URD-SBX-004Success LEDSuccessful announcementGreen flashP2
TC-SBX-013URD-SBX-004Error LEDError/failure eventRed flashP2
TC-SBX-014URD-SBX-005Min volumeSet volume 1Plays at minimum; audibleP2
TC-SBX-015URD-SBX-005Max volumeSet volume 10Plays at maximum; clearP2
TC-SBX-016URD-SBX-005Out of rangeSet 0 or 11Rejected/clamped to 1–10P2
TC-SBX-017URD-SBX-005Toggle amountDisable amount announcementAnnouncement omits amount; rest unaffectedP2
TC-SBX-018URD-SBX-006At range10 m from deviceAnnouncement received without dropoutP2
TC-SBX-019URD-SBX-006Beyond range11 m from deviceConnection may drop; handled gracefullyP2

2.8 SoftPOS / NFC (NFC)

TC IDURD refScenarioStepsExpectedP
TC-NFC-001URD-NFC-001NFC presentOpen SoftPOS settings, NFC onNFC confirmed; activation enabledP1
TC-NFC-002URD-NFC-001No NFCOpen SoftPOS settings, no NFCDetected unavailable; activation disabled/hidden; messageP1
TC-NFC-003URD-NFC-003NFC offActivate with NFC turned offDirected to enable NFC; activation haltsP1
TC-NFC-004URD-NFC-002KYC doneActivate with KYC completeSoftPOS activated; payment can startP1
TC-NFC-005URD-NFC-002KYC missingActivate without KYCBlocked; KYC-required messageP1
TC-NFC-006URD-NFC-004iOS hiddenOpen SoftPOS on iOSOption unavailable; Android-only messageP2
TC-NFC-007URD-NFC-004Android flowStart contactless paymentNFC/payment plugins invoked; waits for tapP2

2.9 Health Monitoring (MON)

TC IDURD refScenarioStepsExpectedP
TC-MON-001URD-MON-001HeartbeatActive device over timeHeartbeat every 5 min; recorded; stays onlineP1
TC-MON-002URD-MON-0015-min mark5 min since last heartbeatHeartbeat sent; timestamp updated; timer resetP1
TC-MON-003URD-MON-001Lost networkHeartbeats cannot sendFailures logged; resumes on reconnectP1
TC-MON-004URD-MON-002Offline15 min without heartbeatStatus → offline; dashboard reflects itP1
TC-MON-005URD-MON-00214-min14 min without heartbeatStill online; threshold not crossedP1
TC-MON-006URD-MON-002Back onlineHeartbeat after offlineStatus → online immediatelyP1
TC-MON-007URD-MON-003Status listOpen device list (mixed status)Each device shows online/offlineP1
TC-MON-008URD-MON-003FilterFilter online-onlyOnly online devices shownP1
TC-MON-009URD-MON-004Remote deactivateRemotely deactivate active deviceStatus DEACTIVATED; session terminated; loggedP1
TC-MON-010URD-MON-004Already offDeactivate a DEACTIVATED deviceHandled gracefully; stays DEACTIVATEDP1
TC-MON-011URD-MON-005Remote wipeTrigger wipe on online deviceCached data deleted; device deactivated; loggedP2
TC-MON-012URD-MON-005Queued wipeTrigger wipe on offline deviceQueued; executes on reconnectP2

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 IDURD refScenarioStepsExpectedP
TC-CON-017URD-POS-002Terminal listOpen Terminal list with existing recordsTerminals shown with name/code/status/type; pagination worksP1
TC-CON-018URD-MOB-006Terminal metadataInitiate checkout on a known terminalPayment body carries the real terminal name/code, not a placeholderP1

QE Findings — TC-CON-017 / TC-CON-018 currently fail

  • apps/client/.../terminal/list/TerminalTable.tsx — rendered with hardcoded rowCount={0}, data={[]}; no data provider wired, so the table is always empty.
  • apps/sale-renderer/.../apis/payment/payment.api.tsmetadata.terminal is 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 areaRequirementsTest casesStatus
DEV (URD-DEV-001…019)19TC-DEV-001…038✅ Covered
MOB (URD-MOB-001…006)6TC-MOB-001…015✅ Covered
WEB (URD-WEB-001…005)5TC-WEB-001…013✅ Covered
POS (URD-POS-001…005)5TC-POS-001…014, TC-CON-017✅ Covered
PRN (URD-PRN-001…012)12TC-PRN-001…029✅ Covered*
SCN (URD-SCN-001…007)7TC-SCN-001…020✅ Covered*
SBX (URD-SBX-001…006)6TC-SBX-001…019✅ Covered
NFC (URD-NFC-001…004)4TC-NFC-001…007✅ Covered
MON (URD-MON-001…005)5TC-MON-001…012✅ Covered

*PRN and SCN coverage 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.

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.