@@ -326,10 +326,13 @@ def test_sync_organization_is_rbac_permissions_enabled_open_source(make_organiza
326
326
327
327
@pytest .mark .parametrize ("gcom_api_response" , [False , True ])
328
328
@patch ("apps.user_management.sync.GcomAPIClient" )
329
+ @patch ("common.utils.cache" )
329
330
@override_settings (LICENSE = settings .CLOUD_LICENSE_NAME )
330
331
@override_settings (GRAFANA_COM_ADMIN_API_TOKEN = "mockedToken" )
331
332
@pytest .mark .django_db
332
- def test_sync_organization_is_rbac_permissions_enabled_cloud (mocked_gcom_client , make_organization , gcom_api_response ):
333
+ def test_sync_organization_is_rbac_permissions_enabled_cloud (
334
+ mock_cache , mocked_gcom_client , make_organization , gcom_api_response
335
+ ):
333
336
stack_id = 5
334
337
organization = make_organization (stack_id = stack_id )
335
338
@@ -369,22 +372,27 @@ def test_sync_organization_is_rbac_permissions_enabled_cloud(mocked_gcom_client,
369
372
},
370
373
)
371
374
372
- with patch .object (GrafanaAPIClient , "check_token" , return_value = (None , api_check_token_call_status )):
373
- with patch .object (GrafanaAPIClient , "get_users" , return_value = api_users_response ):
374
- with patch .object (GrafanaAPIClient , "get_teams" , return_value = (api_teams_response , None )):
375
- with patch .object (GrafanaAPIClient , "get_team_members" , return_value = (api_members_response , None )):
376
- with patch .object (
377
- GrafanaAPIClient ,
378
- "get_grafana_incident_plugin_settings" ,
379
- return_value = (
380
- {"enabled" : True , "jsonData" : {"backendUrl" : MOCK_GRAFANA_INCIDENT_BACKEND_URL }},
381
- None ,
382
- ),
383
- ):
384
- sync_organization (organization )
375
+ random_uuid = "random"
376
+ with patch ("apps.user_management.sync.uuid.uuid4" , return_value = random_uuid ):
377
+ with patch .object (GrafanaAPIClient , "check_token" , return_value = (None , api_check_token_call_status )):
378
+ with patch .object (GrafanaAPIClient , "get_users" , return_value = api_users_response ):
379
+ with patch .object (GrafanaAPIClient , "get_teams" , return_value = (api_teams_response , None )):
380
+ with patch .object (GrafanaAPIClient , "get_team_members" , return_value = (api_members_response , None )):
381
+ with patch .object (
382
+ GrafanaAPIClient ,
383
+ "get_grafana_incident_plugin_settings" ,
384
+ return_value = (
385
+ {"enabled" : True , "jsonData" : {"backendUrl" : MOCK_GRAFANA_INCIDENT_BACKEND_URL }},
386
+ None ,
387
+ ),
388
+ ):
389
+ sync_organization (organization )
385
390
386
391
organization .refresh_from_db ()
387
392
393
+ # lock is set and released
394
+ mock_cache .add .assert_called_once_with (f"sync-organization-lock-{ organization .id } " , random_uuid , 60 * 10 )
395
+ mock_cache .delete .assert_called_once_with (f"sync-organization-lock-{ organization .id } " )
388
396
assert mocked_gcom_client .return_value .called_once_with ("mockedToken" )
389
397
assert mocked_gcom_client .return_value .is_rbac_enabled_for_stack .called_once_with (stack_id )
390
398
assert organization .is_rbac_permissions_enabled == gcom_api_response
@@ -433,3 +441,19 @@ def test_cleanup_organization_deleted(make_organization):
433
441
434
442
organization .refresh_from_db ()
435
443
assert organization .deleted_at is not None
444
+
445
+
446
+ @pytest .mark .django_db
447
+ def test_sync_organization_lock (make_organization ):
448
+ organization = make_organization ()
449
+
450
+ random_uuid = "random"
451
+ with patch ("apps.user_management.sync.GrafanaAPIClient" ) as mock_client :
452
+ with patch ("apps.user_management.sync.uuid.uuid4" , return_value = random_uuid ):
453
+ with patch ("apps.user_management.sync.task_lock" ) as mock_task_lock :
454
+ # lock couldn't be acquired
455
+ mock_task_lock .return_value .__enter__ .return_value = False
456
+ sync_organization (organization )
457
+
458
+ mock_task_lock .assert_called_once_with (f"sync-organization-lock-{ organization .id } " , random_uuid )
459
+ assert not mock_client .called
0 commit comments