Skip to content

Test Execution Report

Generated: February 17, 2026 01:31:18 UTC

📊 Test Suite Summary

Metric Value
Total Tests 339
Passed 339 ✅
Failed 0 ❌
Errors 0 ⚠️
Skipped 0 ⏭️
Success Rate 100.0%
Total Duration 17.64s

📝 Test Results by Python Version

Unit Tests (Python 3.10)

Summary: 67/67 passed • Duration: 2.77s

test_api

  • test_liveness_probe (0.009s)
  • test_post_weather_missing_body (0.009s)
  • test_weather_caching_same_bucket (0.008s)
  • test_weather_cache_invalidation (0.010s)
  • test_health_check (0.008s)
  • test_cache_with_different_locations (0.006s)
  • test_health_check_legacy (0.007s)
  • test_get_weather_missing_parameters (0.007s)
  • test_cache_size_configuration (0.001s)
  • test_readiness_probe (0.220s)
  • test_cache_duration_configuration (0.001s)
  • test_post_weather_missing_fields (0.008s)
  • test_get_weather_success (0.009s)
  • test_get_weather_missing_city (0.007s)
  • test_post_weather_success (0.008s)
  • test_invalid_content_type_post (0.003s)
  • test_post_weather_client_error (0.010s)
  • test_get_weather_client_error (0.009s)
  • test_malformed_json_body (0.004s)
  • test_post_weather_invalid_json (0.008s)
  • test_recent_searches_get (0.003s)
  • test_weather_coordinates_invalid_latitude (0.004s)
  • test_x_request_id_header (0.003s)
  • test_invalid_endpoint (0.007s)
  • test_weather_coordinates_endpoint (0.529s)
  • test_invalid_http_method (0.003s)
  • test_cache_zero_duration (0.005s)
  • test_weather_coordinates_missing_params (0.003s)
  • test_weather_coordinates_invalid_longitude (0.004s)
  • test_versioned_weather_post (0.006s)
  • test_recent_searches_delete (0.004s)
  • test_versioned_weather_get (0.399s)
  • test_oversized_request_body (0.006s)

test_client

  • test_extract_temperature (0.032s)
  • test_extract_humidity (0.032s)
  • test_extract_humidity_not_found (0.030s)
  • test_extract_temperature_not_found (0.032s)
  • test_get_weather_with_json_extraction (0.032s)
  • test_weather_client_initialization (0.023s)
  • test_extract_weather_from_json_invalid_json (0.028s)
  • test_get_weather_by_coordinates_geocode_exception (0.004s)
  • test_extract_weather_json_empty_hourly (0.030s)
  • test_mph_to_kmh_conversion (0.029s)
  • test_humidity_extraction_with_parent_element (0.031s)
  • test_get_weather_request_exception (0.031s)
  • test_async_get_weather_by_coordinates_geocode_failure (0.064s)
  • test_extract_weather_json_empty_forecast (0.030s)
  • test_extract_weather_from_json_success (0.030s)
  • test_weather_client_context_manager (0.025s)
  • test_async_get_weather_by_coordinates_success (0.067s)
  • test_extract_weather_from_json_missing_keys (0.026s)
  • test_extract_weather_json_exception (0.026s)
  • test_extract_weather_json_no_hourly (0.028s)
  • test_ms_to_kmh_conversion (0.026s)
  • test_extract_condition (0.028s)
  • test_extract_wind_speed_not_found (0.029s)
  • test_get_weather_by_coordinates_geocode_failure (0.002s)
  • test_extract_weather_from_json_no_script_tag (0.027s)
  • test_fahrenheit_to_celsius_conversion (0.028s)
  • test_extract_wind_speed (0.028s)
  • test_extract_condition_not_found (0.029s)
  • test_get_weather_fallback_to_html (0.031s)
  • test_async_get_weather_by_coordinates_geocode_exception (0.029s)

test_models

  • test_location_creation (0.002s)
  • test_location_with_coordinates (0.001s)
  • test_weather_data_creation (0.001s)
  • test_weather_data_validation (0.001s)

Unit Tests (Python 3.11)

Summary: 67/67 passed • Duration: 2.84s

test_api

  • test_health_check_legacy (0.007s)
  • test_get_weather_client_error (0.005s)
  • test_post_weather_client_error (0.011s)
  • test_weather_cache_invalidation (0.009s)
  • test_cache_with_different_locations (0.010s)
  • test_health_check (0.008s)
  • test_readiness_probe (0.219s)
  • test_get_weather_missing_parameters (0.008s)
  • test_liveness_probe (0.007s)
  • test_get_weather_missing_city (0.007s)
  • test_post_weather_missing_body (0.007s)
  • test_post_weather_success (0.010s)
  • test_cache_duration_configuration (0.001s)
  • test_cache_size_configuration (0.001s)
  • test_post_weather_missing_fields (0.009s)
  • test_x_request_id_header (0.003s)
  • test_malformed_json_body (0.003s)
  • test_invalid_http_method (0.003s)
  • test_cache_zero_duration (0.006s)
  • test_weather_coordinates_endpoint (0.595s)
  • test_weather_caching_same_bucket (0.013s)
  • test_get_weather_success (0.009s)
  • test_weather_coordinates_missing_params (0.003s)
  • test_recent_searches_delete (0.003s)
  • test_invalid_endpoint (0.007s)
  • test_versioned_weather_get (0.552s)
  • test_weather_coordinates_invalid_longitude (0.004s)
  • test_recent_searches_get (0.003s)
  • test_post_weather_invalid_json (0.009s)
  • test_weather_coordinates_invalid_latitude (0.008s)
  • test_versioned_weather_post (0.006s)
  • test_invalid_content_type_post (0.010s)
  • test_oversized_request_body (0.004s)

test_client

  • test_get_weather_by_coordinates_geocode_exception (0.004s)
  • test_extract_temperature (0.028s)
  • test_extract_humidity (0.030s)
  • test_extract_humidity_not_found (0.039s)
  • test_extract_weather_from_json_success (0.021s)
  • test_extract_weather_json_empty_forecast (0.028s)
  • test_get_weather_with_json_extraction (0.033s)
  • test_get_weather_request_exception (0.028s)
  • test_async_get_weather_by_coordinates_geocode_failure (0.058s)
  • test_extract_temperature_not_found (0.031s)
  • test_extract_weather_json_empty_hourly (0.030s)
  • test_extract_weather_from_json_invalid_json (0.030s)
  • test_mph_to_kmh_conversion (0.030s)
  • test_humidity_extraction_with_parent_element (0.022s)
  • test_weather_client_initialization (0.029s)
  • test_extract_weather_from_json_no_script_tag (0.026s)
  • test_get_weather_by_coordinates_geocode_failure (0.002s)
  • test_async_get_weather_by_coordinates_success (0.067s)
  • test_extract_weather_from_json_missing_keys (0.027s)
  • test_ms_to_kmh_conversion (0.027s)
  • test_extract_condition (0.027s)
  • test_weather_client_context_manager (0.027s)
  • test_extract_condition_not_found (0.029s)
  • test_extract_weather_json_no_hourly (0.029s)
  • test_fahrenheit_to_celsius_conversion (0.032s)
  • test_extract_weather_json_exception (0.026s)
  • test_get_weather_fallback_to_html (0.032s)
  • test_extract_wind_speed_not_found (0.029s)
  • test_extract_wind_speed (0.029s)
  • test_async_get_weather_by_coordinates_geocode_exception (0.028s)

test_models

  • test_location_creation (0.002s)
  • test_location_with_coordinates (0.001s)
  • test_weather_data_creation (0.001s)
  • test_weather_data_validation (0.001s)

Unit Tests (Python 3.12)

Summary: 67/67 passed • Duration: 3.33s

test_api

  • test_readiness_probe (0.178s)
  • test_liveness_probe (0.006s)
  • test_get_weather_missing_city (0.002s)
  • test_post_weather_missing_body (0.007s)
  • test_post_weather_missing_fields (0.002s)
  • test_health_check (0.007s)
  • test_post_weather_client_error (0.003s)
  • test_post_weather_success (0.004s)
  • test_post_weather_invalid_json (0.007s)
  • test_get_weather_client_error (0.005s)
  • test_weather_caching_same_bucket (0.006s)
  • test_weather_cache_invalidation (0.005s)
  • test_invalid_endpoint (0.002s)
  • test_cache_with_different_locations (0.005s)
  • test_cache_size_configuration (0.001s)
  • test_invalid_content_type_post (0.002s)
  • test_cache_duration_configuration (0.000s)
  • test_oversized_request_body (0.002s)
  • test_invalid_http_method (0.002s)
  • test_x_request_id_header (0.002s)
  • test_malformed_json_body (0.002s)
  • test_cache_zero_duration (0.003s)
  • test_weather_coordinates_endpoint (0.602s)
  • test_weather_coordinates_missing_params (0.002s)
  • test_weather_coordinates_invalid_latitude (0.002s)
  • test_recent_searches_delete (0.002s)
  • test_weather_coordinates_invalid_longitude (0.002s)
  • test_versioned_weather_get (0.402s)
  • test_versioned_weather_post (0.003s)
  • test_health_check_legacy (0.006s)
  • test_get_weather_success (0.007s)
  • test_get_weather_missing_parameters (0.003s)
  • test_recent_searches_get (0.002s)

test_client

  • test_extract_weather_from_json_invalid_json (0.018s)
  • test_weather_client_initialization (0.017s)
  • test_extract_weather_from_json_success (0.018s)
  • test_extract_temperature_not_found (0.021s)
  • test_get_weather_with_json_extraction (0.021s)
  • test_get_weather_request_exception (0.019s)
  • test_extract_temperature (0.020s)
  • test_extract_humidity (0.020s)
  • test_get_weather_fallback_to_html (0.022s)
  • test_weather_client_context_manager (0.016s)
  • test_extract_wind_speed (0.020s)
  • test_extract_weather_from_json_missing_keys (0.016s)
  • test_extract_condition (0.017s)
  • test_extract_weather_from_json_no_script_tag (0.016s)
  • test_fahrenheit_to_celsius_conversion (0.019s)
  • test_extract_condition_not_found (0.018s)
  • test_extract_humidity_not_found (0.018s)
  • test_mph_to_kmh_conversion (0.020s)
  • test_humidity_extraction_with_parent_element (0.026s)
  • test_extract_weather_json_empty_hourly (0.016s)
  • test_extract_weather_json_empty_forecast (0.023s)
  • test_get_weather_by_coordinates_geocode_failure (0.004s)
  • test_extract_weather_json_exception (0.016s)
  • test_extract_weather_json_no_hourly (0.016s)
  • test_async_get_weather_by_coordinates_geocode_exception (0.083s)
  • test_extract_wind_speed_not_found (0.019s)
  • test_ms_to_kmh_conversion (0.015s)
  • test_async_get_weather_by_coordinates_success (0.052s)
  • test_get_weather_by_coordinates_geocode_exception (0.004s)
  • test_async_get_weather_by_coordinates_geocode_failure (0.053s)

test_models

  • test_location_with_coordinates (0.001s)
  • test_location_creation (0.001s)
  • test_weather_data_validation (0.001s)
  • test_weather_data_creation (0.001s)

Security Tests (Python 3.10)

Summary: 46/46 passed • Duration: 2.67s

TestAPIRateLimiting

  • test_multiple_invalid_requests (0.017s)
  • test_multiple_valid_requests (0.013s)

TestAPISecurityGET

  • test_xss_attempts (0.011s)
  • test_oversized_input (0.008s)
  • test_command_injection_attempts (0.013s)
  • test_whitespace_only_parameters (0.009s)
  • test_sql_injection_attempts (0.010s)
  • test_path_traversal_attempts (0.005s)
  • test_null_bytes (0.003s)
  • test_empty_parameters (0.003s)

TestAPISecurityPOST

  • test_non_string_types (0.014s)
  • test_oversized_json_values (0.008s)
  • test_xss_in_json (0.009s)
  • test_malformed_json (0.007s)
  • test_sql_injection_in_json (0.003s)
  • test_non_dict_json (0.010s)

TestHTTPErrorHandlers

  • test_invalid_json_syntax (0.011s)
  • test_405_method_not_allowed (0.009s)
  • test_400_bad_request_missing_required_fields (0.012s)
  • test_415_unsupported_media_type (0.003s)
  • test_content_type_without_charset (0.433s)
  • test_413_payload_too_large (0.019s)
  • test_404_not_found (0.002s)
  • test_null_bytes_in_input (0.007s)
  • test_case_sensitive_endpoints (0.004s)
  • test_cors_preflight_request (0.003s)
  • test_unicode_normalization_attack (0.008s)
  • test_header_injection_attempts (0.009s)
  • test_double_slash_in_path (0.003s)
  • test_url_encoding_in_parameters (0.432s)
  • test_very_long_query_string (0.010s)
  • test_empty_request_body_post (0.004s)
  • test_response_headers_present (0.003s)
  • test_repeated_parameters (0.457s)
  • test_parameter_without_value (0.004s)
  • test_multiple_content_types (0.004s)
  • test_trailing_slash_handling (0.003s)

TestInputValidation

  • test_whitespace_only (0.002s)
  • test_valid_input (0.003s)
  • test_unicode_cities_allowed (0.002s)
  • test_empty_string (0.003s)
  • test_non_string_type (0.002s)
  • test_exceeds_max_length (0.001s)
  • test_none_value (0.001s)
  • test_special_characters_rejected (0.001s)
  • test_whitespace_trimming (0.001s)

Security Tests (Python 3.11)

Summary: 46/46 passed • Duration: 2.80s

TestAPIRateLimiting

  • test_multiple_invalid_requests (0.017s)
  • test_multiple_valid_requests (0.015s)

TestAPISecurityGET

  • test_whitespace_only_parameters (0.008s)
  • test_oversized_input (0.011s)
  • test_xss_attempts (0.012s)
  • test_command_injection_attempts (0.014s)
  • test_path_traversal_attempts (0.005s)
  • test_null_bytes (0.003s)
  • test_sql_injection_attempts (0.011s)
  • test_empty_parameters (0.004s)

TestAPISecurityPOST

  • test_xss_in_json (0.010s)
  • test_oversized_json_values (0.009s)
  • test_non_string_types (0.013s)
  • test_malformed_json (0.005s)
  • test_sql_injection_in_json (0.003s)
  • test_non_dict_json (0.010s)

TestHTTPErrorHandlers

  • test_invalid_json_syntax (0.012s)
  • test_405_method_not_allowed (0.010s)
  • test_400_bad_request_missing_required_fields (0.012s)
  • test_415_unsupported_media_type (0.003s)
  • test_413_payload_too_large (0.022s)
  • test_content_type_without_charset (0.525s)
  • test_404_not_found (0.003s)
  • test_empty_request_body_post (0.008s)
  • test_null_bytes_in_input (0.008s)
  • test_header_injection_attempts (0.009s)
  • test_multiple_content_types (0.006s)
  • test_very_long_query_string (0.009s)
  • test_parameter_without_value (0.003s)
  • test_case_sensitive_endpoints (0.004s)
  • test_response_headers_present (0.003s)
  • test_cors_preflight_request (0.003s)
  • test_unicode_normalization_attack (0.004s)
  • test_url_encoding_in_parameters (0.502s)
  • test_trailing_slash_handling (0.006s)
  • test_repeated_parameters (0.502s)
  • test_double_slash_in_path (0.001s)

TestInputValidation

  • test_whitespace_only (0.002s)
  • test_empty_string (0.002s)
  • test_unicode_cities_allowed (0.002s)
  • test_valid_input (0.002s)
  • test_non_string_type (0.002s)
  • test_whitespace_trimming (0.001s)
  • test_none_value (0.001s)
  • test_special_characters_rejected (0.001s)
  • test_exceeds_max_length (0.001s)

Security Tests (Python 3.12)

Summary: 46/46 passed • Duration: 3.23s

TestAPIRateLimiting

  • test_multiple_valid_requests (0.012s)
  • test_multiple_invalid_requests (0.012s)

TestAPISecurityGET

  • test_xss_attempts (0.008s)
  • test_oversized_input (0.008s)
  • test_command_injection_attempts (0.009s)
  • test_path_traversal_attempts (0.003s)
  • test_sql_injection_attempts (0.011s)
  • test_null_bytes (0.002s)
  • test_empty_parameters (0.003s)
  • test_whitespace_only_parameters (0.006s)

TestAPISecurityPOST

  • test_xss_in_json (0.002s)
  • test_non_string_types (0.014s)
  • test_oversized_json_values (0.002s)
  • test_non_dict_json (0.014s)
  • test_sql_injection_in_json (0.006s)
  • test_malformed_json (0.006s)

TestHTTPErrorHandlers

  • test_413_payload_too_large (0.015s)
  • test_invalid_json_syntax (0.005s)
  • test_400_bad_request_missing_required_fields (0.004s)
  • test_empty_request_body_post (0.002s)
  • test_404_not_found (0.002s)
  • test_405_method_not_allowed (0.004s)
  • test_unicode_normalization_attack (0.003s)
  • test_very_long_query_string (0.003s)
  • test_415_unsupported_media_type (0.003s)
  • test_header_injection_attempts (0.002s)
  • test_repeated_parameters (0.401s)
  • test_null_bytes_in_input (0.002s)
  • test_double_slash_in_path (0.002s)
  • test_trailing_slash_handling (0.003s)
  • test_url_encoding_in_parameters (0.365s)
  • test_content_type_without_charset (0.411s)
  • test_case_sensitive_endpoints (0.004s)
  • test_multiple_content_types (0.003s)
  • test_parameter_without_value (0.002s)
  • test_cors_preflight_request (0.002s)
  • test_response_headers_present (0.002s)

TestInputValidation

  • test_empty_string (0.002s)
  • test_non_string_type (0.002s)
  • test_unicode_cities_allowed (0.002s)
  • test_valid_input (0.002s)
  • test_whitespace_only (0.002s)
  • test_none_value (0.001s)
  • test_exceeds_max_length (0.001s)
  • test_special_characters_rejected (0.001s)
  • test_whitespace_trimming (0.001s)

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