Skip to content

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)

This report is auto-generated from CI/CD pipeline execution. Generated by scripts/generate_reports.py.