Jadpo is experimental and not ready for production. These docs follow the compiler's main branch as of 30 Oct 2026. What's built · Install 0.1.0
jadpo
Reference: Testing

Testing

What is built: Testing

Which parts of Testing are built, and what the rest waits on

Feature Status
Pure and action tests Built: jadpo test runs test "…" { } and assert in the interpreter, for tests that call functions and actions. Each test gets its own environment (its seed and clock, its database and fakes), tests run on a thread per core, and the results are reported in the order seed's order. Each action or fixture a test calls commits on its own, through the runtime's action boundary; an action it calls joins its transaction.
Kind of test Built: the kind comes from what a test calls (an action, query or fixture makes it an action test, a request a route test, a schedule's .run() a schedule test), and the footer and --json count each kind.
Schedule tests Built: schedule.run() in a test runs the schedule once at the test's clock, its action called as the system with no tenant, with its own database like an action test; --kind schedule runs only these; anywhere but a test it is semantic.not_callable.
Route tests Built: request { method: path: params: input: } sends a request through the runtime's HTTP component and gives a Response with status, code and the route's typed output; a route test gets its own database like an action test, and a defect behind a 500 ends it as test.fault. as: signs in a user through a real browser session or API token, and a service through a real service key. Every request but a GET sends a fresh Idempotency-Key, or the one idempotency_key: gives (Idempotency keys). An optional field the input: leaves out is left out of the body, so a patch: keeps it. A streaming route's Response has pieces in place of output, its events read to the last.
Assertion messages Partly built: a failed assert reports its file and line, its source with each part's value hung beneath it, expected and actual, a field-by-field diff for records, lists, sets and maps, a stable code and the rerun command with the order seed (see Errors). Not built yet: the trace, fakes, kept database and clock in the report. A statement over several lines shows its first line; --json has all of it.
Checking a failure Built: assert call(…) fails Failure; when the call returns or fails differently, the report shows the value, or the other failure with its code, kind, fields and where it was raised. A failure under attempt ends the test as test.unexpected_failure, and a fault as test.fault, each with its .jadpo frames.
Events Built: what each step emits is delivered once it comes back and before the next statement, at the test's clock, until nothing is due, in an order the run's seed shuffles; a retry waits its full backoff until clock.advance reaches it, and a delivery that fails for good, or stops as diverged, ends the test as test.subscriber_failed ("Caches and events").
Clock Built: a test's clock starts at its clock:, or at 2000-01-01T00:00:00Z without one, and clock.advance(...) moves it on for the calls after it; only a test moves it (type.test_clock_context, a fixture and a seed included), and a move backwards is the fault clock_backward.
Configuration Built: test: values on fields, defaults, generated secrets and a test's own config:; a request sent through a route is not followed for the compile-time check that every setting a test reads has a value, and a read with none then ends the test as a fault naming the setting.
Integration fakes Partly built: for provider packages, every provider call a test reaches answers through its package's fake, with the operation's generated default unless the test's fakes: scripts its answers, each checked against the package (semantic.fake_invalid); a script the calls run past is test.fake_exhausted, one with answers left test.fake_unused ("Fakes for integrations"). Package fakes keep keys, and a test that reaches an action with several changing calls runs again with a crash at each step boundary ("Provider calls and capabilities in tests"). email.sent (Email): every email a test sends is caught, rendered whole, a mail package's included, and read as a List<SentEmail>. Not built yet: .requests (built for the ai fake, ai.<prompt>.requests), the capability fakes but ai's, grants, documents, batches and fixture_file.
Database Built: jadpo test gives each action test in a project with tables its own copy of a template built from the migrations, on the server JADPO_TEST_DATABASE_URL names or a disposable one started from the machine's PostgreSQL tools; copies are prepared in the background, and a test gets its copy the first time it uses a store. --keep-failed keeps a failed test's database and names it in the report. Tests read and write records through actions, queries and fixtures; a concurrent change, which needs a second connection, is shown by the runtime's own tests.
Caller Built: Principal.user(user) and Principal.service(service) in tests, fixtures and seeds; a call passing a caller runs as that caller, one passing none runs without policy.
Placement Built: a test sits in <name>.test.jadpo beside its subject, or in root tests/; a test elsewhere is layout.wrong_folder, which names the .test.jadpo file beside it, and a test file with nothing beside it is layout.test_without_subject.
Watch mode Partly built: jadpo test --watch runs the tests asked for, then on every save the ones that reach what changed, through the graph's digests and calls and uses edges, on one long-lived database; a save no test reaches says nothing to rerun, a broken build shows its errors, and the next good save runs everything changed since the last run, or says errors fixed when no test reaches it; a removed file is a change like any other. Run from outside the project, its paths start with the project as typed. It ends when nothing reads its output any more, as when piped into head. A save shows its results in about 0.1 s on a 230-file project, and the gate fails above 1.25 s. The keys in the interactive screen (enter, a, f) wait for --interactive, which says toolchain.not_built_yet; ctrl-c quits.
Fixtures Built: a fixture is checked like an action and called by name from tests, fixtures and seeds; an action calling one is semantic.not_callable. A public fixture is called through its domain from other domains' tests, fixtures and seeds and from root tests/; a private one from there is visibility.private_cross_domain. Seeds are checked but jadpo seed is not built.
Data builders, assert emitted Not built yet.
Interactive mode Not built yet: jadpo test --interactive says toolchain.not_built_yet.
Caches in tests Not built yet: caches need the Redis driver.
Golden application contract Built: the shared black-box harness in benchmarks/contract/ executes all 44 versioned application cases interpreted, on generated native code and on compiled workerd, with real credential verification, raw invalid inputs, physical SQL observation, persisted-state assertions, controlled clocks and provider faults. These checks supplement authored Jadpo tests; they add no application-facing test controls. Full-gate ownership is interpreted and native in compiled, workerd in wasm32, and verifier negative controls in lint.
test.no_tests Built: raised by jadpo test only (Tooling), when the project has no tests or a file, line, name, kind or --failed picks none.

Markdown for agents: /docs/testing-built.md.Built from Jadpo main at a707efb.