Test Execution Report¶
Generated: April 16, 2026 11:02:38 UTC
📊 Test Suite Summary¶
| Metric | Value |
|---|---|
| Total Tests | 336 |
| Passed | 336 ✅ |
| Failed | 0 ❌ |
| Errors | 0 ⚠️ |
| Skipped | 0 ⏭️ |
| Success Rate | 100.0% |
| Total Duration | 32.91s |
📝 Test Results by Python Version¶
Unit Tests (Python 3.10)¶
Summary: 66/66 passed • Duration: 5.19s
test_api¶
- ✅
test_health_check(0.028s) - ✅
test_liveness_probe(0.011s) - ✅
test_get_weather_success(0.032s) - ✅
test_readiness_probe(0.215s) - ✅
test_get_weather_missing_parameters(0.032s) - ✅
test_get_weather_client_error(0.019s) - ✅
test_post_weather_missing_body(0.012s) - ✅
test_post_weather_client_error(0.015s) - ✅
test_post_weather_invalid_json(0.009s) - ✅
test_get_weather_missing_city(0.010s) - ✅
test_weather_caching_same_bucket(0.013s) - ✅
test_weather_cache_invalidation(0.017s) - ✅
test_invalid_endpoint(0.008s) - ✅
test_cache_duration_configuration(0.001s) - ✅
test_cache_with_different_locations(0.014s) - ✅
test_cache_size_configuration(0.001s) - ✅
test_malformed_json_body(0.009s) - ✅
test_oversized_request_body(0.011s) - ✅
test_invalid_content_type_post(0.008s) - ✅
test_invalid_http_method(0.007s) - ✅
test_x_request_id_header(0.008s) - ✅
test_weather_coordinates_endpoint(0.702s) - ✅
test_cache_zero_duration(0.012s) - ✅
test_weather_coordinates_missing_params(0.013s) - ✅
test_weather_coordinates_invalid_latitude(0.012s) - ✅
test_recent_searches_get(0.010s) - ✅
test_recent_searches_delete(0.008s) - ✅
test_versioned_weather_get(0.287s) - ✅
test_versioned_weather_post(0.015s) - ✅
test_post_weather_missing_fields(0.009s) - ✅
test_post_weather_success(0.010s) - ✅
test_weather_coordinates_invalid_longitude(0.006s)
test_client¶
- ✅
test_extract_humidity(0.042s) - ✅
test_weather_client_initialization(0.042s) - ✅
test_extract_weather_from_json_invalid_json(0.048s) - ✅
test_get_weather_request_exception(0.042s) - ✅
test_weather_client_context_manager(0.036s) - ✅
test_fahrenheit_to_celsius_conversion(0.046s) - ✅
test_extract_wind_speed(0.065s) - ✅
test_extract_weather_from_json_missing_keys(0.043s) - ✅
test_extract_temperature(0.039s) - ✅
test_extract_temperature_not_found(0.053s) - ✅
test_get_weather_with_json_extraction(0.043s) - ✅
test_extract_weather_from_json_success(0.042s) - ✅
test_extract_condition(0.039s) - ✅
test_get_weather_fallback_to_html(0.045s) - ✅
test_extract_condition_not_found(0.043s) - ✅
test_extract_weather_from_json_no_script_tag(0.038s) - ✅
test_extract_humidity_not_found(0.039s) - ✅
test_extract_weather_json_empty_forecast(0.039s) - ✅
test_humidity_extraction_with_parent_element(0.043s) - ✅
test_async_get_weather_by_coordinates_geocode_failure(0.111s) - ✅
test_extract_wind_speed_not_found(0.041s) - ✅
test_extract_weather_json_no_hourly(0.043s) - ✅
test_get_weather_by_coordinates_geocode_failure(0.004s) - ✅
test_mph_to_kmh_conversion(0.037s) - ✅
test_get_weather_by_coordinates_geocode_exception(0.004s) - ✅
test_async_get_weather_by_coordinates_success(0.110s) - ✅
test_extract_weather_json_empty_hourly(0.043s) - ✅
test_ms_to_kmh_conversion(0.032s) - ✅
test_async_get_weather_by_coordinates_geocode_exception(0.039s) - ✅
test_extract_weather_json_exception(0.044s)
test_models¶
- ✅
test_location_creation(0.001s) - ✅
test_location_with_coordinates(0.001s) - ✅
test_weather_data_creation(0.002s) - ✅
test_weather_data_validation(0.002s)
Unit Tests (Python 3.11)¶
Summary: 66/66 passed • Duration: 4.98s
test_api¶
- ✅
test_health_check(0.029s) - ✅
test_get_weather_success(0.017s) - ✅
test_get_weather_missing_parameters(0.031s) - ✅
test_post_weather_missing_body(0.012s) - ✅
test_liveness_probe(0.010s) - ✅
test_get_weather_client_error(0.033s) - ✅
test_readiness_probe(0.256s) - ✅
test_get_weather_missing_city(0.009s) - ✅
test_post_weather_missing_fields(0.011s) - ✅
test_post_weather_invalid_json(0.013s) - ✅
test_post_weather_success(0.011s) - ✅
test_weather_caching_same_bucket(0.016s) - ✅
test_post_weather_client_error(0.016s) - ✅
test_weather_cache_invalidation(0.018s) - ✅
test_cache_size_configuration(0.002s) - ✅
test_cache_with_different_locations(0.016s) - ✅
test_cache_duration_configuration(0.001s) - ✅
test_malformed_json_body(0.011s) - ✅
test_oversized_request_body(0.009s) - ✅
test_invalid_content_type_post(0.008s) - ✅
test_x_request_id_header(0.009s) - ✅
test_invalid_http_method(0.008s) - ✅
test_weather_coordinates_endpoint(1.054s) - ✅
test_cache_zero_duration(0.011s) - ✅
test_weather_coordinates_missing_params(0.013s) - ✅
test_weather_coordinates_invalid_latitude(0.012s) - ✅
test_recent_searches_get(0.009s) - ✅
test_recent_searches_delete(0.008s) - ✅
test_versioned_weather_get(0.411s) - ✅
test_versioned_weather_post(0.011s) - ✅
test_invalid_endpoint(0.006s) - ✅
test_weather_coordinates_invalid_longitude(0.007s)
test_client¶
- ✅
test_weather_client_initialization(0.048s) - ✅
test_extract_humidity(0.050s) - ✅
test_extract_weather_from_json_invalid_json(0.055s) - ✅
test_get_weather_request_exception(0.048s) - ✅
test_weather_client_context_manager(0.042s) - ✅
test_extract_weather_from_json_missing_keys(0.065s) - ✅
test_fahrenheit_to_celsius_conversion(0.046s) - ✅
test_extract_wind_speed(0.043s) - ✅
test_extract_weather_from_json_success(0.045s) - ✅
test_extract_temperature_not_found(0.045s) - ✅
test_extract_temperature(0.045s) - ✅
test_get_weather_with_json_extraction(0.052s) - ✅
test_extract_condition(0.048s) - ✅
test_extract_weather_from_json_no_script_tag(0.051s) - ✅
test_extract_condition_not_found(0.045s) - ✅
test_get_weather_fallback_to_html(0.059s) - ✅
test_extract_weather_json_empty_forecast(0.046s) - ✅
test_humidity_extraction_with_parent_element(0.048s) - ✅
test_extract_humidity_not_found(0.042s) - ✅
test_extract_weather_json_no_hourly(0.044s) - ✅
test_get_weather_by_coordinates_geocode_failure(0.004s) - ✅
test_extract_wind_speed_not_found(0.047s) - ✅
test_async_get_weather_by_coordinates_geocode_failure(0.112s) - ✅
test_get_weather_by_coordinates_geocode_exception(0.003s) - ✅
test_async_get_weather_by_coordinates_success(0.119s) - ✅
test_extract_weather_json_empty_hourly(0.044s) - ✅
test_mph_to_kmh_conversion(0.044s) - ✅
test_extract_weather_json_exception(0.044s) - ✅
test_ms_to_kmh_conversion(0.047s) - ✅
test_async_get_weather_by_coordinates_geocode_exception(0.052s)
test_models¶
- ✅
test_location_with_coordinates(0.001s) - ✅
test_weather_data_creation(0.001s) - ✅
test_weather_data_validation(0.001s) - ✅
test_location_creation(0.001s)
Unit Tests (Python 3.12)¶
Summary: 66/66 passed • Duration: 7.93s
test_api¶
- ✅
test_health_check(0.019s) - ✅
test_get_weather_missing_parameters(0.023s) - ✅
test_liveness_probe(0.010s) - ✅
test_get_weather_missing_city(0.008s) - ✅
test_get_weather_success(0.020s) - ✅
test_readiness_probe(0.319s) - ✅
test_get_weather_client_error(0.022s) - ✅
test_post_weather_missing_body(0.012s) - ✅
test_invalid_endpoint(0.015s) - ✅
test_post_weather_invalid_json(0.011s) - ✅
test_post_weather_client_error(0.013s) - ✅
test_weather_caching_same_bucket(0.015s) - ✅
test_weather_cache_invalidation(0.017s) - ✅
test_cache_with_different_locations(0.013s) - ✅
test_cache_size_configuration(0.001s) - ✅
test_cache_duration_configuration(0.002s) - ✅
test_invalid_content_type_post(0.008s) - ✅
test_malformed_json_body(0.010s) - ✅
test_invalid_http_method(0.008s) - ✅
test_oversized_request_body(0.010s) - ✅
test_x_request_id_header(0.007s) - ✅
test_cache_zero_duration(0.010s) - ✅
test_weather_coordinates_missing_params(0.010s) - ✅
test_weather_coordinates_endpoint(0.635s) - ✅
test_weather_coordinates_invalid_latitude(0.010s) - ✅
test_weather_coordinates_invalid_longitude(0.011s) - ✅
test_recent_searches_delete(0.009s) - ✅
test_versioned_weather_get(0.505s) - ✅
test_versioned_weather_post(0.012s) - ✅
test_post_weather_missing_fields(0.014s) - ✅
test_post_weather_success(0.014s) - ✅
test_recent_searches_get(0.008s)
test_client¶
- ✅
test_weather_client_initialization(0.047s) - ✅
test_extract_humidity(0.051s) - ✅
test_get_weather_request_exception(0.054s) - ✅
test_extract_weather_from_json_invalid_json(0.055s) - ✅
test_extract_wind_speed(0.047s) - ✅
test_weather_client_context_manager(0.041s) - ✅
test_fahrenheit_to_celsius_conversion(0.048s) - ✅
test_extract_weather_from_json_missing_keys(0.088s) - ✅
test_extract_temperature(0.047s) - ✅
test_extract_weather_from_json_success(0.045s) - ✅
test_extract_temperature_not_found(0.054s) - ✅
test_extract_condition(0.044s) - ✅
test_get_weather_with_json_extraction(0.051s) - ✅
test_extract_weather_from_json_no_script_tag(0.042s) - ✅
test_extract_condition_not_found(0.051s) - ✅
test_extract_humidity_not_found(0.050s) - ✅
test_extract_weather_json_empty_forecast(0.056s) - ✅
test_get_weather_fallback_to_html(0.056s) - ✅
test_humidity_extraction_with_parent_element(0.046s) - ✅
test_extract_wind_speed_not_found(0.049s) - ✅
test_extract_weather_json_no_hourly(0.045s) - ✅
test_async_get_weather_by_coordinates_geocode_failure(0.131s) - ✅
test_get_weather_by_coordinates_geocode_failure(0.005s) - ✅
test_get_weather_by_coordinates_geocode_exception(0.005s) - ✅
test_async_get_weather_by_coordinates_success(0.120s) - ✅
test_mph_to_kmh_conversion(0.046s) - ✅
test_extract_weather_json_empty_hourly(0.044s) - ✅
test_ms_to_kmh_conversion(0.041s) - ✅
test_extract_weather_json_exception(0.044s) - ✅
test_async_get_weather_by_coordinates_geocode_exception(0.051s)
test_models¶
- ✅
test_location_with_coordinates(0.002s) - ✅
test_weather_data_creation(0.001s) - ✅
test_weather_data_validation(0.001s) - ✅
test_location_creation(0.002s)
Security Tests (Python 3.10)¶
Summary: 46/46 passed • Duration: 3.71s
TestAPIRateLimiting¶
- ✅
test_multiple_valid_requests(0.031s) - ✅
test_multiple_invalid_requests(0.036s)
TestAPISecurityGET¶
- ✅
test_oversized_input(0.059s) - ✅
test_path_traversal_attempts(0.036s) - ✅
test_sql_injection_attempts(0.033s) - ✅
test_command_injection_attempts(0.019s) - ✅
test_xss_attempts(0.017s) - ✅
test_empty_parameters(0.011s) - ✅
test_null_bytes(0.007s) - ✅
test_whitespace_only_parameters(0.010s)
TestAPISecurityPOST¶
- ✅
test_malformed_json(0.045s) - ✅
test_non_string_types(0.022s) - ✅
test_sql_injection_in_json(0.013s) - ✅
test_non_dict_json(0.021s) - ✅
test_xss_in_json(0.009s) - ✅
test_oversized_json_values(0.009s)
TestHTTPErrorHandlers¶
- ✅
test_404_not_found(0.009s) - ✅
test_405_method_not_allowed(0.011s) - ✅
test_400_bad_request_missing_required_fields(0.023s) - ✅
test_413_payload_too_large(0.031s) - ✅
test_415_unsupported_media_type(0.008s) - ✅
test_null_bytes_in_input(0.008s) - ✅
test_invalid_json_syntax(0.020s) - ✅
test_very_long_query_string(0.026s) - ✅
test_content_type_without_charset(0.560s) - ✅
test_empty_request_body_post(0.012s) - ✅
test_unicode_normalization_attack(0.010s) - ✅
test_case_sensitive_endpoints(0.011s) - ✅
test_trailing_slash_handling(0.013s) - ✅
test_header_injection_attempts(0.009s) - ✅
test_url_encoding_in_parameters(0.295s) - ✅
test_double_slash_in_path(0.008s) - ✅
test_repeated_parameters(0.342s) - ✅
test_cors_preflight_request(0.009s) - ✅
test_parameter_without_value(0.006s) - ✅
test_response_headers_present(0.006s) - ✅
test_multiple_content_types(0.007s)
TestInputValidation¶
- ✅
test_whitespace_only(0.003s) - ✅
test_empty_string(0.003s) - ✅
test_non_string_type(0.004s) - ✅
test_valid_input(0.004s) - ✅
test_none_value(0.002s) - ✅
test_special_characters_rejected(0.001s) - ✅
test_exceeds_max_length(0.001s) - ✅
test_unicode_cities_allowed(0.001s) - ✅
test_whitespace_trimming(0.001s)
Security Tests (Python 3.11)¶
Summary: 46/46 passed • Duration: 4.31s
TestAPIRateLimiting¶
- ✅
test_multiple_valid_requests(0.031s) - ✅
test_multiple_invalid_requests(0.037s)
TestAPISecurityGET¶
- ✅
test_path_traversal_attempts(0.030s) - ✅
test_oversized_input(0.064s) - ✅
test_sql_injection_attempts(0.031s) - ✅
test_command_injection_attempts(0.018s) - ✅
test_xss_attempts(0.015s) - ✅
test_null_bytes(0.005s) - ✅
test_empty_parameters(0.010s) - ✅
test_whitespace_only_parameters(0.010s)
TestAPISecurityPOST¶
- ✅
test_malformed_json(0.086s) - ✅
test_sql_injection_in_json(0.012s) - ✅
test_non_dict_json(0.025s) - ✅
test_xss_in_json(0.010s) - ✅
test_oversized_json_values(0.010s) - ✅
test_non_string_types(0.023s)
TestHTTPErrorHandlers¶
- ✅
test_405_method_not_allowed(0.011s) - ✅
test_413_payload_too_large(0.031s) - ✅
test_415_unsupported_media_type(0.009s) - ✅
test_404_not_found(0.008s) - ✅
test_empty_request_body_post(0.008s) - ✅
test_content_type_without_charset(0.458s) - ✅
test_400_bad_request_missing_required_fields(0.022s) - ✅
test_very_long_query_string(0.023s) - ✅
test_invalid_json_syntax(0.019s) - ✅
test_null_bytes_in_input(0.005s) - ✅
test_case_sensitive_endpoints(0.010s) - ✅
test_header_injection_attempts(0.006s) - ✅
test_multiple_content_types(0.008s) - ✅
test_trailing_slash_handling(0.015s) - ✅
test_double_slash_in_path(0.009s) - ✅
test_url_encoding_in_parameters(0.425s) - ✅
test_parameter_without_value(0.010s) - ✅
test_repeated_parameters(0.454s) - ✅
test_response_headers_present(0.008s) - ✅
test_unicode_normalization_attack(0.007s) - ✅
test_cors_preflight_request(0.008s)
TestInputValidation¶
- ✅
test_empty_string(0.003s) - ✅
test_valid_input(0.003s) - ✅
test_whitespace_only(0.003s) - ✅
test_non_string_type(0.004s) - ✅
test_exceeds_max_length(0.001s) - ✅
test_none_value(0.001s) - ✅
test_whitespace_trimming(0.001s) - ✅
test_unicode_cities_allowed(0.004s) - ✅
test_special_characters_rejected(0.001s)
Security Tests (Python 3.12)¶
Summary: 46/46 passed • Duration: 6.80s
TestAPIRateLimiting¶
- ✅
test_multiple_valid_requests(0.035s) - ✅
test_multiple_invalid_requests(0.034s)
TestAPISecurityGET¶
- ✅
test_path_traversal_attempts(0.025s) - ✅
test_oversized_input(0.054s) - ✅
test_sql_injection_attempts(0.028s) - ✅
test_command_injection_attempts(0.019s) - ✅
test_xss_attempts(0.015s) - ✅
test_null_bytes(0.008s) - ✅
test_empty_parameters(0.009s) - ✅
test_whitespace_only_parameters(0.010s)
TestAPISecurityPOST¶
- ✅
test_malformed_json(0.032s) - ✅
test_non_string_types(0.021s) - ✅
test_sql_injection_in_json(0.012s) - ✅
test_non_dict_json(0.021s) - ✅
test_xss_in_json(0.014s) - ✅
test_oversized_json_values(0.011s)
TestHTTPErrorHandlers¶
- ✅
test_404_not_found(0.008s) - ✅
test_405_method_not_allowed(0.012s) - ✅
test_400_bad_request_missing_required_fields(0.019s) - ✅
test_413_payload_too_large(0.038s) - ✅
test_415_unsupported_media_type(0.008s) - ✅
test_empty_request_body_post(0.009s) - ✅
test_invalid_json_syntax(0.019s) - ✅
test_very_long_query_string(0.025s) - ✅
test_null_bytes_in_input(0.005s) - ✅
test_content_type_without_charset(0.445s) - ✅
test_unicode_normalization_attack(0.012s) - ✅
test_multiple_content_types(0.009s) - ✅
test_header_injection_attempts(0.006s) - ✅
test_case_sensitive_endpoints(0.013s) - ✅
test_double_slash_in_path(0.008s) - ✅
test_url_encoding_in_parameters(0.446s) - ✅
test_parameter_without_value(0.009s) - ✅
test_repeated_parameters(0.462s) - ✅
test_response_headers_present(0.008s) - ✅
test_trailing_slash_handling(0.012s) - ✅
test_cors_preflight_request(0.007s)
TestInputValidation¶
- ✅
test_valid_input(0.004s) - ✅
test_whitespace_only(0.004s) - ✅
test_empty_string(0.005s) - ✅
test_non_string_type(0.005s) - ✅
test_whitespace_trimming(0.002s) - ✅
test_none_value(0.001s) - ✅
test_exceeds_max_length(0.002s) - ✅
test_unicode_cities_allowed(0.001s) - ✅
test_special_characters_rejected(0.001s)
🔗 Related Documentation¶
- Coverage Report - Detailed code coverage analysis
- Security Report - Security scan results
- CI/CD Status - Pipeline execution details
This report is auto-generated from CI/CD pipeline execution.
Generated by scripts/generate_reports.py.