@@ -192,6 +192,51 @@ async def test_returns_40x_if_not_authenticated(
192192 response = await client .post ("/api/project/main/fleets/get" )
193193 assert response .status_code in [401 , 403 ]
194194
195+ @pytest .mark .asyncio
196+ @pytest .mark .parametrize ("test_db" , ["sqlite" , "postgres" ], indirect = True )
197+ @pytest .mark .parametrize (
198+ "by_id" , [pytest .param (False , id = "by-name" ), pytest .param (True , id = "by-id" )]
199+ )
200+ async def test_returns_403_on_nonexistent_fleet_in_foreign_project (
201+ self , test_db , session : AsyncSession , client : AsyncClient , by_id : bool
202+ ):
203+ await create_project (session , name = "test-project" )
204+ user = await create_user (session , global_role = GlobalRole .USER ) # not a project member
205+ if by_id :
206+ body = {"id" : str (uuid4 ())}
207+ else :
208+ body = {"name" : "nonexistent" }
209+ response = await client .post (
210+ "/api/project/test-project/fleets/get" ,
211+ headers = get_auth_headers (user .token ),
212+ json = body ,
213+ )
214+ assert response .status_code == 403
215+
216+ @pytest .mark .asyncio
217+ @pytest .mark .parametrize ("test_db" , ["sqlite" , "postgres" ], indirect = True )
218+ @pytest .mark .parametrize (
219+ "by_id" , [pytest .param (False , id = "by-name" ), pytest .param (True , id = "by-id" )]
220+ )
221+ async def test_returns_403_on_deleted_fleet_in_foreign_project (
222+ self , test_db , session : AsyncSession , client : AsyncClient , by_id : bool
223+ ):
224+ project = await create_project (session , name = "test-project" )
225+ user = await create_user (session , global_role = GlobalRole .USER ) # not a project member
226+ fleet = await create_fleet (
227+ session = session , project = project , deleted = True , name = "deleted-fleet"
228+ )
229+ if by_id :
230+ body = {"id" : str (fleet .id )}
231+ else :
232+ body = {"name" : "deleted-fleet" }
233+ response = await client .post (
234+ "/api/project/test-project/fleets/get" ,
235+ headers = get_auth_headers (user .token ),
236+ json = body ,
237+ )
238+ assert response .status_code == 403
239+
195240 @pytest .mark .asyncio
196241 @pytest .mark .parametrize ("test_db" , ["sqlite" , "postgres" ], indirect = True )
197242 @pytest .mark .parametrize ("deleted" , [False , True ])
@@ -303,6 +348,29 @@ async def test_not_returns_by_name_if_fleet_does_not_exist(
303348 )
304349 assert response .status_code == 400
305350
351+ @pytest .mark .asyncio
352+ @pytest .mark .parametrize ("test_db" , ["sqlite" , "postgres" ], indirect = True )
353+ @pytest .mark .parametrize (
354+ "by_id" , [pytest .param (False , id = "by-name" ), pytest .param (True , id = "by-id" )]
355+ )
356+ async def test_returns_foreign_fleet_to_global_admin (
357+ self , test_db , session : AsyncSession , client : AsyncClient , by_id : bool
358+ ):
359+ admin = await create_user (session , global_role = GlobalRole .ADMIN )
360+ project = await create_project (session , name = "test-project" )
361+ fleet = await create_fleet (session = session , project = project , name = "test-fleet" )
362+ if by_id :
363+ body = {"id" : str (fleet .id )}
364+ else :
365+ body = {"name" : "test-fleet" }
366+ response = await client .post (
367+ "/api/project/test-project/fleets/get" ,
368+ headers = get_auth_headers (admin .token ),
369+ json = body ,
370+ )
371+ assert response .status_code == 200
372+ assert response .json ()["name" ] == "test-fleet"
373+
306374
307375class TestApplyFleetPlan :
308376 @pytest .mark .asyncio
0 commit comments