44# pylint: disable=unused-argument
55# pylint: disable=unused-variable
66
7- from collections .abc import AsyncIterator , Callable
7+ from collections .abc import AsyncIterator
88from contextlib import AsyncExitStack
9- from copy import deepcopy
10- from typing import Any
119
1210import pytest
1311from aiohttp .test_utils import TestClient
1412from faker import Faker
15- from models_library .groups import AccessRightsDict
13+ from models_library .api_schemas_webserver .groups import GroupGet
14+ from models_library .groups import AccessRightsDict , Group
1615from pytest_simcore .helpers .assert_checks import assert_status
1716from pytest_simcore .helpers .webserver_login import LoggedUser , NewUser , UserInfoDict
1817from pytest_simcore .helpers .webserver_parametrizations import (
1918 ExpectedResponse ,
2019 standard_role_response ,
2120)
22- from pytest_simcore .simcore_webserver_groups_fixtures import CreateUserGroupCallable
2321from servicelib .aiohttp import status
24- from servicelib .aiohttp .application import create_safe_application
2522from simcore_postgres_database .models .users import UserRole
2623from simcore_service_webserver ._meta import API_VTAG
27- from simcore_service_webserver .application_settings import setup_settings
28- from simcore_service_webserver .db .plugin import setup_db
24+ from simcore_service_webserver .groups ._groups_api import (
25+ create_organization ,
26+ delete_organization ,
27+ )
2928from simcore_service_webserver .groups ._groups_db import (
3029 _DEFAULT_GROUP_OWNER_ACCESS_RIGHTS ,
3130 _DEFAULT_GROUP_READ_ACCESS_RIGHTS ,
3231)
33- from simcore_service_webserver .groups .api import (
34- auto_add_user_to_groups ,
35- delete_user_group ,
36- )
37- from simcore_service_webserver .groups .plugin import setup_groups
38- from simcore_service_webserver .login .plugin import setup_login
39- from simcore_service_webserver .rest .plugin import setup_rest
32+ from simcore_service_webserver .groups .api import auto_add_user_to_groups
4033from simcore_service_webserver .security .api import clean_auth_policy_cache
41- from simcore_service_webserver .security .plugin import setup_security
42- from simcore_service_webserver .session .plugin import setup_session
43- from simcore_service_webserver .users .plugin import setup_users
4434from simcore_service_webserver .utils import gravatar_hash
4535
4636
47- @pytest .fixture
48- def client (
49- event_loop ,
50- aiohttp_client ,
51- app_cfg ,
52- postgres_db ,
53- monkeypatch_setenv_from_app_config : Callable ,
54- ) -> TestClient :
55- cfg = deepcopy (app_cfg )
56-
57- port = cfg ["main" ]["port" ]
58-
59- assert cfg ["rest" ]["version" ] == API_VTAG
60- monkeypatch_setenv_from_app_config (cfg )
61-
62- # fake config
63- app = create_safe_application (cfg )
64-
65- setup_settings (app )
66- setup_db (app )
67- setup_session (app )
68- setup_security (app )
69- setup_rest (app )
70- setup_login (app )
71- setup_users (app )
72- setup_groups (app )
73-
74- return event_loop .run_until_complete (
75- aiohttp_client (app , server_kwargs = {"port" : port , "host" : "localhost" })
76- )
77-
78-
7937def _assert_group (group : dict [str , str ]):
80- properties = ["gid" , "label" , "description" , "thumbnail" , "accessRights" ]
81- assert all (x in group for x in properties )
82- access_rights = group ["accessRights" ]
83- access_rights_properties = ["read" , "write" , "delete" ]
84- assert all (x in access_rights for x in access_rights_properties )
38+ return GroupGet .model_validate (group )
8539
8640
8741def _assert__group_user (
@@ -104,113 +58,6 @@ def _assert__group_user(
10458 assert "gid" in actual_user
10559
10660
107- @pytest .mark .parametrize (* standard_role_response ())
108- async def test_group_creation_workflow (
109- client : TestClient ,
110- logged_user : UserInfoDict ,
111- user_role : UserRole ,
112- expected : ExpectedResponse ,
113- ):
114- assert client .app
115- url = client .app .router ["create_group" ].url_for ()
116- assert f"{ url } " == f"/{ API_VTAG } /groups"
117-
118- new_group = {
119- "gid" : "4564" ,
120- "label" : "Black Sabbath" ,
121- "description" : "The founders of Rock'N'Roll" ,
122- "thumbnail" : "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fencrypted-tbn0.gstatic.com%2Fimages%3Fq%3Dtbn%3AANd9GcS3pAUISv_wtYDL9Ih4JtUfAWyHj9PkYMlEBGHJsJB9QlTZuuaK%26s&sp=1591105967T00f0b7ff95c7b3bca035102fa1ead205ab29eb6cd95acedcedf6320e64634f0c" ,
123- }
124-
125- resp = await client .post (f"{ url } " , json = new_group )
126- data , error = await assert_status (resp , expected .created )
127-
128- assigned_group = new_group
129- if not error :
130- assert isinstance (data , dict )
131- assigned_group = data
132- _assert_group (assigned_group )
133- # we get a new gid and the rest keeps the same
134- assert assigned_group ["gid" ] != new_group ["gid" ]
135- for prop in ["label" , "description" , "thumbnail" ]:
136- assert assigned_group [prop ] == new_group [prop ]
137- # we get all rights on the group since we are the creator
138- assert assigned_group ["accessRights" ] == {
139- "read" : True ,
140- "write" : True ,
141- "delete" : True ,
142- }
143-
144- # get the groups and check we are part of this new group
145- url = client .app .router ["list_groups" ].url_for ()
146- assert f"{ url } " == f"/{ API_VTAG } /groups"
147-
148- resp = await client .get (f"{ url } " )
149- data , error = await assert_status (
150- resp , expected .ok if user_role != UserRole .GUEST else status .HTTP_200_OK
151- )
152- if not error and user_role != UserRole .GUEST :
153- assert len (data ["organizations" ]) == 1
154- assert data ["organizations" ][0 ] == assigned_group
155-
156- # check getting one group
157- url = client .app .router ["get_group" ].url_for (gid = f"{ assigned_group ['gid' ]} " )
158- assert f"{ url } " == f"/{ API_VTAG } /groups/{ assigned_group ['gid' ]} "
159- resp = await client .get (f"{ url } " )
160- data , error = await assert_status (
161- resp , expected .ok if user_role != UserRole .GUEST else status .HTTP_404_NOT_FOUND
162- )
163- if not error :
164- assert data == assigned_group
165-
166- # modify the group
167- modified_group = {"label" : "Led Zeppelin" }
168- url = client .app .router ["update_group" ].url_for (gid = f"{ assigned_group ['gid' ]} " )
169- assert f"{ url } " == f"/{ API_VTAG } /groups/{ assigned_group ['gid' ]} "
170- resp = await client .patch (f"{ url } " , json = modified_group )
171- data , error = await assert_status (resp , expected .ok )
172- if not error :
173- assert data != assigned_group
174- _assert_group (data )
175- assigned_group .update (** modified_group )
176- assert data == assigned_group
177- # check getting the group returns the newly modified group
178- url = client .app .router ["get_group" ].url_for (gid = f"{ assigned_group ['gid' ]} " )
179- assert f"{ url } " == f"/{ API_VTAG } /groups/{ assigned_group ['gid' ]} "
180- resp = await client .get (f"{ url } " )
181- data , error = await assert_status (
182- resp , expected .ok if user_role != UserRole .GUEST else status .HTTP_404_NOT_FOUND
183- )
184- if not error :
185- _assert_group (data )
186- assert data == assigned_group
187-
188- # delete the group
189- url = client .app .router ["delete_group" ].url_for (gid = f"{ assigned_group ['gid' ]} " )
190- assert f"{ url } " == f"/{ API_VTAG } /groups/{ assigned_group ['gid' ]} "
191- resp = await client .delete (f"{ url } " )
192- data , error = await assert_status (resp , expected .no_content )
193- if not error :
194- assert not data
195-
196- # check deleting the same group again fails
197- url = client .app .router ["delete_group" ].url_for (gid = f"{ assigned_group ['gid' ]} " )
198- assert f"{ url } " == f"/{ API_VTAG } /groups/{ assigned_group ['gid' ]} "
199- resp = await client .delete (f"{ url } " )
200- data , error = await assert_status (resp , expected .not_found )
201-
202- # check getting the group fails
203- url = client .app .router ["get_group" ].url_for (gid = f"{ assigned_group ['gid' ]} " )
204- assert f"{ url } " == f"/{ API_VTAG } /groups/{ assigned_group ['gid' ]} "
205- resp = await client .get (f"{ url } " )
206- data , error = await assert_status (
207- resp ,
208- expected .not_found
209- if user_role != UserRole .GUEST
210- else status .HTTP_404_NOT_FOUND ,
211- )
212-
213-
21461@pytest .mark .parametrize (* standard_role_response ())
21562async def test_add_remove_users_from_group (
21663 client : TestClient ,
@@ -428,6 +275,7 @@ async def test_group_access_rights(
428275 params = {"uid" : user ["id" ]} if i % 2 == 0 else {"email" : user ["email" ]}
429276 resp = await client .post (f"{ add_group_user_url } " , json = params )
430277 data , error = await assert_status (resp , expected .no_content )
278+
431279 # 3. user 1 shall be a manager
432280 patch_group_user_url = client .app .router ["update_group_user" ].url_for (
433281 gid = f"{ assigned_group ['gid' ]} " , uid = f"{ users [0 ]['id' ]} "
@@ -439,6 +287,7 @@ async def test_group_access_rights(
439287 params = {"accessRights" : {"read" : True , "write" : True , "delete" : False }}
440288 resp = await client .patch (f"{ patch_group_user_url } " , json = params )
441289 data , error = await assert_status (resp , expected .ok )
290+
442291 # 4. user 2 shall be a member
443292 patch_group_user_url = client .app .router ["update_group_user" ].url_for (
444293 gid = f"{ assigned_group ['gid' ]} " , uid = f"{ users [1 ]['id' ]} "
@@ -462,6 +311,7 @@ async def test_group_access_rights(
462311 },
463312 )
464313 await assert_status (resp , expected .ok )
314+
465315 # check as a manager I can remove user 2
466316 delete_group_user_url = client .app .router ["delete_group_user" ].url_for (
467317 gid = f"{ assigned_group ['gid' ]} " , uid = f"{ users [1 ]['id' ]} "
@@ -472,9 +322,11 @@ async def test_group_access_rights(
472322 )
473323 resp = await client .delete (f"{ delete_group_user_url } " )
474324 data , error = await assert_status (resp , expected .no_content )
325+
475326 # as a manager I can add user 2 again
476327 resp = await client .post (f"{ add_group_user_url } " , json = {"uid" : users [1 ]["id" ]})
477328 data , error = await assert_status (resp , expected .no_content )
329+
478330 # as a manager I cannot delete the group
479331 url = client .app .router ["delete_group" ].url_for (gid = f"{ assigned_group ['gid' ]} " )
480332 resp = await client .delete (f"{ url } " )
@@ -491,6 +343,7 @@ async def test_group_access_rights(
491343 },
492344 )
493345 await assert_status (resp , expected .ok )
346+
494347 # as a member I cannot remove user 1
495348 delete_group_user_url = client .app .router ["delete_group_user" ].url_for (
496349 gid = f"{ assigned_group ['gid' ]} " , uid = f"{ users [0 ]['id' ]} "
@@ -501,9 +354,11 @@ async def test_group_access_rights(
501354 )
502355 resp = await client .delete (f"{ delete_group_user_url } " )
503356 data , error = await assert_status (resp , status .HTTP_403_FORBIDDEN )
357+
504358 # as a member I cannot add user 1
505359 resp = await client .post (f"{ add_group_user_url } " , json = {"uid" : users [0 ]["id" ]})
506360 data , error = await assert_status (resp , status .HTTP_403_FORBIDDEN )
361+
507362 # as a member I cannot delete the grouop
508363 url = client .app .router ["delete_group" ].url_for (gid = f"{ assigned_group ['gid' ]} " )
509364 resp = await client .delete (f"{ url } " )
@@ -553,21 +408,22 @@ async def test_add_user_gets_added_to_group(
553408async def group_where_logged_user_is_the_owner (
554409 client : TestClient ,
555410 logged_user : UserInfoDict ,
556- create_user_group : CreateUserGroupCallable ,
557- ) -> AsyncIterator [dict [str , Any ]]:
411+ ) -> AsyncIterator [Group ]:
558412 assert client .app
559- group = await create_user_group (
413+ group , _ = await create_organization (
560414 app = client .app ,
561415 user_id = logged_user ["id" ],
562- new_group = {
416+ new_group_values = {
563417 "gid" : "6543" ,
564418 "label" : f"this is user { logged_user ['id' ]} group" ,
565419 "description" : f"user { logged_user ['email' ]} is the owner of that one" ,
566420 "thumbnail" : None ,
567421 },
568422 )
423+
569424 yield group
570- await delete_user_group (client .app , logged_user ["id" ], group ["gid" ])
425+
426+ await delete_organization (client .app , user_id = logged_user ["id" ], group_id = group .gid )
571427
572428
573429@pytest .mark .acceptance_test (
@@ -577,12 +433,12 @@ async def group_where_logged_user_is_the_owner(
577433async def test_adding_user_to_group_with_upper_case_email (
578434 client : TestClient ,
579435 user_role : UserRole ,
580- group_where_logged_user_is_the_owner : dict [ str , str ] ,
436+ group_where_logged_user_is_the_owner : Group ,
581437 faker : Faker ,
582438):
583439 assert client .app
584440 url = client .app .router ["add_group_user" ].url_for (
585- gid = f"{ group_where_logged_user_is_the_owner [ ' gid' ] } "
441+ gid = f"{ group_where_logged_user_is_the_owner . gid } "
586442 )
587443 # adding a user to group with the email in capital letters
588444 # Tests 🐛 https://github.com/ITISFoundation/osparc-issues/issues/812
0 commit comments