55per-request headers feature to ensure robust handling.
66"""
77
8- import json
98from unittest import IsolatedAsyncioTestCase
10- from unittest .mock import ANY , patch
9+ from unittest .mock import patch
1110
1211import urllib3
1312
1413from openfga_sdk import rest
1514from openfga_sdk .client import ClientConfiguration
16- from openfga_sdk .client .client import OpenFgaClient , options_to_kwargs , set_heading_if_not_set
15+ from openfga_sdk .client .client import (
16+ OpenFgaClient ,
17+ options_to_kwargs ,
18+ set_heading_if_not_set ,
19+ )
1720from openfga_sdk .client .models .check_request import ClientCheckRequest
1821
1922
@@ -59,14 +62,14 @@ def test_options_to_kwargs_with_headers(self):
5962 "authorization_model_id" : "test-model" ,
6063 "page_size" : 25
6164 }
62-
65+
6366 result = options_to_kwargs (options )
64-
67+
6568 # Check that headers are converted to _headers
6669 self .assertIn ("_headers" , result )
6770 self .assertEqual (result ["_headers" ]["x-test-header" ], "test-value" )
6871 self .assertEqual (result ["_headers" ]["x-another" ], "another-value" )
69-
72+
7073 # Check that other options are preserved
7174 self .assertEqual (result .get ("page_size" ), 25 )
7275
@@ -76,26 +79,26 @@ def test_options_to_kwargs_without_headers(self):
7679 "authorization_model_id" : "test-model" ,
7780 "page_size" : 25
7881 }
79-
82+
8083 result = options_to_kwargs (options )
81-
84+
8285 # Check that headers is not present when no headers option
8386 self .assertNotIn ("headers" , result )
84-
87+
8588 # Check that other options are preserved
8689 self .assertEqual (result .get ("page_size" ), 25 )
8790
8891 def test_options_to_kwargs_with_none (self ):
8992 """Test options_to_kwargs function handles None input"""
9093 result = options_to_kwargs (None )
91-
94+
9295 # Should return empty dict
9396 self .assertEqual (result , {})
9497
9598 def test_options_to_kwargs_with_empty_dict (self ):
9699 """Test options_to_kwargs function handles empty dict input"""
97100 result = options_to_kwargs ({})
98-
101+
99102 # Should return empty dict
100103 self .assertEqual (result , {})
101104
@@ -106,9 +109,9 @@ def test_set_heading_if_not_set_with_existing_headers(self):
106109 "x-existing" : "existing-value"
107110 }
108111 }
109-
112+
110113 result = set_heading_if_not_set (options , "x-new-header" , "new-value" )
111-
114+
112115 # Check that new header was added
113116 self .assertEqual (result ["headers" ]["x-new-header" ], "new-value" )
114117 # Check that existing header is preserved
@@ -119,9 +122,9 @@ def test_set_heading_if_not_set_without_headers(self):
119122 options = {
120123 "other_option" : "value"
121124 }
122-
125+
123126 result = set_heading_if_not_set (options , "x-new-header" , "new-value" )
124-
127+
125128 # Check that headers dict was created and header was added
126129 self .assertIn ("headers" , result )
127130 self .assertEqual (result ["headers" ]["x-new-header" ], "new-value" )
@@ -131,7 +134,7 @@ def test_set_heading_if_not_set_without_headers(self):
131134 def test_set_heading_if_not_set_with_none_options (self ):
132135 """Test set_heading_if_not_set function with None options"""
133136 result = set_heading_if_not_set (None , "x-new-header" , "new-value" )
134-
137+
135138 # Check that options dict was created with headers
136139 self .assertIn ("headers" , result )
137140 self .assertEqual (result ["headers" ]["x-new-header" ], "new-value" )
@@ -143,9 +146,9 @@ def test_set_heading_if_not_set_header_already_exists(self):
143146 "x-existing" : "original-value"
144147 }
145148 }
146-
149+
147150 result = set_heading_if_not_set (options , "x-existing" , "new-value" )
148-
151+
149152 # Check that original value is preserved (not overwritten)
150153 self .assertEqual (result ["headers" ]["x-existing" ], "original-value" )
151154
@@ -154,9 +157,9 @@ def test_set_heading_if_not_set_with_invalidheaders_type(self):
154157 options = {
155158 "headers" : "not-a-dict" # Invalid type
156159 }
157-
160+
158161 result = set_heading_if_not_set (options , "x-new-header" , "new-value" )
159-
162+
160163 # Function should create new headers dict, replacing the invalid one
161164 self .assertIsInstance (result ["headers" ], dict )
162165 self .assertEqual (result ["headers" ]["x-new-header" ], "new-value" )
@@ -198,7 +201,7 @@ async def test_large_number_of_headers(self, mock_request):
198201 options = {
199202 "headers" : largeheaders
200203 }
201-
204+
202205 body = ClientCheckRequest (
203206 user = "user:test-user" ,
204207 relation = "viewer" ,
@@ -211,7 +214,7 @@ async def test_large_number_of_headers(self, mock_request):
211214 mock_request .assert_called_once ()
212215 call_args = mock_request .call_args
213216 headers = call_args .kwargs .get ("headers" , {})
214-
217+
215218 # Check that all custom headers were included (plus system headers)
216219 self .assertGreaterEqual (len (headers ), 100 )
217220 for i in range (100 ):
@@ -233,7 +236,7 @@ async def test_unicode_headers(self, mock_request):
233236 options = {
234237 "headers" : unicode_headers
235238 }
236-
239+
237240 body = ClientCheckRequest (
238241 user = "user:test-user" ,
239242 relation = "viewer" ,
@@ -246,7 +249,7 @@ async def test_unicode_headers(self, mock_request):
246249 mock_request .assert_called_once ()
247250 call_args = mock_request .call_args
248251 headers = call_args .kwargs .get ("headers" , {})
249-
252+
250253 # Check that unicode headers were included
251254 self .assertEqual (headers ["x-unicode-header" ], "测试值" )
252255 self .assertEqual (headers ["x-emoji-header" ], "🚀🔐" )
@@ -260,7 +263,7 @@ async def test_long_header_values(self, mock_request):
260263
261264 # Create a very long header value
262265 long_value = "x" * 10000 # 10KB header value
263-
266+
264267 longheaders = {
265268 "x-long-header" : long_value ,
266269 "x-normal-header" : "normal-value"
@@ -270,7 +273,7 @@ async def test_long_header_values(self, mock_request):
270273 options = {
271274 "headers" : longheaders
272275 }
273-
276+
274277 body = ClientCheckRequest (
275278 user = "user:test-user" ,
276279 relation = "viewer" ,
@@ -283,7 +286,7 @@ async def test_long_header_values(self, mock_request):
283286 mock_request .assert_called_once ()
284287 call_args = mock_request .call_args
285288 headers = call_args .kwargs .get ("headers" , {})
286-
289+
287290 # Check that long header was included
288291 self .assertEqual (headers ["x-long-header" ], long_value )
289292 self .assertEqual (headers ["x-normal-header" ], "normal-value" )
@@ -305,7 +308,7 @@ async def test_header_case_sensitivity(self, mock_request):
305308 options = {
306309 "headers" : case_sensitiveheaders
307310 }
308-
311+
309312 body = ClientCheckRequest (
310313 user = "user:test-user" ,
311314 relation = "viewer" ,
@@ -318,7 +321,7 @@ async def test_header_case_sensitivity(self, mock_request):
318321 mock_request .assert_called_once ()
319322 call_args = mock_request .call_args
320323 headers = call_args .kwargs .get ("headers" , {})
321-
324+
322325 # Check that header case was preserved
323326 self .assertEqual (headers ["X-Upper-Case" ], "upper-value" )
324327 self .assertEqual (headers ["x-lower-case" ], "lower-value" )
@@ -331,7 +334,7 @@ async def test_header_overrides_default_headers(self, mock_request):
331334 response_body = '{"allowed": true}'
332335 mock_request .return_value = mock_response (response_body , 200 )
333336
334- # Test with headers that can override defaults (User-Agent)
337+ # Test with headers that can override defaults (User-Agent)
335338 # Note: Accept and Content-Type are set by the API method and cannot be overridden
336339 override_headers = {
337340 "User-Agent" : "custom-user-agent" ,
@@ -361,7 +364,7 @@ async def test_header_overrides_default_headers(self, mock_request):
361364 self .assertEqual (headers ["User-Agent" ], "custom-user-agent" )
362365 self .assertEqual (headers ["x-custom-header" ], "custom-value" )
363366 self .assertEqual (headers ["Authorization" ], "Bearer custom-token" )
364-
367+
365368 # System headers are still set by the API method
366369 self .assertEqual (headers ["Accept" ], "application/json" )
367- self .assertTrue ("Content-Type" in headers )
370+ self .assertTrue ("Content-Type" in headers )
0 commit comments