FranFunnel · FF Tester

Run

Env change ↗
Credentials change ↗
Lead change ↗
quick:

Latest results

No run yet — hit “Run now”.
Surfaces
What we check
The product’s key user journeys and whether each has an automated test yet. covered today · planned (not built yet).

Tests

Add or remove tags per test. Edits rewrite the spec source (commit them); they take effect next run.
Quick:
Test Health Projects Tags
Loading…

New test

Scaffolds a fixme-stubbed test(…) at the end of the chosen spec file (so it never reddens CI) — fill in the body in your editor, then commit.

Tags

Create, rename, or delete tags. Rename/delete apply across every test that uses the tag.
Tag Tests Actions
Loading…

Environments

Named sets of target URLs. The active environment's URLs are used for runs. Secrets (keys/passwords) stay in .env.

Add environment

Credential profiles

Bundles of identities/secrets a run uses. Pick one on the Run tab; the active profile overrides .env. Stored locally in config/credentials.json (gitignored) — never committed.

Add profile

Lead templates

Rules for the lead a scenario creates. Pick one on the Run tab; on each scenario run it generates the next lead (random or +1 increment) and injects it. Stored locally (gitignored).

Add template

Loading results…
Talk to:
🛡 SANDBOX — enrolls a test_ lead; all real sends are suppressed. FranFunnel is never touched.

Talk to Autopilot

Enrolls a test_ lead (testMode) into Autopilot. All real sends are suppressed and replies are pushed back here — FranFunnel is never touched.

Autopilot: —
Agent (from credentials)

Enrolls a fresh test_ lead with the payload below (context + initial message), like FranFunnel's sign-up. Replies pushed to .

Conversation

Pick an agent and start a test conversation.

Payload — the lead sign-up sent to Autopilot's enroll-lead webhook

Default lead fields plus any custom variables. This is what FranFunnel would send on sign-up.

Custom fields variable name → value (added to the payload as-is)
Running preflight…

Pre-release smoke & E2E suite for the FranFunnel platform — one repo, one report, one gate across surfaces.

Test coverage map

Every test, grouped by file. Click a file to expand its tests.

Loading…

Common commands

npm run test:fastUnit + contract — deterministic, no creds, no network (~1s). Run before every commit.
npm run typechecktsc --noEmit across the whole repo.
npm run test:smokeThe full pre-release gate (--grep @smoke).
npm run test:safeEverything except @mutates.
npm run doctorPreflight: what's configured, what runs vs skips, Twilio + surface reachability.
npm run statsFlaky tests + slowest + run trend from history.
npm run sms -- read|watch|sendRead/send SMS on the Twilio test number.
npm run dashboardThis dashboard → http://127.0.0.1:4321.

Test projects

unit
Pure logic — SMS classifiers, CLI parser, waitFor, Twilio scoping. Deterministic.
Needs: nothing
contract
FranFunnel adapter vs a local HTTP fixture — request shapes + error contract.
Needs: nothing
smoke
Cross-surface reachability + web render (health).
Needs: network
api
FranFunnel API contract (safe; the mutating lead-create is opt-in).
Needs: network
api-autopilot
Autopilot API gateway — reachability, auth gates, webhook-secret gate, input validation. Read-only.
Needs: AUTOPILOT_WEB_URL
scenarios
Autopilot booking conversations (timezones, closed slots, reschedules, races) over the app's own webhooks with test_ leads — plus one real-wire autoresponder smoke @mutates.
Needs: AUTOPILOT webhook-secret + test-agent (direct); FF_API_KEY + Twilio (autoresponder)

Run npm run doctor or open Health to see which will run vs skip with your current config.

Tags

Every test carries tags; filter with the Tag dropdown or --grep.

@p0@p1@p2priority (one per test)
@smokefast pre-release / nightly gate
@mutateswrites state — leads, bookings, calendar (excluded from a safe run)
@outreachsends a real SMS/email — implies @mutates, opt-in only
@scenariocross-system saga
@authneeds a session
@securityasserts an auth/authz boundary
Layer is a project, not a tag — --project unit · contract · api · scenarios.
Scenarios & safety
  • Lead creation hits PROD (app.franfunnel.com) — staging's lead endpoints are unreliable, and prod/staging share a backend, so the staging autopilot still handles it.
  • Twilio is scoped strictly to TWILIO_NUMBER (the simulated lead) and filtered by timestamp — the suite never touches other traffic on the shared account.
  • Self-cleaning: each scenario cancels its booking over SMS, stops the autopilot drip, and archives the lead — even on failure.
  • Autopilot (direct test mode): ff-tester drives the autopilot over its own webhook/test endpoints (no Supabase, no FranFunnel). It targets the agent set in AUTOPILOT_TEST_OWNER_KEY (which must have allowTestLeads=true), unlocked by AUTOPILOT_WEBHOOK_SECRET.
Shortcuts & tips
  • /Ctrl + Enter on the Run tab launches a run.
  • Quick-run chips and your project/tag/exclude-@mutates selection are remembered across reloads.
  • The header dot (● top-right) shows surface health; click it for the Health tab.
  • Hover most controls for a tooltip explaining what they do.

Users

Super-admin

Full access. Manages all users and roles.

Admin

Can add/remove regular users.

User

Dashboard access only.

Email Role

Appearance

Theme System follows your OS setting

Your account

Test runsSaved

Default test timeout Per-test timeout for dashboard-launched runs (seconds)
History retention How many runs to show in Results (DB keeps all)
Run-complete notification Browser notification + sound when a run finishes