@blucca/n8n-check 0.0.0-stage → 0.1.7

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.
Files changed (78) hide show
  1. package/Dockerfile +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +323 -2
  4. package/bin/n8n-check.mjs +62 -0
  5. package/examples/agregado-enrichment/README.md +68 -0
  6. package/examples/agregado-enrichment/n8n-synthetic +11 -0
  7. package/examples/agregado-enrichment/observed-results.json +806 -0
  8. package/examples/agregado-enrichment/prepare.mjs +39 -0
  9. package/examples/identity-projection/README.md +39 -0
  10. package/examples/identity-projection/case.json +33 -0
  11. package/examples/identity-projection/observed-results.json +117 -0
  12. package/examples/identity-projection/workflow.json +71 -0
  13. package/examples/identity-projection/wrong-id.json +71 -0
  14. package/examples/morsof-invoice-history/README.md +77 -0
  15. package/examples/morsof-invoice-history/UPSTREAM-LICENSE +21 -0
  16. package/examples/morsof-invoice-history/n8n-datatable.cjs +28 -0
  17. package/examples/morsof-invoice-history/observed-results.json +113 -0
  18. package/examples/morsof-invoice-history/prepare.mjs +57 -0
  19. package/examples/morsof-invoice-history/replay.mjs +35 -0
  20. package/examples/morsof-invoice-history/run.sh +19 -0
  21. package/examples/object-body/broken.json +74 -0
  22. package/examples/object-body/case.json +81 -0
  23. package/examples/object-body/fixed.json +74 -0
  24. package/examples/object-body/observed-results.json +449 -0
  25. package/examples/object-body/retry-case.json +112 -0
  26. package/examples/object-body/retry.json +77 -0
  27. package/examples/propfind-body/README.md +75 -0
  28. package/examples/propfind-body/case.json +51 -0
  29. package/examples/propfind-body/no-body-control.json +96 -0
  30. package/examples/propfind-body/observed-results.json +307 -0
  31. package/examples/propfind-body/workflow.json +96 -0
  32. package/examples/raw-response/README.md +71 -0
  33. package/examples/raw-response/file-case.json +54 -0
  34. package/examples/raw-response/json-body.json +58 -0
  35. package/examples/raw-response/json-case.json +52 -0
  36. package/examples/raw-response/observed-results.json +383 -0
  37. package/examples/raw-response/raw-file.json +88 -0
  38. package/examples/raw-response/raw-json.json +58 -0
  39. package/examples/raw-response/raw-text.json +58 -0
  40. package/examples/raw-response/text-case.json +50 -0
  41. package/examples/retry-isolation/README.md +71 -0
  42. package/examples/retry-isolation/direct-case.json +112 -0
  43. package/examples/retry-isolation/direct.json +101 -0
  44. package/examples/retry-isolation/editor-template.json +168 -0
  45. package/examples/retry-isolation/http-batching-case.json +112 -0
  46. package/examples/retry-isolation/http-batching.json +107 -0
  47. package/examples/retry-isolation/loop-case.json +117 -0
  48. package/examples/retry-isolation/loop.json +133 -0
  49. package/examples/retry-isolation/observed-results.json +155 -0
  50. package/examples/silent-filter/README.md +57 -0
  51. package/examples/silent-filter/broken.json +96 -0
  52. package/examples/silent-filter/case.json +120 -0
  53. package/examples/silent-filter/fixed.json +96 -0
  54. package/examples/silent-filter/observed-results.json +273 -0
  55. package/examples/stop-after/README.md +66 -0
  56. package/examples/stop-after/broken.json +134 -0
  57. package/examples/stop-after/case.json +34 -0
  58. package/examples/stop-after/fixed.json +134 -0
  59. package/examples/stop-after/observed-results.json +162 -0
  60. package/examples/vapi-tool-contract/README.md +67 -0
  61. package/examples/vapi-tool-contract/backend-503.case.json +113 -0
  62. package/examples/vapi-tool-contract/empty-orders.case.json +113 -0
  63. package/examples/vapi-tool-contract/observed-results.json +234 -0
  64. package/examples/vapi-tool-contract/success.case.json +118 -0
  65. package/examples/vapi-tool-contract/workflow.json +143 -0
  66. package/examples/vapi-tool-contract/wrong-id.json +143 -0
  67. package/examples/version-matrix/README.md +65 -0
  68. package/examples/version-matrix/observed-results.json +307 -0
  69. package/examples/version-matrix/upgrade-check.yml +32 -0
  70. package/package.json +41 -4
  71. package/src/action.mjs +108 -0
  72. package/src/case-draft.mjs +163 -0
  73. package/src/local-bundle.mjs +154 -0
  74. package/src/mock.mjs +72 -0
  75. package/src/report.mjs +73 -0
  76. package/src/runner.mjs +111 -0
  77. package/src/version.mjs +3 -0
  78. package/src/workflow.mjs +140 -0
@@ -0,0 +1,806 @@
1
+ {
2
+ "recordedAtTimezone": "Asia/Shanghai",
3
+ "recordedDate": "2026-10-07",
4
+ "originalCommit": "0cbbac9c7c6e19f2b9f82bab57cf75a171279eac",
5
+ "patchedCommit": "b4e4332b57341f1afdb7a3be7a9069540b8a15f4",
6
+ "scope": "Real n8n downstream of the injected Parse entries boundary; synthetic environment and loopback HTTP responses.",
7
+ "runs": [
8
+ {
9
+ "name": "baseline",
10
+ "startedAt": "2026-10-06T17:21:52.576Z",
11
+ "n8nVersion": "2.41.7",
12
+ "nodeVersion": "v26.10.0",
13
+ "runnerVersion": "0.1.3",
14
+ "status": "failed",
15
+ "exitCode": 1,
16
+ "network": {
17
+ "mode": "loopback-only",
18
+ "enforced": true,
19
+ "interfaces": [
20
+ "lo"
21
+ ]
22
+ },
23
+ "checks": [
24
+ {
25
+ "name": "n8n execution succeeds",
26
+ "passed": true,
27
+ "actual": {
28
+ "cliExitCode": 0,
29
+ "lastNode": "Call enrich API",
30
+ "executionFound": true
31
+ }
32
+ },
33
+ {
34
+ "name": "Build enrich request: output 0",
35
+ "passed": false,
36
+ "expected": [
37
+ {
38
+ "entry": {
39
+ "id": 101,
40
+ "url": "https://example.test/article-101",
41
+ "title": "Article 101"
42
+ },
43
+ "body": {
44
+ "entry_id": 101,
45
+ "canonical_url": "https://example.test/article-101",
46
+ "title": "Article 101"
47
+ }
48
+ },
49
+ {
50
+ "entry": {
51
+ "id": 102,
52
+ "url": "https://example.test/article-102",
53
+ "title": "Article 102"
54
+ },
55
+ "body": {
56
+ "entry_id": 102,
57
+ "canonical_url": "https://example.test/article-102",
58
+ "title": "Article 102"
59
+ }
60
+ }
61
+ ],
62
+ "actual": [
63
+ {
64
+ "entry": {
65
+ "id": 101,
66
+ "url": "https://example.test/article-101",
67
+ "title": "Article 101"
68
+ },
69
+ "body": {
70
+ "entry_id": 101,
71
+ "canonical_url": "https://example.test/article-101",
72
+ "title": "Article 101"
73
+ }
74
+ }
75
+ ]
76
+ },
77
+ {
78
+ "name": "mock: all requests match routes",
79
+ "passed": true,
80
+ "actual": []
81
+ },
82
+ {
83
+ "name": "mock: request limits and server",
84
+ "passed": true,
85
+ "actual": []
86
+ },
87
+ {
88
+ "name": "Call enrich API: POST /api/private/articles/enrich request count",
89
+ "passed": false,
90
+ "expected": 2,
91
+ "actual": 1
92
+ },
93
+ {
94
+ "name": "Call enrich API: POST /api/private/articles/enrich request bodies",
95
+ "passed": false,
96
+ "expected": [
97
+ {
98
+ "entry_id": 101,
99
+ "canonical_url": "https://example.test/article-101",
100
+ "title": "Article 101"
101
+ },
102
+ {
103
+ "entry_id": 102,
104
+ "canonical_url": "https://example.test/article-102",
105
+ "title": "Article 102"
106
+ }
107
+ ],
108
+ "actual": [
109
+ {
110
+ "entry_id": 101,
111
+ "canonical_url": "https://example.test/article-101",
112
+ "title": "Article 101"
113
+ }
114
+ ]
115
+ },
116
+ {
117
+ "name": "Lookup bridge content: POST /d1/content request count",
118
+ "passed": true,
119
+ "expected": 0,
120
+ "actual": 0
121
+ },
122
+ {
123
+ "name": "Claim alert: POST /d1/claim request count",
124
+ "passed": true,
125
+ "expected": 0,
126
+ "actual": 0
127
+ },
128
+ {
129
+ "name": "Notify: POST /alert request count",
130
+ "passed": true,
131
+ "expected": 0,
132
+ "actual": 0
133
+ }
134
+ ],
135
+ "requests": [
136
+ {
137
+ "node": "Call enrich API",
138
+ "method": "POST",
139
+ "path": "/api/private/articles/enrich",
140
+ "body": {
141
+ "entry_id": 101,
142
+ "canonical_url": "https://example.test/article-101",
143
+ "title": "Article 101"
144
+ },
145
+ "status": 200
146
+ }
147
+ ],
148
+ "loopDoneItems": 0
149
+ },
150
+ {
151
+ "name": "fixed-ordinary",
152
+ "startedAt": "2026-10-06T17:23:38.516Z",
153
+ "n8nVersion": "2.41.7",
154
+ "nodeVersion": "v26.10.0",
155
+ "runnerVersion": "0.1.3",
156
+ "status": "passed",
157
+ "exitCode": 0,
158
+ "network": {
159
+ "mode": "loopback-only",
160
+ "enforced": true,
161
+ "interfaces": [
162
+ "lo"
163
+ ]
164
+ },
165
+ "checks": [
166
+ {
167
+ "name": "n8n execution succeeds",
168
+ "passed": true,
169
+ "actual": {
170
+ "cliExitCode": 0,
171
+ "lastNode": "Loop Articles",
172
+ "executionFound": true
173
+ }
174
+ },
175
+ {
176
+ "name": "Build enrich request: output 0",
177
+ "passed": true,
178
+ "expected": [
179
+ {
180
+ "entry": {
181
+ "id": 101,
182
+ "url": "https://example.test/article-101",
183
+ "title": "Article 101"
184
+ },
185
+ "body": {
186
+ "entry_id": 101,
187
+ "canonical_url": "https://example.test/article-101",
188
+ "title": "Article 101"
189
+ }
190
+ },
191
+ {
192
+ "entry": {
193
+ "id": 102,
194
+ "url": "https://example.test/article-102",
195
+ "title": "Article 102"
196
+ },
197
+ "body": {
198
+ "entry_id": 102,
199
+ "canonical_url": "https://example.test/article-102",
200
+ "title": "Article 102"
201
+ }
202
+ }
203
+ ],
204
+ "actual": [
205
+ {
206
+ "entry": {
207
+ "id": 101,
208
+ "url": "https://example.test/article-101",
209
+ "title": "Article 101"
210
+ },
211
+ "body": {
212
+ "entry_id": 101,
213
+ "canonical_url": "https://example.test/article-101",
214
+ "title": "Article 101"
215
+ }
216
+ },
217
+ {
218
+ "entry": {
219
+ "id": 102,
220
+ "url": "https://example.test/article-102",
221
+ "title": "Article 102"
222
+ },
223
+ "body": {
224
+ "entry_id": 102,
225
+ "canonical_url": "https://example.test/article-102",
226
+ "title": "Article 102"
227
+ }
228
+ }
229
+ ]
230
+ },
231
+ {
232
+ "name": "mock: all requests match routes",
233
+ "passed": true,
234
+ "actual": []
235
+ },
236
+ {
237
+ "name": "mock: request limits and server",
238
+ "passed": true,
239
+ "actual": []
240
+ },
241
+ {
242
+ "name": "Call enrich API: POST /api/private/articles/enrich request count",
243
+ "passed": true,
244
+ "expected": 2,
245
+ "actual": 2
246
+ },
247
+ {
248
+ "name": "Call enrich API: POST /api/private/articles/enrich request bodies",
249
+ "passed": true,
250
+ "expected": [
251
+ {
252
+ "entry_id": 101,
253
+ "canonical_url": "https://example.test/article-101",
254
+ "title": "Article 101"
255
+ },
256
+ {
257
+ "entry_id": 102,
258
+ "canonical_url": "https://example.test/article-102",
259
+ "title": "Article 102"
260
+ }
261
+ ],
262
+ "actual": [
263
+ {
264
+ "entry_id": 101,
265
+ "canonical_url": "https://example.test/article-101",
266
+ "title": "Article 101"
267
+ },
268
+ {
269
+ "entry_id": 102,
270
+ "canonical_url": "https://example.test/article-102",
271
+ "title": "Article 102"
272
+ }
273
+ ]
274
+ },
275
+ {
276
+ "name": "Lookup bridge content: POST /d1/content request count",
277
+ "passed": true,
278
+ "expected": 0,
279
+ "actual": 0
280
+ },
281
+ {
282
+ "name": "Claim alert: POST /d1/claim request count",
283
+ "passed": true,
284
+ "expected": 0,
285
+ "actual": 0
286
+ },
287
+ {
288
+ "name": "Notify: POST /alert request count",
289
+ "passed": true,
290
+ "expected": 0,
291
+ "actual": 0
292
+ }
293
+ ],
294
+ "requests": [
295
+ {
296
+ "node": "Call enrich API",
297
+ "method": "POST",
298
+ "path": "/api/private/articles/enrich",
299
+ "body": {
300
+ "entry_id": 101,
301
+ "canonical_url": "https://example.test/article-101",
302
+ "title": "Article 101"
303
+ },
304
+ "status": 200
305
+ },
306
+ {
307
+ "node": "Call enrich API",
308
+ "method": "POST",
309
+ "path": "/api/private/articles/enrich",
310
+ "body": {
311
+ "entry_id": 102,
312
+ "canonical_url": "https://example.test/article-102",
313
+ "title": "Article 102"
314
+ },
315
+ "status": 200
316
+ }
317
+ ],
318
+ "loopDoneItems": 2
319
+ },
320
+ {
321
+ "name": "fixed-mixed",
322
+ "startedAt": "2026-10-06T17:23:48.107Z",
323
+ "n8nVersion": "2.41.7",
324
+ "nodeVersion": "v26.10.0",
325
+ "runnerVersion": "0.1.3",
326
+ "status": "passed",
327
+ "exitCode": 0,
328
+ "network": {
329
+ "mode": "loopback-only",
330
+ "enforced": true,
331
+ "interfaces": [
332
+ "lo"
333
+ ]
334
+ },
335
+ "checks": [
336
+ {
337
+ "name": "n8n execution succeeds",
338
+ "passed": true,
339
+ "actual": {
340
+ "cliExitCode": 0,
341
+ "lastNode": "Loop Articles",
342
+ "executionFound": true
343
+ }
344
+ },
345
+ {
346
+ "name": "Build enrich request: output 0",
347
+ "passed": true,
348
+ "expected": [
349
+ {
350
+ "entry": {
351
+ "id": 101,
352
+ "url": "https://example.test/article-101",
353
+ "title": "Article 101"
354
+ },
355
+ "body": {
356
+ "entry_id": 101,
357
+ "canonical_url": "https://example.test/article-101",
358
+ "title": "Article 101"
359
+ }
360
+ },
361
+ {
362
+ "entry": {
363
+ "id": 102,
364
+ "url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000102",
365
+ "title": "Article 102"
366
+ },
367
+ "body": {
368
+ "entry_id": 102,
369
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000102",
370
+ "title": "Article 102",
371
+ "bridge_content": "<p>Content for 102</p>"
372
+ }
373
+ },
374
+ {
375
+ "entry": {
376
+ "id": 103,
377
+ "url": "https://example.test/article-103",
378
+ "title": "Article 103"
379
+ },
380
+ "body": {
381
+ "entry_id": 103,
382
+ "canonical_url": "https://example.test/article-103",
383
+ "title": "Article 103"
384
+ }
385
+ },
386
+ {
387
+ "entry": {
388
+ "id": 104,
389
+ "url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000104",
390
+ "title": "Article 104"
391
+ },
392
+ "body": {
393
+ "entry_id": 104,
394
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000104",
395
+ "title": "Article 104",
396
+ "bridge_content": "<p>Content for 104</p>"
397
+ }
398
+ }
399
+ ],
400
+ "actual": [
401
+ {
402
+ "entry": {
403
+ "id": 101,
404
+ "url": "https://example.test/article-101",
405
+ "title": "Article 101"
406
+ },
407
+ "body": {
408
+ "entry_id": 101,
409
+ "canonical_url": "https://example.test/article-101",
410
+ "title": "Article 101"
411
+ }
412
+ },
413
+ {
414
+ "entry": {
415
+ "id": 102,
416
+ "url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000102",
417
+ "title": "Article 102"
418
+ },
419
+ "body": {
420
+ "entry_id": 102,
421
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000102",
422
+ "title": "Article 102",
423
+ "bridge_content": "<p>Content for 102</p>"
424
+ }
425
+ },
426
+ {
427
+ "entry": {
428
+ "id": 103,
429
+ "url": "https://example.test/article-103",
430
+ "title": "Article 103"
431
+ },
432
+ "body": {
433
+ "entry_id": 103,
434
+ "canonical_url": "https://example.test/article-103",
435
+ "title": "Article 103"
436
+ }
437
+ },
438
+ {
439
+ "entry": {
440
+ "id": 104,
441
+ "url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000104",
442
+ "title": "Article 104"
443
+ },
444
+ "body": {
445
+ "entry_id": 104,
446
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000104",
447
+ "title": "Article 104",
448
+ "bridge_content": "<p>Content for 104</p>"
449
+ }
450
+ }
451
+ ]
452
+ },
453
+ {
454
+ "name": "mock: all requests match routes",
455
+ "passed": true,
456
+ "actual": []
457
+ },
458
+ {
459
+ "name": "mock: request limits and server",
460
+ "passed": true,
461
+ "actual": []
462
+ },
463
+ {
464
+ "name": "Call enrich API: POST /api/private/articles/enrich request count",
465
+ "passed": true,
466
+ "expected": 4,
467
+ "actual": 4
468
+ },
469
+ {
470
+ "name": "Call enrich API: POST /api/private/articles/enrich request bodies",
471
+ "passed": true,
472
+ "expected": [
473
+ {
474
+ "entry_id": 101,
475
+ "canonical_url": "https://example.test/article-101",
476
+ "title": "Article 101"
477
+ },
478
+ {
479
+ "entry_id": 102,
480
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000102",
481
+ "title": "Article 102",
482
+ "bridge_content": "<p>Content for 102</p>"
483
+ },
484
+ {
485
+ "entry_id": 103,
486
+ "canonical_url": "https://example.test/article-103",
487
+ "title": "Article 103"
488
+ },
489
+ {
490
+ "entry_id": 104,
491
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000104",
492
+ "title": "Article 104",
493
+ "bridge_content": "<p>Content for 104</p>"
494
+ }
495
+ ],
496
+ "actual": [
497
+ {
498
+ "entry_id": 101,
499
+ "canonical_url": "https://example.test/article-101",
500
+ "title": "Article 101"
501
+ },
502
+ {
503
+ "entry_id": 102,
504
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000102",
505
+ "title": "Article 102",
506
+ "bridge_content": "<p>Content for 102</p>"
507
+ },
508
+ {
509
+ "entry_id": 103,
510
+ "canonical_url": "https://example.test/article-103",
511
+ "title": "Article 103"
512
+ },
513
+ {
514
+ "entry_id": 104,
515
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000104",
516
+ "title": "Article 104",
517
+ "bridge_content": "<p>Content for 104</p>"
518
+ }
519
+ ]
520
+ },
521
+ {
522
+ "name": "Lookup bridge content: POST /d1/content request count",
523
+ "passed": true,
524
+ "expected": 2,
525
+ "actual": 2
526
+ },
527
+ {
528
+ "name": "Claim alert: POST /d1/claim request count",
529
+ "passed": true,
530
+ "expected": 0,
531
+ "actual": 0
532
+ },
533
+ {
534
+ "name": "Notify: POST /alert request count",
535
+ "passed": true,
536
+ "expected": 0,
537
+ "actual": 0
538
+ }
539
+ ],
540
+ "requests": [
541
+ {
542
+ "node": "Call enrich API",
543
+ "method": "POST",
544
+ "path": "/api/private/articles/enrich",
545
+ "body": {
546
+ "entry_id": 101,
547
+ "canonical_url": "https://example.test/article-101",
548
+ "title": "Article 101"
549
+ },
550
+ "status": 200
551
+ },
552
+ {
553
+ "node": "Lookup bridge content",
554
+ "method": "POST",
555
+ "path": "/d1/content",
556
+ "body": {
557
+ "sql": "SELECT readable_content FROM entries WHERE permalink_uuid = ?",
558
+ "params": [
559
+ "00000000-0000-4000-8000-000000000102"
560
+ ]
561
+ },
562
+ "status": 200
563
+ },
564
+ {
565
+ "node": "Call enrich API",
566
+ "method": "POST",
567
+ "path": "/api/private/articles/enrich",
568
+ "body": {
569
+ "entry_id": 102,
570
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000102",
571
+ "title": "Article 102",
572
+ "bridge_content": "<p>Content for 102</p>"
573
+ },
574
+ "status": 200
575
+ },
576
+ {
577
+ "node": "Call enrich API",
578
+ "method": "POST",
579
+ "path": "/api/private/articles/enrich",
580
+ "body": {
581
+ "entry_id": 103,
582
+ "canonical_url": "https://example.test/article-103",
583
+ "title": "Article 103"
584
+ },
585
+ "status": 200
586
+ },
587
+ {
588
+ "node": "Lookup bridge content",
589
+ "method": "POST",
590
+ "path": "/d1/content",
591
+ "body": {
592
+ "sql": "SELECT readable_content FROM entries WHERE permalink_uuid = ?",
593
+ "params": [
594
+ "00000000-0000-4000-8000-000000000104"
595
+ ]
596
+ },
597
+ "status": 200
598
+ },
599
+ {
600
+ "node": "Call enrich API",
601
+ "method": "POST",
602
+ "path": "/api/private/articles/enrich",
603
+ "body": {
604
+ "entry_id": 104,
605
+ "canonical_url": "https://bridge.example.test/p/00000000-0000-4000-8000-000000000104",
606
+ "title": "Article 104",
607
+ "bridge_content": "<p>Content for 104</p>"
608
+ },
609
+ "status": 200
610
+ }
611
+ ],
612
+ "loopDoneItems": 4
613
+ },
614
+ {
615
+ "name": "fixed-retry",
616
+ "startedAt": "2026-10-06T17:23:57.565Z",
617
+ "n8nVersion": "2.41.7",
618
+ "nodeVersion": "v26.10.0",
619
+ "runnerVersion": "0.1.3",
620
+ "status": "passed",
621
+ "exitCode": 0,
622
+ "network": {
623
+ "mode": "loopback-only",
624
+ "enforced": true,
625
+ "interfaces": [
626
+ "lo"
627
+ ]
628
+ },
629
+ "checks": [
630
+ {
631
+ "name": "n8n execution succeeds",
632
+ "passed": true,
633
+ "actual": {
634
+ "cliExitCode": 0,
635
+ "lastNode": "Loop Articles",
636
+ "executionFound": true
637
+ }
638
+ },
639
+ {
640
+ "name": "Build enrich request: output 0",
641
+ "passed": true,
642
+ "expected": [
643
+ {
644
+ "entry": {
645
+ "id": 101,
646
+ "url": "https://example.test/article-101",
647
+ "title": "Article 101"
648
+ },
649
+ "body": {
650
+ "entry_id": 101,
651
+ "canonical_url": "https://example.test/article-101",
652
+ "title": "Article 101"
653
+ }
654
+ },
655
+ {
656
+ "entry": {
657
+ "id": 102,
658
+ "url": "https://example.test/article-102",
659
+ "title": "Article 102"
660
+ },
661
+ "body": {
662
+ "entry_id": 102,
663
+ "canonical_url": "https://example.test/article-102",
664
+ "title": "Article 102"
665
+ }
666
+ }
667
+ ],
668
+ "actual": [
669
+ {
670
+ "entry": {
671
+ "id": 101,
672
+ "url": "https://example.test/article-101",
673
+ "title": "Article 101"
674
+ },
675
+ "body": {
676
+ "entry_id": 101,
677
+ "canonical_url": "https://example.test/article-101",
678
+ "title": "Article 101"
679
+ }
680
+ },
681
+ {
682
+ "entry": {
683
+ "id": 102,
684
+ "url": "https://example.test/article-102",
685
+ "title": "Article 102"
686
+ },
687
+ "body": {
688
+ "entry_id": 102,
689
+ "canonical_url": "https://example.test/article-102",
690
+ "title": "Article 102"
691
+ }
692
+ }
693
+ ]
694
+ },
695
+ {
696
+ "name": "mock: all requests match routes",
697
+ "passed": true,
698
+ "actual": []
699
+ },
700
+ {
701
+ "name": "mock: request limits and server",
702
+ "passed": true,
703
+ "actual": []
704
+ },
705
+ {
706
+ "name": "Call enrich API: POST /api/private/articles/enrich request count",
707
+ "passed": true,
708
+ "expected": 3,
709
+ "actual": 3
710
+ },
711
+ {
712
+ "name": "Call enrich API: POST /api/private/articles/enrich request bodies",
713
+ "passed": true,
714
+ "expected": [
715
+ {
716
+ "entry_id": 101,
717
+ "canonical_url": "https://example.test/article-101",
718
+ "title": "Article 101"
719
+ },
720
+ {
721
+ "entry_id": 102,
722
+ "canonical_url": "https://example.test/article-102",
723
+ "title": "Article 102"
724
+ },
725
+ {
726
+ "entry_id": 102,
727
+ "canonical_url": "https://example.test/article-102",
728
+ "title": "Article 102"
729
+ }
730
+ ],
731
+ "actual": [
732
+ {
733
+ "entry_id": 101,
734
+ "canonical_url": "https://example.test/article-101",
735
+ "title": "Article 101"
736
+ },
737
+ {
738
+ "entry_id": 102,
739
+ "canonical_url": "https://example.test/article-102",
740
+ "title": "Article 102"
741
+ },
742
+ {
743
+ "entry_id": 102,
744
+ "canonical_url": "https://example.test/article-102",
745
+ "title": "Article 102"
746
+ }
747
+ ]
748
+ },
749
+ {
750
+ "name": "Lookup bridge content: POST /d1/content request count",
751
+ "passed": true,
752
+ "expected": 0,
753
+ "actual": 0
754
+ },
755
+ {
756
+ "name": "Claim alert: POST /d1/claim request count",
757
+ "passed": true,
758
+ "expected": 0,
759
+ "actual": 0
760
+ },
761
+ {
762
+ "name": "Notify: POST /alert request count",
763
+ "passed": true,
764
+ "expected": 0,
765
+ "actual": 0
766
+ }
767
+ ],
768
+ "requests": [
769
+ {
770
+ "node": "Call enrich API",
771
+ "method": "POST",
772
+ "path": "/api/private/articles/enrich",
773
+ "body": {
774
+ "entry_id": 101,
775
+ "canonical_url": "https://example.test/article-101",
776
+ "title": "Article 101"
777
+ },
778
+ "status": 200
779
+ },
780
+ {
781
+ "node": "Call enrich API",
782
+ "method": "POST",
783
+ "path": "/api/private/articles/enrich",
784
+ "body": {
785
+ "entry_id": 102,
786
+ "canonical_url": "https://example.test/article-102",
787
+ "title": "Article 102"
788
+ },
789
+ "status": 503
790
+ },
791
+ {
792
+ "node": "Call enrich API",
793
+ "method": "POST",
794
+ "path": "/api/private/articles/enrich",
795
+ "body": {
796
+ "entry_id": 102,
797
+ "canonical_url": "https://example.test/article-102",
798
+ "title": "Article 102"
799
+ },
800
+ "status": 200
801
+ }
802
+ ],
803
+ "loopDoneItems": 2
804
+ }
805
+ ]
806
+ }