assert-json-body 1.6.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +219 -95
- package/dist/assertion/diff-recordings-vs-spec.js +7 -3
- package/dist/assertion/diff-recordings-vs-spec.js.map +1 -1
- package/dist/assertion/playwright-type.d.ts.map +1 -1
- package/dist/assertion/summarize-recordings.js.map +1 -1
- package/dist/cli/index.js +35 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/extractor/src/lib/child-expansion.d.ts.map +1 -1
- package/dist/extractor/src/lib/child-expansion.js.map +1 -1
- package/dist/extractor/src/lib/git.d.ts.map +1 -1
- package/dist/extractor/src/lib/git.js.map +1 -1
- package/dist/extractor/src/lib/ref-resolver.d.ts.map +1 -1
- package/dist/extractor/src/lib/ref-resolver.js.map +1 -1
- package/dist/extractor/src/lib/schema-flatten.d.ts.map +1 -1
- package/dist/extractor/src/lib/schema-flatten.js +19 -9
- package/dist/extractor/src/lib/schema-flatten.js.map +1 -1
- package/dist/extractor/src/lib/type-utils.d.ts.map +1 -1
- package/dist/extractor/src/lib/type-utils.js +3 -1
- package/dist/extractor/src/lib/type-utils.js.map +1 -1
- package/dist/lib/assert.d.ts.map +1 -1
- package/dist/lib/assert.js +6 -1
- package/dist/lib/assert.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +27 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/extractor.d.ts.map +1 -1
- package/dist/lib/extractor.js +67 -23
- package/dist/lib/extractor.js.map +1 -1
- package/dist/lib/recorder.d.ts.map +1 -1
- package/dist/lib/recorder.js +12 -5
- package/dist/lib/recorder.js.map +1 -1
- package/dist/lib/responses.d.ts.map +1 -1
- package/dist/lib/responses.js +26 -9
- package/dist/lib/responses.js.map +1 -1
- package/dist/lib/schema-flatten.d.ts +1 -1
- package/dist/lib/schema-flatten.d.ts.map +1 -1
- package/dist/lib/schema-flatten.js +1 -1
- package/dist/lib/schema-flatten.js.map +1 -1
- package/dist/lib/validator.d.ts.map +1 -1
- package/dist/lib/validator.js +50 -18
- package/dist/lib/validator.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist-cjs/assertion/diff-recordings-vs-spec.js +7 -3
- package/dist-cjs/assertion/diff-recordings-vs-spec.js.map +1 -1
- package/dist-cjs/assertion/playwright-type.d.ts.map +1 -1
- package/dist-cjs/assertion/summarize-recordings.js.map +1 -1
- package/dist-cjs/cli/index.js +35 -7
- package/dist-cjs/cli/index.js.map +1 -1
- package/dist-cjs/extractor/src/lib/child-expansion.d.ts.map +1 -1
- package/dist-cjs/extractor/src/lib/child-expansion.js.map +1 -1
- package/dist-cjs/extractor/src/lib/git.d.ts.map +1 -1
- package/dist-cjs/extractor/src/lib/git.js.map +1 -1
- package/dist-cjs/extractor/src/lib/ref-resolver.d.ts.map +1 -1
- package/dist-cjs/extractor/src/lib/ref-resolver.js.map +1 -1
- package/dist-cjs/extractor/src/lib/schema-flatten.d.ts.map +1 -1
- package/dist-cjs/extractor/src/lib/schema-flatten.js +19 -9
- package/dist-cjs/extractor/src/lib/schema-flatten.js.map +1 -1
- package/dist-cjs/extractor/src/lib/type-utils.d.ts.map +1 -1
- package/dist-cjs/extractor/src/lib/type-utils.js +3 -1
- package/dist-cjs/extractor/src/lib/type-utils.js.map +1 -1
- package/dist-cjs/lib/assert.d.ts.map +1 -1
- package/dist-cjs/lib/assert.js +6 -1
- package/dist-cjs/lib/assert.js.map +1 -1
- package/dist-cjs/lib/config.d.ts.map +1 -1
- package/dist-cjs/lib/config.js +27 -3
- package/dist-cjs/lib/config.js.map +1 -1
- package/dist-cjs/lib/extractor.d.ts.map +1 -1
- package/dist-cjs/lib/extractor.js +67 -23
- package/dist-cjs/lib/extractor.js.map +1 -1
- package/dist-cjs/lib/recorder.d.ts.map +1 -1
- package/dist-cjs/lib/recorder.js +12 -5
- package/dist-cjs/lib/recorder.js.map +1 -1
- package/dist-cjs/lib/responses.d.ts.map +1 -1
- package/dist-cjs/lib/responses.js +26 -9
- package/dist-cjs/lib/responses.js.map +1 -1
- package/dist-cjs/lib/schema-flatten.d.ts +1 -1
- package/dist-cjs/lib/schema-flatten.d.ts.map +1 -1
- package/dist-cjs/lib/schema-flatten.js.map +1 -1
- package/dist-cjs/lib/validator.d.ts.map +1 -1
- package/dist-cjs/lib/validator.js +50 -18
- package/dist-cjs/lib/validator.js.map +1 -1
- package/dist-cjs/types/index.d.ts +2 -0
- package/dist-cjs/types/index.d.ts.map +1 -1
- package/package.json +15 -4
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/assert-json-body)
|
|
5
5
|
|
|
6
6
|
Framework-agnostic toolkit to:
|
|
7
|
+
|
|
7
8
|
- Extract OpenAPI response schemas into a compact `responses.json` artifact
|
|
8
9
|
- Validate real JSON response bodies against the extracted required/optional field model
|
|
9
10
|
- Assert inside any test runner (Vitest, Jest, Playwright, etc.)
|
|
@@ -17,74 +18,99 @@ npm install assert-json-body
|
|
|
17
18
|
## Quick Start
|
|
18
19
|
|
|
19
20
|
1. (Optional) Initialize a config file:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
npx assert-json-body config:init
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Produces `assert-json-body.config.json` (edit repo, spec path, output dir, etc.).
|
|
24
27
|
|
|
25
28
|
2. Extract responses from your OpenAPI spec:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
npx assert-json-body extract
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This writes (by default):
|
|
35
|
+
- `./json-body-assertions/responses.json` (schema bundle)
|
|
36
|
+
- `./json-body-assertions/index.ts` (auto-generated typed wrapper)
|
|
37
|
+
or the configured `responsesFile` for the JSON schema artifact.
|
|
38
|
+
|
|
39
|
+
The init step also adds an npm script for convenience:
|
|
40
|
+
|
|
41
|
+
```jsonc
|
|
42
|
+
// package.json
|
|
43
|
+
{
|
|
44
|
+
"scripts": {
|
|
45
|
+
"responses:regenerate": "assert-json-body extract",
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
So you can run:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
npm run responses:regenerate
|
|
54
|
+
```
|
|
47
55
|
|
|
48
56
|
3. Validate in a test (untyped import):
|
|
49
|
-
```ts
|
|
50
|
-
import { validateResponseShape, validateResponse } from 'assert-json-body';
|
|
51
57
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Throws if JSON shape violates required field presence / type rules.
|
|
58
|
+
```ts
|
|
59
|
+
import { validateResponseShape, validateResponse } from 'assert-json-body';
|
|
55
60
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
// Suppose you just performed an HTTP request and have jsonBody
|
|
62
|
+
validateResponseShape(
|
|
63
|
+
{ path: '/process-instance/create', method: 'POST', status: '200' },
|
|
64
|
+
jsonBody
|
|
65
|
+
);
|
|
66
|
+
// Throws if JSON shape violates required field presence / type rules.
|
|
67
|
+
|
|
68
|
+
// Playwright convenience helper: consumes APIResponse, checks HTTP status, then validates JSON
|
|
69
|
+
await validateResponse(
|
|
70
|
+
{ path: '/process-instance/create', method: 'POST', status: '200' },
|
|
71
|
+
playwrightResponse
|
|
72
|
+
);
|
|
73
|
+
```
|
|
59
74
|
|
|
60
75
|
4. Prefer typed validation (after extract):
|
|
61
|
-
```ts
|
|
62
|
-
import { validateResponseShape, validateResponse } from './json-body-assertions/index';
|
|
63
76
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
77
|
+
```ts
|
|
78
|
+
import { validateResponseShape, validateResponse } from './json-body-assertions/index';
|
|
79
|
+
|
|
80
|
+
// Now path/method/status are constrained to extracted endpoints
|
|
81
|
+
validateResponseShape(
|
|
82
|
+
{ path: '/process-instance/create', method: 'POST', status: '200' },
|
|
83
|
+
jsonBody
|
|
84
|
+
);
|
|
85
|
+
await validateResponse(
|
|
86
|
+
{ path: '/process-instance/create', method: 'POST', status: '200' },
|
|
87
|
+
playwrightResponse
|
|
88
|
+
);
|
|
67
89
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
90
|
+
// @ts-expect-error invalid status not in spec
|
|
91
|
+
// validateResponseShape({ path: '/process-instance/create', method: 'POST', status: '418' }, jsonBody);
|
|
92
|
+
```
|
|
71
93
|
|
|
72
94
|
Regenerate typed file whenever the spec changes by re-running `extract` (commit both `responses.json` and `index.ts` if you track API contract changes in version control).
|
|
73
95
|
|
|
74
96
|
You can control default throw/record behavior globally via config or env (see below) and override per call.
|
|
75
97
|
|
|
76
98
|
### CI Integration
|
|
99
|
+
|
|
77
100
|
Keep the generated artifacts (`responses.json`, `index.ts`) in sync with the upstream spec during continuous integration:
|
|
78
101
|
|
|
79
102
|
Example GitHub Actions step (add after install):
|
|
103
|
+
|
|
80
104
|
```yaml
|
|
81
105
|
- name: Regenerate response schemas
|
|
82
106
|
run: npm run responses:regenerate
|
|
83
107
|
```
|
|
84
108
|
|
|
85
109
|
If you commit the generated files:
|
|
110
|
+
|
|
86
111
|
1. Run the regenerate step early (before tests).
|
|
87
112
|
2. Add a check that the working tree is clean to ensure developers didn’t forget to re-run extraction locally:
|
|
113
|
+
|
|
88
114
|
```yaml
|
|
89
115
|
- name: Verify no uncommitted changes
|
|
90
116
|
run: |
|
|
@@ -92,11 +118,74 @@ If you commit the generated files:
|
|
|
92
118
|
```
|
|
93
119
|
|
|
94
120
|
If you prefer not to commit generated artifacts:
|
|
121
|
+
|
|
95
122
|
- Add the output directory (default `json-body-assertions/`) to `.gitignore`.
|
|
96
123
|
- Always run `npm run responses:regenerate` before building / testing.
|
|
97
124
|
|
|
98
125
|
Caching tip: if your spec repo is large, you can cache the sparse checkout directory by keying on the spec ref (commit SHA) to speed up subsequent runs.
|
|
99
126
|
|
|
127
|
+
### Standalone Binary (no Node.js required)
|
|
128
|
+
|
|
129
|
+
Pre-built standalone binaries are attached to each [GitHub release](https://github.com/camunda/assert-json-body/releases). These are self-contained executables compiled with Deno — no Node.js or npm installation needed.
|
|
130
|
+
|
|
131
|
+
Available platforms:
|
|
132
|
+
|
|
133
|
+
- `x86_64-unknown-linux-gnu` / `aarch64-unknown-linux-gnu`
|
|
134
|
+
- `x86_64-apple-darwin` / `aarch64-apple-darwin`
|
|
135
|
+
- `x86_64-pc-windows-msvc`
|
|
136
|
+
|
|
137
|
+
Usage in CI (e.g. GitHub Actions):
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
- name: Download assert-json-body
|
|
141
|
+
run: |
|
|
142
|
+
curl -fsSL -o assert-json-body \
|
|
143
|
+
"https://github.com/camunda/assert-json-body/releases/latest/download/assert-json-body-x86_64-unknown-linux-gnu"
|
|
144
|
+
chmod +x assert-json-body
|
|
145
|
+
|
|
146
|
+
- name: Regenerate response schemas
|
|
147
|
+
run: ./assert-json-body extract
|
|
148
|
+
env:
|
|
149
|
+
AJB_REF: ${{ github.event.inputs.spec_ref || 'main' }}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
To build locally (requires Deno ≥ 2.x):
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
npm run build:deno # local platform
|
|
156
|
+
npm run build:deno:cross # all platforms
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
#### Using the binary with a local spec file (`AJB_SPEC_FILE`)
|
|
160
|
+
|
|
161
|
+
When the OpenAPI spec is already available on disk — for example, in a workflow that checks out the `camunda/camunda` repository — you can skip the git sparse-checkout entirely by pointing at the local file with `AJB_SPEC_FILE`.
|
|
162
|
+
|
|
163
|
+
When `specFile` (or `AJB_SPEC_FILE`) is set, the `repo`, `specPath`, `ref`, and `preserveCheckout` options are ignored — no git operations are performed. The generated `responses.json` metadata will show `commit: "local"` instead of a SHA.
|
|
164
|
+
|
|
165
|
+
#### Copy-paste for `camunda/camunda` QA e2e workflows
|
|
166
|
+
|
|
167
|
+
The orchestration-cluster e2e test suite lives at `qa/c8-orchestration-cluster-e2e-test-suite/` and already checks out the branch under test. The spec file is at `zeebe/gateway-protocol/src/main/proto/v2/rest-api.yaml` in the repo root. Add these steps **before** `npm install` / `npm run test`:
|
|
168
|
+
|
|
169
|
+
```yaml
|
|
170
|
+
# ── Regenerate response schemas from the branch's spec ──────────
|
|
171
|
+
- name: Download assert-json-body binary
|
|
172
|
+
run: |
|
|
173
|
+
curl -fsSL -o /usr/local/bin/assert-json-body \
|
|
174
|
+
"https://github.com/camunda/assert-json-body/releases/latest/download/assert-json-body-x86_64-unknown-linux-gnu"
|
|
175
|
+
chmod +x /usr/local/bin/assert-json-body
|
|
176
|
+
|
|
177
|
+
- name: Regenerate response schemas from local spec
|
|
178
|
+
run: assert-json-body extract
|
|
179
|
+
env:
|
|
180
|
+
AJB_SPEC_FILE: ${{ github.workspace }}/zeebe/gateway-protocol/src/main/proto/v2/rest-api.yaml
|
|
181
|
+
AJB_OUTPUT_DIR: ${{ github.workspace }}/qa/c8-orchestration-cluster-e2e-test-suite/json-body-assertions
|
|
182
|
+
# ────────────────────────────────────────────────────────────────
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
That's it — no Node.js setup, no `npm install`, and no second git clone required. The binary reads the spec file that is already on disk from the workflow's checkout step and writes `responses.json` directly into the test suite's `json-body-assertions/` directory.
|
|
186
|
+
|
|
187
|
+
**Why this works:** The e2e workflows (nightly matrix across `stable/8.6` … `main`, on-demand branch, release) already `actions/checkout` the target branch. The OpenAPI spec in that checkout reflects the branch's API surface, so the generated response schemas will match the server under test.
|
|
188
|
+
|
|
100
189
|
## Configuration
|
|
101
190
|
|
|
102
191
|
Config file: `assert-json-body.config.json` (created with `npx assert-json-body config:init`).
|
|
@@ -108,52 +197,55 @@ The configuration is now split into two blocks:
|
|
|
108
197
|
|
|
109
198
|
### extract block
|
|
110
199
|
|
|
111
|
-
| Field
|
|
112
|
-
|
|
113
|
-
| `repo`
|
|
114
|
-
| `specPath`
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
117
|
-
| `
|
|
118
|
-
| `
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
200
|
+
| Field | Type | Default | Description | Env override(s) |
|
|
201
|
+
| ------------------ | ------- | -------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------- |
|
|
202
|
+
| `repo` | string | `https://github.com/camunda/camunda` | Git repository containing the OpenAPI spec | `AJB_REPO`, `REPO` |
|
|
203
|
+
| `specPath` | string | `zeebe/gateway-protocol/src/main/proto/v2/rest-api.yaml` | Path to OpenAPI spec inside the repo | `AJB_SPEC_PATH`, `SPEC_PATH` |
|
|
204
|
+
| `specFile` | string | — | Local spec file path (skips git checkout entirely) | `AJB_SPEC_FILE` |
|
|
205
|
+
| `ref` | string | `main` | Git ref (branch/tag/sha) to checkout | `AJB_REF`, `SPEC_REF`, `REF` |
|
|
206
|
+
| `outputDir` | string | `json-body-assertions` | Directory to write `responses.json` + generated `index.ts` | `AJB_OUTPUT_DIR`, `OUTPUT_DIR` |
|
|
207
|
+
| `preserveCheckout` | boolean | `false` | Keep sparse checkout working copy (debug) | `AJB_PRESERVE_CHECKOUT`, `PRESERVE_SPEC_CHECKOUT` |
|
|
208
|
+
| `dryRun` | boolean | `false` | Parse spec but do not write files | `AJB_DRY_RUN` |
|
|
209
|
+
| `logLevel` | enum | `info` | `silent` `error` `warn` `info` `debug` | `AJB_LOG_LEVEL` |
|
|
210
|
+
| `failIfExists` | boolean | `false` | Abort if target responses file already exists | `AJB_FAIL_IF_EXISTS` |
|
|
211
|
+
| `responsesFile` | string | — | Optional explicit path for responses JSON (advanced) | `AJB_RESPONSES_FILE`, `ROUTE_TEST_RESPONSES_FILE` |
|
|
122
212
|
|
|
123
213
|
### validate block
|
|
124
214
|
|
|
125
|
-
| Field
|
|
126
|
-
|
|
127
|
-
| `recordResponses`
|
|
128
|
-
| `throwOnValidationFail` | boolean | `true`
|
|
215
|
+
| Field | Type | Default | Description | Env override(s) |
|
|
216
|
+
| ----------------------- | ------- | ------- | ----------------------------------------- | ----------------------------------------- |
|
|
217
|
+
| `recordResponses` | boolean | `false` | Globally enable body recording | `AJB_RECORD`, `TEST_RESPONSE_BODY_RECORD` |
|
|
218
|
+
| `throwOnValidationFail` | boolean | `true` | Throw vs structured `{ ok:false }` result | `AJB_THROW_ON_FAIL` |
|
|
129
219
|
|
|
130
220
|
Additional env variables:
|
|
131
221
|
|
|
132
|
-
| Env
|
|
133
|
-
|
|
222
|
+
| Env | Purpose |
|
|
223
|
+
| ------------------------------- | ------------------------------------------------------------------------------ |
|
|
134
224
|
| `TEST_RESPONSE_BODY_RECORD_DIR` | Override directory for JSONL body recordings (default `<outputDir>/recording`) |
|
|
135
225
|
|
|
136
226
|
Example full config:
|
|
227
|
+
|
|
137
228
|
```json
|
|
138
229
|
{
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
230
|
+
"extract": {
|
|
231
|
+
"repo": "https://github.com/camunda/camunda",
|
|
232
|
+
"specPath": "zeebe/gateway-protocol/src/main/proto/v2/rest-api.yaml",
|
|
233
|
+
"ref": "main",
|
|
234
|
+
"outputDir": "json-body-assertions",
|
|
235
|
+
"preserveCheckout": false,
|
|
236
|
+
"dryRun": false,
|
|
237
|
+
"logLevel": "info",
|
|
238
|
+
"failIfExists": false
|
|
239
|
+
},
|
|
240
|
+
"validate": {
|
|
241
|
+
"recordResponses": false,
|
|
242
|
+
"throwOnValidationFail": true
|
|
243
|
+
}
|
|
153
244
|
}
|
|
154
245
|
```
|
|
155
246
|
|
|
156
247
|
Notes:
|
|
248
|
+
|
|
157
249
|
- The responses schema file defaults to `<outputDir>/responses.json` unless overridden.
|
|
158
250
|
- Boolean env overrides accept `1|true|yes` (case-insensitive).
|
|
159
251
|
- Precedence per value: CLI flag > environment variable > config file > built-in default.
|
|
@@ -161,6 +253,7 @@ Notes:
|
|
|
161
253
|
## Schema Resolution Precedence
|
|
162
254
|
|
|
163
255
|
When `validateResponseShape` looks for the schema artifact, precedence is:
|
|
256
|
+
|
|
164
257
|
1. Explicit option: `responsesFilePath` passed to the function
|
|
165
258
|
2. Environment variable: `ROUTE_TEST_RESPONSES_FILE` or `AJB_RESPONSES_FILE`
|
|
166
259
|
3. Config file: `extract.responsesFile` or `<outputDir>/responses.json`
|
|
@@ -171,52 +264,63 @@ All file issues (missing, unreadable, parse errors, malformed structure) throw c
|
|
|
171
264
|
## API Reference
|
|
172
265
|
|
|
173
266
|
### `validateResponseShape(spec, body, options?)`
|
|
267
|
+
|
|
174
268
|
Single unified API: validates `body` against the schema entry. Supports optional structured result mode and recording.
|
|
175
269
|
|
|
176
270
|
```ts
|
|
177
|
-
validateResponseShape(
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
);
|
|
271
|
+
validateResponseShape({ path: '/foo', method: 'GET', status: '200' }, jsonBody, {
|
|
272
|
+
responsesFilePath: './custom/responses.json',
|
|
273
|
+
configPath: './custom-config.json',
|
|
274
|
+
});
|
|
182
275
|
```
|
|
276
|
+
|
|
183
277
|
Default behavior: throws on mismatch (configurable). If you pass `throw:false` (or set global flag) it returns a structured object:
|
|
184
278
|
|
|
185
279
|
```ts
|
|
186
280
|
interface ValidateResultBase {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
281
|
+
ok: boolean;
|
|
282
|
+
errors?: string[]; // present when ok === false
|
|
283
|
+
response: unknown; // the original response body you passed in
|
|
284
|
+
routeContext: RouteContext; // resolved route/method/status + flattened field specs
|
|
191
285
|
}
|
|
192
286
|
```
|
|
193
287
|
|
|
194
288
|
Examples:
|
|
289
|
+
|
|
195
290
|
```ts
|
|
196
291
|
// Success (non-throw mode)
|
|
197
|
-
const r1 = validateResponseShape({ path: '/foo', method: 'GET', status: '200' }, body, {
|
|
292
|
+
const r1 = validateResponseShape({ path: '/foo', method: 'GET', status: '200' }, body, {
|
|
293
|
+
throw: false,
|
|
294
|
+
});
|
|
198
295
|
if (!r1.ok) throw new Error('unexpected');
|
|
199
|
-
console.log(r1.routeContext.requiredFields.map(f => f.name));
|
|
296
|
+
console.log(r1.routeContext.requiredFields.map((f) => f.name));
|
|
200
297
|
|
|
201
298
|
// Failure (non-throw mode)
|
|
202
|
-
const r2 = validateResponseShape({ path: '/foo', method: 'GET', status: '200' }, otherBody, {
|
|
299
|
+
const r2 = validateResponseShape({ path: '/foo', method: 'GET', status: '200' }, otherBody, {
|
|
300
|
+
throw: false,
|
|
301
|
+
});
|
|
203
302
|
if (!r2.ok) {
|
|
204
|
-
|
|
205
|
-
|
|
303
|
+
console.warn(r2.errors); // array of error lines
|
|
304
|
+
console.log(r2.routeContext.status); // resolved status used
|
|
206
305
|
}
|
|
207
306
|
```
|
|
208
307
|
|
|
209
308
|
#### Options
|
|
309
|
+
|
|
210
310
|
- `responsesFilePath` / `configPath` – override resolution
|
|
211
311
|
- `throw?: boolean` – override global throw setting
|
|
212
312
|
- `record?: boolean | { label?: string }` – enable recording for this call
|
|
213
313
|
|
|
214
314
|
### `validateResponse(spec, playwrightResponse, options?)`
|
|
315
|
+
|
|
215
316
|
Playwright-friendly wrapper: reads `await response.json()`, optionally enforces the expected status, then routes through `validateResponseShape`.
|
|
216
317
|
|
|
217
318
|
```ts
|
|
218
319
|
const apiResponse = await request.post('/process-instance/create', { data: payload });
|
|
219
|
-
await validateResponse(
|
|
320
|
+
await validateResponse(
|
|
321
|
+
{ path: '/process-instance/create', method: 'POST', status: '200' },
|
|
322
|
+
apiResponse
|
|
323
|
+
);
|
|
220
324
|
```
|
|
221
325
|
|
|
222
326
|
- `spec.status` is required when you need HTTP status enforcement; the helper throws if it does not match `response.status()`.
|
|
@@ -234,25 +338,33 @@ The validator respects the OpenAPI `nullable: true` property. When a field in th
|
|
|
234
338
|
The `nullable` flag is extracted automatically during `assert-json-body extract` and stored in `responses.json`. You can also set it manually in a custom responses file:
|
|
235
339
|
|
|
236
340
|
```json
|
|
237
|
-
{"name": "label", "type": "string", "nullable": true}
|
|
341
|
+
{ "name": "label", "type": "string", "nullable": true }
|
|
238
342
|
```
|
|
239
343
|
|
|
240
344
|
### Types
|
|
345
|
+
|
|
241
346
|
`FieldSpec`, `RouteContext`, `PlaywrightAPIResponse`, and other structural types are exported from `@/types`.
|
|
242
347
|
|
|
243
348
|
### Generated Typed Entry (after extract)
|
|
349
|
+
|
|
244
350
|
After running the extractor you can import strongly-typed versions of `validateResponseShape` and `validateResponse` that constrain `path`, `method` and `status` to only the extracted endpoints:
|
|
351
|
+
|
|
245
352
|
```ts
|
|
246
353
|
import { validateResponseShape, validateResponse } from './json-body-assertions/index';
|
|
247
354
|
|
|
248
355
|
// Autocomplete + compile-time safety for path/method/status
|
|
249
356
|
validateResponseShape({ path: '/process-instance/create', method: 'POST', status: '200' }, body);
|
|
250
|
-
await validateResponse(
|
|
357
|
+
await validateResponse(
|
|
358
|
+
{ path: '/process-instance/create', method: 'POST', status: '200' },
|
|
359
|
+
playwrightResponse
|
|
360
|
+
);
|
|
251
361
|
|
|
252
362
|
// @ts-expect-error invalid status for that route will fail type-check
|
|
253
363
|
// validateResponseShape({ path: '/process-instance/create', method: 'POST', status: '418' }, body);
|
|
254
364
|
```
|
|
365
|
+
|
|
255
366
|
You can also use the exported helper types:
|
|
367
|
+
|
|
256
368
|
```ts
|
|
257
369
|
import type { RoutePath, MethodFor, StatusFor } from './json-body-assertions/index';
|
|
258
370
|
|
|
@@ -286,6 +398,7 @@ Yes. The extractor automatically bundles referenced files (via `$ref`) as long a
|
|
|
286
398
|
## Releasing & Versioning
|
|
287
399
|
|
|
288
400
|
This project uses [semantic-release](https://semantic-release.gitbook.io/) with Conventional Commits to automate:
|
|
401
|
+
|
|
289
402
|
- Version determination (based on commit messages)
|
|
290
403
|
- CHANGELOG generation (`CHANGELOG.md`)
|
|
291
404
|
- GitHub release notes
|
|
@@ -294,6 +407,7 @@ This project uses [semantic-release](https://semantic-release.gitbook.io/) with
|
|
|
294
407
|
Every push to `main` triggers the release workflow. Ensure your commits follow Conventional Commit prefixes so changes are categorized correctly:
|
|
295
408
|
|
|
296
409
|
Common types:
|
|
410
|
+
|
|
297
411
|
- `feat:` – new feature (minor release)
|
|
298
412
|
- `fix:` – bug fix (patch release)
|
|
299
413
|
- `docs:` – documentation only
|
|
@@ -305,6 +419,7 @@ Common types:
|
|
|
305
419
|
Breaking changes: add a footer line `BREAKING CHANGE: <description>` (or use `!` after the type, e.g. `feat!: drop Node 16`).
|
|
306
420
|
|
|
307
421
|
Example commit message:
|
|
422
|
+
|
|
308
423
|
```
|
|
309
424
|
feat: add structured validation result for non-throw mode
|
|
310
425
|
|
|
@@ -317,12 +432,13 @@ Local commit messages are validated by commitlint + husky (commit-msg hook). If
|
|
|
317
432
|
|
|
318
433
|
## CLI Commands
|
|
319
434
|
|
|
320
|
-
| Command
|
|
321
|
-
|
|
322
|
-
| `assert-json-body extract`
|
|
323
|
-
| `assert-json-body config:init` | Creates a starter `assert-json-body.config.json`.
|
|
435
|
+
| Command | Description |
|
|
436
|
+
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
|
|
437
|
+
| `assert-json-body extract` | Performs sparse checkout + OpenAPI parse + response schema flattening into `responses.json` and emits typed `index.ts`. |
|
|
438
|
+
| `assert-json-body config:init` | Creates a starter `assert-json-body.config.json`. |
|
|
324
439
|
|
|
325
440
|
Environment variables (selected):
|
|
441
|
+
|
|
326
442
|
- `ROUTE_TEST_RESPONSES_FILE` / `AJB_RESPONSES_FILE` – override schema file
|
|
327
443
|
- `TEST_RESPONSE_BODY_RECORD_DIR` – override recording directory (default `<outputDir>/recording`)
|
|
328
444
|
- `AJB_RECORD` / `TEST_RESPONSE_BODY_RECORD` – set default recording on (true/1/yes)
|
|
@@ -331,12 +447,16 @@ Environment variables (selected):
|
|
|
331
447
|
## Recording (Optional)
|
|
332
448
|
|
|
333
449
|
By default, recordings are written to `<outputDir>/recording` (e.g. `json-body-assertions/recording`). Set `TEST_RESPONSE_BODY_RECORD_DIR` only if you want a custom location. To record responses, either:
|
|
450
|
+
|
|
334
451
|
```ts
|
|
335
452
|
// Per-call recording
|
|
336
|
-
validateResponseShape({ path: '/foo', method: 'GET', status: '200' }, body, {
|
|
453
|
+
validateResponseShape({ path: '/foo', method: 'GET', status: '200' }, body, {
|
|
454
|
+
record: { label: 'GET /foo success' },
|
|
455
|
+
});
|
|
337
456
|
|
|
338
457
|
// Or enable globally (env): AJB_RECORD=true
|
|
339
458
|
```
|
|
459
|
+
|
|
340
460
|
Produces JSONL rows with required field list, top-level present, deep presence and body snapshot.
|
|
341
461
|
|
|
342
462
|
## Integration Tests
|
|
@@ -344,20 +464,24 @@ Produces JSONL rows with required field list, top-level present, deep presence a
|
|
|
344
464
|
An optional end-to-end integration test suite lives under `integration/` and is excluded from the default unit test run.
|
|
345
465
|
|
|
346
466
|
Run unit tests (fast, pure):
|
|
467
|
+
|
|
347
468
|
```
|
|
348
469
|
npm test
|
|
349
470
|
```
|
|
350
471
|
|
|
351
472
|
Run integration tests (performs real OpenAPI extraction and live HTTP calls):
|
|
473
|
+
|
|
352
474
|
```
|
|
353
475
|
npm run test:integration
|
|
354
476
|
```
|
|
355
477
|
|
|
356
478
|
Local requirements:
|
|
479
|
+
|
|
357
480
|
- Start the target service (expected at `http://localhost:8080` by default), or
|
|
358
481
|
- Set `TEST_BASE_URL` to point to a running instance
|
|
359
482
|
|
|
360
483
|
CI (Docker) example:
|
|
484
|
+
|
|
361
485
|
```yaml
|
|
362
486
|
- name: Start API container
|
|
363
487
|
run: |
|
|
@@ -378,5 +502,5 @@ Errors show a capped (first 15) list of issues (missing, type, enum, extra) with
|
|
|
378
502
|
See `src/tests/precedence.spec.ts` for an executable example verifying explicit > env > config > default ordering.
|
|
379
503
|
|
|
380
504
|
## License
|
|
381
|
-
ISC (see `LICENSE`).
|
|
382
505
|
|
|
506
|
+
ISC (see `LICENSE`).
|
|
@@ -54,10 +54,12 @@ for (const entry of parsedSpec.responses) {
|
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
function recKey(route, method, status) {
|
|
57
|
-
return `${(method || 'ANY').toUpperCase()} ${
|
|
57
|
+
return `${(method || 'ANY').toUpperCase()} ${status || 'ANY'} ${route}`;
|
|
58
58
|
}
|
|
59
59
|
const aggIndex = new Map();
|
|
60
|
-
function isJsonl(f) {
|
|
60
|
+
function isJsonl(f) {
|
|
61
|
+
return f.endsWith('.jsonl');
|
|
62
|
+
}
|
|
61
63
|
for (const file of readdirSync(recordDir)) {
|
|
62
64
|
if (!isJsonl(file))
|
|
63
65
|
continue;
|
|
@@ -91,7 +93,9 @@ for (const file of readdirSync(recordDir)) {
|
|
|
91
93
|
a.deepCounts.set(p, (a.deepCounts.get(p) || 0) + 1);
|
|
92
94
|
}
|
|
93
95
|
}
|
|
94
|
-
catch {
|
|
96
|
+
catch {
|
|
97
|
+
/* ignore malformed */
|
|
98
|
+
}
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
const results = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-recordings-vs-spec.js","sourceRoot":"","sources":["../../src/assertion/diff-recordings-vs-spec.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"diff-recordings-vs-spec.js","sourceRoot":"","sources":["../../src/assertion/diff-recordings-vs-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright-type.d.ts","sourceRoot":"","sources":["../../src/assertion/playwright-type.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,KAAK,YAAY,GAAG,OAAO,CAAC;AAE5B;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,OAAO,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"playwright-type.d.ts","sourceRoot":"","sources":["../../src/assertion/playwright-type.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,KAAK,YAAY,GAAG,OAAO,CAAC;AAE5B;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,OAAO,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAErC;;;OAGG;IACH,YAAY,IAAI,KAAK,CAAC;QACpB;;WAEG;QACH,IAAI,EAAE,MAAM,CAAC;QAEb;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IAEH;;;;OAIG;IACH,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAE9B;;OAEG;IACH,EAAE,IAAI,OAAO,CAAC;IAEd;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,IAAI,MAAM,CAAC;IAErB;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB;;OAEG;IACH,GAAG,IAAI,MAAM,CAAC;IAEd,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize-recordings.js","sourceRoot":"","sources":["../../src/assertion/summarize-recordings.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAEH;;;;GAIG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"summarize-recordings.js","sourceRoot":"","sources":["../../src/assertion/summarize-recordings.ts"],"names":[],"mappings":"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"}
|