Skip to content

Commit 9c3a4b1

Browse files
authored
Minor fixes (#147)
2 parents 2a0c741 + 8905252 commit 9c3a4b1

5 files changed

Lines changed: 103 additions & 43 deletions

File tree

example/example1/example1.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
TypeDefinition,
1717
Userset,
1818
Usersets,
19+
UserTypeFilter,
1920
WriteAuthorizationModelRequest,
2021
)
2122
from openfga_sdk.client.models import (
@@ -306,16 +307,17 @@ async def main():
306307
# ListUsers
307308
print("Listing user who have access to object")
308309

309-
response = await fga_client.list_objects(
310+
response = await fga_client.list_users(
310311
ClientListUsersRequest(
311312
relation="viewer",
312313
object=FgaObject(type="document", id="roadmap"),
313314
user_filters=[
314-
FgaObject(type="user"),
315+
UserTypeFilter(type="user"),
315316
],
317+
context=dict(ViewCount=100),
316318
)
317319
)
318-
print(f"Users: {response.objects}")
320+
print(f"Users: {response.users}")
319321

320322
# WriteAssertions
321323
await fga_client.write_assertions(

openfga_sdk/client/client.py

Lines changed: 7 additions & 4 deletions
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
@@ -744,9 +749,7 @@ async def list_users(
744749
)
745750

746751
if body.contextual_tuples:
747-
req_body.contextual_tuples = ContextualTupleKeys(
748-
tuple_keys=convert_tuple_keys(body.contextual_tuples)
749-
)
752+
req_body.contextual_tuples = convert_tuple_keys(body.contextual_tuples)
750753

751754
api_response = await self._api.list_users(body=req_body, **kwargs)
752755

openfga_sdk/sync/client/client.py

Lines changed: 7 additions & 4 deletions
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
@@ -733,9 +738,7 @@ def list_users(self, body: ClientListUsersRequest, options: dict[str, str] = Non
733738
)
734739

735740
if body.contextual_tuples:
736-
req_body.contextual_tuples = ContextualTupleKeys(
737-
tuple_keys=convert_tuple_keys(body.contextual_tuples)
738-
)
741+
req_body.contextual_tuples = convert_tuple_keys(body.contextual_tuples)
739742

740743
api_response = self._api.list_users(body=req_body, **kwargs)
741744

test/client/client_test.py

Lines changed: 42 additions & 16 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,22 +2550,19 @@ async def test_list_users(self, mock_request):
25212550
"relation": "can_read",
25222551
"user_filters": [
25232552
{"type": "user"},
2524-
{"type": "team", "relation": "member"},
25252553
],
2526-
"contextual_tuples": {
2527-
"tuple_keys": [
2528-
{
2529-
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
2530-
"relation": "editor",
2531-
"object": "folder:product",
2532-
},
2533-
{
2534-
"user": "folder:product",
2535-
"relation": "parent",
2536-
"object": "document:roadmap",
2537-
},
2538-
]
2539-
},
2554+
"contextual_tuples": [
2555+
{
2556+
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
2557+
"relation": "editor",
2558+
"object": "folder:product",
2559+
},
2560+
{
2561+
"user": "folder:product",
2562+
"relation": "parent",
2563+
"object": "document:roadmap",
2564+
},
2565+
],
25402566
"context": {},
25412567
"consistency": "MINIMIZE_LATENCY",
25422568
},

test/sync/client/client_test.py

Lines changed: 42 additions & 16 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,22 +2553,19 @@ def test_list_users(self, mock_request):
25242553
"relation": "can_read",
25252554
"user_filters": [
25262555
{"type": "user"},
2527-
{"type": "team", "relation": "member"},
25282556
],
2529-
"contextual_tuples": {
2530-
"tuple_keys": [
2531-
{
2532-
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
2533-
"relation": "editor",
2534-
"object": "folder:product",
2535-
},
2536-
{
2537-
"user": "folder:product",
2538-
"relation": "parent",
2539-
"object": "document:roadmap",
2540-
},
2541-
]
2542-
},
2557+
"contextual_tuples": [
2558+
{
2559+
"user": "user:81684243-9356-4421-8fbf-a4f8d36aa31b",
2560+
"relation": "editor",
2561+
"object": "folder:product",
2562+
},
2563+
{
2564+
"user": "folder:product",
2565+
"relation": "parent",
2566+
"object": "document:roadmap",
2567+
},
2568+
],
25432569
"context": {},
25442570
"consistency": "MINIMIZE_LATENCY",
25452571
},

0 commit comments

Comments
 (0)