Skip to content

Commit 13daf25

Browse files
committed
test: add auto mocker
1 parent 96f4827 commit 13daf25

File tree

15 files changed

+572
-11
lines changed

15 files changed

+572
-11
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import fs from "fs";
2+
import path from "path";
3+
import { expect, test } from "vitest";
4+
5+
const FIXTURE_FILE = path.join(
6+
process.cwd(),
7+
"src/mocks/fixtures/registry_info/get.ts",
8+
);
9+
10+
test("auto-mocker generates fixture and serves JSON", async () => {
11+
// Call an endpoint present in swagger.json
12+
const res = await fetch("http://localhost/api/v0/registry/info");
13+
expect(res.ok).toBe(true);
14+
const data = await res.json();
15+
expect(typeof data).toBe("object");
16+
17+
// Fixture file should exist after first call
18+
expect(fs.existsSync(FIXTURE_FILE)).toBe(true);
19+
});

__tests__/msw-example.test.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
import { HttpResponse, http } from "msw";
2-
import { setupServer } from "msw/node";
3-
import { afterAll, afterEach, beforeAll, expect, test } from "vitest";
2+
import { beforeEach, expect, test } from "vitest";
3+
import { server } from "@/mocks/node";
44

5-
const server = setupServer(
6-
http.get("https://api.example.com/greet", () =>
7-
HttpResponse.json({ message: "hello from msw" }),
8-
),
9-
);
10-
11-
beforeAll(() => server.listen({ onUnhandledRequest: "error" }));
12-
afterEach(() => server.resetHandlers());
13-
afterAll(() => server.close());
5+
beforeEach(() => {
6+
server.resetHandlers();
7+
server.use(
8+
http.get("https://api.example.com/greet", () =>
9+
HttpResponse.json({ message: "hello from msw" }),
10+
),
11+
);
12+
});
1413

1514
test("fetches mocked data from MSW handler", async () => {
1615
const res = await fetch("https://api.example.com/greet");

docs/mocks.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
MSW Auto‑Mocker
2+
3+
- Handlers: `src/mocks/handlers.ts` combines custom and auto‑generated.
4+
- Custom: add overrides in `src/mocks/customHandlers/index.ts`.
5+
- Auto‑gen: `src/mocks/mocker.ts` reads `swagger.json` and creates fixtures in `src/mocks/fixtures` on first run.
6+
- Validation: Loaded fixtures are validated with Ajv; errors log to console.
7+
8+
Usage
9+
- Vitest: already wired via `src/mocks/test.setup.ts`. Run `pnpm test`.
10+
- Browser dev (optional): import and call `startWorker()` from `src/mocks/browser.ts` in your app's dev entry.
11+
12+
Regeneration
13+
- Delete a fixture file or run with `AUTO_MOCKER_FORCE=1` to re-generate.
14+
15+
Types (optional)
16+
- If you expose OpenAPI response types under `@api/types.gen`, set `USE_TYPES_FOR_FIXTURES = true` in `src/mocks/mocker.ts` to add a `satisfies` clause in generated fixtures.
17+

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
"better-auth": "1.4.0-beta.21",
2323
"class-variance-authority": "0.7.1",
2424
"clsx": "2.1.1",
25+
"ajv": "^8.17.1",
26+
"json-schema-faker": "^0.5.6",
2527
"msw": "^2.12.2",
2628
"next": "16.0.3",
2729
"react": "19.2.0",

pnpm-lock.yaml

Lines changed: 132 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/mocks/browser.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import type { RestHandler } from "msw";
2+
import { setupWorker } from "msw/browser";
3+
import { handlers } from "./handlers";
4+
5+
export const worker = setupWorker(...(handlers as RestHandler[]));
6+
7+
export async function startWorker() {
8+
await worker.start({ onUnhandledRequest: "bypass" });
9+
}

0 commit comments

Comments
 (0)