Skip to content

Commit 11ba49a

Browse files
committed
refactor API
1 parent 412fda1 commit 11ba49a

File tree

2 files changed

+179
-9
lines changed

2 files changed

+179
-9
lines changed

databunkerpro/api.py

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,13 +350,16 @@ def get_user(
350350
self,
351351
mode: str,
352352
identity: str,
353+
version: Optional[int] = None,
353354
request_metadata: Optional[Dict[str, Any]] = None,
354355
) -> Dict[str, Any]:
355356
"""Get user information from DatabunkerPro."""
356357
data = {
357358
"mode": mode,
358359
"identity": identity,
359360
}
361+
if version is not None:
362+
data["version"] = version
360363
return self._make_request("UserGet", data, request_metadata)
361364

362365
def update_user(
@@ -445,6 +448,34 @@ def request_user_deletion(
445448
}
446449
return self._make_request("UserDeleteRequest", data, request_metadata)
447450

451+
def search_user(
452+
self,
453+
mode: str,
454+
identity: str,
455+
unlock_uuid: str,
456+
request_metadata: Optional[Dict[str, Any]] = None,
457+
) -> Dict[str, Any]:
458+
"""Search for a user with unlock UUID."""
459+
data = {
460+
"mode": mode,
461+
"identity": identity,
462+
"unlockuuid": unlock_uuid,
463+
}
464+
return self._make_request("UserSearch", data, request_metadata)
465+
466+
def list_user_versions(
467+
self,
468+
mode: str,
469+
identity: str,
470+
request_metadata: Optional[Dict[str, Any]] = None,
471+
) -> Dict[str, Any]:
472+
"""List all versions of a user record."""
473+
data = {
474+
"mode": mode,
475+
"identity": identity,
476+
}
477+
return self._make_request("UserListVersions", data, request_metadata)
478+
448479
# User Authentication
449480
def prelogin_user(
450481
self,
@@ -650,6 +681,21 @@ def list_app_names(
650681
"""List all application names in the system."""
651682
return self._make_request("AppdataListAppNames", None, request_metadata)
652683

684+
def list_app_data_versions(
685+
self,
686+
mode: str,
687+
identity: str,
688+
appname: str,
689+
request_metadata: Optional[Dict[str, Any]] = None,
690+
) -> Dict[str, Any]:
691+
"""List all versions of application data for a user."""
692+
data = {
693+
"mode": mode,
694+
"identity": identity,
695+
"appname": appname,
696+
}
697+
return self._make_request("AppdataListVersions", data, request_metadata)
698+
653699
# Legal Basis Management
654700
def create_legal_basis(
655701
self,
@@ -1344,19 +1390,32 @@ def bulk_list_unlock(
13441390
return self._make_request("BulkListUnlock", None, request_metadata)
13451391

13461392
def bulk_list_users(
1393+
self,
1394+
unlock_uuid: str,
1395+
users: List[Dict[str, str]],
1396+
request_metadata: Optional[Dict[str, Any]] = None,
1397+
) -> Dict[str, Any]:
1398+
"""List specific users in a bulk operation."""
1399+
data = {
1400+
"unlockuuid": unlock_uuid,
1401+
"users": users,
1402+
}
1403+
return self._make_request("BulkListUsers", data, request_metadata)
1404+
1405+
def bulk_list_all_users(
13471406
self,
13481407
unlock_uuid: str,
13491408
offset: int = 0,
13501409
limit: int = 10,
13511410
request_metadata: Optional[Dict[str, Any]] = None,
13521411
) -> Dict[str, Any]:
1353-
"""List users in a bulk operation."""
1412+
"""List all users in a bulk operation with pagination."""
13541413
data = {
13551414
"unlockuuid": unlock_uuid,
13561415
"offset": offset,
13571416
"limit": limit,
13581417
}
1359-
return self._make_request("BulkListUsers", data, request_metadata)
1418+
return self._make_request("BulkListAllUsers", data, request_metadata)
13601419

13611420
def bulk_list_group_users(
13621421
self,

tests/test_api.py

Lines changed: 118 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,14 @@ def test_bulk_operations_workflow(self):
162162
"""Test complete bulk operations workflow: create users, unlock bulk, and fetch all users."""
163163
# Step 1: Create 10 users using bulk creation
164164
users_data = []
165+
created_emails = []
165166
for i in range(10):
167+
email = f"bulktest{random.randint(1000, 999999)}@example.com"
168+
created_emails.append(email)
166169
users_data.append(
167170
{
168171
"profile": {
169-
"email": f"bulktest{random.randint(1000, 999999)}@example.com",
172+
"email": email,
170173
"name": f"Bulk Test User {i+1}",
171174
"phone": str(random.randint(1000000, 9999999)),
172175
}
@@ -183,8 +186,12 @@ def test_bulk_operations_workflow(self):
183186
self.assertIn("created", create_result)
184187
self.assertEqual(len(create_result["created"]), 10)
185188

186-
# Store created user tokens for verification
189+
# Store created user tokens and emails for verification
187190
created_tokens = [user["token"] for user in create_result["created"]]
191+
created_user_identities = [
192+
{"mode": "email", "identity": user["profile"]["email"]}
193+
for user in create_result["created"]
194+
]
188195

189196
# Step 2: Initiate bulk list unlock operation
190197
unlock_result = self.api.bulk_list_unlock()
@@ -196,9 +203,28 @@ def test_bulk_operations_workflow(self):
196203

197204
unlock_uuid = unlock_result["unlockuuid"]
198205

199-
# Step 3: Fetch all users using bulk list operation
200-
# First, get the total count by fetching with a large limit
201-
bulk_users_result = self.api.bulk_list_users(unlock_uuid, offset=0, limit=100)
206+
# Step 3: Test bulk_list_users() with subset of created users
207+
# Select first 5 users for subset testing
208+
subset_users = created_user_identities[:5]
209+
subset_result = self.api.bulk_list_users(unlock_uuid, subset_users)
210+
211+
# Verify subset fetch was successful
212+
self.assertIsInstance(subset_result, dict)
213+
self.assertEqual(subset_result.get("status"), "ok")
214+
self.assertIn("rows", subset_result)
215+
216+
# Verify we got the expected number of users in subset
217+
subset_users_returned = subset_result["rows"]
218+
self.assertLessEqual(len(subset_users_returned), 5, "Subset should not exceed requested users")
219+
220+
# Verify subset users are from our created set
221+
subset_emails = [user.get("profile", {}).get("email") for user in subset_users_returned]
222+
for email in subset_emails:
223+
if email: # Only check if email exists
224+
self.assertIn(email, created_emails, f"Email {email} should be from our created users")
225+
226+
# Step 4: Fetch all users using bulk list operation
227+
bulk_users_result = self.api.bulk_list_all_users(unlock_uuid, offset=0, limit=100)
202228

203229
# Verify bulk fetch was successful
204230
self.assertIsInstance(bulk_users_result, dict)
@@ -225,13 +251,13 @@ def test_bulk_operations_workflow(self):
225251
f"Expected to find 10 created users in bulk results, but found {found_created_users}",
226252
)
227253

228-
# Step 4: Test pagination by fetching users in smaller batches
254+
# Step 5: Test pagination by fetching users in smaller batches
229255
paginated_users = []
230256
offset = 0
231257
limit = 5
232258

233259
while True:
234-
page_result = self.api.bulk_list_users(
260+
page_result = self.api.bulk_list_all_users(
235261
unlock_uuid, offset=offset, limit=limit
236262
)
237263
self.assertEqual(page_result.get("status"), "ok")
@@ -264,6 +290,91 @@ def test_bulk_operations_workflow(self):
264290

265291
return created_tokens
266292

293+
def test_bulk_list_users_subset(self):
294+
"""Test bulk_list_users() method to fetch a specific subset of user records."""
295+
# Step 1: Create 5 users for testing
296+
users_data = []
297+
test_emails = []
298+
for i in range(5):
299+
email = f"subsettest{random.randint(1000, 999999)}@example.com"
300+
test_emails.append(email)
301+
users_data.append(
302+
{
303+
"profile": {
304+
"email": email,
305+
"name": f"Subset Test User {i+1}",
306+
"phone": str(random.randint(1000000, 9999999)),
307+
}
308+
}
309+
)
310+
311+
# Create users in bulk
312+
create_result = self.api.create_users_bulk(users_data)
313+
self.assertEqual(create_result.get("status"), "ok")
314+
self.assertEqual(len(create_result["created"]), 5)
315+
316+
# Store created user data
317+
created_tokens = [user["token"] for user in create_result["created"]]
318+
created_user_identities = [
319+
{"mode": "email", "identity": user["profile"]["email"]}
320+
for user in create_result["created"]
321+
]
322+
323+
# Step 2: Initiate bulk list unlock operation
324+
unlock_result = self.api.bulk_list_unlock()
325+
self.assertEqual(unlock_result.get("status"), "ok")
326+
unlock_uuid = unlock_result["unlockuuid"]
327+
328+
# Step 3: Test bulk_list_users with all created users
329+
all_users_result = self.api.bulk_list_users(unlock_uuid, created_user_identities)
330+
331+
# Verify the result
332+
self.assertEqual(all_users_result.get("status"), "ok")
333+
self.assertIn("rows", all_users_result)
334+
335+
returned_users = all_users_result["rows"]
336+
self.assertLessEqual(len(returned_users), 5, "Should not return more users than requested")
337+
338+
# Verify all returned users are from our created set
339+
returned_emails = [user.get("profile", {}).get("email") for user in returned_users]
340+
for email in returned_emails:
341+
if email:
342+
self.assertIn(email, test_emails, f"Email {email} should be from our test users")
343+
344+
# Step 4: Test bulk_list_users with subset (first 3 users)
345+
subset_identities = created_user_identities[:3]
346+
subset_result = self.api.bulk_list_users(unlock_uuid, subset_identities)
347+
348+
# Verify subset result
349+
self.assertEqual(subset_result.get("status"), "ok")
350+
self.assertIn("rows", subset_result)
351+
352+
subset_users = subset_result["rows"]
353+
self.assertLessEqual(len(subset_users), 3, "Subset should not exceed 3 users")
354+
355+
# Verify subset users are from our created set
356+
subset_emails = [user.get("profile", {}).get("email") for user in subset_users]
357+
for email in subset_emails:
358+
if email:
359+
self.assertIn(email, test_emails, f"Email {email} should be from our test users")
360+
361+
# Step 5: Test with empty users list
362+
empty_result = self.api.bulk_list_users(unlock_uuid, [])
363+
self.assertEqual(empty_result.get("status"), "ok")
364+
self.assertIn("rows", empty_result)
365+
self.assertEqual(len(empty_result["rows"]), 0, "Empty users list should return empty result")
366+
367+
# Clean up: Delete the created users
368+
for token in created_tokens:
369+
try:
370+
delete_result = self.api.delete_user("token", token)
371+
if delete_result.get("status") != "ok":
372+
print(f"Warning: Failed to delete user with token {token}")
373+
except Exception as e:
374+
print(f"Warning: Exception during cleanup for token {token}: {str(e)}")
375+
376+
return created_tokens
377+
267378

268379
if __name__ == "__main__":
269380
unittest.main()

0 commit comments

Comments
 (0)