Skip to content

Commit 5cfd9c1

Browse files
committed
fix: handle no models in response in read_latest_authorization_model
1 parent 92494b5 commit 5cfd9c1

4 files changed

Lines changed: 72 additions & 6 deletions

File tree

openfga_sdk/client/client.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,12 @@ async def read_latest_authorization_model(
321321
)
322322
options["page_size"] = 1
323323
api_response = await self.read_authorization_models(options)
324-
return ReadAuthorizationModelResponse(api_response.authorization_models[0])
324+
model = (
325+
api_response.authorization_models[0]
326+
if len(api_response.authorization_models) > 0
327+
else None
328+
)
329+
return ReadAuthorizationModelResponse(model)
325330

326331
#######################
327332
# Relationship Tuples

openfga_sdk/sync/client/client.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,12 @@ def read_latest_authorization_model(self, options: dict[str, int | str] = None):
319319
)
320320
options["page_size"] = 1
321321
api_response = self.read_authorization_models(options)
322-
return ReadAuthorizationModelResponse(api_response.authorization_models[0])
322+
model = (
323+
api_response.authorization_models[0]
324+
if len(api_response.authorization_models) > 0
325+
else None
326+
)
327+
return ReadAuthorizationModelResponse(model)
323328

324329
#######################
325330
# Relationship Tuples

test/client/client_test.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,36 @@ async def test_read_latest_authorization_model(self, mock_request):
615615
_request_timeout=None,
616616
)
617617

618+
@patch.object(rest.RESTClientObject, "request")
619+
async def test_read_latest_authorization_model_with_no_models(self, mock_request):
620+
"""Test case for read_latest_authorization_model when no models are in the store
621+
622+
Return the latest authorization models configured for the store
623+
"""
624+
response_body = """
625+
{
626+
"authorization_models": []
627+
}
628+
"""
629+
mock_request.return_value = mock_response(response_body, 200)
630+
configuration = self.configuration
631+
configuration.store_id = store_id
632+
# Enter a context with an instance of the API client
633+
async with OpenFgaClient(configuration) as api_client:
634+
635+
# Return a particular version of an authorization model
636+
api_response = await api_client.read_latest_authorization_model(options={})
637+
self.assertIsInstance(api_response, ReadAuthorizationModelResponse)
638+
self.assertIsNone(api_response.authorization_model)
639+
mock_request.assert_called_once_with(
640+
"GET",
641+
"http://api.fga.example/stores/01YCP46JKYM8FJCQ37NMBYHE5X/authorization-models",
642+
headers=ANY,
643+
query_params=[("page_size", 1)],
644+
_preload_content=ANY,
645+
_request_timeout=None,
646+
)
647+
618648
@patch.object(rest.RESTClientObject, "request")
619649
async def test_read_changes(self, mock_request):
620650
"""Test case for read_changes
@@ -2460,7 +2490,6 @@ async def test_list_users(self, mock_request):
24602490
relation="can_read",
24612491
user_filters=[
24622492
UserTypeFilter(type="user"),
2463-
UserTypeFilter(type="team", relation="member"),
24642493
],
24652494
context={},
24662495
contextual_tuples=[
@@ -2521,7 +2550,6 @@ async def test_list_users(self, mock_request):
25212550
"relation": "can_read",
25222551
"user_filters": [
25232552
{"type": "user"},
2524-
{"type": "team", "relation": "member"},
25252553
],
25262554
"contextual_tuples": [
25272555
{

test/sync/client/client_test.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,36 @@ def test_read_latest_authorization_model(self, mock_request):
614614
_request_timeout=None,
615615
)
616616

617+
@patch.object(rest.RESTClientObject, "request")
618+
def test_read_latest_authorization_model_with_no_models(self, mock_request):
619+
"""Test case for read_latest_authorization_model when no models are in the store
620+
621+
Return the latest authorization models configured for the store
622+
"""
623+
response_body = """
624+
{
625+
"authorization_models": []
626+
}
627+
"""
628+
mock_request.return_value = mock_response(response_body, 200)
629+
configuration = self.configuration
630+
configuration.store_id = store_id
631+
# Enter a context with an instance of the API client
632+
with OpenFgaClient(configuration) as api_client:
633+
634+
# Return a particular version of an authorization model
635+
api_response = api_client.read_latest_authorization_model(options={})
636+
self.assertIsInstance(api_response, ReadAuthorizationModelResponse)
637+
self.assertIsNone(api_response.authorization_model)
638+
mock_request.assert_called_once_with(
639+
"GET",
640+
"http://api.fga.example/stores/01YCP46JKYM8FJCQ37NMBYHE5X/authorization-models",
641+
headers=ANY,
642+
query_params=[("page_size", 1)],
643+
_preload_content=ANY,
644+
_request_timeout=None,
645+
)
646+
617647
@patch.object(rest.RESTClientObject, "request")
618648
def test_read_changes(self, mock_request):
619649
"""Test case for read_changes
@@ -2464,7 +2494,6 @@ def test_list_users(self, mock_request):
24642494
body.relation = "can_read"
24652495
body.user_filters = [
24662496
UserTypeFilter(type="user"),
2467-
UserTypeFilter(type="team", relation="member"),
24682497
]
24692498
body.context = {}
24702499
body.contextual_tuples = [
@@ -2524,7 +2553,6 @@ def test_list_users(self, mock_request):
25242553
"relation": "can_read",
25252554
"user_filters": [
25262555
{"type": "user"},
2527-
{"type": "team", "relation": "member"},
25282556
],
25292557
"contextual_tuples": [
25302558
{

0 commit comments

Comments
 (0)