# QA Test Report **Date:** 2026-06-24 13:26:21 **URL:** https://falahos.my/mobile **Layer:** all ## Summary | ✅ Pass | ❌ Fail | ⚠️ Warn | Total | Grade | |:------:|:------:|:------:|:----:|:-----:| | 137 | 18 | 10 | 165 | **D** | ## Details | Result | Message | |:------|:--------| | ✅ | Landing page (/) → 200 in 287ms | | ✅ | Prayer times (/prayer) → 200 in 135ms | | ✅ | Dhikr counter (/dhikr) → 200 in 97ms | | ✅ | Qibla finder (/qibla) → 200 in 284ms | | ✅ | Halal monitor (/halal-monitor) → 200 in 70ms | | ✅ | Nur AI (/nur) → 200 in 75ms | | ✅ | Forum (/forum) → 200 in 71ms | | ✅ | Souq (/souq) → 200 in 114ms | | ✅ | Groups (/groups) → 200 in 133ms | | ✅ | Health API endpoint (/api/health) → 200 in 70ms | | ✅ | Prayer API endpoint (/api/prayer) → 200 in 428ms | | ✅ | Landing returns 200 directly | | ✅ | Prayer API — full contract satisfied | | ✅ | Prayer API — all 5 prayer times present | | ✅ | Prayer API — date: 24 Jun 2026 | | ✅ | Prayer API — hijri: 9 Muḥarram 1448 | | ⚠️ | Prayer API — no error for empty params, returned default data | | ✅ | Health API — status=ok | | ✅ | Ummah ID Health — available (expected for SSO route) | | ✅ | Landing (/) — clean (no error patterns) | | ✅ | Landing (/) — contains "Falah" | | ❌ | Landing (/) — MISSING expected text: "Assalamualaikum" | | ❌ | Landing (/) — MISSING expected text: "Daily Verse" | | ❌ | Landing (/) — MISSING expected text: "Quick Actions" | | ✅ | Prayer (/prayer) — clean (no error patterns) | | ✅ | Prayer (/prayer) — contains "Prayer Times" | | ❌ | Prayer (/prayer) — MISSING expected text: "Fajr" | | ❌ | Prayer (/prayer) — MISSING expected text: "Dhuhr" | | ❌ | Prayer (/prayer) — MISSING expected text: "Asr" | | ❌ | Prayer (/prayer) — MISSING expected text: "Maghrib" | | ❌ | Prayer (/prayer) — MISSING expected text: "Isha" | | ✅ | Dhikr (/dhikr) — clean (no error patterns) | | ✅ | Dhikr (/dhikr) — contains "Dhikr" | | ✅ | Dhikr (/dhikr) — contains "Digital Tasbih" | | ✅ | Dhikr (/dhikr) — contains "SubhanAllah" | | ✅ | Dhikr (/dhikr) — contains "Alhamdulillah" | | ✅ | Dhikr (/dhikr) — contains "Allahu Akbar" | | ✅ | Qibla (/qibla) — clean (no error patterns) | | ✅ | Qibla (/qibla) — contains "Qibla Finder" | | ✅ | Qibla (/qibla) — contains "Kaaba" | | ❌ | Qibla (/qibla) — MISSING expected text: "bearing" | | ✅ | Halal Monitor (/halal-monitor) — clean (no error patterns) | | ❌ | Halal Monitor (/halal-monitor) — MISSING expected text: "Halal Monitor" | | ❌ | Halal Monitor (/halal-monitor) — MISSING expected text: "Restaurants" | | ✅ | Nur (/nur) — clean (no error patterns) | | ❌ | Nur (/nur) — MISSING expected text: "Nur" | | ✅ | Forum (/forum) — clean (no error patterns) | | ❌ | Forum (/forum) — MISSING expected text: "Forum" | | ✅ | Souq (/souq) — clean (no error patterns) | | ❌ | Souq (/souq) — MISSING expected text: "Souq" | | ✅ | Groups (/groups) — clean (no error patterns) | | ❌ | Groups (/groups) — MISSING expected text: "Groups" | | ✅ | Pattern "Invalid response" — absent from all pages | | ✅ | Pattern "Internal Server Error" — absent from all pages | | ✅ | Pattern "Application error" — absent from all pages | | ✅ | Pattern "Cannot read properties of" — absent from all pages | | ✅ | Pattern "undefined is not" — absent from all pages | | ✅ | Pattern "TypeError" — absent from all pages | | ✅ | Pattern "Failed to fetch" — absent from all pages | | ✅ | Pattern "not found" — absent from all pages | | ✅ | Pattern "500 Internal" — absent from all pages | | ✅ | Pattern "JSON Parse error" — absent from all pages | | ✅ | Pattern "Unexpected token" — absent from all pages | | ✅ | Pattern "Cannot find module" — absent from all pages | | ✅ | Pattern "Minified React error" — absent from all pages | | ✅ | /prayer — 2 loading indicators (acceptable) | | ✅ | /dhikr — 2 loading indicators (acceptable) | | ✅ | /qibla — 3 loading indicators (acceptable) | | ✅ | Unauthenticated / — shows content | | ✅ | Unauthenticated /prayer — shows content | | ✅ | Unauthenticated /qibla — shows content | | ✅ | Login — obtained token (eyJhbGciOiJIUzI1...0ES0) | | ❌ | Authenticated / — missing: ['Assalamualaikum'] | | ❌ | Authenticated /prayer — missing: ['Fajr'] | | ✅ | Authenticated /dhikr — all expected content present | | ✅ | Authenticated /qibla — all expected content present | | ⚠️ | Dhikr session — HTTP 404 | | ✅ | Dhikr stats — received data: {'dayStats': {'userId': 'cmqgdj5ta00009aare9z8x4df', 'date': '2026-06-24', 'subhanallah': 0, 'alhamd | | ❌ | Qibla API — unexpected: None | | ✅ | /prayer — accessible and clean | | ✅ | /dhikr — accessible and clean | | ✅ | /qibla — accessible and clean | | ✅ | Full journey (Prayer → Dhikr → Qibla) — ALL pages clean | | ✅ | Prayer times for Mecca — loaded | | ✅ | Prayer times for Jakarta — loaded | | ✅ | Prayer times for London — loaded | | ✅ | api/prayer with bad token → 200 (graceful) | | ✅ | api/dhikr/stats with bad token → 401 (graceful) | | ⚠️ | api/prayer — 200 with missing params (may silently default) | | ⚠️ | api/qibla → 404 (unexpected) | | ✅ | Prayer API — handles 'space in name': New York | | ✅ | Prayer API — handles 'accented chars': São Paulo | | ✅ | Prayer API — handles 'umlaut': Köln | | ✅ | Prayer API — handles 'normal ref': Kuala Lumpur | | ⚠️ | Burst test — 19/20 returned 200, 1 failed (avg 217ms) | | ✅ | /this-does-not-exist → 404 (correct) | | ✅ | /api/nonexistent → 404 (correct) | | ✅ | /mobile/undefined-route → 404 (correct) | | ✅ | / — 200ms | | ✅ | /prayer — 171ms | | ✅ | /dhikr — 143ms | | ✅ | /api/prayer?city=Kuala+Lumpur&country=MY — 106ms | | ✅ | / — viewport meta present | | ✅ | /prayer — viewport meta present | | ✅ | /dhikr — viewport meta present | | ✅ | /qibla — viewport meta present | | ✅ | /halal-monitor — viewport meta present | | ✅ | /nur — viewport meta present | | ✅ | /forum — viewport meta present | | ✅ | /souq — viewport meta present | | ✅ | /groups — viewport meta present | | ✅ | / — ≥44px touch targets detected | | ✅ | /prayer — ≥44px touch targets detected | | ✅ | /dhikr — ≥44px touch targets detected | | ✅ | /qibla — ≥44px touch targets detected | | ✅ | /halal-monitor — ≥44px touch targets detected | | ✅ | /nur — ≥44px touch targets detected | | ✅ | /forum — ≥44px touch targets detected | | ✅ | /souq — ≥44px touch targets detected | | ✅ | /groups — ≥44px touch targets detected | | ✅ | / — no sub-12px text | | ✅ | /prayer — no sub-12px text | | ⚠️ | /dhikr — sub-12px text found: ['10px'] | | ✅ | /qibla — no sub-12px text | | ✅ | /halal-monitor — no sub-12px text | | ✅ | /nur — no sub-12px text | | ✅ | /forum — no sub-12px text | | ✅ | /souq — no sub-12px text | | ✅ | /groups — no sub-12px text | | ⚠️ | / — bottom nav incomplete (2/6) | | ⚠️ | /prayer — bottom nav incomplete (3/6) | | ⚠️ | /dhikr — bottom nav incomplete (2/6) | | ⚠️ | /qibla — bottom nav incomplete (2/6) | | ✅ | /prayer — 4 tap targets found | | ✅ | /dhikr — 11 tap targets found | | ✅ | Landing (/) — cold=197ms warm=281ms, 13KB | | ✅ | Prayer (/prayer) — cold=328ms warm=101ms, 16KB | | ✅ | Dhikr (/dhikr) — cold=66ms warm=113ms, 19KB | | ✅ | Qibla (/qibla) — cold=105ms warm=107ms, 16KB | | ✅ | Halal Monitor (/halal-monitor) — cold=109ms warm=87ms, 14KB | | ✅ | Prayer API (cached) (/api/prayer?city=Kuala+Lumpur&country=MY) — cold=133ms warm=78ms, 0KB | | ✅ | Prayer API — 96ms | | ✅ | Health API — 93ms | | ✅ | Content-Type: text/html; charset=utf-8 | | ✅ | X-Content-Type-Options: nosniff | | ✅ | / — no JWT token leak | | ✅ | / — no GitHub PAT leak | | ✅ | / — no OpenAI key leak | | ✅ | / — no Private key leak | | ✅ | / — no FLH secret pattern leak | | ✅ | /prayer — no JWT token leak | | ✅ | /prayer — no GitHub PAT leak | | ✅ | /prayer — no OpenAI key leak | | ✅ | /prayer — no Private key leak | | ✅ | /prayer — no FLH secret pattern leak | | ✅ | /dhikr — no JWT token leak | | ✅ | /dhikr — no GitHub PAT leak | | ✅ | /dhikr — no OpenAI key leak | | ✅ | /dhikr — no Private key leak | | ✅ | /dhikr — no FLH secret pattern leak | | ✅ | /qibla — no JWT token leak | | ✅ | /qibla — no GitHub PAT leak | | ✅ | /qibla — no OpenAI key leak | | ✅ | /qibla — no Private key leak | | ✅ | /qibla — no FLH secret pattern leak | ## Re-run ```bash python3 tests/qa-test-suite.py ```