@classytic/arc-testkit
v0.5.0
Published
Boot a real @classytic/arc app around the module(s) under test on in-memory MongoDB — the ecosystem test harness. Thin Mongo-typed wrapper over @classytic/arc/testing (arc 2.22+). If your arc module boots green here, it composes into any arc host.
Readme
@classytic/arc-testkit
Boot a real
@classytic/arcapp around the module(s) under test, on a real (in-memory) database.
The ecosystem's contributor contract for the @classytic/arc-* module fleet: if your module boots green here, it composes into any arc host.
Install
npm i -D @classytic/arc-testkit @classytic/mongokit mongodb-memory-server@classytic/mongokit + mongodb-memory-server are optional peers — needed only for the default backend, and dynamically imported so they never enter a production bundle. Pass your own backend to skip them entirely.
Usage
import { bootModuleApp } from '@classytic/arc-testkit';
import { createAccountingModule } from '@classytic/arc-accounting';
const t = await bootModuleApp(({ connection }) => [
createAccountingModule({ connection, permissions }),
]);
const res = await t.app.inject({ method: 'GET', url: '/accounting/accounts' });
expect(res.statusCode).toBe(200);
await t.close();The module input is a factory receiving { connection, mongoUri } (or a plain module / array). It boots arc with preset: 'testing', auth: false — override via options.app.
Transactions
Modules that open multi-document transactions need a replica set:
const t = await bootModuleApp(({ connection }) => [createReservationModule({ connection, permissions })],
{ replset: true });Bring your own backend
The default backend is mongoMemoryBackend() from @classytic/mongokit/testkit. Override it to point at a shared server, a real Atlas cluster, or a different kit's backend — anything that satisfies the TestBackend shape (setup() → { ctx: { connection, uri }, teardown }):
import { mongoMemoryBackend } from '@classytic/mongokit/testkit';
const t = await bootModuleApp(mods, {
backend: mongoMemoryBackend({ uri: process.env.ATLAS_TEST_URI }), // real cluster
});API
| Export | |
| --- | --- |
| bootModuleApp(modules, options?) | boot arc around modules on a backend; returns { app, connection, mongoUri, close } |
| TestBackend | the backend seam — setup() → { ctx: { connection, uri }, teardown } |
| TestkitContext | what a module factory receives: { connection, mongoUri } |
| BootModuleAppOptions | { replset?, app?, backend? } |
Cost and plan assertions (MongoDB)
import { assertConstantCommands, countCommands } from '@classytic/arc-testkit/mongo-commands';
import { assertIndexServed } from '@classytic/arc-testkit/mongo-explain';
// What the driver sent (the connection needs `monitorCommands: true` — it refuses otherwise).
const { total, byCollection } = await countCommands(conn, () => placeOrder(), { collections: ['orders'] });
// Same commands at every size, and at least one: a per-item read fails here.
await assertConstantCommands(conn, (n) => reader.page(n), [5, 50]);
// No COLLSCAN, an index scanned, optionally a named one and a docs-examined ceiling.
assertIndexServed(await Model.find(filter).explain('executionStats'), { index: 'org_state', maxDocsExamined: 40 });License
MIT © Classytic
Trademark
MIT-licensed code. "Classytic"/"arc" names + logos are trademarks of Classytic LLC — see TRADEMARK.md.
