<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="51" time="1.509" timestamp="2026-10-11T22:25:50.913598+00:00" hostname="runnervmmprz5"><testcase classname="tests.test_client" name="test_api_token_precedence[None-from-arg-Bearer from-arg]" file="tests/test_client.py" line="23" time="0.115" /><testcase classname="tests.test_client" name="test_api_token_precedence[from-env-None-Bearer from-env]" file="tests/test_client.py" line="23" time="0.021" /><testcase classname="tests.test_client" name="test_api_token_precedence[from-env-from-arg-Bearer from-arg]" file="tests/test_client.py" line="23" time="0.022" /><testcase classname="tests.test_client" name="test_no_auth_header_sent_when_unset" file="tests/test_client.py" line="46" time="0.020" /><testcase classname="tests.test_client" name="test_health_returns_parsed_body" file="tests/test_client.py" line="57" time="0.020" /><testcase classname="tests.test_client" name="test_ahealth_returns_parsed_body" file="tests/test_client.py" line="67" time="0.021" /><testcase classname="tests.test_client" name="test_health_raises_typeerror_for_undocumented_status" file="tests/test_client.py" line="77" time="0.021" /><testcase classname="tests.test_client" name="test_ahealth_raises_typeerror_for_undocumented_status" file="tests/test_client.py" line="91" time="0.020" /><testcase classname="tests.test_client" name="test_get_version_returns_parsed_body" file="tests/test_client.py" line="102" time="0.020" /><testcase classname="tests.test_client" name="test_aget_version_returns_parsed_body" file="tests/test_client.py" line="112" time="0.020" /><testcase classname="tests.test_client" name="test_context_manager_closes_underlying_client" file="tests/test_client.py" line="122" time="0.039" /><testcase classname="tests.test_client" name="test_get_version_raises_api_error" file="tests/test_client.py" line="132" time="0.021" /><testcase classname="tests.test_client" name="test_aget_version_raises_api_error" file="tests/test_client.py" line="144" time="0.020" /><testcase classname="tests.test_client" name="test_close_closes_sync_client" file="tests/test_client.py" line="155" time="0.038" /><testcase classname="tests.test_client" name="test_aclose_closes_async_client" file="tests/test_client.py" line="164" time="0.040" /><testcase classname="tests.test_client" name="test_async_context_manager_closes_underlying_client" file="tests/test_client.py" line="173" time="0.038" /><testcase classname="tests.test_client" name="test_default_construction_wires_base_url_auth_and_retry" file="tests/test_client.py" line="186" time="0.038" /><testcase classname="tests.test_client" name="test_raise_on_unexpected_status_true_raises_instead_of_returning_none" file="tests/test_client.py" line="209" time="0.019" /><testcase classname="tests.test_client" name="test_get_version_raises_typeerror_for_undocumented_status" file="tests/test_client.py" line="226" time="0.021" /><testcase classname="tests.test_client" name="test_aget_version_raises_typeerror_for_undocumented_status" file="tests/test_client.py" line="240" time="0.020" /><testcase classname="tests.test_errors" name="test_decode_error_returns_none_below_400" file="tests/test_errors.py" line="14" time="0.001" /><testcase classname="tests.test_errors" name="test_decode_error_treats_400_as_an_error" file="tests/test_errors.py" line="19" time="0.001" /><testcase classname="tests.test_errors" name="test_decode_error_parses_message" file="tests/test_errors.py" line="26" time="0.001" /><testcase classname="tests.test_errors" name="test_decode_error_tolerates_non_json_body" file="tests/test_errors.py" line="35" time="0.001" /><testcase classname="tests.test_errors" name="test_decode_error_defaults_message_when_missing" file="tests/test_errors.py" line="43" time="0.001" /><testcase classname="tests.test_errors" name="test_api_error_str" file="tests/test_errors.py" line="49" time="0.001" /><testcase classname="tests.test_errors" name="test_api_error_args_reflect_str" file="tests/test_errors.py" line="54" time="0.001" /><testcase classname="tests.test_reports" name="test_builds_the_published_tree" file="tests/test_reports.py" line="30" time="0.008" /><testcase classname="tests.test_reports" name="test_missing_input_fails_loudly" file="tests/test_reports.py" line="46" time="0.002" /><testcase classname="tests.test_retry" name="test_retries_5xx_then_succeeds" file="tests/test_retry.py" line="39" time="0.001" /><testcase classname="tests.test_retry" name="test_never_retries_other_4xx" file="tests/test_retry.py" line="54" time="0.001" /><testcase classname="tests.test_retry" name="test_exhausts_max_retries_and_returns_last_response" file="tests/test_retry.py" line="69" time="0.001" /><testcase classname="tests.test_retry" name="test_retries_transport_error_then_succeeds" file="tests/test_retry.py" line="83" time="0.001" /><testcase classname="tests.test_retry" name="test_transport_error_exhausts_retries_after_correct_attempt_count" file="tests/test_retry.py" line="110" time="0.001" /><testcase classname="tests.test_retry" name="test_retry_after_seconds_header_takes_priority_over_backoff" file="tests/test_retry.py" line="132" time="0.001" /><testcase classname="tests.test_retry" name="test_retry_after_seconds_helper_parses_http_date" file="tests/test_retry.py" line="145" time="0.001" /><testcase classname="tests.test_retry" name="test_retry_after_seconds_helper_returns_none_when_absent" file="tests/test_retry.py" line="156" time="0.001" /><testcase classname="tests.test_retry" name="test_retry_after_seconds_helper_ignores_garbage" file="tests/test_retry.py" line="160" time="0.001" /><testcase classname="tests.test_retry" name="test_retry_after_seconds_helper_parses_naive_http_date" file="tests/test_retry.py" line="164" time="0.001" /><testcase classname="tests.test_retry" name="test_retry_after_seconds_helper_clamps_past_date_to_zero" file="tests/test_retry.py" line="175" time="0.001" /><testcase classname="tests.test_retry" name="test_should_retry_raises_without_response_or_exception" file="tests/test_retry.py" line="182" time="0.001" /><testcase classname="tests.test_retry" name="test_backoff_seconds_formula" file="tests/test_retry.py" line="188" time="0.001" /><testcase classname="tests.test_retry" name="test_async_retries_5xx_then_succeeds" file="tests/test_retry.py" line="205" time="0.001" /><testcase classname="tests.test_retry" name="test_async_never_retries_other_4xx" file="tests/test_retry.py" line="234" time="0.001" /><testcase classname="tests.test_retry" name="test_async_retries_transport_error_then_succeeds" file="tests/test_retry.py" line="254" time="0.001" /><testcase classname="tests.test_retry" name="test_async_transport_error_exhausts_retries_after_correct_attempt_count" file="tests/test_retry.py" line="285" time="0.001" /><testcase classname="tests.test_retry" name="test_async_exhausts_max_retries_and_returns_last_response" file="tests/test_retry.py" line="310" time="0.001" /><testcase classname="tests.test_retry" name="test_default_sync_transport_is_a_real_http_transport" file="tests/test_retry.py" line="346" time="0.019" /><testcase classname="tests.test_retry" name="test_default_async_transport_is_a_real_http_transport" file="tests/test_retry.py" line="350" time="0.018" /><testcase classname="tests.test_retry" name="test_sync_transport_error_raises_once_retries_exhausted" file="tests/test_retry.py" line="354" time="0.001" /><testcase classname="tests.test_retry" name="test_close_and_aclose_delegate_to_wrapped_transport" file="tests/test_retry.py" line="368" time="0.001" /></testsuite></testsuites>