11import json
2+ from math import ceil
23
34from django .contrib .auth import get_user_model
45from django .core .management import call_command
@@ -20,11 +21,25 @@ def kc_settings(settings):
2021 settings .KEYCLOAK_REALM_NAME = "pytest-realm"
2122
2223
23- def test_migrate_users_to_keycloak (mocked_responses ):
24+ @pytest .mark .parametrize (
25+ "num_users, num_already_synced, batch_size" ,
26+ [
27+ (100 , 0 , 10 ),
28+ (100 , 20 , 10 ),
29+ (100 , 99 , 10 ),
30+ ],
31+ )
32+ def test_migrate_users_to_keycloak (
33+ mocked_responses ,
34+ django_assert_num_queries ,
35+ num_users ,
36+ num_already_synced ,
37+ batch_size ,
38+ ):
2439 """Test that the migrate_users_to_keycloak command functions as expected"""
25- users = UserFactory .create_batch (100 )
40+ users = UserFactory .create_batch (num_users )
2641 inactive_users = UserFactory .create_batch (10 , is_active = False )
27- already_synced = users [:20 ]
42+ already_synced = users [:num_already_synced ]
2843
2944 UserExportToKeycloak .objects .bulk_create (
3045 [UserExportToKeycloak (user = user ) for user in already_synced ]
@@ -68,11 +83,16 @@ def partial_import_callback(request):
6883 content_type = "application/json" ,
6984 )
7085
71- call_command (
72- "migrate_users_to_keycloak" ,
73- "--client-id=test-client-id" ,
74- "--client-secret=test-client-secret" ,
75- )
86+ # 3 queries per batch plus 1 for the last empty query to terminate the loop
87+ num_batches = ceil ((num_users - num_already_synced ) / batch_size )
88+ num_queries = num_batches * 3 + 1
89+ with django_assert_num_queries (num_queries ):
90+ call_command (
91+ "migrate_users_to_keycloak" ,
92+ "--client-id=test-client-id" ,
93+ "--client-secret=test-client-secret" ,
94+ f"--batch-size={ batch_size } " ,
95+ )
7696
7797 assert (
7898 list (User .objects .filter (userexporttokeycloak__isnull = False ).order_by ("id" ))
0 commit comments