Test Execution Report¶
Generated: May 15, 2026 01:37:47 UTC
📊 Test Suite Summary¶
| Metric | Value |
|---|---|
| Total Tests | 336 |
| Passed | 336 ✅ |
| Failed | 0 ❌ |
| Errors | 0 ⚠️ |
| Skipped | 0 ⏭️ |
| Success Rate | 100.0% |
| Total Duration | 31.28s |
📝 Test Results by Python Version¶
Unit Tests (Python 3.10)¶
Summary: 66/66 passed • Duration: 5.63s
test_api¶
- ✅
test_health_check(0.021s) - ✅
test_get_weather_missing_parameters(0.022s) - ✅
test_liveness_probe(0.008s) - ✅
test_get_weather_missing_city(0.009s) - ✅
test_readiness_probe(0.209s) - ✅
test_get_weather_success(0.010s) - ✅
test_get_weather_client_error(0.019s) - ✅
test_post_weather_missing_body(0.012s) - ✅
test_post_weather_client_error(0.017s) - ✅
test_post_weather_invalid_json(0.009s) - ✅
test_invalid_endpoint(0.008s) - ✅
test_weather_cache_invalidation(0.033s) - ✅
test_weather_caching_same_bucket(0.015s) - ✅
test_cache_with_different_locations(0.011s) - ✅
test_cache_duration_configuration(0.001s) - ✅
test_invalid_content_type_post(0.009s) - ✅
test_oversized_request_body(0.010s) - ✅
test_cache_size_configuration(0.001s) - ✅
test_malformed_json_body(0.011s) - ✅
test_cache_zero_duration(0.010s) - ✅
test_invalid_http_method(0.008s) - ✅
test_x_request_id_header(0.008s) - ✅
test_weather_coordinates_missing_params(0.011s) - ✅
test_weather_coordinates_endpoint(0.391s) - ✅
test_weather_coordinates_invalid_latitude(0.012s) - ✅
test_recent_searches_get(0.009s) - ✅
test_recent_searches_delete(0.009s) - ✅
test_versioned_weather_get(0.465s) - ✅
test_versioned_weather_post(0.010s) - ✅
test_post_weather_missing_fields(0.011s) - ✅
test_post_weather_success(0.010s) - ✅
test_weather_coordinates_invalid_longitude(0.006s)
test_client¶
- ✅
test_weather_client_initialization(0.041s) - ✅
test_extract_weather_from_json_invalid_json(0.043s) - ✅
test_extract_humidity(0.043s) - ✅
test_get_weather_request_exception(0.046s) - ✅
test_extract_weather_from_json_missing_keys(0.039s) - ✅
test_weather_client_context_manager(0.036s) - ✅
test_extract_wind_speed(0.038s) - ✅
test_fahrenheit_to_celsius_conversion(0.068s) - ✅
test_extract_temperature(0.050s) - ✅
test_extract_weather_from_json_success(0.039s) - ✅
test_get_weather_with_json_extraction(0.041s) - ✅
test_extract_temperature_not_found(0.046s) - ✅
test_extract_weather_from_json_no_script_tag(0.037s) - ✅
test_get_weather_fallback_to_html(0.045s) - ✅
test_extract_condition(0.038s) - ✅
test_extract_weather_json_empty_forecast(0.041s) - ✅
test_extract_condition_not_found(0.044s) - ✅
test_extract_humidity_not_found(0.040s) - ✅
test_humidity_extraction_with_parent_element(0.039s) - ✅
test_extract_weather_json_no_hourly(0.037s) - ✅
test_extract_wind_speed_not_found(0.038s) - ✅
test_async_get_weather_by_coordinates_geocode_failure(0.138s) - ✅
test_get_weather_by_coordinates_geocode_failure(0.004s) - ✅
test_get_weather_by_coordinates_geocode_exception(0.003s) - ✅
test_async_get_weather_by_coordinates_success(0.128s) - ✅
test_extract_weather_json_empty_hourly(0.037s) - ✅
test_mph_to_kmh_conversion(0.037s) - ✅
test_extract_weather_json_exception(0.037s) - ✅
test_ms_to_kmh_conversion(0.037s) - ✅
test_async_get_weather_by_coordinates_geocode_exception(0.049s)
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.11)¶
Summary: 66/66 passed • Duration: 4.72s
test_api¶
- ✅
test_health_check(0.031s) - ✅
test_get_weather_missing_parameters(0.033s) - ✅
test_get_weather_success(0.038s) - ✅
test_liveness_probe(0.012s) - ✅
test_post_weather_missing_fields(0.018s) - ✅
test_readiness_probe(0.190s) - ✅
test_get_weather_missing_city(0.010s) - ✅
test_post_weather_missing_body(0.012s) - ✅
test_post_weather_success(0.013s) - ✅
test_post_weather_client_error(0.020s) - ✅
test_post_weather_invalid_json(0.010s) - ✅
test_invalid_endpoint(0.012s) - ✅
test_weather_caching_same_bucket(0.017s) - ✅
test_weather_cache_invalidation(0.019s) - ✅
test_cache_with_different_locations(0.016s) - ✅
test_cache_size_configuration(0.002s) - ✅
test_invalid_content_type_post(0.008s) - ✅
test_cache_duration_configuration(0.001s) - ✅
test_malformed_json_body(0.011s) - ✅
test_invalid_http_method(0.010s) - ✅
test_oversized_request_body(0.011s) - ✅
test_x_request_id_header(0.010s) - ✅
test_cache_zero_duration(0.014s) - ✅
test_weather_coordinates_endpoint(0.676s) - ✅
test_weather_coordinates_missing_params(0.014s) - ✅
test_weather_coordinates_invalid_latitude(0.013s) - ✅
test_recent_searches_get(0.011s) - ✅
test_recent_searches_delete(0.010s) - ✅
test_versioned_weather_get(0.323s) - ✅
test_versioned_weather_post(0.012s) - ✅
test_get_weather_client_error(0.015s) - ✅
test_weather_coordinates_invalid_longitude(0.007s)
test_client¶
- ✅
test_extract_weather_from_json_invalid_json(0.049s) - ✅
test_get_weather_request_exception(0.051s) - ✅
test_extract_humidity(0.052s) - ✅
test_weather_client_initialization(0.048s) - ✅
test_weather_client_context_manager(0.042s) - ✅
test_extract_weather_from_json_missing_keys(0.046s) - ✅
test_fahrenheit_to_celsius_conversion(0.071s) - ✅
test_extract_wind_speed(0.045s) - ✅
test_extract_temperature(0.045s) - ✅
test_get_weather_with_json_extraction(0.048s) - ✅
test_extract_weather_from_json_success(0.046s) - ✅
test_extract_temperature_not_found(0.051s) - ✅
test_extract_condition(0.043s) - ✅
test_extract_weather_from_json_no_script_tag(0.044s) - ✅
test_get_weather_fallback_to_html(0.061s) - ✅
test_extract_condition_not_found(0.046s) - ✅
test_extract_humidity_not_found(0.045s) - ✅
test_extract_weather_json_empty_forecast(0.047s) - ✅
test_humidity_extraction_with_parent_element(0.048s) - ✅
test_async_get_weather_by_coordinates_geocode_failure(0.112s) - ✅
test_extract_wind_speed_not_found(0.047s) - ✅
test_extract_weather_json_no_hourly(0.046s) - ✅
test_get_weather_by_coordinates_geocode_failure(0.004s) - ✅
test_get_weather_by_coordinates_geocode_exception(0.004s) - ✅
test_async_get_weather_by_coordinates_success(0.119s) - ✅
test_mph_to_kmh_conversion(0.043s) - ✅
test_extract_weather_json_empty_hourly(0.046s) - ✅
test_ms_to_kmh_conversion(0.043s) - ✅
test_extract_weather_json_exception(0.046s) - ✅
test_async_get_weather_by_coordinates_geocode_exception(0.043s)
test_models¶
- ✅
test_location_creation(0.001s) - ✅
test_location_with_coordinates(0.001s) - ✅
test_weather_data_creation(0.001s) - ✅
test_weather_data_validation(0.003s)
Unit Tests (Python 3.12)¶
Summary: 66/66 passed • Duration: 6.90s
test_api¶
- ✅
test_health_check(0.022s) - ✅
test_get_weather_missing_parameters(0.022s) - ✅
test_liveness_probe(0.008s) - ✅
test_get_weather_success(0.022s) - ✅
test_get_weather_missing_city(0.009s) - ✅
test_readiness_probe(0.322s) - ✅
test_post_weather_missing_fields(0.019s) - ✅
test_get_weather_client_error(0.017s) - ✅
test_post_weather_missing_body(0.010s) - ✅
test_post_weather_success(0.010s) - ✅
test_invalid_endpoint(0.008s) - ✅
test_post_weather_invalid_json(0.012s) - ✅
test_weather_caching_same_bucket(0.015s) - ✅
test_weather_cache_invalidation(0.016s) - ✅
test_cache_with_different_locations(0.016s) - ✅
test_cache_size_configuration(0.001s) - ✅
test_cache_duration_configuration(0.001s) - ✅
test_malformed_json_body(0.009s) - ✅
test_oversized_request_body(0.008s) - ✅
test_invalid_content_type_post(0.007s) - ✅
test_invalid_http_method(0.008s) - ✅
test_x_request_id_header(0.008s) - ✅
test_cache_zero_duration(0.010s) - ✅
test_weather_coordinates_endpoint(0.536s) - ✅
test_weather_coordinates_missing_params(0.009s) - ✅
test_weather_coordinates_invalid_latitude(0.009s) - ✅
test_recent_searches_get(0.009s) - ✅
test_recent_searches_delete(0.008s) - ✅
test_versioned_weather_get(0.650s) - ✅
test_versioned_weather_post(0.007s) - ✅
test_post_weather_client_error(0.010s) - ✅
test_weather_coordinates_invalid_longitude(0.006s)
test_client¶
- ✅
test_extract_humidity(0.046s) - ✅
test_get_weather_request_exception(0.047s) - ✅
test_extract_weather_from_json_invalid_json(0.046s) - ✅
test_weather_client_initialization(0.042s) - ✅
test_extract_wind_speed(0.042s) - ✅
test_fahrenheit_to_celsius_conversion(0.043s) - ✅
test_extract_weather_from_json_missing_keys(0.051s) - ✅
test_weather_client_context_manager(0.064s) - ✅
test_extract_temperature_not_found(0.048s) - ✅
test_extract_weather_from_json_success(0.049s) - ✅
test_get_weather_with_json_extraction(0.047s) - ✅
test_extract_temperature(0.043s) - ✅
test_extract_condition_not_found(0.041s) - ✅
test_extract_weather_from_json_no_script_tag(0.040s) - ✅
test_get_weather_fallback_to_html(0.050s) - ✅
test_extract_condition(0.040s) - ✅
test_extract_weather_json_empty_forecast(0.051s) - ✅
test_extract_humidity_not_found(0.040s) - ✅
test_humidity_extraction_with_parent_element(0.041s) - ✅
test_async_get_weather_by_coordinates_geocode_failure(0.130s) - ✅
test_extract_wind_speed_not_found(0.042s) - ✅
test_extract_weather_json_no_hourly(0.039s) - ✅
test_get_weather_by_coordinates_geocode_failure(0.006s) - ✅
test_get_weather_by_coordinates_geocode_exception(0.007s) - ✅
test_async_get_weather_by_coordinates_success(0.105s) - ✅
test_mph_to_kmh_conversion(0.038s) - ✅
test_extract_weather_json_empty_hourly(0.038s) - ✅
test_ms_to_kmh_conversion(0.040s) - ✅
test_extract_weather_json_exception(0.037s) - ✅
test_async_get_weather_by_coordinates_geocode_exception(0.036s)
test_models¶
- ✅
test_location_with_coordinates(0.002s) - ✅
test_location_creation(0.001s) - ✅
test_weather_data_creation(0.002s) - ✅
test_weather_data_validation(0.001s)
Security Tests (Python 3.10)¶
Summary: 46/46 passed • Duration: 3.84s
TestAPIRateLimiting¶
- ✅
test_multiple_valid_requests(0.029s) - ✅
test_multiple_invalid_requests(0.033s)
TestAPISecurityGET¶
- ✅
test_path_traversal_attempts(0.033s) - ✅
test_oversized_input(0.056s) - ✅
test_sql_injection_attempts(0.036s) - ✅
test_command_injection_attempts(0.018s) - ✅
test_xss_attempts(0.015s) - ✅
test_empty_parameters(0.009s) - ✅
test_null_bytes(0.007s) - ✅
test_whitespace_only_parameters(0.010s)
TestAPISecurityPOST¶
- ✅
test_malformed_json(0.037s) - ✅
test_non_string_types(0.024s) - ✅
test_non_dict_json(0.023s) - ✅
test_sql_injection_in_json(0.010s) - ✅
test_xss_in_json(0.010s) - ✅
test_oversized_json_values(0.011s)
TestHTTPErrorHandlers¶
- ✅
test_404_not_found(0.009s) - ✅
test_405_method_not_allowed(0.011s) - ✅
test_413_payload_too_large(0.033s) - ✅
test_415_unsupported_media_type(0.010s) - ✅
test_400_bad_request_missing_required_fields(0.019s) - ✅
test_null_bytes_in_input(0.006s) - ✅
test_empty_request_body_post(0.008s) - ✅
test_very_long_query_string(0.025s) - ✅
test_invalid_json_syntax(0.022s) - ✅
test_content_type_without_charset(0.363s) - ✅
test_unicode_normalization_attack(0.008s) - ✅
test_trailing_slash_handling(0.013s) - ✅
test_multiple_content_types(0.008s) - ✅
test_header_injection_attempts(0.006s) - ✅
test_double_slash_in_path(0.009s) - ✅
test_url_encoding_in_parameters(0.499s) - ✅
test_repeated_parameters(0.712s) - ✅
test_parameter_without_value(0.009s) - ✅
test_case_sensitive_endpoints(0.007s) - ✅
test_cors_preflight_request(0.006s) - ✅
test_response_headers_present(0.006s)
TestInputValidation¶
- ✅
test_non_string_type(0.003s) - ✅
test_valid_input(0.004s) - ✅
test_whitespace_only(0.004s) - ✅
test_empty_string(0.005s) - ✅
test_none_value(0.001s) - ✅
test_special_characters_rejected(0.001s) - ✅
test_whitespace_trimming(0.001s) - ✅
test_exceeds_max_length(0.001s) - ✅
test_unicode_cities_allowed(0.001s)
Security Tests (Python 3.11)¶
Summary: 46/46 passed • Duration: 4.45s
TestAPIRateLimiting¶
- ✅
test_multiple_valid_requests(0.038s) - ✅
test_multiple_invalid_requests(0.043s)
TestAPISecurityGET¶
- ✅
test_path_traversal_attempts(0.036s) - ✅
test_oversized_input(0.059s) - ✅
test_sql_injection_attempts(0.034s) - ✅
test_command_injection_attempts(0.023s) - ✅
test_xss_attempts(0.019s) - ✅
test_empty_parameters(0.013s) - ✅
test_null_bytes(0.006s) - ✅
test_whitespace_only_parameters(0.012s)
TestAPISecurityPOST¶
- ✅
test_malformed_json(0.042s) - ✅
test_non_string_types(0.029s) - ✅
test_sql_injection_in_json(0.014s) - ✅
test_xss_in_json(0.011s) - ✅
test_non_dict_json(0.026s) - ✅
test_oversized_json_values(0.013s)
TestHTTPErrorHandlers¶
- ✅
test_405_method_not_allowed(0.014s) - ✅
test_404_not_found(0.011s) - ✅
test_413_payload_too_large(0.030s) - ✅
test_400_bad_request_missing_required_fields(0.025s) - ✅
test_content_type_without_charset(0.428s) - ✅
test_invalid_json_syntax(0.024s) - ✅
test_415_unsupported_media_type(0.010s) - ✅
test_unicode_normalization_attack(0.015s) - ✅
test_empty_request_body_post(0.014s) - ✅
test_very_long_query_string(0.023s) - ✅
test_header_injection_attempts(0.007s) - ✅
test_multiple_content_types(0.011s) - ✅
test_trailing_slash_handling(0.018s) - ✅
test_double_slash_in_path(0.010s) - ✅
test_case_sensitive_endpoints(0.013s) - ✅
test_url_encoding_in_parameters(0.389s) - ✅
test_repeated_parameters(0.557s) - ✅
test_parameter_without_value(0.011s) - ✅
test_null_bytes_in_input(0.004s) - ✅
test_cors_preflight_request(0.008s) - ✅
test_response_headers_present(0.009s)
TestInputValidation¶
- ✅
test_whitespace_only(0.004s) - ✅
test_non_string_type(0.004s) - ✅
test_empty_string(0.004s) - ✅
test_valid_input(0.005s) - ✅
test_exceeds_max_length(0.001s) - ✅
test_none_value(0.001s) - ✅
test_unicode_cities_allowed(0.001s) - ✅
test_whitespace_trimming(0.002s) - ✅
test_special_characters_rejected(0.001s)
Security Tests (Python 3.12)¶
Summary: 46/46 passed • Duration: 5.74s
TestAPIRateLimiting¶
- ✅
test_multiple_valid_requests(0.031s) - ✅
test_multiple_invalid_requests(0.030s)
TestAPISecurityGET¶
- ✅
test_path_traversal_attempts(0.023s) - ✅
test_sql_injection_attempts(0.024s) - ✅
test_oversized_input(0.046s) - ✅
test_command_injection_attempts(0.019s) - ✅
test_xss_attempts(0.015s) - ✅
test_null_bytes(0.005s) - ✅
test_empty_parameters(0.008s) - ✅
test_whitespace_only_parameters(0.010s)
TestAPISecurityPOST¶
- ✅
test_malformed_json(0.031s) - ✅
test_non_string_types(0.022s) - ✅
test_sql_injection_in_json(0.011s) - ✅
test_xss_in_json(0.009s) - ✅
test_non_dict_json(0.019s) - ✅
test_oversized_json_values(0.008s)
TestHTTPErrorHandlers¶
- ✅
test_405_method_not_allowed(0.010s) - ✅
test_404_not_found(0.007s) - ✅
test_413_payload_too_large(0.035s) - ✅
test_400_bad_request_missing_required_fields(0.020s) - ✅
test_415_unsupported_media_type(0.007s) - ✅
test_null_bytes_in_input(0.005s) - ✅
test_invalid_json_syntax(0.018s) - ✅
test_very_long_query_string(0.022s) - ✅
test_empty_request_body_post(0.011s) - ✅
test_content_type_without_charset(0.483s) - ✅
test_unicode_normalization_attack(0.011s) - ✅
test_multiple_content_types(0.006s) - ✅
test_header_injection_attempts(0.006s) - ✅
test_trailing_slash_handling(0.014s) - ✅
test_double_slash_in_path(0.008s) - ✅
test_url_encoding_in_parameters(0.354s) - ✅
test_parameter_without_value(0.008s) - ✅
test_repeated_parameters(0.465s) - ✅
test_response_headers_present(0.008s) - ✅
test_cors_preflight_request(0.005s) - ✅
test_case_sensitive_endpoints(0.009s)
TestInputValidation¶
- ✅
test_empty_string(0.004s) - ✅
test_non_string_type(0.004s) - ✅
test_whitespace_only(0.004s) - ✅
test_valid_input(0.006s) - ✅
test_none_value(0.001s) - ✅
test_special_characters_rejected(0.002s) - ✅
test_whitespace_trimming(0.001s) - ✅
test_exceeds_max_length(0.001s) - ✅
test_unicode_cities_allowed(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.