Skip to content

Commit 91db28b

Browse files
committed
update mocks documentation
1 parent 69b7265 commit 91db28b

File tree

1 file changed

+112
-1
lines changed

1 file changed

+112
-1
lines changed

docs/mocks.md

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ MSW Auto-Mocker
33
- Handlers: `src/mocks/handlers.ts` combines non-schema mocks and auto-generated mocks.
44
- Non-schema mocks: add hand-written handlers in `src/mocks/customHandlers/index.ts`. These take precedence over schema-based mocks.
55
- Auto-generated: `src/mocks/mocker.ts` reads `swagger.json` and creates fixtures under `src/mocks/fixtures` on first run.
6-
- Validation: Loaded fixtures are validated with Ajv; errors log to console.
76

87
Usage
98
- Vitest: tests initialize MSW in `src/mocks/test.setup.ts`. Run `pnpm test`.
@@ -24,3 +23,115 @@ Failure behavior (always strict)
2423
Types
2524
- Fixtures default to strict types. Generated modules import response types from `@api/types.gen` and use a `satisfies` clause to ensure compatibility.
2625
- Make sure `tsconfig.json` includes: `"paths": { "@api/*": ["./src/generated/*"] }`.
26+
27+
## Test-Scoped Overrides with AutoAPIMock
28+
29+
Each fixture is wrapped in `AutoAPIMock<T>`, which provides test-scoped override capabilities.
30+
31+
### Fixture Structure
32+
33+
Generated fixtures use named exports with a consistent naming convention:
34+
35+
```typescript
36+
// src/mocks/fixtures/registry_v0_1_servers/get.ts
37+
import type { GetRegistryV01ServersResponse } from "@api/types.gen";
38+
import { AutoAPIMock } from "@mocks";
39+
40+
export const mockedGetRegistryV01Servers = AutoAPIMock<GetRegistryV01ServersResponse>({
41+
servers: [...],
42+
metadata: { count: 15 },
43+
});
44+
```
45+
46+
### Overriding in Tests
47+
48+
Use `.override()` to customize responses for specific tests:
49+
50+
```typescript
51+
import { HttpResponse } from "msw";
52+
import { mockedGetRegistryV01Servers } from "@mocks/fixtures/registry_v0_1_servers/get";
53+
54+
describe("ServerList", () => {
55+
it("shows empty state when no servers", async () => {
56+
// Override to return empty list for this test only
57+
mockedGetRegistryV01Servers.override(() =>
58+
HttpResponse.json({ servers: [], metadata: { count: 0 } })
59+
);
60+
61+
render(<ServerList />);
62+
expect(screen.getByText("No servers available")).toBeVisible();
63+
});
64+
65+
it("shows error state on API failure", async () => {
66+
// Override to return an error
67+
mockedGetRegistryV01Servers.override(() =>
68+
HttpResponse.json({ error: "Server error" }, { status: 500 })
69+
);
70+
71+
render(<ServerList />);
72+
expect(screen.getByText("Failed to load servers")).toBeVisible();
73+
});
74+
75+
it("shows servers from default fixture", async () => {
76+
// No override - uses default fixture data
77+
render(<ServerList />);
78+
expect(screen.getByText("AWS Nova Canvas")).toBeVisible();
79+
});
80+
});
81+
```
82+
83+
### API Reference
84+
85+
```typescript
86+
interface AutoAPIMockInstance<T> {
87+
// The default fixture data
88+
defaultValue: T;
89+
90+
// Override the response for the current test
91+
override(fn: (data: T, info: ResponseResolverInfo) => Response): this;
92+
93+
// Reset to default behavior (called automatically before each test)
94+
reset(): this;
95+
96+
// Internal handler used by MSW (don't call directly)
97+
generatedHandler: HttpResponseResolver;
98+
}
99+
```
100+
101+
### Override Function
102+
103+
The override function receives:
104+
1. `data: T` - The default fixture data (useful for partial modifications)
105+
2. `info: ResponseResolverInfo` - MSW request info (request, params, cookies)
106+
107+
Return a `Response` object (use `HttpResponse.json()` from MSW).
108+
109+
### Automatic Reset
110+
111+
Overrides are automatically reset before each test via `beforeEach()` in `src/mocks/test.setup.ts`. You don't need to manually reset mocks between tests.
112+
113+
### Using Default Data in Overrides
114+
115+
Access the default fixture data to make partial modifications:
116+
117+
```typescript
118+
mockedGetRegistryV01Servers.override((data) =>
119+
HttpResponse.json({
120+
...data,
121+
servers: data.servers?.slice(0, 1), // Keep only first server
122+
})
123+
);
124+
```
125+
126+
### Accessing Request Info
127+
128+
Use the `info` parameter to vary responses based on request:
129+
130+
```typescript
131+
mockedGetRegistryV01Servers.override((data, info) => {
132+
const cursor = new URL(info.request.url).searchParams.get("cursor");
133+
if (cursor === "page2") {
134+
return HttpResponse.json({ servers: [], metadata: { count: 0 } });
135+
}
136+
return HttpResponse.json(data);
137+
});

0 commit comments

Comments
 (0)