@@ -91,15 +91,15 @@ async def test_returns_public_projects_to_non_members(
9191 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
9292 global_role = GlobalRole .USER ,
9393 )
94-
94+
9595 # Create a different user who is not a member
9696 non_member = await create_user (
9797 session = session ,
9898 name = "non_member" ,
9999 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
100100 global_role = GlobalRole .USER ,
101101 )
102-
102+
103103 # Create a public project
104104 public_project = await create_project (
105105 session = session ,
@@ -108,26 +108,28 @@ async def test_returns_public_projects_to_non_members(
108108 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
109109 is_public = True ,
110110 )
111-
112- # Create a private project
111+
112+ # Create a private project
113113 private_project = await create_project (
114114 session = session ,
115115 owner = owner ,
116- name = "private_project" ,
116+ name = "private_project" ,
117117 created_at = datetime (2023 , 1 , 2 , 3 , 5 , tzinfo = timezone .utc ),
118118 is_public = False ,
119119 )
120-
120+
121121 # Add owner as admin to both projects
122122 await add_project_member (
123123 session = session , project = public_project , user = owner , project_role = ProjectRole .ADMIN
124124 )
125125 await add_project_member (
126126 session = session , project = private_project , user = owner , project_role = ProjectRole .ADMIN
127127 )
128-
128+
129129 # List projects as non-member - should only see public project
130- response = await client .post ("/api/projects/list" , headers = get_auth_headers (non_member .token ))
130+ response = await client .post (
131+ "/api/projects/list" , headers = get_auth_headers (non_member .token )
132+ )
131133 assert response .status_code == 200
132134 projects = response .json ()
133135
@@ -148,15 +150,15 @@ async def test_member_sees_both_public_and_private_projects(
148150 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
149151 global_role = GlobalRole .USER ,
150152 )
151-
153+
152154 # Create a user who will be a member
153155 member = await create_user (
154156 session = session ,
155157 name = "member" ,
156158 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
157159 global_role = GlobalRole .USER ,
158160 )
159-
161+
160162 # Create a public project
161163 public_project = await create_project (
162164 session = session ,
@@ -165,34 +167,34 @@ async def test_member_sees_both_public_and_private_projects(
165167 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
166168 is_public = True ,
167169 )
168-
170+
169171 # Create a private project
170172 private_project = await create_project (
171173 session = session ,
172174 owner = owner ,
173175 name = "private_project" ,
174- created_at = datetime (2023 , 1 , 2 , 3 , 5 , tzinfo = timezone .utc ),
176+ created_at = datetime (2023 , 1 , 2 , 3 , 5 , tzinfo = timezone .utc ),
175177 is_public = False ,
176178 )
177-
179+
178180 # Add member to the private project only
179181 await add_project_member (
180182 session = session , project = private_project , user = member , project_role = ProjectRole .USER
181183 )
182-
184+
183185 # Add owner as admin to both projects
184186 await add_project_member (
185187 session = session , project = public_project , user = owner , project_role = ProjectRole .ADMIN
186188 )
187189 await add_project_member (
188190 session = session , project = private_project , user = owner , project_role = ProjectRole .ADMIN
189191 )
190-
192+
191193 # List projects as member - should see both projects
192194 response = await client .post ("/api/projects/list" , headers = get_auth_headers (member .token ))
193195 assert response .status_code == 200
194196 projects = response .json ()
195-
197+
196198 # Should see both projects, sorted by created_at
197199 assert len (projects ) == 2
198200 project_names = [p ["project_name" ] for p in projects ]
@@ -366,16 +368,14 @@ async def test_creates_public_project(
366368 json = body ,
367369 )
368370 assert response .status_code == 200 , response .json ()
369-
371+
370372 # Check that the response includes is_public=True
371373 response_data = response .json ()
372374 assert "is_public" in response_data
373375 assert response_data ["is_public" ] is True
374-
376+
375377 # Verify the project was created as public in the database
376- res = await session .execute (
377- select (ProjectModel ).where (ProjectModel .name == project_name )
378- )
378+ res = await session .execute (select (ProjectModel ).where (ProjectModel .name == project_name ))
379379 project = res .scalar_one ()
380380 assert project .is_public is True
381381
@@ -876,7 +876,7 @@ async def test_non_manager_cannot_set_project_members(
876876
877877class TestListUserProjectsService :
878878 """Test the service-level functions for backward compatibility"""
879-
879+
880880 @pytest .mark .asyncio
881881 @pytest .mark .parametrize ("test_db" , ["sqlite" , "postgres" ], indirect = True )
882882 async def test_list_user_projects_only_returns_member_projects (
@@ -889,15 +889,15 @@ async def test_list_user_projects_only_returns_member_projects(
889889 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
890890 global_role = GlobalRole .USER ,
891891 )
892-
892+
893893 # Create a different user who is not a member
894894 non_member = await create_user (
895895 session = session ,
896896 name = "non_member" ,
897897 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
898898 global_role = GlobalRole .USER ,
899899 )
900-
900+
901901 # Create a public project
902902 public_project = await create_project (
903903 session = session ,
@@ -906,17 +906,18 @@ async def test_list_user_projects_only_returns_member_projects(
906906 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
907907 is_public = True ,
908908 )
909-
909+
910910 # Add owner as admin
911911 await add_project_member (
912912 session = session , project = public_project , user = owner , project_role = ProjectRole .ADMIN
913913 )
914-
914+
915915 # Test: list_user_projects should NOT return public projects for non-members
916916 from dstack ._internal .server .services .projects import list_user_projects
917+
917918 projects = await list_user_projects (session = session , user = non_member )
918919 assert len (projects ) == 0 # Non-member should see NO projects
919-
920+
920921 # Test: list_user_projects should return projects where user IS a member
921922 projects = await list_user_projects (session = session , user = owner )
922923 assert len (projects ) == 1
@@ -934,15 +935,15 @@ async def test_list_user_accessible_projects_returns_member_and_public_projects(
934935 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
935936 global_role = GlobalRole .USER ,
936937 )
937-
938+
938939 # Create a different user who is not a member
939940 non_member = await create_user (
940941 session = session ,
941942 name = "non_member" ,
942943 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
943944 global_role = GlobalRole .USER ,
944945 )
945-
946+
946947 # Create a public project
947948 public_project = await create_project (
948949 session = session ,
@@ -951,7 +952,7 @@ async def test_list_user_accessible_projects_returns_member_and_public_projects(
951952 created_at = datetime (2023 , 1 , 2 , 3 , 4 , tzinfo = timezone .utc ),
952953 is_public = True ,
953954 )
954-
955+
955956 # Create a private project
956957 private_project = await create_project (
957958 session = session ,
@@ -960,21 +961,22 @@ async def test_list_user_accessible_projects_returns_member_and_public_projects(
960961 created_at = datetime (2023 , 1 , 2 , 3 , 5 , tzinfo = timezone .utc ),
961962 is_public = False ,
962963 )
963-
964+
964965 # Add owner as admin to both projects
965966 await add_project_member (
966967 session = session , project = public_project , user = owner , project_role = ProjectRole .ADMIN
967968 )
968969 await add_project_member (
969970 session = session , project = private_project , user = owner , project_role = ProjectRole .ADMIN
970971 )
971-
972+
972973 # Test: list_user_accessible_projects should return public projects for non-members
973974 from dstack ._internal .server .services .projects import list_user_accessible_projects
975+
974976 projects = await list_user_accessible_projects (session = session , user = non_member )
975977 assert len (projects ) == 1 # Should see only the public project
976978 assert projects [0 ].project_name == "public_project"
977-
979+
978980 # Test: list_user_accessible_projects should return ALL projects for members
979981 projects = await list_user_accessible_projects (session = session , user = owner )
980982 assert len (projects ) == 2 # Should see both projects
0 commit comments