| name | test-app |
| description | Statically test the entire BeerReal Expo/React-Native app by fanning out subagents across every screen, store, component, and lib module, adversarially verifying findings, then producing a prioritized bug report. Use when the user asks to "test everything", run a full app review/QA pass, find bugs across the app, or sanity-check before a release. There is no unit-test runner in this repo, so testing means type-check + deep per-module static review. |
Test the BeerReal app
This repo is an Expo / React Native app (expo-router, Zustand stores, Supabase backend).
There is no Jest / unit-test runner — "testing" here is a layered static QA pass:
- Mechanical checks (fast, run inline first):
npx tsc --noEmit — must be clean.
npx expo-doctor — surfaces dependency / config issues.
- Per-module deep review — fan out one subagent per module group.
- Adversarial verification — each candidate finding is re-checked by an
independent skeptic before it makes the report (kills false positives).
- Synthesis — dedup + prioritize into a single report.
App surface (keep this list current)
- Auth screens:
app/(auth)/ — index, signup, forgot-password, verify-email, _layout
- Tab screens:
app/(tabs)/ — index (feed), camera, map, memories, profile, _layout
- Modal/stack screens:
app/ — add-drink, bar-crawl, edit-profile, group-outing,
notifications, recap, settings, terms, post/[id], user/[id], _layout
- Stores (Zustand):
store/ — auth, barCrawl, drink, feed, friend, groupOuting,
moderation, notification, status
- Components:
components/ — ContributionGrid, DrinkPill, FriendAvatar, LockedFeed,
PostCard, Tooltip, WhosOutRow
- Lib:
lib/ — contentFilter, notifications, supabase, useOnboarding, useRealtime
- Backend:
supabase/migrations/*.sql — schema, RLS policies
What to look for (review checklist)
- Broken wiring: buttons /
onPress / handlers that do nothing, dead nav routes,
router.push to non-existent paths, props passed but never used.
- State bugs: stale closures, missing
await, unhandled promise rejections,
Zustand selectors that re-render everything, optimistic updates never rolled back.
- Supabase: queries against columns/tables that don't exist in migrations,
RLS that would block the query, missing
.eq filters (data leaks), unhandled error.
- Auth/session: actions assuming a session that may be null, race conditions on init.
- Async/effects:
useEffect missing deps or cleanup, subscriptions never removed,
realtime channels leaked.
- Null/empty:
.map over possibly-undefined, missing loading/empty/error states,
array access without bounds checks.
- Platform: iOS/Android-only APIs used unconditionally, permissions not requested.
- Content moderation: filter bypasses, age-gate (21+) gaps.
How to run it
Prefer the bundled workflow for the full fan-out + verify + synthesize pass:
Workflow: .claude/skills/test-app/test-app.workflow.js
It type-checks, reviews every module group in parallel, verifies each finding with an
independent skeptic, and returns a prioritized report. Read the report, then fix
confirmed bugs (highest severity first) and re-run tsc after each fix.
For a quick check without the fan-out, just run the mechanical checks and review the
specific module the user is asking about.
Reporting
Group findings by severity (Critical / High / Medium / Low), each with
file:line, what's wrong, and the concrete fix. Only include findings that survived
verification. State explicitly what was checked and what was out of scope (e.g. runtime
behavior, device-specific rendering — not exercised by static review).