Skip to content

Commit 0c56ca5

Browse files
committed
Merge branch 'group-admin-and-account-admin-logic-fix' into sign-umg-v2
2 parents 1089ce0 + 3068ee6 commit 0c56ca5

File tree

4 files changed

+288
-47
lines changed

4 files changed

+288
-47
lines changed

tests/test_sign_config.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,3 +195,23 @@ def test_load_invocation_options(modify_sign_config):
195195
options = config.load_invocation_options()
196196
assert options['directory_group_mapped'] is True
197197

198+
def test_load_primary_group_rules_umg_false(modify_sign_config):
199+
sign_config_file =modify_sign_config(['user_sync', 'umg'], False)
200+
args = {'config_filename': sign_config_file}
201+
config = SignConfigLoader(args)
202+
result = config.load_primary_group_rules(False)
203+
assert result == []
204+
205+
def test_load_primary_group_rules_umg_true_empty(modify_sign_config):
206+
sign_config_file = modify_sign_config(['user_sync', 'umg'], True)
207+
args = {'config_filename': sign_config_file}
208+
config = SignConfigLoader(args)
209+
result = config.load_primary_group_rules(True)
210+
expected_result = [
211+
{
212+
'sign_groups': {'sign group 1', 'sign group 2'},
213+
'primary_group': 'Sign Group 2'
214+
}
215+
]
216+
assert result == expected_result
217+

tests/test_sign_engine.py

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import pytest
55
from mock import MagicMock, call
6+
from user_sync.error import AssertionException
67

78
from user_sync.config.sign_sync import SignConfigLoader
89
from 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+
'email': '[email protected]',
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

2065
def 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")
209378
def test_extract_mapped_group():

user_sync/config/sign_sync.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def load_group_admin_mappings(self, umg):
276276
def _groupify(self, group_name):
277277
"""For a given group name, return AdobeGroup with proper primary
278278
target, error checking, etc"""
279-
group = AdobeGroup.create(group_name.lower())
279+
group = AdobeGroup.create(group_name)
280280
if group is None:
281281
raise AssertionException(f"Bad sign group '{group_name}' specified")
282282
if group.umapi_name is None:
@@ -285,14 +285,15 @@ def _groupify(self, group_name):
285285

286286
def load_primary_group_rules(self, umg):
287287
primary_group_rules = []
288-
group_config = self.main_config.get_list_config('primary_group_rules', True)
289-
for mapping in group_config.iter_dict_configs():
290-
sign_groups = mapping.get_list('sign_groups')
291-
primary_group = mapping.get_string('primary_group')
292-
primary_group_rules.append({
293-
'sign_groups': set([g.lower() for g in sign_groups]),
294-
'primary_group': primary_group
295-
})
288+
if umg:
289+
group_config = self.main_config.get_list_config('primary_group_rules', True)
290+
for mapping in group_config.iter_dict_configs():
291+
sign_groups = mapping.get_list('sign_groups')
292+
primary_group = mapping.get_string('primary_group')
293+
primary_group_rules.append({
294+
'sign_groups': set([g.lower() for g in sign_groups]),
295+
'primary_group': primary_group
296+
})
296297
return primary_group_rules
297298

298299
def get_directory_connector_module_name(self) -> str:

0 commit comments

Comments
 (0)