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)
🔗 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 tools/generate_reports.py.