1- import random
2-
31import pytest
2+ from _pytest .fixtures import SubRequest
43
54import weaviate
6- from integration .conftest import ClientFactory
5+ from integration .conftest import ClientFactory , _sanitize_collection_name
76from weaviate .auth import Auth
87from weaviate .rbac .models import Role , RoleBase , UserTypes
98
109RBAC_PORTS = (8092 , 50063 )
1110RBAC_AUTH_CREDS = Auth .api_key ("admin-key" )
1211
1312
13+ def _unique_user_id (name : str ) -> str :
14+ return _sanitize_collection_name (name ).lower ()
15+
16+
1417def test_own_user (client_factory : ClientFactory ) -> None :
1518 with client_factory (ports = RBAC_PORTS , auth_credentials = RBAC_AUTH_CREDS ) as client :
1619 if client ._connection ._weaviate_version .is_lower_than (1 , 28 , 0 ):
@@ -75,129 +78,129 @@ def test_get_static_db_user(client_factory: ClientFactory) -> None:
7578 assert user .user_type == UserTypes .DB_STATIC
7679
7780
78- def test_create_user_and_get (client_factory : ClientFactory ) -> None :
81+ def test_create_user_and_get (client_factory : ClientFactory , request : SubRequest ) -> None :
7982 with client_factory (ports = (RBAC_PORTS ), auth_credentials = Auth .api_key ("admin-key" )) as client :
8083 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
8184 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
8285
83- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
84- apiKey = client .users .db .create (user_id = randomUserName )
86+ user_id = _unique_user_id ( request . node . name )
87+ api_key = client .users .db .create (user_id = user_id )
8588 with weaviate .connect_to_local (
86- port = RBAC_PORTS [0 ], grpc_port = RBAC_PORTS [1 ], auth_credentials = Auth .api_key (apiKey )
89+ port = RBAC_PORTS [0 ], grpc_port = RBAC_PORTS [1 ], auth_credentials = Auth .api_key (api_key )
8790 ) as client2 :
8891 user = client2 .users .get_my_user ()
89- assert user .user_id == randomUserName
90- dynamicUser = client .users .db .get (user_id = randomUserName )
91- assert dynamicUser is not None
92- assert dynamicUser .user_id == randomUserName
93- assert dynamicUser .user_type == UserTypes .DB_DYNAMIC
94- assert client .users .db .delete (user_id = randomUserName )
92+ assert user .user_id == user_id
93+ dynamic_user = client .users .db .get (user_id = user_id )
94+ assert dynamic_user is not None
95+ assert dynamic_user .user_id == user_id
96+ assert dynamic_user .user_type == UserTypes .DB_DYNAMIC
97+ assert client .users .db .delete (user_id = user_id )
9598
9699
97- def test_delete_user (client_factory : ClientFactory ) -> None :
100+ def test_delete_user (client_factory : ClientFactory , request : SubRequest ) -> None :
98101 with client_factory (ports = RBAC_PORTS , auth_credentials = Auth .api_key ("admin-key" )) as client :
99102 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
100103 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
101104
102- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
103- client .users .db .create (user_id = randomUserName )
104- assert client .users .db .delete (user_id = randomUserName )
105+ user_id = _unique_user_id ( request . node . name )
106+ client .users .db .create (user_id = user_id )
107+ assert client .users .db .delete (user_id = user_id )
105108
106109 assert not client .users .db .delete (user_id = "I-do-not-exist" )
107110
108111
109- def test_rotate_user_key (client_factory : ClientFactory ) -> None :
112+ def test_rotate_user_key (client_factory : ClientFactory , request : SubRequest ) -> None :
110113 with client_factory (ports = RBAC_PORTS , auth_credentials = Auth .api_key ("admin-key" )) as client :
111114 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
112115 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
113116
114- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
115- apiKey = client .users .db .create (user_id = randomUserName )
117+ user_id = _unique_user_id ( request . node . name )
118+ api_key = client .users .db .create (user_id = user_id )
116119 with weaviate .connect_to_local (
117- port = RBAC_PORTS [0 ], grpc_port = RBAC_PORTS [1 ], auth_credentials = Auth .api_key (apiKey )
120+ port = RBAC_PORTS [0 ], grpc_port = RBAC_PORTS [1 ], auth_credentials = Auth .api_key (api_key )
118121 ) as client2 :
119122 user = client2 .users .get_my_user ()
120- assert user .user_id == randomUserName
123+ assert user .user_id == user_id
121124
122- apiKeyNew = client .users .db .rotate_key (user_id = randomUserName )
125+ api_key_new = client .users .db .rotate_key (user_id = user_id )
123126 with weaviate .connect_to_local (
124- port = RBAC_PORTS [0 ], grpc_port = RBAC_PORTS [1 ], auth_credentials = Auth .api_key (apiKeyNew )
127+ port = RBAC_PORTS [0 ], grpc_port = RBAC_PORTS [1 ], auth_credentials = Auth .api_key (api_key_new )
125128 ) as client2 :
126129 user = client2 .users .get_my_user ()
127- assert user .user_id == randomUserName
130+ assert user .user_id == user_id
128131
129- assert client .users .db .delete (user_id = randomUserName )
132+ assert client .users .db .delete (user_id = user_id )
130133
131134
132- def test_de_activate (client_factory : ClientFactory ) -> None :
135+ def test_de_activate (client_factory : ClientFactory , request : SubRequest ) -> None :
133136 with client_factory (ports = RBAC_PORTS , auth_credentials = Auth .api_key ("admin-key" )) as client :
134137 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
135138 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
136139
137- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
138- client .users .db .create (user_id = randomUserName )
140+ user_id = _unique_user_id ( request . node . name )
141+ client .users .db .create (user_id = user_id )
139142
140- assert client .users .db .deactivate (user_id = randomUserName )
143+ assert client .users .db .deactivate (user_id = user_id )
141144 assert not client .users .db .deactivate (
142- user_id = randomUserName
145+ user_id = user_id
143146 ) # second deactivation returns a conflict => false
144- user = client .users .db .get (user_id = randomUserName )
147+ user = client .users .db .get (user_id = user_id )
145148 assert not user .active
146- assert client .users .db .activate (user_id = randomUserName )
149+ assert client .users .db .activate (user_id = user_id )
147150 assert not client .users .db .activate (
148- user_id = randomUserName
151+ user_id = user_id
149152 ) # second activation returns a conflict => false
150- user = client .users .db .get (user_id = randomUserName )
153+ user = client .users .db .get (user_id = user_id )
151154 assert user .active
152155
153- client .users .db .delete (user_id = randomUserName )
156+ client .users .db .delete (user_id = user_id )
154157
155158
156- def test_deactivate_and_revoke (client_factory : ClientFactory ) -> None :
159+ def test_deactivate_and_revoke (client_factory : ClientFactory , request : SubRequest ) -> None :
157160 with client_factory (ports = RBAC_PORTS , auth_credentials = Auth .api_key ("admin-key" )) as client :
158161 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
159162 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
160163
161- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
162- apiKeyOld = client .users .db .create (user_id = randomUserName )
163- assert client .users .db .deactivate (user_id = randomUserName , revoke_key = True )
164+ user_id = _unique_user_id ( request . node . name )
165+ api_key_old = client .users .db .create (user_id = user_id )
166+ assert client .users .db .deactivate (user_id = user_id , revoke_key = True )
164167
165168 with pytest .raises (weaviate .exceptions .UnexpectedStatusCodeError ):
166169 weaviate .connect_to_local (
167170 port = RBAC_PORTS [0 ],
168171 grpc_port = RBAC_PORTS [1 ],
169- auth_credentials = Auth .api_key (apiKeyOld ),
172+ auth_credentials = Auth .api_key (api_key_old ),
170173 )
171174
172175 # re-activating is not enough
173- assert client .users .db .activate (user_id = randomUserName )
176+ assert client .users .db .activate (user_id = user_id )
174177 with pytest .raises (weaviate .exceptions .UnexpectedStatusCodeError ):
175178 weaviate .connect_to_local (
176179 port = RBAC_PORTS [0 ],
177180 grpc_port = RBAC_PORTS [1 ],
178- auth_credentials = Auth .api_key (apiKeyOld ),
181+ auth_credentials = Auth .api_key (api_key_old ),
179182 )
180183
181- apiKeyNew = client .users .db .rotate_key (user_id = randomUserName )
184+ api_key_new = client .users .db .rotate_key (user_id = user_id )
182185
183186 with weaviate .connect_to_local (
184- port = RBAC_PORTS [0 ], grpc_port = RBAC_PORTS [1 ], auth_credentials = Auth .api_key (apiKeyNew )
187+ port = RBAC_PORTS [0 ], grpc_port = RBAC_PORTS [1 ], auth_credentials = Auth .api_key (api_key_new )
185188 ) as client2 :
186189 user = client2 .users .get_my_user ()
187- assert user .user_id == randomUserName
190+ assert user .user_id == user_id
188191
189- client .users .db .delete (user_id = randomUserName )
192+ client .users .db .delete (user_id = user_id )
190193
191194
192- def test_deprecated_syntax (client_factory : ClientFactory ) -> None :
195+ def test_deprecated_syntax (client_factory : ClientFactory , request : SubRequest ) -> None :
193196 with client_factory (ports = RBAC_PORTS , auth_credentials = Auth .api_key ("admin-key" )) as client :
194197 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
195198 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
196- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
197- client .users .db .create (user_id = randomUserName )
198- roles = client .users .db .get_assigned_roles (user_id = randomUserName )
199+ user_id = _unique_user_id ( request . node . name )
200+ client .users .db .create (user_id = user_id )
201+ roles = client .users .db .get_assigned_roles (user_id = user_id )
199202 assert len (roles ) == 0
200- client .users .db .delete (user_id = randomUserName )
203+ client .users .db .delete (user_id = user_id )
201204
202205
203206def test_list_all_users (client_factory : ClientFactory ) -> None :
@@ -216,80 +219,86 @@ def test_list_all_users(client_factory: ClientFactory) -> None:
216219 client .users .db .delete (user_id = f"list-all-{ i } " )
217220
218221
219- def test_get_user_created_at_and_api_key_first_letters (client_factory : ClientFactory ) -> None :
222+ def test_get_user_created_at_and_api_key_first_letters (
223+ client_factory : ClientFactory , request : SubRequest
224+ ) -> None :
220225 with client_factory (ports = RBAC_PORTS , auth_credentials = Auth .api_key ("admin-key" )) as client :
221226 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
222227 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
223228
224- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
225- client .users .db .create (user_id = randomUserName )
229+ user_id = _unique_user_id ( request . node . name )
230+ client .users .db .create (user_id = user_id )
226231 try :
227- user = client .users .db .get (user_id = randomUserName )
232+ user = client .users .db .get (user_id = user_id )
228233 assert user is not None
229234 assert user .created_at is not None
230235 assert user .api_key_first_letters is not None
231236 assert len (user .api_key_first_letters ) > 0
232237 finally :
233- client .users .db .delete (user_id = randomUserName )
238+ client .users .db .delete (user_id = user_id )
234239
235240
236- def test_get_user_include_last_used_time (client_factory : ClientFactory ) -> None :
241+ def test_get_user_include_last_used_time (
242+ client_factory : ClientFactory , request : SubRequest
243+ ) -> None :
237244 with client_factory (ports = RBAC_PORTS , auth_credentials = Auth .api_key ("admin-key" )) as client :
238245 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
239246 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
240247
241- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
242- apiKey = client .users .db .create (user_id = randomUserName )
248+ user_id = _unique_user_id ( request . node . name )
249+ api_key = client .users .db .create (user_id = user_id )
243250 try :
244251 # log in with the new user to generate a lastUsedAt timestamp
245252 with weaviate .connect_to_local (
246253 port = RBAC_PORTS [0 ],
247254 grpc_port = RBAC_PORTS [1 ],
248- auth_credentials = Auth .api_key (apiKey ),
255+ auth_credentials = Auth .api_key (api_key ),
249256 ) as client2 :
250- assert client2 .users .get_my_user ().user_id == randomUserName
257+ assert client2 .users .get_my_user ().user_id == user_id
251258
252259 # without include_last_used_time, last_used_time should be None
253- user = client .users .db .get (user_id = randomUserName )
260+ user = client .users .db .get (user_id = user_id )
254261 assert user is not None
255262 assert user .last_used_time is None
256263
257264 # with include_last_used_time=True, last_used_time should be populated
258- user = client .users .db .get (user_id = randomUserName , include_last_used_time = True )
265+ user = client .users .db .get (user_id = user_id , include_last_used_time = True )
259266 assert user is not None
260267 assert user .last_used_time is not None
261268 finally :
262- client .users .db .delete (user_id = randomUserName )
269+ client .users .db .delete (user_id = user_id )
263270
264271
265- def test_list_all_include_last_used_time (client_factory : ClientFactory ) -> None :
272+ def test_list_all_include_last_used_time (
273+ client_factory : ClientFactory , request : SubRequest
274+ ) -> None :
266275 with client_factory (ports = RBAC_PORTS , auth_credentials = Auth .api_key ("admin-key" )) as client :
267276 if client ._connection ._weaviate_version .is_lower_than (1 , 30 , 0 ):
268277 pytest .skip ("This test requires Weaviate 1.30.0 or higher" )
269278
270- randomUserName = "new-user" + str ( random . randint ( 1 , 1000 ) )
271- apiKey = client .users .db .create (user_id = randomUserName )
279+ user_id = _unique_user_id ( request . node . name )
280+ api_key = client .users .db .create (user_id = user_id )
272281 try :
273282 # log in with the new user to generate a lastUsedAt timestamp
274283 with weaviate .connect_to_local (
275284 port = RBAC_PORTS [0 ],
276285 grpc_port = RBAC_PORTS [1 ],
277- auth_credentials = Auth .api_key (apiKey ),
286+ auth_credentials = Auth .api_key (api_key ),
278287 ) as client2 :
279- assert client2 .users .get_my_user ().user_id == randomUserName
288+ assert client2 .users .get_my_user ().user_id == user_id
280289
281290 # without include_last_used_time, last_used_time should be None
282291 users = client .users .db .list_all ()
283- target = next ((u for u in users if u .user_id == randomUserName ), None )
292+ target = next ((u for u in users if u .user_id == user_id ), None )
284293 assert target is not None
285294 assert target .created_at is not None
286295 assert target .api_key_first_letters is not None
287296 assert target .last_used_time is None
288297
289298 # with include_last_used_time=True, last_used_time should be populated
290299 users = client .users .db .list_all (include_last_used_time = True )
291- target = next ((u for u in users if u .user_id == randomUserName ), None )
300+ target = next ((u for u in users if u .user_id == user_id ), None )
292301 assert target is not None
293302 assert target .last_used_time is not None
294303 finally :
295- client .users .db .delete (user_id = randomUserName )
304+ client .users .db .delete (user_id = user_id )
0 commit comments