tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_none_returns_empty_string tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_plain_string_returned_as_is tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_empty_string_returned_as_is tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_text_content_part tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_input_text_content_part tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_output_text_content_part tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_multiple_text_parts_joined_with_newline tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_mixed_string_and_dict_parts tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_image_url_parts_silently_skipped tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_integer_content_converted tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_boolean_content_converted tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_deeply_nested_list_respects_depth_limit tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_large_list_capped tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_oversized_string_truncated tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_empty_text_parts_filtered tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_dict_without_type_skipped tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_empty_list_returns_empty tests/gateway/test_api_server_normalize.py::TestNormalizeChatContent::test_many_small_parts_normalize_without_quadratic_rescan