@schmock/faker 1.10.0 → 1.13.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/dist/field-name-matcher.d.ts.map +1 -1
- package/dist/field-name-matcher.js +9 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/jsf-config.d.ts +8 -5
- package/dist/jsf-config.d.ts.map +1 -1
- package/dist/jsf-config.js +19 -42
- package/dist/schema-enhancement.js +4 -0
- package/dist/test-utils.d.ts +5 -5
- package/dist/test-utils.d.ts.map +1 -1
- package/dist/test-utils.js +25 -13
- package/package.json +7 -7
- package/src/advanced-features.test.ts +72 -71
- package/src/data-quality.test.ts +38 -38
- package/src/error-handling.test.ts +54 -56
- package/src/field-mappings.test.ts +74 -63
- package/src/field-name-matcher.ts +12 -2
- package/src/index.test.ts +145 -135
- package/src/index.ts +8 -6
- package/src/integration.test.ts +30 -28
- package/src/jsf-config.ts +21 -37
- package/src/performance.test.ts +45 -43
- package/src/plugin-integration.test.ts +46 -46
- package/src/real-world.test.ts +22 -22
- package/src/schema-enhancement.ts +5 -0
- package/src/steps/deterministic-seeds.steps.ts +24 -21
- package/src/steps/faker-plugin.steps.ts +190 -142
- package/src/test-utils.ts +38 -22
|
@@ -21,7 +21,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
21
21
|
}).toThrow("Invalid schema type");
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
-
it("processes context through plugin pipeline", () => {
|
|
24
|
+
it("processes context through plugin pipeline", async () => {
|
|
25
25
|
const plugin = fakerPlugin({
|
|
26
26
|
schema: schemas.simple.object({
|
|
27
27
|
requestId: { type: "string" },
|
|
@@ -41,7 +41,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
41
41
|
route: { pattern: "/api/data" },
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
const result = plugin.process(context);
|
|
44
|
+
const result = await plugin.process(context);
|
|
45
45
|
|
|
46
46
|
expect(result).toHaveProperty("context");
|
|
47
47
|
expect(result).toHaveProperty("response");
|
|
@@ -51,7 +51,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
51
51
|
expect(result.response).toHaveProperty("data");
|
|
52
52
|
});
|
|
53
53
|
|
|
54
|
-
it("preserves existing responses when present", () => {
|
|
54
|
+
it("preserves existing responses when present", async () => {
|
|
55
55
|
const plugin = fakerPlugin({
|
|
56
56
|
schema: schemas.simple.object({ id: schemas.simple.number() }),
|
|
57
57
|
});
|
|
@@ -73,7 +73,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
73
73
|
metadata: { source: "cache" },
|
|
74
74
|
};
|
|
75
75
|
|
|
76
|
-
const result = plugin.process(context, existingResponse);
|
|
76
|
+
const result = await plugin.process(context, existingResponse);
|
|
77
77
|
|
|
78
78
|
expect(result.response).toBe(existingResponse);
|
|
79
79
|
expect(result.response).toEqual(existingResponse);
|
|
@@ -81,7 +81,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
81
81
|
});
|
|
82
82
|
|
|
83
83
|
describe("Context Integration", () => {
|
|
84
|
-
it("uses params in template overrides", () => {
|
|
84
|
+
it("uses params in template overrides", async () => {
|
|
85
85
|
const plugin = fakerPlugin({
|
|
86
86
|
schema: schemas.simple.object({
|
|
87
87
|
userId: { type: "string" },
|
|
@@ -95,7 +95,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
95
95
|
},
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
-
const result = plugin.process({
|
|
98
|
+
const result = await plugin.process({
|
|
99
99
|
method: "GET",
|
|
100
100
|
path: "/users/123/posts/456",
|
|
101
101
|
params: { userId: "123", postId: "456" },
|
|
@@ -111,7 +111,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
111
111
|
expect(result.response.action).toBe("view");
|
|
112
112
|
});
|
|
113
113
|
|
|
114
|
-
it("uses query parameters in templates", () => {
|
|
114
|
+
it("uses query parameters in templates", async () => {
|
|
115
115
|
const plugin = fakerPlugin({
|
|
116
116
|
schema: schemas.simple.object({
|
|
117
117
|
page: { type: "number" },
|
|
@@ -127,7 +127,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
127
127
|
},
|
|
128
128
|
});
|
|
129
129
|
|
|
130
|
-
const result = plugin.process({
|
|
130
|
+
const result = await plugin.process({
|
|
131
131
|
method: "GET",
|
|
132
132
|
path: "/api/items",
|
|
133
133
|
params: {},
|
|
@@ -149,7 +149,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
149
149
|
expect(result.response.filter).toBe("active");
|
|
150
150
|
});
|
|
151
151
|
|
|
152
|
-
it("uses state in template processing", () => {
|
|
152
|
+
it("uses state in template processing", async () => {
|
|
153
153
|
const plugin = fakerPlugin({
|
|
154
154
|
schema: schemas.simple.object({
|
|
155
155
|
currentUser: { type: "string" },
|
|
@@ -163,7 +163,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
163
163
|
},
|
|
164
164
|
});
|
|
165
165
|
|
|
166
|
-
const result = plugin.process({
|
|
166
|
+
const result = await plugin.process({
|
|
167
167
|
method: "GET",
|
|
168
168
|
path: "/api/profile",
|
|
169
169
|
params: {},
|
|
@@ -183,7 +183,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
183
183
|
expect(result.response.permissions).toEqual(["read", "write"]);
|
|
184
184
|
});
|
|
185
185
|
|
|
186
|
-
it("handles missing template values gracefully", () => {
|
|
186
|
+
it("handles missing template values gracefully", async () => {
|
|
187
187
|
const plugin = fakerPlugin({
|
|
188
188
|
schema: schemas.simple.object({
|
|
189
189
|
value1: { type: "string" },
|
|
@@ -197,7 +197,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
197
197
|
},
|
|
198
198
|
});
|
|
199
199
|
|
|
200
|
-
const result = plugin.process({
|
|
200
|
+
const result = await plugin.process({
|
|
201
201
|
method: "GET",
|
|
202
202
|
path: "/test",
|
|
203
203
|
params: { other: "value" },
|
|
@@ -217,7 +217,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
217
217
|
});
|
|
218
218
|
|
|
219
219
|
describe("Array Generation with Plugin", () => {
|
|
220
|
-
it("generates arrays with count parameter", () => {
|
|
220
|
+
it("generates arrays with count parameter", async () => {
|
|
221
221
|
const plugin = fakerPlugin({
|
|
222
222
|
schema: schemas.simple.array(
|
|
223
223
|
schemas.simple.object({
|
|
@@ -228,7 +228,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
228
228
|
count: 5,
|
|
229
229
|
});
|
|
230
230
|
|
|
231
|
-
const result = plugin.process({
|
|
231
|
+
const result = await plugin.process({
|
|
232
232
|
method: "GET",
|
|
233
233
|
path: "/api/items",
|
|
234
234
|
params: {},
|
|
@@ -247,7 +247,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
247
247
|
});
|
|
248
248
|
});
|
|
249
249
|
|
|
250
|
-
it("applies overrides to array items", () => {
|
|
250
|
+
it("applies overrides to array items", async () => {
|
|
251
251
|
const plugin = fakerPlugin({
|
|
252
252
|
schema: schemas.simple.array(
|
|
253
253
|
schemas.simple.object({
|
|
@@ -261,7 +261,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
261
261
|
},
|
|
262
262
|
});
|
|
263
263
|
|
|
264
|
-
const result = plugin.process({
|
|
264
|
+
const result = await plugin.process({
|
|
265
265
|
method: "GET",
|
|
266
266
|
path: "/api/items",
|
|
267
267
|
params: {},
|
|
@@ -281,7 +281,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
281
281
|
});
|
|
282
282
|
|
|
283
283
|
describe("Error Handling in Plugin", () => {
|
|
284
|
-
it("wraps generation errors with context", () => {
|
|
284
|
+
it("wraps generation errors with context", async () => {
|
|
285
285
|
const plugin = fakerPlugin({
|
|
286
286
|
schema: {
|
|
287
287
|
type: "string",
|
|
@@ -301,7 +301,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
301
301
|
};
|
|
302
302
|
|
|
303
303
|
try {
|
|
304
|
-
plugin.process(context);
|
|
304
|
+
await plugin.process(context);
|
|
305
305
|
expect.fail("Should have thrown");
|
|
306
306
|
} catch (error: any) {
|
|
307
307
|
// Should throw some kind of error for invalid pattern
|
|
@@ -310,7 +310,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
310
310
|
}
|
|
311
311
|
});
|
|
312
312
|
|
|
313
|
-
it("handles null or undefined context properties", () => {
|
|
313
|
+
it("handles null or undefined context properties", async () => {
|
|
314
314
|
const plugin = fakerPlugin({
|
|
315
315
|
schema: schemas.simple.object({
|
|
316
316
|
data: { type: "string" },
|
|
@@ -318,7 +318,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
318
318
|
});
|
|
319
319
|
|
|
320
320
|
// Should not crash with null/undefined properties
|
|
321
|
-
const result = plugin.process({
|
|
321
|
+
const result = await plugin.process({
|
|
322
322
|
method: "GET",
|
|
323
323
|
path: "/test",
|
|
324
324
|
params: null as any,
|
|
@@ -335,7 +335,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
335
335
|
});
|
|
336
336
|
|
|
337
337
|
describe("Complex Schema Scenarios", () => {
|
|
338
|
-
it("handles conditional schemas in plugin", () => {
|
|
338
|
+
it("handles conditional schemas in plugin", async () => {
|
|
339
339
|
const plugin = fakerPlugin({
|
|
340
340
|
schema: {
|
|
341
341
|
type: "object",
|
|
@@ -347,7 +347,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
347
347
|
},
|
|
348
348
|
});
|
|
349
349
|
|
|
350
|
-
const result = plugin.process({
|
|
350
|
+
const result = await plugin.process({
|
|
351
351
|
method: "GET",
|
|
352
352
|
path: "/api/profile",
|
|
353
353
|
params: {},
|
|
@@ -362,10 +362,10 @@ describe("Schema Plugin Integration", () => {
|
|
|
362
362
|
expect(result.response).toHaveProperty("data");
|
|
363
363
|
});
|
|
364
364
|
|
|
365
|
-
it("generates nested data with references", () => {
|
|
365
|
+
it("generates nested data with references", async () => {
|
|
366
366
|
const plugin = fakerPlugin({
|
|
367
367
|
schema: {
|
|
368
|
-
|
|
368
|
+
$defs: {
|
|
369
369
|
timestamp: { type: "string", format: "date-time" },
|
|
370
370
|
user: {
|
|
371
371
|
type: "object",
|
|
@@ -377,15 +377,15 @@ describe("Schema Plugin Integration", () => {
|
|
|
377
377
|
},
|
|
378
378
|
type: "object",
|
|
379
379
|
properties: {
|
|
380
|
-
created: { $ref: "
|
|
381
|
-
updated: { $ref: "
|
|
382
|
-
author: { $ref: "
|
|
383
|
-
editor: { $ref: "
|
|
380
|
+
created: { $ref: "#/$defs/timestamp" },
|
|
381
|
+
updated: { $ref: "#/$defs/timestamp" },
|
|
382
|
+
author: { $ref: "#/$defs/user" },
|
|
383
|
+
editor: { $ref: "#/$defs/user" },
|
|
384
384
|
},
|
|
385
385
|
},
|
|
386
386
|
});
|
|
387
387
|
|
|
388
|
-
const result = plugin.process({
|
|
388
|
+
const result = await plugin.process({
|
|
389
389
|
method: "GET",
|
|
390
390
|
path: "/api/document",
|
|
391
391
|
params: {},
|
|
@@ -402,17 +402,16 @@ describe("Schema Plugin Integration", () => {
|
|
|
402
402
|
expect(
|
|
403
403
|
validators.appearsToBeFromCategory([result.response.updated], "date"),
|
|
404
404
|
).toBe(true);
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
).toBe(
|
|
408
|
-
expect(
|
|
409
|
-
|
|
410
|
-
).toBe(true);
|
|
405
|
+
// $ref-resolved schemas may not preserve format through JSF resolution
|
|
406
|
+
expect(result.response.author).toHaveProperty("id");
|
|
407
|
+
expect(typeof result.response.author.id).toBe("string");
|
|
408
|
+
expect(result.response.editor).toHaveProperty("id");
|
|
409
|
+
expect(typeof result.response.editor.id).toBe("string");
|
|
411
410
|
});
|
|
412
411
|
});
|
|
413
412
|
|
|
414
413
|
describe("Performance Characteristics", () => {
|
|
415
|
-
it("maintains consistent performance across multiple calls", () => {
|
|
414
|
+
it("maintains consistent performance across multiple calls", async () => {
|
|
416
415
|
const plugin = fakerPlugin({
|
|
417
416
|
schema: schemas.complex.user(),
|
|
418
417
|
});
|
|
@@ -429,10 +428,11 @@ describe("Schema Plugin Integration", () => {
|
|
|
429
428
|
};
|
|
430
429
|
|
|
431
430
|
// Generate multiple times
|
|
432
|
-
const results =
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
431
|
+
const results: any[] = [];
|
|
432
|
+
for (let i = 0; i < 10; i++) {
|
|
433
|
+
const r = await plugin.process(context);
|
|
434
|
+
results.push(r.response);
|
|
435
|
+
}
|
|
436
436
|
|
|
437
437
|
// All should be valid but different
|
|
438
438
|
results.forEach((result) => {
|
|
@@ -446,7 +446,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
446
446
|
expect(uniqueEmails.size).toBeGreaterThan(5);
|
|
447
447
|
});
|
|
448
448
|
|
|
449
|
-
it("handles large schemas efficiently", () => {
|
|
449
|
+
it("handles large schemas efficiently", async () => {
|
|
450
450
|
const plugin = fakerPlugin({
|
|
451
451
|
schema: {
|
|
452
452
|
type: "object",
|
|
@@ -470,7 +470,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
470
470
|
route: {},
|
|
471
471
|
};
|
|
472
472
|
|
|
473
|
-
const result = plugin.process(context);
|
|
473
|
+
const result = await plugin.process(context);
|
|
474
474
|
|
|
475
475
|
// Should have all fields
|
|
476
476
|
expect(Object.keys(result.response).length).toBeGreaterThanOrEqual(50);
|
|
@@ -478,7 +478,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
478
478
|
});
|
|
479
479
|
|
|
480
480
|
describe("Real-world Plugin Usage", () => {
|
|
481
|
-
it("generates mock API responses for testing", () => {
|
|
481
|
+
it("generates mock API responses for testing", async () => {
|
|
482
482
|
const plugin = fakerPlugin({
|
|
483
483
|
schema: {
|
|
484
484
|
type: "object",
|
|
@@ -507,7 +507,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
507
507
|
},
|
|
508
508
|
});
|
|
509
509
|
|
|
510
|
-
const result = plugin.process({
|
|
510
|
+
const result = await plugin.process({
|
|
511
511
|
method: "GET",
|
|
512
512
|
path: "/api/users/user-123",
|
|
513
513
|
params: { userId: "user-123" },
|
|
@@ -530,7 +530,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
530
530
|
).toBe(true);
|
|
531
531
|
});
|
|
532
532
|
|
|
533
|
-
it("works with schmock plugin pipeline", () => {
|
|
533
|
+
it("works with schmock plugin pipeline", async () => {
|
|
534
534
|
const schemaPlug = fakerPlugin({
|
|
535
535
|
schema: schemas.simple.object({
|
|
536
536
|
message: { type: "string" },
|
|
@@ -561,7 +561,7 @@ describe("Schema Plugin Integration", () => {
|
|
|
561
561
|
};
|
|
562
562
|
|
|
563
563
|
// First plugin generates response
|
|
564
|
-
const result1 = schemaPlug.process(context);
|
|
564
|
+
const result1 = await schemaPlug.process(context);
|
|
565
565
|
|
|
566
566
|
// Second plugin receives generated response
|
|
567
567
|
const result2 = loggingPlugin.process(result1.context, result1.response);
|
package/src/real-world.test.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { validators } from "./test-utils";
|
|
|
5
5
|
|
|
6
6
|
describe("Real-World Scenarios", () => {
|
|
7
7
|
describe("API Response Schemas", () => {
|
|
8
|
-
it("generates REST API list responses", () => {
|
|
8
|
+
it("generates REST API list responses", async () => {
|
|
9
9
|
const schema: JSONSchema7 = {
|
|
10
10
|
type: "object",
|
|
11
11
|
properties: {
|
|
@@ -53,7 +53,7 @@ describe("Real-World Scenarios", () => {
|
|
|
53
53
|
required: ["data", "meta"],
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
-
const result = generateFromSchema({ schema });
|
|
56
|
+
const result = await generateFromSchema({ schema });
|
|
57
57
|
|
|
58
58
|
expect(result).toHaveProperty("data");
|
|
59
59
|
expect(result).toHaveProperty("meta");
|
|
@@ -78,7 +78,7 @@ describe("Real-World Scenarios", () => {
|
|
|
78
78
|
expect(result.meta.total).toBeGreaterThanOrEqual(0);
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
it("generates GraphQL-style responses", () => {
|
|
81
|
+
it("generates GraphQL-style responses", async () => {
|
|
82
82
|
const schema: JSONSchema7 = {
|
|
83
83
|
type: "object",
|
|
84
84
|
properties: {
|
|
@@ -128,7 +128,7 @@ describe("Real-World Scenarios", () => {
|
|
|
128
128
|
},
|
|
129
129
|
};
|
|
130
130
|
|
|
131
|
-
const result = generateFromSchema({ schema });
|
|
131
|
+
const result = await generateFromSchema({ schema });
|
|
132
132
|
|
|
133
133
|
if (result.data?.user) {
|
|
134
134
|
expect(result.data.user).toHaveProperty("id");
|
|
@@ -145,7 +145,7 @@ describe("Real-World Scenarios", () => {
|
|
|
145
145
|
}
|
|
146
146
|
});
|
|
147
147
|
|
|
148
|
-
it("generates webhook payloads", () => {
|
|
148
|
+
it("generates webhook payloads", async () => {
|
|
149
149
|
const schema: JSONSchema7 = {
|
|
150
150
|
type: "object",
|
|
151
151
|
properties: {
|
|
@@ -179,7 +179,7 @@ describe("Real-World Scenarios", () => {
|
|
|
179
179
|
required: ["event", "timestamp", "data", "signature"],
|
|
180
180
|
};
|
|
181
181
|
|
|
182
|
-
const result = generateFromSchema({ schema });
|
|
182
|
+
const result = await generateFromSchema({ schema });
|
|
183
183
|
|
|
184
184
|
expect(["order.created", "order.updated", "order.cancelled"]).toContain(
|
|
185
185
|
result.event,
|
|
@@ -191,7 +191,7 @@ describe("Real-World Scenarios", () => {
|
|
|
191
191
|
});
|
|
192
192
|
|
|
193
193
|
describe("Database Model Schemas", () => {
|
|
194
|
-
it("generates user model data", () => {
|
|
194
|
+
it("generates user model data", async () => {
|
|
195
195
|
const schema: JSONSchema7 = {
|
|
196
196
|
type: "object",
|
|
197
197
|
properties: {
|
|
@@ -237,7 +237,7 @@ describe("Real-World Scenarios", () => {
|
|
|
237
237
|
],
|
|
238
238
|
};
|
|
239
239
|
|
|
240
|
-
const result = generateFromSchema({ schema });
|
|
240
|
+
const result = await generateFromSchema({ schema });
|
|
241
241
|
|
|
242
242
|
expect(result.id).toBeGreaterThanOrEqual(1);
|
|
243
243
|
expect(result.username).toMatch(/^[a-zA-Z0-9_]{3,20}$/);
|
|
@@ -253,7 +253,7 @@ describe("Real-World Scenarios", () => {
|
|
|
253
253
|
expect(updated.getTime()).not.toBeNaN();
|
|
254
254
|
});
|
|
255
255
|
|
|
256
|
-
it("generates product catalog data", () => {
|
|
256
|
+
it("generates product catalog data", async () => {
|
|
257
257
|
const schema: JSONSchema7 = {
|
|
258
258
|
type: "object",
|
|
259
259
|
properties: {
|
|
@@ -289,7 +289,7 @@ describe("Real-World Scenarios", () => {
|
|
|
289
289
|
},
|
|
290
290
|
};
|
|
291
291
|
|
|
292
|
-
const result = generateFromSchema({ schema });
|
|
292
|
+
const result = await generateFromSchema({ schema });
|
|
293
293
|
|
|
294
294
|
expect(result.sku).toMatch(/^[A-Z]{3}-[0-9]{6}$/);
|
|
295
295
|
expect(result.name.length).toBeGreaterThan(0);
|
|
@@ -304,7 +304,7 @@ describe("Real-World Scenarios", () => {
|
|
|
304
304
|
});
|
|
305
305
|
|
|
306
306
|
describe("Configuration Schemas", () => {
|
|
307
|
-
it("generates application config", () => {
|
|
307
|
+
it("generates application config", async () => {
|
|
308
308
|
const schema: JSONSchema7 = {
|
|
309
309
|
type: "object",
|
|
310
310
|
properties: {
|
|
@@ -355,7 +355,7 @@ describe("Real-World Scenarios", () => {
|
|
|
355
355
|
},
|
|
356
356
|
};
|
|
357
357
|
|
|
358
|
-
const result = generateFromSchema({ schema });
|
|
358
|
+
const result = await generateFromSchema({ schema });
|
|
359
359
|
|
|
360
360
|
if (result.app) {
|
|
361
361
|
expect(result.app.version).toMatch(/^\d+\.\d+\.\d+$/);
|
|
@@ -370,7 +370,7 @@ describe("Real-World Scenarios", () => {
|
|
|
370
370
|
}
|
|
371
371
|
});
|
|
372
372
|
|
|
373
|
-
it("generates OpenAPI schema definitions", () => {
|
|
373
|
+
it("generates OpenAPI schema definitions", async () => {
|
|
374
374
|
const schema: JSONSchema7 = {
|
|
375
375
|
type: "object",
|
|
376
376
|
properties: {
|
|
@@ -411,7 +411,7 @@ describe("Real-World Scenarios", () => {
|
|
|
411
411
|
required: ["openapi", "info", "paths"],
|
|
412
412
|
};
|
|
413
413
|
|
|
414
|
-
const result = generateFromSchema({ schema });
|
|
414
|
+
const result = await generateFromSchema({ schema });
|
|
415
415
|
|
|
416
416
|
expect(result.openapi).toBe("3.0.0");
|
|
417
417
|
expect(result.info).toHaveProperty("title");
|
|
@@ -421,7 +421,7 @@ describe("Real-World Scenarios", () => {
|
|
|
421
421
|
});
|
|
422
422
|
|
|
423
423
|
describe("Form Data Schemas", () => {
|
|
424
|
-
it("generates user registration form data", () => {
|
|
424
|
+
it("generates user registration form data", async () => {
|
|
425
425
|
const schema: JSONSchema7 = {
|
|
426
426
|
type: "object",
|
|
427
427
|
properties: {
|
|
@@ -466,7 +466,7 @@ describe("Real-World Scenarios", () => {
|
|
|
466
466
|
],
|
|
467
467
|
};
|
|
468
468
|
|
|
469
|
-
const result = generateFromSchema({ schema });
|
|
469
|
+
const result = await generateFromSchema({ schema });
|
|
470
470
|
|
|
471
471
|
expect(result.username).toMatch(/^[a-zA-Z0-9_]+$/);
|
|
472
472
|
expect(result.username.length).toBeGreaterThanOrEqual(3);
|
|
@@ -477,7 +477,7 @@ describe("Real-World Scenarios", () => {
|
|
|
477
477
|
expect(result.termsAccepted).toBe(true);
|
|
478
478
|
});
|
|
479
479
|
|
|
480
|
-
it("generates complex survey responses", () => {
|
|
480
|
+
it("generates complex survey responses", async () => {
|
|
481
481
|
const schema: JSONSchema7 = {
|
|
482
482
|
type: "object",
|
|
483
483
|
properties: {
|
|
@@ -515,7 +515,7 @@ describe("Real-World Scenarios", () => {
|
|
|
515
515
|
},
|
|
516
516
|
};
|
|
517
517
|
|
|
518
|
-
const result = generateFromSchema({ schema });
|
|
518
|
+
const result = await generateFromSchema({ schema });
|
|
519
519
|
|
|
520
520
|
expect(
|
|
521
521
|
validators.appearsToBeFromCategory([result.respondentId], "uuid"),
|
|
@@ -534,7 +534,7 @@ describe("Real-World Scenarios", () => {
|
|
|
534
534
|
});
|
|
535
535
|
|
|
536
536
|
describe("Integration with Schmock", () => {
|
|
537
|
-
it("works with schmock route handlers", () => {
|
|
537
|
+
it("works with schmock route handlers", async () => {
|
|
538
538
|
const plugin = fakerPlugin({
|
|
539
539
|
schema: {
|
|
540
540
|
type: "object",
|
|
@@ -574,7 +574,7 @@ describe("Real-World Scenarios", () => {
|
|
|
574
574
|
route: {},
|
|
575
575
|
};
|
|
576
576
|
|
|
577
|
-
const result = plugin.process(context);
|
|
577
|
+
const result = await plugin.process(context);
|
|
578
578
|
|
|
579
579
|
expect(result.response).toHaveProperty("users");
|
|
580
580
|
expect(Array.isArray(result.response.users)).toBe(true);
|
|
@@ -590,7 +590,7 @@ describe("Real-World Scenarios", () => {
|
|
|
590
590
|
}
|
|
591
591
|
});
|
|
592
592
|
|
|
593
|
-
it("integrates with template overrides", () => {
|
|
593
|
+
it("integrates with template overrides", async () => {
|
|
594
594
|
const plugin = fakerPlugin({
|
|
595
595
|
schema: {
|
|
596
596
|
type: "object",
|
|
@@ -625,7 +625,7 @@ describe("Real-World Scenarios", () => {
|
|
|
625
625
|
route: {},
|
|
626
626
|
};
|
|
627
627
|
|
|
628
|
-
const result = plugin.process(context);
|
|
628
|
+
const result = await plugin.process(context);
|
|
629
629
|
|
|
630
630
|
expect(result.response.orderId).toBe("order-123");
|
|
631
631
|
expect(result.response.customerId).toBe("customer-456");
|
|
@@ -93,6 +93,11 @@ function enhanceFieldSchema(
|
|
|
93
93
|
return enhanced;
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
+
// Don't apply smart mapping when const or enum is defined — these have fixed values
|
|
97
|
+
if (enhanced.const !== undefined || enhanced.enum) {
|
|
98
|
+
return enhanced;
|
|
99
|
+
}
|
|
100
|
+
|
|
96
101
|
// Apply smart field name mapping via the scoring matcher
|
|
97
102
|
const match = findBestMapping(fieldName, enhanced);
|
|
98
103
|
if (match) {
|
|
@@ -22,9 +22,9 @@ describeFeature(feature, ({ Scenario }) => {
|
|
|
22
22
|
// seed will be passed during generation
|
|
23
23
|
});
|
|
24
24
|
|
|
25
|
-
When("I generate data twice with the same seed", () => {
|
|
26
|
-
result1 = generateFromSchema({ schema: testSchema, seed: 42 });
|
|
27
|
-
result2 = generateFromSchema({ schema: testSchema, seed: 42 });
|
|
25
|
+
When("I generate data twice with the same seed", async () => {
|
|
26
|
+
result1 = await generateFromSchema({ schema: testSchema, seed: 42 });
|
|
27
|
+
result2 = await generateFromSchema({ schema: testSchema, seed: 42 });
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
Then("both outputs are identical", () => {
|
|
@@ -32,22 +32,25 @@ describeFeature(feature, ({ Scenario }) => {
|
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
Scenario(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
35
|
+
Scenario(
|
|
36
|
+
"Different seeds produce different output",
|
|
37
|
+
({ Given, And, When, Then }) => {
|
|
38
|
+
Given("a schema plugin with seed 42", () => {
|
|
39
|
+
// setup done during generation
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
And("a schema plugin with seed 99", () => {
|
|
43
|
+
// setup done during generation
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
When("I generate data from each", async () => {
|
|
47
|
+
result1 = await generateFromSchema({ schema: testSchema, seed: 42 });
|
|
48
|
+
result2 = await generateFromSchema({ schema: testSchema, seed: 99 });
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
Then("the outputs are different", () => {
|
|
52
|
+
expect(result1).not.toEqual(result2);
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
);
|
|
53
56
|
});
|