Files
falah-mobile/qa-report-20260619_001148.md
T
wmj a1c5fecd83 pivot: migrate V1 mobile from Docker to Netlify serverless
- Switch Prisma schema from SQLite to PostgreSQL
- Add netlify.toml for Netlify deployment config
- Add @netlify/plugin-nextjs for serverless Next.js
- Remove Docker build files (Dockerfile, docker-compose, start.sh)
- Remove auto-healer and scripts directories
- Update next.config.ts (remove standalone output)
- Database: falah_mobile_v1 on Contabo Postgres
2026-06-28 23:02:48 +02:00

183 lines
8.6 KiB
Markdown

# QA Test Report
**Date:** 2026-06-19 00:11:48
**URL:** https://falahos.my/mobile
**Layer:** all
## Summary
| ✅ Pass | ❌ Fail | ⚠️ Warn | Total | Grade |
|:------:|:------:|:------:|:----:|:-----:|
| 143 | 15 | 7 | 165 | **D** |
## Details
| Result | Message |
|:------|:--------|
| ✅ | Landing page (/) → 200 in 211ms |
| ✅ | Prayer times (/prayer) → 200 in 108ms |
| ✅ | Dhikr counter (/dhikr) → 200 in 135ms |
| ✅ | Qibla finder (/qibla) → 200 in 115ms |
| ✅ | Halal monitor (/halal-monitor) → 200 in 114ms |
| ✅ | Nur AI (/nur) → 200 in 70ms |
| ✅ | Forum (/forum) → 200 in 81ms |
| ✅ | Souq (/souq) → 200 in 76ms |
| ✅ | Groups (/groups) → 200 in 92ms |
| ✅ | Health API endpoint (/api/health) → 200 in 63ms |
| ✅ | Prayer API endpoint (/api/prayer) → 200 in 422ms |
| ✅ | Landing returns 200 directly |
| ✅ | Prayer API — full contract satisfied |
| ✅ | Prayer API — all 5 prayer times present |
| ✅ | Prayer API — date: 19 Jun 2026 |
| ✅ | Prayer API — hijri: 4 Muḥarram 1448 |
| ⚠️ | Prayer API — no error for empty params, returned default data |
| ✅ | Health API — status=ok |
| ⚠️ | Ummah ID Health → 404 |
| ✅ | 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) — contains "Nur" |
| ✅ | Forum (/forum) — clean (no error patterns) |
| ✅ | Forum (/forum) — contains "Forum" |
| ✅ | Souq (/souq) — clean (no error patterns) |
| ✅ | Souq (/souq) — contains "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...-LPQ) |
| ❌ | 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-18', '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 — 20/20 returned 200 (avg 168ms, total 0.3s) |
| ✅ | /this-does-not-exist → 404 (correct) |
| ✅ | /api/nonexistent → 404 (correct) |
| ✅ | /mobile/undefined-route → 404 (correct) |
| ✅ | / — 137ms |
| ✅ | /prayer — 75ms |
| ✅ | /dhikr — 61ms |
| ✅ | /api/prayer?city=Kuala+Lumpur&country=MY — 50ms |
| ✅ | / — 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 with 6/6 links |
| ✅ | /prayer — bottom nav with 6/6 links |
| ✅ | /dhikr — bottom nav with 6/6 links |
| ✅ | /qibla — bottom nav with 6/6 links |
| ✅ | /prayer — 2 tap targets found |
| ✅ | /dhikr — 9 tap targets found |
| ✅ | Landing (/) — cold=151ms warm=126ms, 13KB |
| ✅ | Prayer (/prayer) — cold=52ms warm=52ms, 15KB |
| ✅ | Dhikr (/dhikr) — cold=73ms warm=74ms, 18KB |
| ✅ | Qibla (/qibla) — cold=170ms warm=65ms, 16KB |
| ✅ | Halal Monitor (/halal-monitor) — cold=52ms warm=59ms, 14KB |
| ✅ | Prayer API (cached) (/api/prayer?city=Kuala+Lumpur&country=MY) — cold=77ms warm=58ms, 0KB |
| ✅ | Prayer API — 55ms |
| ✅ | Health API — 72ms |
| ✅ | Content-Type: text/html; charset=utf-8 |
| ⚠️ | X-Content-Type-Options: MISSING |
| ✅ | / — 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 --ci-exit
```