Skip to main content

Phase 1 — Mobile Device Test Plan

Task: E4 — Real-device mobile testing plan Scope: All 4 KeyNova mobile apps (Housekeeping, Manager, F&B, Guest) on physical Android devices Audience: QA team executing pre-launch validation during the week of April 7-13, 2026 (Phase 1 launch on April 14, 2026) Status: Draft — ready for QA team execution

Companion documents

  • phase1-mobile-device-matrix.md — device matrix, APK distribution, and EAS build commands
  • phase1-mobile-acceptance-checklist.md — quick-scan sign-off checklist

1. Overview​

The KeyNova mobile suite consists of four React Native / Expo apps shipped as part of the hmp-mobile-apps monorepo:

AppPackage (Android)Primary usersForm factor
KeyNova Housekeepingcom.keynova.housekeepingRoom attendants, HK supervisorsPhone / phablet
KeyNova Managercom.keynova.managerGMs, department heads, ownersPhone / tablet
KeyNova F&Bcom.keynova.fnbWaiters, captains, F&B managersPhablet / tablet
KeyNova Guestcom.keynova.guestIn-house & upcoming guests (self-service)Phone

All four apps share:

  • Expo SDK 50+ with expo-router file-based navigation
  • Auth: JWT (access token + refresh token) stored in expo-secure-store
  • API target (production build profile): http://43.204.247.178/api (QA EC2 — will be swapped to prod domain before launch)
  • KeyNova Ink & Brass theme: navy #0A1628 splash background, gold #B8962E accents

1.1 iOS — Out of scope for Phase 1​

As reported in task D5 (Mobile app KeyNova branding), iOS builds are not configured for any of the four apps — the eas.json submit section still contains placeholder Apple credentials, no app-specific-password, and no Apple Developer enrollment has been verified. All Phase 1 real-device testing is Android-only. iOS support will be revisited in Phase 2.

1.2 Test plan goals​

  1. Verify each app installs and runs on Android 11, 13, and 14 without crash-on-launch
  2. Exercise every primary user journey (login, core task flow, logout) on a real device with a real network
  3. Validate the KeyNova branding lands correctly in production builds (splash, launcher name, header color)
  4. Confirm offline / WiFi-handoff behaviour for HK (only app with explicit offline-sync support)
  5. Identify what is acceptable for Phase 1 launch vs. what is a hard blocker
  6. Produce a dated sign-off report per device per app

1.3 Test plan non-goals​

  • Automated E2E (no Detox run on CI — tracked separately as E2-F2)
  • iOS-specific flows
  • Performance / load testing (smoke-level manual observation only)
  • Localized language testing beyond English (Hindi/Tamil will be sampled only if visible strings are present)

2. Test environment​

2.1 Backend target​

EnvironmentURLUse for
QA (current)http://43.204.247.178/apiDevice testing from Apr 7-10
Prod (from Apr 11)https://api.keynova.in/apiFinal go/no-go validation

Note: eas.json currently points production builds at http://43.204.247.178/api. When the prod domain is cut over (per F1 task), eas.json in each of the four apps must be updated and a new APK produced. Retest the 4 smoke scenarios below on the re-built APK.

2.2 Test credentials (from seed — E1)​

RoleEmailPassword
Adminadmin@hmphotel.com<REDACTED>
Managermanager@hmphotel.com<REDACTED>
Front deskfrontdesk@hmphotel.com<REDACTED>
Housekeepinghk@hmphotel.com<REDACTED>

Fixed IDs for reference during assertions:

  • Tenant: 00000000-0000-4000-a000-000000000001
  • Property: 40b29005-5196-4ba7-a71d-94323caee4dc (Grand Vishram Hotel)

Additional 5 test properties seeded per E1 — see phase1-e2e-report.md for property list. The manager multi-property test must be executed against a user mapped to 3+ of those properties.

2.3 Guest app test data​

Guest app login uses confirmation number + last name. Seed reservations from E1 that are currently in CHECKED_IN or CONFIRMED_UPCOMING state must be used. Pick 2 of each:

  • 2 in-house (for "My Stay" home screen with in-house quick actions)
  • 2 upcoming (for Pre Check-In flow)

2.4 Network conditions to exercise​

ConditionPurpose
Hotel WiFi (typical 2.4 GHz, 5–15 Mbps)Baseline
Cellular 4G LTEField backup
WiFi drop → cell handoff mid-actionResilience
Airplane mode mid-taskOffline sync (HK only)
Slow 3G (throttled via developer options)Low-bandwidth demo properties

3. Device matrix — summary​

Full device procurement, specs, and rationale in phase1-mobile-device-matrix.md. At-a-glance:

SlotDeviceScreenAndroidCovers
1Samsung Galaxy A235.8"13Budget phone (dominant at demo properties)
2Google Pixel 66.4"14Mainstream modern phone
3Samsung Galaxy S23 Ultra6.8"14Phablet (manager day-to-day)
4Samsung Galaxy Tab A810.5"11Tablet (F&B captain / manager tablet), older Android

All four devices are REQUIRED for sign-off. Any app that crashes or fails login on any device is a blocker.


4. Per-app test checklists​

Each checklist below is executed once per device (4 devices × 4 apps = 16 passes). Record results in phase1-mobile-acceptance-checklist.md.

4.1 KeyNova Housekeeping​

Path: hmp-mobile-apps/apps/housekeeping/

#StepExpectedPass criteria
HK-01Launch app cold (killed)Splash screen shows navy #0A1628 background; no Expo default art; launcher icon is KeyNova placeholderBranded splash visible; no flash of default Expo logo
HK-02Login with hk@hmphotel.comToken stored in SecureStore; redirect to (tabs)/my-tasksSuccessful login within 3s
HK-03Property selection (multi-property staff only)Picker shows properties the user is authorized forCorrect list; selection persists after relaunch
HK-04Tab navigation: my-tasks → tasks → rooms → maintenance → profileAll 5 tabs mount without errorNo blank screens, no JS red box
HK-05Pull-to-refresh on My TasksNetwork fetch, skeleton shown, fresh dataNew task count matches dashboard
HK-06Swipe-right on a task cardSwipeableTaskCard fires "accept"Task moves from pending to in-progress; dashboard reflects it within 5s
HK-07Swipe-left on a task cardSwipeableTaskCard fires "defer"Task marked deferred; dashboard reflects it
HK-08Open task detail, start Cleaning TimerCleaningTimer begins counting from 00:00Color is green for 0–20m
HK-09Send app to background for 10s, returnTimer auto-pauses on background, resumes on foregroundElapsed time does NOT include background seconds
HK-10Let timer run past 20m / 30m (can fast-forward via device clock)Color transitions green → orange → redVisible color change at 20m and 30m boundaries
HK-11Complete task with a photoCamera permission prompt → photo capture → uploadTask marked complete; photo visible in task history on dashboard
HK-12Offline mode: enable airplane mode, create a task status update (e.g. "Clean")Action queued via useOfflineSync; UI shows "Pending sync" stateNo error dialog; pending count increments
HK-13Disable airplane mode (still on same screen)Pending mutation auto-replays via POST /sync; queue drainsDashboard reflects the status within 10s
HK-14Real-time from dashboard: have a second person assign a new task from the web dashboarduseRealtimeTasks hook receives WebSocket event on /housekeeping namespace; task appears without manual refreshTask visible within 5s; no pull-to-refresh needed
HK-15Push notification: assign task while app is backgroundedExpo push notification appears; tap opens the task detail screenDeep link routes to the correct /task/[id]
HK-16Profile → LogoutSecureStore cleared; redirect to loginCannot access (tabs)/* without re-login

Known limitations for Phase 1:

  • Badge count on launcher icon may not update (Expo notifications limitation on some OEM ROMs)
  • Photo upload requires WiFi or 4G+; on 3G it may time out (acceptable)

4.2 KeyNova Manager​

Path: hmp-mobile-apps/apps/manager/

#StepExpectedPass criteria
MG-01Cold launchNavy splash, KeyNova placeholder icon in launcherNo Expo default flash
MG-02Login with manager@hmphotel.comRedirect to (tabs)/dashboardWithin 3s
MG-03Dashboard KPIs visibleOccupancy %, ADR (₹), RevPAR (₹), Today's RevenueAll 4 values render, non-zero for seeded property
MG-04KPI trend arrowsUp/down indicators with delta vs. yesterdayColors match direction (green up, red down)
MG-05Property selector (for chain users)List of properties staff is authorized forSwitching updates all KPIs
MG-06Operations tab → arrivals listShows today's arrivals from seedCount matches dashboard web view
MG-07Operations tab → departures listShows today's departuresMatches web
MG-08Operations tab → in-houseShows currently checked-in guestsMatches web
MG-09Approvals tabList of pending discount/void approvalsTap approval shows ApprovalCard with Approve/Reject buttons
MG-10Approve a pending itemConfirmation dialog → approve → item removed from listDashboard web shows approved state
MG-11Reject a pending item with reasonText input for reason → rejectItem removed; reason persisted
MG-12Reports tabList of available reports (occupancy, revenue, etc.)Tap opens report viewer
MG-13Alert card tapOpens context for the alertCorrect routing (e.g. low occupancy → dashboard)
MG-14Profile → LogoutBack to loginCannot re-enter without auth

Known limitations:

  • Chart rendering may be slow on Android 11 tablets (Victory Native performance) — acceptable if <3s
  • No offline mode — all reads require network (documented)

4.3 KeyNova F&B​

Path: hmp-mobile-apps/apps/fnb/

#StepExpectedPass criteria
FB-01Cold launchNavy splash, KeyNova placeholder iconNo default art
FB-02Login with admin@hmphotel.com (or seeded F&B user)Redirect to (tabs)/tablesWithin 3s
FB-03Outlet selectionPicker with 4 seeded POS outletsSelection persists
FB-04Tables floor plan (Konva canvas)Tables rendered at posX/posY with status colorsAll 29 seeded tables visible; pan/zoom works smoothly
FB-05Tap a vacant tableOpens order entryMenu categories load
FB-06Add menu item to orderHaptic feedback; item appears in order summaryItem count increments
FB-07Add item with modifiersModifierSheet bottom sheet opensModifiers selectable; required modifiers enforced
FB-08Increase quantity on item already in orderQuantity increments, not duplicatedSingle line item with qty=N
FB-09Special instructions fieldFree text input saves with orderInstructions visible in KOT preview
FB-10Send to KDS (Send KOT)Order posted; KOT printed to kitchen display; success toastKDS display shows the new KOT within 5s
FB-11Real-time KOT status updatesuseRealtimeKitchen hook receives kotAcknowledged + orderItemReady from /kitchen namespaceStatus badge updates in real-time without refresh
FB-12Kitchen marks item ready → waiter receives push notificationForeground: in-app toast; Background: system notificationNotification within 5s of kitchen action
FB-13Close table: generate billBill preview with items, modifiers, tax breakdownTotals match seeded tax config
FB-14Print bill (to seeded test printer or mock)POST /pos/orders/:id/bill with printMock=true in envSuccess toast; bill logged in folio
FB-15Orders tabList of today's orders for the outletCount matches web dashboard
FB-16Kitchen tab (if staff role = kitchen)KDS-like view of active KOTsKOTs grouped by station
FB-17Profile → LogoutBack to loginSecureStore cleared

Known limitations:

  • Konva canvas panning may feel sluggish on Android 11 (acceptable)
  • Split-bill UI exists but is flagged experimental — do not test in Phase 1
  • Payment collection UI is deferred to Phase 2 (Razorpay SDK integration pending)

4.4 KeyNova Guest​

Path: hmp-mobile-apps/apps/guest/

Scope verified from app/_layout.tsx and app/index.tsx: this is a guest-facing self-service app, not a kiosk. It has the following screens:

  • login.tsx — booking lookup (confirmation number + last name)
  • index.tsx — "My Stay" home with welcome card, property name, booking number, status badge
  • room-service.tsx — order food & beverages from in-room
  • requests.tsx — housekeeping, maintenance, and other requests
  • pre-checkin.tsx — pre-arrival check-in (hidden once status == CHECKED_IN)
#StepExpectedPass criteria
GU-01Cold launchNavy splashNo default art
GU-02Open login (Find My Booking)Form with confirmation number + last nameForm loads
GU-03Login with seeded upcoming bookingGuestAuthProvider stores sessionRedirect to index ("My Stay")
GU-04"My Stay" welcome cardShows guest name, property name, confirmation number, status badge ("Upcoming" or "In-House")All fields populated from seed
GU-05Menu items visibleRoom Service, Requests, Pre Check-In (Pre Check-In hidden if in-house)Correct filtering by session.status
GU-06Tap Pre Check-Inpre-checkin.tsx loads formForm submits successfully; status updates to "Pre Checked In" on dashboard
GU-07Login with in-house booking, tap Room Serviceroom-service.tsx loads menuMenu items from POS outlet load
GU-08Place a room service orderOrder submitted; confirmation number displayedOrder visible on dashboard
GU-09Tap Requestsrequests.tsx loads; list of existing requests (if any) + new-request buttonForm loads
GU-10Submit a housekeeping request (extra towels)Request created with status PENDINGVisible in HK app's tasks list within 10s
GU-11Sign Out buttonSession cleared; redirect to loginCannot access index.tsx without re-auth

Known limitations:

  • No push notifications for guests in Phase 1 (no device token registration for guest sessions)
  • No multi-language UI (English only in Phase 1)
  • Pre Check-In does not yet upload guest ID photos (placeholder)

5. Cross-app test scenarios​

Execute these on at least 1 phone and 1 tablet per app:

5.1 Battery consumption (soak test)​

Procedure:

  1. Fully charge device to 100%
  2. Login to app, run typical usage loop for 60 minutes (see per-app typical loop below)
  3. Record battery percentage at 60m mark
  4. Target: ≤ 15% drain for HK/Manager/Guest, ≤ 20% for F&B (Konva canvas heavier)

Typical usage loops:

  • HK: Accept task → start timer → mark 2 checklist items → upload photo → complete → repeat (6 tasks/hour)
  • Manager: Open dashboard → scroll → switch property → view arrivals → approve 1 item → repeat (10 cycles/hour)
  • F&B: Open table → add 5 items → send KOT → close → open next table → repeat (8 tables/hour)
  • Guest: Login → view stay → order room service → view requests → logout → repeat (4 cycles/hour)

5.2 WiFi ↔ cellular handoff​

Procedure:

  1. Connect to hotel WiFi, login, start an action (e.g., create an HK task update)
  2. Mid-action (just before hitting "Complete"), disable WiFi — device falls back to cellular automatically
  3. Complete the action
  4. Verify the action succeeded and no duplicate was created

Pass criteria:

  • No crash
  • Action either succeeds on cellular OR gets queued for offline sync (HK only)
  • No duplicate mutations after reconnect

5.3 Cold start vs warm start​

Start typeDefinitionExpected behavior
ColdApp killed from recents, then launchedBranded splash (navy) visible for 1-2s; login screen or resumed session
WarmApp backgrounded, foregrounded againNo splash; resume at previous screen; timer states preserved

5.4 Low-light viewing​

Test all 4 apps in:

  • Bright sunlight (outdoor)
  • Normal indoor lighting
  • Low-light (back-of-house corridor, night shift)

Pass criteria:

  • Gold #B8962E accents still legible against #0A1628 navy in all conditions
  • Dashboard KPI numbers readable at arm's length
  • No dark UI elements invisible in low-light (common with gold-on-navy when contrast drops)

5.5 Rotation (portrait / landscape)​

app.json for all 4 apps declares "orientation": "portrait". Therefore:

  • Rotating the device should NOT change the UI orientation
  • Tablet user rotating to landscape: UI remains portrait (letterboxed on tablet — acceptable for Phase 1)
  • Confirm no crash on rotation

5.6 Accessibility: TalkBack (Android screen reader)​

Procedure:

  1. Enable TalkBack (Settings → Accessibility → TalkBack)
  2. Navigate each app's primary flow using only screen reader gestures
  3. Record any unlabeled buttons, missing alt text, or focus traps

Pass criteria for Phase 1:

  • Login form fields have labels readable by TalkBack
  • Primary CTAs (Send KOT, Complete Task, Approve) have readable labels
  • No focus traps (can always navigate back)
  • Acceptable for Phase 1: some charts and the Konva canvas are not screen-reader accessible (known limitation; flagged for Phase 2 per D7 accessibility audit)

5.7 Text scaling (Android large text)​

Procedure:

  1. Settings → Display → Font size → Largest
  2. Launch each app
  3. Scan for truncation, overlap, or unreadable UI

Pass criteria:

  • No text cut off in critical CTAs
  • Form fields remain usable
  • Bottom navigation tabs don't overlap content
  • Acceptable for Phase 1: some KPI cards may wrap awkwardly at 200% text size (not a blocker)

5.8 One-handed use (thumb reach)​

For HK and Guest apps (phone form factor):

  • Primary CTAs must be reachable with thumb when holding device in one hand
  • Bottom nav is at the bottom (good) — verify it remains at bottom with on-screen keyboard hidden
  • Pull-to-refresh works one-handed

6. KeyNova branding verification​

Per task D5 (Mobile app KeyNova branding). Execute on every device × every app combination:

#ItemPass criterion
BR-01Splash screen backgroundNavy #0A1628 — no flash of white
BR-02Launcher iconKeyNova placeholder icon (navy + gold K-leaf) — NOT the default Expo blue icon
BR-03App name in launcher"KeyNova Housekeeping" / "KeyNova Manager" / "KeyNova F&B" / "KeyNova Guest" — NOT "HMP" anywhere
BR-04Login screenNavy header, gold accent on submit button
BR-05Header barNavy background, gold icon tint
BR-06Tab barNavy background, gold active tab indicator
BR-07Primary CTAsGold background on action buttons (Send KOT, Complete, Approve)
BR-08Full-text search for "HMP"Run grep -r "HMP" app/ components/ in each app — should return 0 matches in user-visible strings
BR-09Notification channel namesAndroid system shows "KeyNova" prefix — not "HMP"
BR-10Deep links (scheme)keynova-housekeeping://, keynova-manager://, keynova-fnb://, keynova-guest://

7. Known placeholder items (not blockers, but must be tracked)​

Per D5 handoff:

ItemCurrent statePhase 1 actionFollow-up owner
Logo SVGReact-Native-rendered K-leaf placeholder; no high-res PNGAccept placeholder; design team delivers final PNG pre-Phase-2Design team
Satoshi fontNOT loaded via expo-font — falls back to system font (Roboto on Android)Accept system fallback; add expo-font load in Phase 2Mobile team
Splash PNGsassets/splash.png in each app is still the old Expo placeholder art with navy tint appliedAccept for Phase 1 (navy background masks the art for 95% of the frame); replace with branded asset in Phase 2Design team
Launcher iconassets/icon.png and assets/adaptive-icon.png are placeholdersAccept; replace with final branded assets in Phase 2Design team
Notification iconManager app uses ./assets/notification-icon.png placeholderAccept; HK and F&B don't have notification icon plugin configured yetMobile team
iOS buildsNot configured (no bundle IDs verified, no provisioning)Out of Phase 1 scopeMobile team

Action: Each of these must appear in the Phase 2 backlog (ticket IDs TBD by mobile team).


8. Expected defects vs acceptable state​

8.1 BLOCKERS — must-fix before launch​

  • Crash on launch on any target device × any app
  • Login failure on any app (token not stored, or 401 on valid creds)
  • Data loss — action completed on device but not reflected in backend (except when offline queue is intentionally used)
  • KOT fails to reach KDS (F&B)
  • Offline sync drops mutations (HK) — verified by pending count not draining after reconnect
  • HMP branding still visible in any launcher name or splash screen
  • App crashes on TalkBack navigation (accessibility regression)

8.2 DEGRADED-BUT-OK — ship with it​

  • Splash screen shows placeholder Expo art (navy tint covers most of it)
  • System font (Roboto) instead of Satoshi
  • Gold color slightly off-hex on some OEM displays (Samsung cool white vs Pixel neutral)
  • Konva canvas (F&B) has minor lag when panning with 25+ tables
  • Chart renders (Manager) take 1-3s on Android 11 tablets
  • Badge count on launcher icon doesn't update (Xiaomi / Oppo ROM limitation)
  • Some KPI cards wrap awkwardly at 200% text scaling
  • Pre Check-In ID photo upload not implemented (form still submits with text fields)

8.3 ACCEPTABLE FOR PHASE 1, DOCUMENT IN RELEASE NOTES​

  • No push notifications for Guest app
  • No multi-language UI (English only)
  • F&B payment collection is view-only (actual collection happens on front desk)
  • Manager reports are read-only (no export)
  • HK maintenance requests don't have in-app photo gallery (single photo per request)

9. Test execution schedule​

Assumes 2 QA testers working in parallel. If fewer, the schedule extends accordingly.

DayActivityDevicesApps
Apr 7 (Tue)APK build + device provisioning + first smokeAll 4HK + Manager
Apr 8 (Wed)Full checklist passAll 4HK + Manager
Apr 9 (Thu)Full checklist passAll 4F&B + Guest
Apr 10 (Fri)Cross-app scenarios (battery, WiFi handoff, accessibility)All 4All 4
Apr 11 (Sat)Re-test prod URL cut-over; retest any failuresAll 4All 4
Apr 12 (Sun)Regression on any fixed defectsAll 4As needed
Apr 13 (Mon)Go/no-go sign-off review——
Apr 14PHASE 1 LAUNCH

Entry criteria (must be in place before testing begins)​

  • EAS account logged in (BLOCKED per D5 — requires user to run eas login interactively)
  • APKs built for all 4 apps (preview profile, Android only) — see device matrix doc
  • APKs published to internal distribution URL
  • 4 physical test devices provisioned with unknown-source installs enabled
  • Test credentials verified against QA backend
  • WebSocket endpoint reachable from test devices
  • Push notification sandbox configured (Expo push credentials set in each app's app.json extra field)

Exit criteria (for go/no-go decision)​

  • Zero blockers from section 8.1
  • All 16 per-device/per-app full-checklist passes completed and signed off
  • Cross-app scenarios (section 5) completed on at least 1 phone + 1 tablet
  • Branding verification (section 6) zero "HMP" findings
  • All degraded items documented in release notes
  • QA lead signs the phase1-mobile-acceptance-checklist.md

10. Test reporting​

For each test run, record:

  • Device make/model/Android version
  • App name + version + build number
  • APK profile (development/preview/production)
  • Network condition (WiFi/cellular/mixed)
  • Tester initials and date
  • Per-check pass/fail/skipped
  • Screenshot or screen recording for any failure
  • Log capture: adb logcat -s ReactNativeJS:V for 30s after the failure

Store artifacts in hmp-docs/docs/testing/phase1-mobile-artifacts/ (to be created by QA lead).


11. Escalation​

SeverityDefinitionAction
P0Blocker from section 8.1Slack #keynova-phase1-launch, assign mobile on-call
P1Major degradation (crash on specific device; feature unusable)File issue, assign to mobile team with target fix within 24h
P2Minor UX / cosmeticFile issue for Phase 2 backlog

Mobile on-call rotation for Apr 7-14: see hmp-infrastructure/oncall/phase1-rotation.md (TBD by ops).


12. References​

  • Task D5 — Mobile app KeyNova branding (branding handoff notes and known placeholder list)
  • Task E1 — Seeded 5 test properties with fixed IDs
  • Task E2 — Full E2E test pass (includes workspace install gap E2-F2)
  • hmp-mobile-apps/CLAUDE.md — mobile app architecture overview
  • hmp-docs/docs/requirements/reviews/EP-021/ — operations/mobile epic implementation report
  • hmp-docs/docs/testing/phase1-mobile-device-matrix.md — device matrix and APK distribution
  • hmp-docs/docs/testing/phase1-mobile-acceptance-checklist.md — sign-off checklist