dánwòdánwò

Get started

What you can test

From a log-in to a payment charged exactly once, which of danwo's layers each kind of test needs.

danwo tests the journeys every app has, and the checks behind the screen that most test suites can't reach. This page lists both, with the layer each one needs and where to read more.

The layers

Each layer is optional and adds to the ones before it. The Introduction shows each in a few lines.

LayerWhat it addsNeeds
1. LocatorsSteps that name an element: a button, a field, a headingnothing
2. Agent stepsSteps in plain English, recorded once, replayed with no modela model, for the first run
3. Visual comparisonThe page or an element compared with a baseline imagenothing
4. Emulated servicesStripe, Clerk, Resend and more, answered locallya service in your config
5. InvariantsA rule that reads your database and the providerlayer 4, usually
6. Fault matrixThe test replayed once per thing that could go wrongan invariant to judge it by

Layers 1 to 3 are a complete end-to-end setup on their own.

Journeys on the screen

These need layers 1 to 3 only. No providers, no keys.

You want to testLayerSee
Sign up and log in with a password1Agent and locators
Start every test already signed in1Saved sessions
Navigate: menus, links, pages opened by address1Web
Search and filter a list1 or 2Agent and locators
A form: required fields, errors, a success note1Agent and locators
The checkout screens: basket, totals, address1 or 2Agent steps
A page that should look the same as last time3Visual comparison
Two people: a chat, an invite, a shared doc1A second person
A flow on Android or iOS1 or 2Android tests, iOS tests
A page you test in staging or production1 or 2Where danwo runs
A step that is hard to pin with a locator2Agent steps
An existing Playwright testanyPlaywright Test

Agent steps call a model on their first run only. After that they replay from the replay cache, and --replay-only makes sure CI never calls a model.

Flows that go through a provider

These add an emulated service, so the test runs with no sandbox account and no real keys.

You want to testLayerSee
Sign in with an emailed code or a magic link4Email and 2FA codes
Sign in with Clerk, Google or GitHub4Login with Clerk
Pay with Stripe Checkout or card fields4Test a provider
A trial that ends, a subscription that renews4Time travel
Background jobs that run after a click4Background jobs
An AI feature, with the model's answers scripted4AI chat with tools
An upload that goes straight to S34S3

Checks behind the screen

These are the bugs a passing screen hides. They need an invariant, and the fault matrix to find the runs where it breaks.

You want to knowLayerSee
The card was charged once, not twice5, 6A payment made twice
One welcome email went out, not none or two5, 6Next.js waitlist
A webhook that arrives twice is handled once5, 6A webhook handled twice
The app recovers when a provider answers 5006Fault kinds
A double-clicked button makes one order5, 6Fault kinds
Your data agrees with the provider's5Writing invariants
A lost database commit doesn't lose an order5, 6A lost commit

Next

On this page

Run it on every pull request

A GitHub check and one comment per pull request, with the flight records attached.

Set up CI