Skip to content

Commit 5a32208

Browse files
authored
Merge pull request #2013 from weaviate/fix_flaky_user_test
Replace random number with unique and deterministic name
2 parents feb4e4c + f2cf965 commit 5a32208

1 file changed

Lines changed: 82 additions & 73 deletions

File tree

integration/test_users.py

Lines changed: 82 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1-
import random
2-
31
import pytest
2+
from _pytest.fixtures import SubRequest
43

54
import weaviate
6-
from integration.conftest import ClientFactory
5+
from integration.conftest import ClientFactory, _sanitize_collection_name
76
from weaviate.auth import Auth
87
from weaviate.rbac.models import Role, RoleBase, UserTypes
98

109
RBAC_PORTS = (8092, 50063)
1110
RBAC_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+
1417
def 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

203206
def 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

Comments
 (0)