33
44import pytest
55from mock import MagicMock , call
6+ from user_sync .error import AssertionException
67
78from user_sync .config .sign_sync import SignConfigLoader
89from user_sync .engine .sign import SignSyncEngine
@@ -16,6 +17,50 @@ def example_engine(default_sign_args):
1617 target_options = config .get_target_options ()
1718 return SignSyncEngine (rule_config , target_options )
1819
20+ @pytest .fixture
21+ def mock_data_for_update ():
22+ from sign_client .model import UserGroupInfo
23+ return {
24+ 'groups_to_update' : {},
25+ 'assigned_groups' : {
26+ 'group1' : UserGroupInfo (id = '1' , name = 'group1' , isGroupAdmin = False , isPrimaryGroup = True , status = 'ACTIVE' ),
27+ 'group2' : UserGroupInfo (id = '2' , name = 'group2' , isGroupAdmin = True , isPrimaryGroup = False , status = 'ACTIVE' )
28+ },
29+ 'desired_groups' : ['group1' , 'group2' ],
30+ 'admin_groups' : ['group1' ],
31+ 'directory_user' : {'is_group_admin' : True },
32+ 'sign_user' :
MagicMock (
email = '[email protected] ' )
33+ }
34+
35+ @pytest .fixture
36+ def mock_data_for_insert_user ():
37+ return {
38+ 'org_name' : 'org1' ,
39+ 'directory_user' : {
40+ 41+ 'is_admin' : False ,
42+ 'firstname' : 'First' ,
43+ 'lastname' : 'Last' ,
44+ 'is_group_admin' : True ,
45+ 'admin_groups' : [MagicMock (group_name = 'group1' )]
46+ },
47+ 'assignment_groups' : [MagicMock (group_name = 'group1' ), MagicMock (group_name = 'group2' )]
48+ }
49+
50+ @pytest .fixture
51+ def setup_data_resolve_group_mapping ():
52+ return {
53+ 'directory_groups' : ['group1' ],
54+ 'group_mapping' : {
55+ 'group1' : {'priority' : 1 , 'groups' : ['mapped_group1' , 'mapped_group2' ]},
56+ },
57+ 'account_admin_groups' : ['group1' ],
58+ 'group_admin_mapping' : {
59+ 'group1' : {'mapped_group1' },
60+ }
61+ }
62+
63+
1964
2065def test_load_users_and_groups (example_engine : SignSyncEngine , mock_dir_user ):
2166 dc = MagicMock ()
@@ -204,6 +249,130 @@ def dir_user_replacement(*args, **kwargs):
204249 example_engine .read_desired_user_groups (mapping , dc )
205250 assert example_engine .directory_user_by_user_key == user
206251
252+ def test_resolve_primary_group_and_group_admin_state_umg_true (example_engine , mock_data_for_update ):
253+ example_engine .resolve_primary_group = MagicMock (return_value = 'group2' )
254+ groups_to_update = example_engine .resolvePrimaryGroupAndGroupAdminState (
255+ is_umg = True ,
256+ groups_to_update = mock_data_for_update ['groups_to_update' ],
257+ assigned_groups = mock_data_for_update ['assigned_groups' ],
258+ desired_groups = mock_data_for_update ['desired_groups' ],
259+ admin_groups = mock_data_for_update ['admin_groups' ],
260+ directory_user = mock_data_for_update ['directory_user' ],
261+ sign_user = mock_data_for_update ['sign_user' ]
262+ )
263+ assert 'group2' in groups_to_update
264+ assert groups_to_update ['group2' ].isPrimaryGroup is True
265+
266+ def test_resolve_primary_group_and_group_admin_state_no_primary_group (example_engine , mock_data_for_update ):
267+ example_engine .resolve_primary_group = MagicMock (return_value = None )
268+ with pytest .
raises (
AssertionException ,
match = "Can't identify a primary group for user '[email protected] '" ):
269+ example_engine .resolvePrimaryGroupAndGroupAdminState (
270+ is_umg = True ,
271+ groups_to_update = mock_data_for_update ['groups_to_update' ],
272+ assigned_groups = mock_data_for_update ['assigned_groups' ],
273+ desired_groups = mock_data_for_update ['desired_groups' ],
274+ admin_groups = mock_data_for_update ['admin_groups' ],
275+ directory_user = mock_data_for_update ['directory_user' ],
276+ sign_user = mock_data_for_update ['sign_user' ]
277+ )
278+
279+ def test_resolve_primary_group_and_group_admin_state_update_group_admin (example_engine , mock_data_for_update ):
280+ groups_to_update = example_engine .resolvePrimaryGroupAndGroupAdminState (
281+ is_umg = False ,
282+ groups_to_update = mock_data_for_update ['groups_to_update' ],
283+ assigned_groups = mock_data_for_update ['assigned_groups' ],
284+ desired_groups = mock_data_for_update ['desired_groups' ],
285+ admin_groups = mock_data_for_update ['admin_groups' ],
286+ directory_user = mock_data_for_update ['directory_user' ],
287+ sign_user = mock_data_for_update ['sign_user' ]
288+ )
289+
290+ assert 'group1' in groups_to_update
291+ assert groups_to_update ['group1' ].isGroupAdmin is True
292+
293+ def test_resolve_primary_group_and_group_admin_state_umg_false (example_engine , mock_data_for_update ):
294+ from sign_client .model import UserGroupInfo
295+ groups_to_update = example_engine .resolvePrimaryGroupAndGroupAdminState (
296+ is_umg = False ,
297+ groups_to_update = mock_data_for_update ['groups_to_update' ],
298+ assigned_groups = {'group1' : UserGroupInfo (id = '1' , name = 'group1' , isGroupAdmin = False , isPrimaryGroup = True , status = 'ACTIVE' )},
299+ desired_groups = ['group1' ],
300+ admin_groups = ['group1' ],
301+ directory_user = mock_data_for_update ['directory_user' ],
302+ sign_user = mock_data_for_update ['sign_user' ]
303+ )
304+
305+ assert 'group1' in groups_to_update
306+ assert groups_to_update ['group1' ].isGroupAdmin is True
307+
308+
309+ def test_insert_new_users_umg_primary_group (example_engine , mock_data_for_insert_user ):
310+ from sign_client .model import GroupInfo
311+ example_engine .options ['user_sync' ]['umg' ] = True
312+ example_engine .resolve_primary_group = MagicMock (return_value = 'group1' )
313+ example_engine .sign_groups = {
314+ 'org1' : {
315+ 'group1' : GroupInfo (groupId = '1' , groupName = 'group1' ),
316+ 'group2' : GroupInfo (groupId = '2' , groupName = 'group2' )
317+ } }
318+ sign_connector = MagicMock ()
319+ example_engine .insert_new_users (
320+ org_name = mock_data_for_insert_user ['org_name' ],
321+ sign_connector = sign_connector ,
322+ directory_user = mock_data_for_insert_user ['directory_user' ],
323+ assignment_groups = mock_data_for_insert_user ['assignment_groups' ]
324+ )
325+
326+ assert example_engine .
sign_users_created == {
'[email protected] ' }
327+
328+ def test_insert_new_users_non_umg_primary_group (example_engine , mock_data_for_insert_user ):
329+ from sign_client .model import GroupInfo
330+ example_engine .options ['user_sync' ]['umg' ] = False
331+ example_engine .resolve_primary_group = MagicMock (return_value = 'group1' )
332+ example_engine .sign_groups = {
333+ 'org1' : {
334+ 'group1' : GroupInfo (groupId = '1' , groupName = 'group1' ),
335+ 'group2' : GroupInfo (groupId = '2' , groupName = 'group2' )
336+ } }
337+ sign_connector = MagicMock ()
338+ example_engine .insert_new_users (
339+ org_name = mock_data_for_insert_user ['org_name' ],
340+ sign_connector = sign_connector ,
341+ directory_user = mock_data_for_insert_user ['directory_user' ],
342+ assignment_groups = mock_data_for_insert_user ['assignment_groups' ]
343+ )
344+
345+ assert example_engine .
sign_users_created == {
'[email protected] ' }
346+
347+ def test_resolve_group_mappings (setup_data_resolve_group_mapping ):
348+ directory_groups = setup_data_resolve_group_mapping ['directory_groups' ]
349+ group_mapping = setup_data_resolve_group_mapping ['group_mapping' ]
350+ account_admin_groups = setup_data_resolve_group_mapping ['account_admin_groups' ]
351+ group_admin_mapping = setup_data_resolve_group_mapping ['group_admin_mapping' ]
352+
353+ matched_groups , is_admin , is_group_admin , admin_groups = SignSyncEngine .resolve_group_mappings (
354+ directory_groups , group_mapping , account_admin_groups , group_admin_mapping
355+ )
356+
357+ assert set (matched_groups ) == {'mapped_group1' , 'mapped_group2' }
358+ assert is_admin is True
359+ assert is_group_admin is True
360+ assert admin_groups == {'mapped_group1' }
361+
362+ def test_group_admin_mapping (setup_data_resolve_group_mapping ):
363+ directory_groups = setup_data_resolve_group_mapping ['directory_groups' ]
364+ group_mapping = setup_data_resolve_group_mapping ['group_mapping' ]
365+ account_admin_groups = ['group2' ]
366+ group_admin_mapping = setup_data_resolve_group_mapping ['group_admin_mapping' ]
367+
368+ matched_groups , is_admin , is_group_admin , admin_groups = SignSyncEngine .resolve_group_mappings (
369+ directory_groups , group_mapping , account_admin_groups , group_admin_mapping
370+ )
371+
372+ assert set (matched_groups ) == {'mapped_group1' , 'mapped_group2' }
373+ assert is_admin is False
374+ assert is_group_admin is True
375+ assert admin_groups == {'mapped_group1' }
207376
208377@pytest .mark .skip ("wait until UMG is implemented" )
209378def test_extract_mapped_group ():
0 commit comments