@@ -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- 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" ,
90113114+ "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- 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
701756def 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