| { |
| "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 |
| } |
| ] |
| } |