Skip to content

Commit ce0a606

Browse files
committed
drafts test
1 parent 728db70 commit ce0a606

File tree

3 files changed

+94
-36
lines changed
  • packages/models-library/src/models_library/api_schemas_webserver
  • services/web/server

3 files changed

+94
-36
lines changed

packages/models-library/src/models_library/api_schemas_webserver/users.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ class UserGet(OutputSchema):
215215
# Public profile of a user subject to its privacy settings
216216
user_id: UserID
217217
group_id: GroupID
218-
user_name: UserNameID
218+
user_name: UserNameID | None = None
219219
first_name: str | None = None
220220
last_name: str | None = None
221221
email: EmailStr | None = None

services/web/server/src/simcore_service_webserver/users/_users_rest.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,10 @@ async def search_users_for_admin(request: web.Request) -> web.Response:
180180
)
181181

182182
return envelope_json_response(
183-
[_.model_dump(**_RESPONSE_MODEL_MINIMAL_POLICY) for _ in found]
183+
[
184+
user_for_admin.model_dump(**_RESPONSE_MODEL_MINIMAL_POLICY)
185+
for user_for_admin in found
186+
]
184187
)
185188

186189

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

Lines changed: 89 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,36 @@ def app_environment(
6262

6363

6464
@pytest.fixture
65-
async def private_user(client: TestClient) -> AsyncIterable[UserInfoDict]:
65+
def partial_first_name() -> str:
66+
return "James"
67+
68+
69+
@pytest.fixture
70+
def partial_username() -> str:
71+
return "COMMON_USERNAME"
72+
73+
74+
@pytest.fixture
75+
def partial_email() -> str:
76+
return "@acme.com"
77+
78+
79+
@pytest.fixture
80+
async def private_user(
81+
client: TestClient,
82+
partial_username: str,
83+
partial_email: str,
84+
partial_first_name: str,
85+
) -> AsyncIterable[UserInfoDict]:
6686
assert client.app
6787
async with NewUser(
6888
app=client.app,
6989
user_data={
70-
"name": "jamie01",
71-
"first_name": "James",
90+
"name": f"james{partial_username}",
91+
"first_name": partial_first_name,
7292
"last_name": "Bond",
73-
"email": "[email protected]",
93+
"email": f"james{partial_email}",
94+
"privacy_hide_username": True,
7495
"privacy_hide_email": True,
7596
"privacy_hide_fullname": True,
7697
},
@@ -79,15 +100,18 @@ async def private_user(client: TestClient) -> AsyncIterable[UserInfoDict]:
79100

80101

81102
@pytest.fixture
82-
async def semi_private_user(client: TestClient) -> AsyncIterable[UserInfoDict]:
103+
async def semi_private_user(
104+
client: TestClient, partial_username: str, partial_first_name: str
105+
) -> AsyncIterable[UserInfoDict]:
83106
assert client.app
84107
async with NewUser(
85108
app=client.app,
86109
user_data={
87-
"name": "maxwell",
88-
"first_name": "James",
110+
"name": f"maxwell{partial_username}",
111+
"first_name": partial_first_name,
89112
"last_name": "Maxwell",
90113
"email": "[email protected]",
114+
"privacy_hide_username": False,
91115
"privacy_hide_email": True,
92116
"privacy_hide_fullname": False, # <--
93117
},
@@ -96,60 +120,75 @@ async def semi_private_user(client: TestClient) -> AsyncIterable[UserInfoDict]:
96120

97121

98122
@pytest.fixture
99-
async def public_user(client: TestClient) -> AsyncIterable[UserInfoDict]:
123+
async def public_user(
124+
client: TestClient, partial_username: str, partial_email: str
125+
) -> AsyncIterable[UserInfoDict]:
100126
assert client.app
101127
async with NewUser(
102128
app=client.app,
103129
user_data={
104-
"name": "taylie01",
130+
"name": f"taylor{partial_username}",
105131
"first_name": "Taylor",
106132
"last_name": "Swift",
107-
"email": "[email protected]",
133+
"email": f"taylor{partial_email}",
134+
"privacy_hide_username": False,
108135
"privacy_hide_email": False,
109136
"privacy_hide_fullname": False,
110137
},
111138
) as usr:
112139
yield usr
113140

114141

115-
@pytest.mark.acceptance_test(
116-
"https://github.com/ITISFoundation/osparc-issues/issues/1779"
117-
)
118142
@pytest.mark.parametrize("user_role", [UserRole.USER])
119-
async def test_search_users(
143+
async def test_search_users_by_partial_fullname(
144+
user_role: UserRole,
120145
logged_user: UserInfoDict,
121146
client: TestClient,
122-
user_role: UserRole,
147+
partial_first_name: str,
123148
public_user: UserInfoDict,
124149
semi_private_user: UserInfoDict,
125150
private_user: UserInfoDict,
126151
):
127152
assert client.app
128153
assert user_role.value == logged_user["role"]
129154

155+
# logged_user has default settings
130156
assert private_user["id"] != logged_user["id"]
131157
assert public_user["id"] != logged_user["id"]
132158

133159
# SEARCH by partial first_name
134-
partial_name = "james"
135-
assert partial_name in private_user.get("first_name", "").lower()
136-
assert partial_name in semi_private_user.get("first_name", "").lower()
160+
assert partial_first_name in private_user.get("first_name", "")
161+
assert partial_first_name in semi_private_user.get("first_name", "")
162+
assert partial_first_name not in public_user.get("first_name", "")
137163

138164
url = client.app.router["search_users"].url_for()
139-
resp = await client.post(f"{url}", json={"match": partial_name})
165+
resp = await client.post(f"{url}", json={"match": partial_first_name})
140166
data, _ = await assert_status(resp, status.HTTP_200_OK)
141167

168+
# expected `semi_private_user` found
142169
found = TypeAdapter(list[UserGet]).validate_python(data)
143170
assert found
144171
assert len(found) == 1
145-
assert semi_private_user["name"] == found[0].user_name
172+
assert found[0].user_name == semi_private_user["name"]
146173
assert found[0].first_name == semi_private_user.get("first_name")
147174
assert found[0].last_name == semi_private_user.get("last_name")
148175
assert found[0].email is None
149176

177+
178+
@pytest.mark.parametrize("user_role", [UserRole.USER])
179+
async def test_search_users_by_partial_email(
180+
logged_user: UserInfoDict,
181+
client: TestClient,
182+
user_role: UserRole,
183+
partial_email: str,
184+
public_user: UserInfoDict,
185+
semi_private_user: UserInfoDict,
186+
private_user: UserInfoDict,
187+
):
188+
150189
# SEARCH by partial email
151-
partial_email = "@find.m"
152190
assert partial_email in private_user["email"]
191+
assert partial_email not in semi_private_user["email"]
153192
assert partial_email in public_user["email"]
154193

155194
url = client.app.router["search_users"].url_for()
@@ -159,15 +198,36 @@ async def test_search_users(
159198
found = TypeAdapter(list[UserGet]).validate_python(data)
160199
assert found
161200
assert len(found) == 1
201+
202+
# expected `public_user` found
162203
assert found[0].user_id == public_user["id"]
163204
assert found[0].user_name == public_user["name"]
164205
assert found[0].email == public_user["email"]
165206
assert found[0].first_name == public_user.get("first_name")
166207
assert found[0].last_name == public_user.get("last_name")
167208

209+
# SEARCH user for admin (from a USER)
210+
url = (
211+
client.app.router["search_users_for_admin"]
212+
.url_for()
213+
.with_query(email=partial_email)
214+
)
215+
resp = await client.get(f"{url}")
216+
await assert_status(resp, status.HTTP_403_FORBIDDEN)
217+
218+
219+
async def test_search_users_by_partial_username(
220+
logged_user: UserInfoDict,
221+
client: TestClient,
222+
partial_username: str,
223+
user_role: UserRole,
224+
public_user: UserInfoDict,
225+
semi_private_user: UserInfoDict,
226+
private_user: UserInfoDict,
227+
):
168228
# SEARCH by partial username
169-
partial_username = "ie01"
170229
assert partial_username in private_user["name"]
230+
assert partial_username in semi_private_user["name"]
171231
assert partial_username in public_user["name"]
172232

173233
url = client.app.router["search_users"].url_for()
@@ -178,25 +238,20 @@ async def test_search_users(
178238
assert found
179239
assert len(found) == 2
180240

241+
# expected `public_user` found
181242
index = [u.user_id for u in found].index(public_user["id"])
182243
assert found[index].user_name == public_user["name"]
244+
assert found[index].email == public_user["email"]
245+
assert found[index].first_name == public_user.get("first_name")
246+
assert found[index].last_name == public_user.get("last_name")
183247

184-
# check privacy
248+
# expected `semi_private_user` found
185249
index = (index + 1) % 2
186-
assert found[index].user_name == private_user["name"]
250+
assert found[index].user_name == semi_private_user["name"]
187251
assert found[index].email is None
188252
assert found[index].first_name is None
189253
assert found[index].last_name is None
190254

191-
# SEARCH user for admin (from a USER)
192-
url = (
193-
client.app.router["search_users_for_admin"]
194-
.url_for()
195-
.with_query(email=partial_email)
196-
)
197-
resp = await client.get(f"{url}")
198-
await assert_status(resp, status.HTTP_403_FORBIDDEN)
199-
200255

201256
@pytest.mark.acceptance_test(
202257
"https://github.com/ITISFoundation/osparc-issues/issues/1779"
@@ -699,7 +754,7 @@ def test_preuserprofile_parse_model_from_request_form_data(
699754

700755

701756
def test_preuserprofile_parse_model_without_extras(
702-
account_request_form: dict[str, Any]
757+
account_request_form: dict[str, Any],
703758
):
704759
required = {
705760
f.alias or f_name

0 commit comments

Comments
 (0)