11import json
2- from collections .abc import AsyncGenerator
2+ from collections .abc import AsyncGenerator , Callable
33from copy import deepcopy
44from typing import Any
55
6+ import pytest
67import pytest_asyncio
78from authzed .api .v1 import Relationship , RelationshipUpdate , SubjectReference , WriteRelationshipsRequest
9+ from httpx import Response
810from sanic import Sanic
911from sanic_testing .testing import SanicASGITestClient
1012from ulid import ULID
@@ -167,6 +169,34 @@ async def unauthorized_headers() -> dict[str, str]:
167169 return {"Authorization" : "Bearer {}" }
168170
169171
172+ @pytest .fixture
173+ def headers_from_user (
174+ admin_user : UserInfo ,
175+ admin_headers : dict [str , str ],
176+ regular_user : UserInfo ,
177+ user_headers : dict [str , str ],
178+ member_1_user : UserInfo ,
179+ member_1_headers : dict [str , str ],
180+ member_2_user : UserInfo ,
181+ member_2_headers : dict [str , str ],
182+ unauthorized_headers : dict [str , str ],
183+ ) -> Callable [[UserInfo ], dict [str , str ]]:
184+ def _headers_from_user (user : UserInfo ) -> dict [str , str ]:
185+ match user .id :
186+ case admin_user .id :
187+ return admin_headers
188+ case regular_user .id :
189+ return user_headers
190+ case member_1_user .id :
191+ return member_1_headers
192+ case member_2_user .id :
193+ return member_2_headers
194+ case _:
195+ return unauthorized_headers
196+
197+ return _headers_from_user
198+
199+
170200@pytest_asyncio .fixture
171201async def bootstrap_admins (
172202 sanic_client_with_migrations , app_config_instance : Config , event_loop , admin_user : UserInfo
@@ -258,7 +288,7 @@ async def create_project_helper(
258288
259289
260290@pytest_asyncio .fixture
261- async def create_project_copy (sanic_client , user_headers , admin_headers , regular_user , admin_user ):
291+ async def create_project_copy (sanic_client , user_headers , headers_from_user ):
262292 async def create_project_copy_helper (
263293 id : str ,
264294 namespace : str ,
@@ -268,7 +298,7 @@ async def create_project_copy_helper(
268298 members : list [dict [str , str ]] = None ,
269299 ** payload ,
270300 ) -> dict [str , Any ]:
271- headers = user_headers if user is None or user is regular_user else admin_headers
301+ headers = headers_from_user ( user ) if user is not None else user_headers
272302 copy_payload = {"slug" : Slug .from_name (name ).value }
273303 copy_payload .update (payload )
274304 copy_payload .update ({"namespace" : namespace , "name" : name })
@@ -391,7 +421,7 @@ async def create_data_connector_helper(
391421
392422@pytest_asyncio .fixture
393423async def create_data_connector_and_link_project (
394- sanic_client , regular_user , user_headers , admin_user , admin_headers , create_data_connector
424+ regular_user , user_headers , admin_user , admin_headers , create_data_connector , link_data_connector
395425):
396426 async def create_data_connector_and_link_project_helper (
397427 name : str , project_id : str , admin : bool = False , ** payload
@@ -401,20 +431,27 @@ async def create_data_connector_and_link_project_helper(
401431
402432 data_connector = await create_data_connector (name , user = user , headers = headers , ** payload )
403433 data_connector_id = data_connector ["id" ]
404- payload = {"project_id" : project_id }
405-
406- _ , response = await sanic_client .post (
407- f"/api/data/data_connectors/{ data_connector_id } /project_links" , headers = headers , json = payload
408- )
409-
410- assert response .status_code == 201 , response .text
434+ response = await link_data_connector (project_id , data_connector_id , headers = headers )
411435 data_connector_link = response .json
412436
413437 return data_connector , data_connector_link
414438
415439 return create_data_connector_and_link_project_helper
416440
417441
442+ @pytest .fixture
443+ def link_data_connector (sanic_client : SanicASGITestClient ):
444+ async def _link_data_connector (project_id : str , dc_id : str , headers : dict [str , str ]) -> Response :
445+ payload = {"project_id" : project_id }
446+ _ , response = await sanic_client .post (
447+ f"/api/data/data_connectors/{ dc_id } /project_links" , headers = headers , json = payload
448+ )
449+ assert response .status_code == 201 , response .text
450+ return response
451+
452+ return _link_data_connector
453+
454+
418455@pytest_asyncio .fixture
419456async def create_resource_pool (sanic_client , user_headers , admin_headers , valid_resource_pool_payload ):
420457 async def create_resource_pool_helper (admin : bool = False , ** payload ) -> dict [str , Any ]:
0 commit comments