File size: 21,969 Bytes
dc4e6da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
{
  "generated": "2026-05-04T00:21:21.457245",
  "suites": [
    {
      "name": "functional",
      "label": "Functional Testing (Unit Testing)",
      "counts": {
        "passed": 63,
        "failed": 0,
        "error": 0,
        "skipped": 0,
        "total": 63
      },
      "tests": [
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncInputValidation::test_missing_request_id_returns_422",
          "outcome": "PASSED",
          "duration_s": 1.446
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncInputValidation::test_empty_seed_images_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.244
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncInputValidation::test_too_many_seed_images_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.258
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncInputValidation::test_invalid_seed_image_url_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.309
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncInputValidation::test_num_solutions_below_min_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.25
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncInputValidation::test_num_solutions_above_max_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.255
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncInputValidation::test_empty_body_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.243
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncBusinessLogic::test_nonexistent_request_id_is_not_422",
          "outcome": "PASSED",
          "duration_s": 0.357
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncBusinessLogic::test_nonexistent_request_id_returns_404_or_503",
          "outcome": "PASSED",
          "duration_s": 0.376
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncBusinessLogic::test_error_response_is_json",
          "outcome": "PASSED",
          "duration_s": 0.341
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncBusinessLogic::test_error_response_has_detail",
          "outcome": "PASSED",
          "duration_s": 0.324
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncBusinessLogic::test_swagger_string_tokens_not_422",
          "outcome": "PASSED",
          "duration_s": 0.334
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncBusinessLogic::test_none_google_tokens_accepted",
          "outcome": "PASSED",
          "duration_s": 0.332
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncBusinessLogic::test_num_solutions_boundary_values_schema_valid",
          "outcome": "PASSED",
          "duration_s": 0.771
        },
        {
          "nodeid": "api/tests/functional/test_generate_async_endpoint.py::TestGenerateAsyncBusinessLogic::test_missing_prompt_params_uses_defaults",
          "outcome": "PASSED",
          "duration_s": 0.396
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_missing_request_id_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.245
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_empty_seed_images_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.242
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_too_many_seed_images_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.246
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_invalid_seed_image_url_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.243
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_num_solutions_below_min_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.315
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_num_solutions_above_max_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.244
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_handwriting_ratio_out_of_range_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.489
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_non_json_body_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.394
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfInputValidation::test_empty_body_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.302
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfBusinessLogic::test_nonexistent_request_id_returns_404",
          "outcome": "PASSED",
          "duration_s": 0.301
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfBusinessLogic::test_nonexistent_request_id_error_is_json",
          "outcome": "PASSED",
          "duration_s": 0.492
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfBusinessLogic::test_nonexistent_request_id_has_detail",
          "outcome": "PASSED",
          "duration_s": 0.294
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfBusinessLogic::test_swagger_string_token_is_sanitised",
          "outcome": "PASSED",
          "duration_s": 0.382
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfBusinessLogic::test_none_google_tokens_are_accepted",
          "outcome": "PASSED",
          "duration_s": 0.31
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfBusinessLogic::test_valid_num_solutions_boundary_values_accepted",
          "outcome": "PASSED",
          "duration_s": 0.664
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfBusinessLogic::test_missing_prompt_params_uses_defaults",
          "outcome": "PASSED",
          "duration_s": 0.286
        },
        {
          "nodeid": "api/tests/functional/test_generate_pdf_endpoint.py::TestGeneratePdfBusinessLogic::test_request_id_with_user_prefix_is_accepted",
          "outcome": "PASSED",
          "duration_s": 0.301
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestRootEndpoint::test_root_returns_200",
          "outcome": "PASSED",
          "duration_s": 0.248
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestRootEndpoint::test_root_content_type_is_json",
          "outcome": "PASSED",
          "duration_s": 0.275
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestRootEndpoint::test_root_returns_healthy",
          "outcome": "PASSED",
          "duration_s": 0.001
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestRootEndpoint::test_root_response_has_version",
          "outcome": "PASSED",
          "duration_s": 0.0
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestRootEndpoint::test_root_schema_contract",
          "outcome": "PASSED",
          "duration_s": 0.0
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestHealthEndpoint::test_health_returns_200",
          "outcome": "PASSED",
          "duration_s": 0.254
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestHealthEndpoint::test_health_content_type_is_json",
          "outcome": "PASSED",
          "duration_s": 0.249
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestHealthEndpoint::test_health_returns_healthy_status",
          "outcome": "PASSED",
          "duration_s": 0.001
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestHealthEndpoint::test_health_response_has_version",
          "outcome": "PASSED",
          "duration_s": 0.001
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestHealthEndpoint::test_health_schema_contract",
          "outcome": "PASSED",
          "duration_s": 0.001
        },
        {
          "nodeid": "api/tests/functional/test_health_endpoints.py::TestHealthEndpoint::test_health_and_root_agree",
          "outcome": "PASSED",
          "duration_s": 0.538
        },
        {
          "nodeid": "api/tests/functional/test_job_status_endpoint.py::TestJobStatusEndpoint::test_unknown_uuid_returns_non_200",
          "outcome": "PASSED",
          "duration_s": 0.3
        },
        {
          "nodeid": "api/tests/functional/test_job_status_endpoint.py::TestJobStatusEndpoint::test_unknown_uuid_response_is_json",
          "outcome": "PASSED",
          "duration_s": 0.287
        },
        {
          "nodeid": "api/tests/functional/test_job_status_endpoint.py::TestJobStatusEndpoint::test_unknown_uuid_has_detail",
          "outcome": "PASSED",
          "duration_s": 0.293
        },
        {
          "nodeid": "api/tests/functional/test_job_status_endpoint.py::TestJobStatusEndpoint::test_garbage_request_id_returns_error",
          "outcome": "PASSED",
          "duration_s": 0.295
        },
        {
          "nodeid": "api/tests/functional/test_job_status_endpoint.py::TestJobStatusEndpoint::test_endpoint_is_get_only",
          "outcome": "PASSED",
          "duration_s": 0.36
        },
        {
          "nodeid": "api/tests/functional/test_job_status_endpoint.py::TestJobStatusEndpoint::test_status_field_in_known_values_if_200",
          "outcome": "PASSED",
          "duration_s": 0.303
        },
        {
          "nodeid": "api/tests/functional/test_job_status_endpoint.py::TestJobStatusEndpoint::test_200_response_contract_if_present",
          "outcome": "PASSED",
          "duration_s": 0.305
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_returns_200_for_any_user",
          "outcome": "PASSED",
          "duration_s": 0.325
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_response_is_json",
          "outcome": "PASSED",
          "duration_s": 0.32
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_response_has_required_fields",
          "outcome": "PASSED",
          "duration_s": 0.287
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_jobs_is_a_list",
          "outcome": "PASSED",
          "duration_s": 0.302
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_count_matches_jobs_length",
          "outcome": "PASSED",
          "duration_s": 0.327
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_user_id_echoed_in_response",
          "outcome": "PASSED",
          "duration_s": 0.284
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_default_limit_is_50",
          "outcome": "PASSED",
          "duration_s": 0.291
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_default_offset_is_0",
          "outcome": "PASSED",
          "duration_s": 0.309
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_custom_limit_is_respected",
          "outcome": "PASSED",
          "duration_s": 0.298
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_custom_offset_is_respected",
          "outcome": "PASSED",
          "duration_s": 0.399
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_limit_above_100_is_capped",
          "outcome": "PASSED",
          "duration_s": 0.293
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_non_integer_user_id_returns_422",
          "outcome": "PASSED",
          "duration_s": 0.249
        },
        {
          "nodeid": "api/tests/functional/test_user_jobs_endpoint.py::TestUserJobsEndpoint::test_endpoint_is_get_only",
          "outcome": "PASSED",
          "duration_s": 0.275
        }
      ],
      "summary_line": "============================= 63 passed in 20.49s =============================",
      "returncode": 0
    },
    {
      "name": "performance",
      "label": "Non-Functional Testing (Performance Testing)",
      "counts": {
        "passed": 9,
        "failed": 0,
        "error": 0,
        "skipped": 0,
        "total": 9
      },
      "tests": [
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestLightweightEndpointLatency::test_root_latency_under_threshold",
          "outcome": "PASSED",
          "duration_s": 10.77
        },
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestLightweightEndpointLatency::test_health_latency_under_threshold",
          "outcome": "PASSED",
          "duration_s": 1.334
        },
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestLightweightEndpointLatency::test_user_jobs_latency_under_threshold",
          "outcome": "PASSED",
          "duration_s": 1.628
        },
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestGeneratePdfValidationLatency::test_schema_rejection_is_fast",
          "outcome": "PASSED",
          "duration_s": 1.326
        },
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestGenerateAsyncValidationLatency::test_schema_rejection_is_fast",
          "outcome": "PASSED",
          "duration_s": 1.539
        },
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestSequentialThroughput::test_health_sequential_throughput",
          "outcome": "PASSED",
          "duration_s": 1.443
        },
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestConcurrentRequests::test_concurrent_2_health_requests",
          "outcome": "PASSED",
          "duration_s": 1.527
        },
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestConcurrentRequests::test_concurrent_4_health_requests",
          "outcome": "PASSED",
          "duration_s": 1.416
        },
        {
          "nodeid": "api/tests/performance/test_latency_throughput.py::TestConcurrentRequests::test_concurrent_wall_less_than_serial",
          "outcome": "PASSED",
          "duration_s": 9.936
        }
      ],
      "summary_line": "============================= 9 passed in 31.02s =============================",
      "returncode": 0
    },
    {
      "name": "reliability",
      "label": "Non-Functional Testing (Reliability Testing)",
      "counts": {
        "passed": 21,
        "failed": 0,
        "error": 0,
        "skipped": 0,
        "total": 21
      },
      "tests": [
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestRepeatedRequestConsistency::test_health_always_returns_200",
          "outcome": "PASSED",
          "duration_s": 3.296
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestRepeatedRequestConsistency::test_root_always_returns_200",
          "outcome": "PASSED",
          "duration_s": 1.203
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestRepeatedRequestConsistency::test_unknown_job_always_returns_same_code",
          "outcome": "PASSED",
          "duration_s": 2.157
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestRepeatedRequestConsistency::test_user_jobs_always_returns_200",
          "outcome": "PASSED",
          "duration_s": 1.684
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestRepeatedRequestConsistency::test_422_always_returned_for_missing_request_id",
          "outcome": "PASSED",
          "duration_s": 1.217
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestInvalidInputHandling::test_case[missing_request_id_pdf-https://text-to-document-generation-docgenie-api.hf.space/generate/pdf-POST-payload0-expected0]",
          "outcome": "PASSED",
          "duration_s": 0.247
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestInvalidInputHandling::test_case[missing_request_id_async-https://text-to-document-generation-docgenie-api.hf.space/generate/async-POST-payload1-expected1]",
          "outcome": "PASSED",
          "duration_s": 0.255
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestInvalidInputHandling::test_case[empty_seed_images_pdf-https://text-to-document-generation-docgenie-api.hf.space/generate/pdf-POST-payload2-expected2]",
          "outcome": "PASSED",
          "duration_s": 0.334
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestInvalidInputHandling::test_case[num_solutions_zero_pdf-https://text-to-document-generation-docgenie-api.hf.space/generate/pdf-POST-payload3-expected3]",
          "outcome": "PASSED",
          "duration_s": 0.246
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestInvalidInputHandling::test_case[non_int_user_id-https://text-to-document-generation-docgenie-api.hf.space/jobs/user/abc-GET-None-expected4]",
          "outcome": "PASSED",
          "duration_s": 0.387
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestInvalidInputHandling::test_case[nonexistent_job_status-https://text-to-document-generation-docgenie-api.hf.space/jobs/00000000-0000-0000-0000-000000000000/status-GET-None-expected5]",
          "outcome": "PASSED",
          "duration_s": 0.386
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestInvalidInputHandling::test_case[nonexistent_request_id_pdf-https://text-to-document-generation-docgenie-api.hf.space/generate/pdf-POST-payload6-expected6]",
          "outcome": "PASSED",
          "duration_s": 0.312
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestRecoveryAfterBadRequest::test_health_recovers_after_bad_generate_pdf",
          "outcome": "PASSED",
          "duration_s": 0.724
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestRecoveryAfterBadRequest::test_user_jobs_recovers_after_bad_job_status",
          "outcome": "PASSED",
          "duration_s": 0.674
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestRecoveryAfterBadRequest::test_sequential_mixed_valid_invalid",
          "outcome": "PASSED",
          "duration_s": 1.25
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestHealthAvailabilityUnderLoad::test_health_available_during_job_status_calls",
          "outcome": "PASSED",
          "duration_s": 3.461
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestSustainedLoad::test_sustained_health_calls",
          "outcome": "PASSED",
          "duration_s": 14.6
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestErrorResponseContract::test_422_has_detail_list",
          "outcome": "PASSED",
          "duration_s": 0.734
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestErrorResponseContract::test_404_has_detail_string",
          "outcome": "PASSED",
          "duration_s": 1.37
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestErrorResponseContract::test_503_has_detail_if_redis_unavailable",
          "outcome": "PASSED",
          "duration_s": 0.347
        },
        {
          "nodeid": "api/tests/reliability/test_reliability.py::TestErrorResponseContract::test_repeated_422_response_is_stable",
          "outcome": "PASSED",
          "duration_s": 3.146
        }
      ],
      "summary_line": "============================= 21 passed in 50.18s =============================",
      "returncode": 0
    }
  ]
}