Skip to content

Commit ef92fe9

Browse files
committed
cleanup
1 parent 7af1bfa commit ef92fe9

File tree

2 files changed

+129
-105
lines changed

2 files changed

+129
-105
lines changed

services/web/server/src/simcore_service_webserver/groups/_groups_repository.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ async def auto_add_user_to_groups(
739739

740740
# auto add user to the groups with the right rules
741741
# get the groups where there are inclusion rules and see if they apply
742-
query = sa.select(groups).where(groups.c.inclusion_rules != "{}")
742+
query = sa.select(groups).where(groups.c.inclusion_rules != {})
743743
possible_group_ids = set()
744744

745745
async with transaction_context(get_asyncpg_engine(app), connection) as conn:

services/web/server/tests/unit/with_dbs/03/test_users.py

Lines changed: 128 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@
77

88
import functools
99
import sys
10-
from contextlib import AsyncExitStack
1110
from copy import deepcopy
1211
from http import HTTPStatus
13-
from typing import Any
12+
from typing import Any, AsyncIterable
1413
from unittest.mock import MagicMock, Mock
1514

1615
import pytest
@@ -60,121 +59,146 @@ def app_environment(
6059
)
6160

6261

62+
@pytest.fixture
63+
async def private_user(client: TestClient) -> AsyncIterable[UserInfoDict]:
64+
assert client.app
65+
async with NewUser(
66+
app=client.app,
67+
user_data={
68+
"name": "jamie01",
69+
"first_name": "James",
70+
"last_name": "Bond",
71+
"email": "[email protected]",
72+
"privacy_hide_email": True,
73+
"privacy_hide_fullname": True,
74+
},
75+
) as usr:
76+
yield usr
77+
78+
79+
@pytest.fixture
80+
async def public_user(client: TestClient) -> AsyncIterable[UserInfoDict]:
81+
assert client.app
82+
async with NewUser(
83+
user_data={
84+
"name": "taylie01",
85+
"first_name": "Taylor",
86+
"last_name": "Swift",
87+
"email": "[email protected]",
88+
"privacy_hide_email": False,
89+
"privacy_hide_fullname": False,
90+
},
91+
) as usr:
92+
yield usr
93+
94+
6395
@pytest.mark.acceptance_test(
6496
"https://github.com/ITISFoundation/osparc-issues/issues/1779"
6597
)
6698
@pytest.mark.parametrize("user_role", [UserRole.USER])
67-
async def test_get_and_search_public_users(
99+
async def test_search_users(
68100
logged_user: UserInfoDict,
69101
client: TestClient,
70102
user_role: UserRole,
103+
public_user: UserInfoDict,
104+
private_user: UserInfoDict,
71105
):
72106
assert client.app
73107
assert user_role.value == logged_user["role"]
74108

75-
async with AsyncExitStack() as stack:
76-
private_user: UserInfoDict = await stack.enter_async_context(
77-
NewUser(
78-
app=client.app,
79-
user_data={
80-
"name": "jamie01",
81-
"first_name": "James",
82-
"last_name": "Bond",
83-
"email": "[email protected]",
84-
"privacy_hide_email": True,
85-
"privacy_hide_fullname": True,
86-
},
87-
)
88-
)
89-
public_user: UserInfoDict = await stack.enter_async_context(
90-
NewUser(
91-
app=client.app,
92-
user_data={
93-
"name": "taylie01",
94-
"first_name": "Taylor",
95-
"last_name": "Swift",
96-
"email": "[email protected]",
97-
"privacy_hide_email": False,
98-
"privacy_hide_fullname": False,
99-
},
100-
)
101-
)
109+
assert private_user["id"] != logged_user["id"]
110+
assert public_user["id"] != logged_user["id"]
102111

103-
assert private_user["id"] != logged_user["id"]
104-
assert public_user["id"] != logged_user["id"]
105-
106-
# SEARCH by partial email
107-
partial_email = "@find.m"
108-
assert partial_email in private_user["email"]
109-
assert partial_email in public_user["email"]
110-
111-
url = client.app.router["search_users"].url_for()
112-
resp = await client.post(f"{url}", json={"match": partial_email})
113-
data, _ = await assert_status(resp, status.HTTP_200_OK)
114-
115-
found = TypeAdapter(list[UserGet]).validate_python(data)
116-
assert found
117-
assert len(found) == 1
118-
assert found[0].user_id == public_user["id"]
119-
assert found[0].user_name == public_user["name"]
120-
assert found[0].email == public_user["email"]
121-
assert found[0].first_name == public_user.get("first_name")
122-
assert found[0].last_name == public_user.get("last_name")
123-
124-
# SEARCH by partial username
125-
partial_username = "ie01"
126-
assert partial_username in private_user["name"]
127-
assert partial_username in public_user["name"]
128-
129-
url = client.app.router["search_users"].url_for()
130-
resp = await client.post(f"{url}", json={"match": partial_username})
131-
data, _ = await assert_status(resp, status.HTTP_200_OK)
132-
133-
found = TypeAdapter(list[UserGet]).validate_python(data)
134-
assert found
135-
assert len(found) == 2
136-
assert found[1].user_id == public_user["id"]
137-
# check privacy
138-
assert found[0].user_name == private_user["name"]
139-
assert found[0].email is None
140-
assert found[0].first_name is None
141-
assert found[0].last_name is None
142-
143-
# SEARCH user for admin (from a USER)
144-
url = (
145-
client.app.router["search_users_for_admin"]
146-
.url_for()
147-
.with_query(email=partial_email)
148-
)
149-
resp = await client.get(f"{url}")
150-
await assert_status(resp, status.HTTP_403_FORBIDDEN)
112+
# SEARCH by partial email
113+
partial_email = "@find.m"
114+
assert partial_email in private_user["email"]
115+
assert partial_email in public_user["email"]
151116

152-
# GET user by primary GID
153-
url = client.app.router["get_all_group_users"].url_for(
154-
gid=f"{public_user['primary_gid']}"
155-
)
156-
resp = await client.get(f"{url}")
157-
data, _ = await assert_status(resp, status.HTTP_200_OK)
158-
159-
users = TypeAdapter(list[GroupUserGet]).validate_python(data)
160-
assert len(users) == 1
161-
assert users[0].id == public_user["id"]
162-
assert users[0].user_name == public_user["name"]
163-
assert users[0].first_name == public_user.get("first_name")
164-
assert users[0].last_name == public_user.get("last_name")
165-
166-
url = client.app.router["get_all_group_users"].url_for(
167-
gid=f"{private_user['primary_gid']}"
168-
)
169-
resp = await client.get(f"{url}")
170-
data, _ = await assert_status(resp, status.HTTP_200_OK)
171-
172-
users = TypeAdapter(list[GroupUserGet]).validate_python(data)
173-
assert len(users) == 1
174-
assert users[0].id == private_user["id"]
175-
assert users[0].user_name == private_user["name"]
176-
assert users[0].first_name is None
177-
assert users[0].last_name is None
117+
url = client.app.router["search_users"].url_for()
118+
resp = await client.post(f"{url}", json={"match": partial_email})
119+
data, _ = await assert_status(resp, status.HTTP_200_OK)
120+
121+
found = TypeAdapter(list[UserGet]).validate_python(data)
122+
assert found
123+
assert len(found) == 1
124+
assert found[0].user_id == public_user["id"]
125+
assert found[0].user_name == public_user["name"]
126+
assert found[0].email == public_user["email"]
127+
assert found[0].first_name == public_user.get("first_name")
128+
assert found[0].last_name == public_user.get("last_name")
129+
130+
# SEARCH by partial username
131+
partial_username = "ie01"
132+
assert partial_username in private_user["name"]
133+
assert partial_username in public_user["name"]
134+
135+
url = client.app.router["search_users"].url_for()
136+
resp = await client.post(f"{url}", json={"match": partial_username})
137+
data, _ = await assert_status(resp, status.HTTP_200_OK)
138+
139+
found = TypeAdapter(list[UserGet]).validate_python(data)
140+
assert found
141+
assert len(found) == 2
142+
assert found[1].user_id == public_user["id"]
143+
# check privacy
144+
assert found[0].user_name == private_user["name"]
145+
assert found[0].email is None
146+
assert found[0].first_name is None
147+
assert found[0].last_name is None
148+
149+
# SEARCH user for admin (from a USER)
150+
url = (
151+
client.app.router["search_users_for_admin"]
152+
.url_for()
153+
.with_query(email=partial_email)
154+
)
155+
resp = await client.get(f"{url}")
156+
await assert_status(resp, status.HTTP_403_FORBIDDEN)
157+
158+
159+
@pytest.mark.acceptance_test(
160+
"https://github.com/ITISFoundation/osparc-issues/issues/1779"
161+
)
162+
@pytest.mark.parametrize("user_role", [UserRole.USER])
163+
async def test_get_user_by_group_id(
164+
logged_user: UserInfoDict,
165+
client: TestClient,
166+
user_role: UserRole,
167+
public_user: UserInfoDict,
168+
private_user: UserInfoDict,
169+
):
170+
assert client.app
171+
assert user_role.value == logged_user["role"]
172+
173+
assert private_user["id"] != logged_user["id"]
174+
assert public_user["id"] != logged_user["id"]
175+
176+
# GET user by primary GID
177+
url = client.app.router["get_all_group_users"].url_for(
178+
gid=f"{public_user['primary_gid']}"
179+
)
180+
resp = await client.get(f"{url}")
181+
data, _ = await assert_status(resp, status.HTTP_200_OK)
182+
183+
users = TypeAdapter(list[GroupUserGet]).validate_python(data)
184+
assert len(users) == 1
185+
assert users[0].id == public_user["id"]
186+
assert users[0].user_name == public_user["name"]
187+
assert users[0].first_name == public_user.get("first_name")
188+
assert users[0].last_name == public_user.get("last_name")
189+
190+
url = client.app.router["get_all_group_users"].url_for(
191+
gid=f"{private_user['primary_gid']}"
192+
)
193+
resp = await client.get(f"{url}")
194+
data, _ = await assert_status(resp, status.HTTP_200_OK)
195+
196+
users = TypeAdapter(list[GroupUserGet]).validate_python(data)
197+
assert len(users) == 1
198+
assert users[0].id == private_user["id"]
199+
assert users[0].user_name == private_user["name"]
200+
assert users[0].first_name is None
201+
assert users[0].last_name is None
178202

179203

180204
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)