88from python_template_server .models import (
99 BaseResponse ,
1010 CertificateConfigModel ,
11+ CustomJSONResponse ,
1112 GetHealthResponse ,
13+ JSONResponseConfigModel ,
1214 RateLimitConfigModel ,
1315 ResponseCode ,
1416 SecurityConfigModel ,
@@ -87,6 +89,16 @@ def test_days_valid_field(
8789 CertificateConfigModel (** invalid_config_data )
8890
8991
92+ class TestJSONResponseConfigModel :
93+ """Unit tests for the JSONResponseConfigModel class."""
94+
95+ def test_model_dump (
96+ self , mock_json_response_config_dict : dict , mock_json_response_config : JSONResponseConfigModel
97+ ) -> None :
98+ """Test the model_dump method."""
99+ assert mock_json_response_config .model_dump () == mock_json_response_config_dict
100+
101+
90102class TestTemplateServerConfig :
91103 """Unit tests for the TemplateServerConfig class."""
92104
@@ -97,13 +109,15 @@ def test_model_dump(
97109 mock_security_config_dict : dict ,
98110 mock_rate_limit_config_dict : dict ,
99111 mock_certificate_config_dict : dict ,
112+ mock_json_response_config_dict : dict ,
100113 ) -> None :
101114 """Test the model_dump method."""
102115 expected_dict = {
103116 "server" : mock_server_config_dict ,
104117 "security" : mock_security_config_dict ,
105118 "rate_limit" : mock_rate_limit_config_dict ,
106119 "certificate" : mock_certificate_config_dict ,
120+ "json_response" : mock_json_response_config_dict ,
107121 }
108122 assert mock_template_server_config .model_dump () == expected_dict
109123
@@ -119,6 +133,59 @@ def test_save_to_file(
119133
120134
121135# API Response Models
136+ class TestCustomJSONResponse :
137+ """Unit tests for the CustomJSONResponse class."""
138+
139+ def test_configure_method (self , mock_json_response_config : JSONResponseConfigModel ) -> None :
140+ """Test the configure class method."""
141+ CustomJSONResponse .configure (mock_json_response_config )
142+
143+ assert CustomJSONResponse ._ensure_ascii == mock_json_response_config .ensure_ascii
144+ assert CustomJSONResponse ._allow_nan == mock_json_response_config .allow_nan
145+ assert CustomJSONResponse ._indent == mock_json_response_config .indent
146+ assert CustomJSONResponse .media_type == mock_json_response_config .media_type
147+
148+ def test_render_with_unicode (self , mock_json_response_config : JSONResponseConfigModel ) -> None :
149+ """Test rendering JSON with Unicode characters (emojis)."""
150+ CustomJSONResponse .configure (mock_json_response_config )
151+ response = CustomJSONResponse (content = {"message" : "Hello 👋 World 🌍" })
152+
153+ rendered = response .render ({"message" : "Hello 👋 World 🌍" })
154+ assert b"Hello \\ ud83d\\ udc4b World" not in rendered # Should NOT be escaped
155+ assert "👋" .encode () in rendered # Should preserve emoji
156+ assert "🌍" .encode () in rendered
157+
158+ def test_render_with_ensure_ascii_true (self ) -> None :
159+ """Test rendering with ensure_ascii=True."""
160+ config = JSONResponseConfigModel (ensure_ascii = True )
161+ CustomJSONResponse .configure (config )
162+ response = CustomJSONResponse (content = {"message" : "Hello 👋" })
163+
164+ rendered = response .render ({"message" : "Hello 👋" })
165+ # With ensure_ascii=True, Unicode should be escaped
166+ assert b"\\ ud83d\\ udc4b" in rendered or b"\\ u" in rendered
167+
168+ def test_render_with_indent (self ) -> None :
169+ """Test rendering with indentation."""
170+ config = JSONResponseConfigModel (indent = 2 )
171+ CustomJSONResponse .configure (config )
172+ response = CustomJSONResponse (content = {"key" : "value" })
173+
174+ rendered = response .render ({"key" : "value" })
175+ # With indent, output should have newlines and spaces
176+ assert b"\n " in rendered
177+ assert b" " in rendered
178+
179+ def test_render_compact (self , mock_json_response_config : JSONResponseConfigModel ) -> None :
180+ """Test rendering in compact mode (no indent)."""
181+ CustomJSONResponse .configure (mock_json_response_config )
182+ response = CustomJSONResponse (content = {"key" : "value" , "number" : 42 })
183+
184+ rendered = response .render ({"key" : "value" , "number" : 42 })
185+ # Compact mode should use "," separator without spaces after
186+ assert rendered == b'{"key":"value","number":42}'
187+
188+
122189class TestResponseCode :
123190 """Unit tests for the ResponseCode enum."""
124191
0 commit comments