def test_run():
    """
    Should synchronize specified AD groups to Everbridge
    """
    gid = 123
    azure = create_azure_mock('GROUP1', [1, 2, 4, 5, 6, 7])
    data = [create_everbridge_contacts([1, 2, 3, 5, 8], True)]
    delete_ids = [3, 8]
    update_ids = [1, 2]
    insert_ids = [4, 6, 7]
    modify_everbridge_data(data[0], update_ids, 'phone', '8087779999')
    modify_everbridge_data(data[0], delete_ids, 'groups', [gid])
    update_data = create_everbridge_contacts(update_ids, True)
    insert_data = create_everbridge_contacts(insert_ids, False)
    upsert_data = update_data + insert_data
    inserted_data = [create_everbridge_contacts(insert_ids, True)]
    inserted_exids = ('&[email protected]' +
                      '&[email protected]' +
                      '&[email protected]')
    ever = create_everbridge_mock(data)
    ever.get_contacts_by_external_ids = MagicMock(side_effect=inserted_data)
    app = Synchronizer(azure, ever)
    # Call run
    rslt = app.run([gid])
    # Tests each method call
    azure.get_group_name.assert_called_with(123)
    ever.get_group_id_by_name.assert_called_with('GROUP1')
    ever.add_group.assert_not_called()
    ever.delete_group.assert_not_called()
    ever.delete_members_from_group.assert_called_with(gid, delete_ids)
    ever.delete_contacts.assert_called_with(delete_ids)
    ever.upsert_contacts.assert_called_with(upsert_data)
    ever.get_contacts_by_external_ids.assert_called_with(inserted_exids)
    ever.add_members_to_group.assert_called_with(gid, insert_ids)
    assert rslt == {
        'GROUP1': {
            'azure_group_id': 123,
            'everbridge_group_id': 123,
            'azure_count': 6,
            'everbridge_count': 5,
            'error_contacts': 0,
            'inserted_contacts': 3,
            'updated_contacts': 2,
            'removed_members': 2,
            'deleted_contacts': 2,
            'added_members': 3
        }
    }
def test_sync_group_no_data():
    """
    Should synchronize AD group to Everbridge group
    """
    gid = 123
    azure = create_azure_mock('GROUP1', [])
    data = [create_everbridge_contacts([], True)]
    ever = create_everbridge_mock(data)
    itr_ad = AzureGroupMemberIterator(azure, gid)
    itr_ev = EverbridgeGroupMemberIterator(ever, gid)
    app = Synchronizer(azure, ever)
    # Call sync_group
    rslt = app.sync_group(itr_ad, itr_ev)
    # Tests each method call
    ever.add_group.assert_not_called()
    ever.delete_group.assert_not_called()
    ever.delete_contacts.assert_not_called()
    ever.delete_members_from_group.assert_not_called()
    ever.upsert_contacts.assert_not_called()
    ever.get_contacts_by_external_ids.assert_not_called()
    ever.add_members_to_group.assert_not_called()
    assert rslt == {
        'azure_group_id': 123,
        'everbridge_group_id': 123,
        'azure_count': 0,
        'everbridge_count': 0,
        'inserted_contacts': 0,
        'updated_contacts': 0,
        'removed_members': 0,
        'deleted_contacts': 0,
        'added_members': 0,
        'error_contacts': 0
    }
def test_run_add_group():
    """
    Should add a group to Everbridge and insert all the members
    """
    gid = 123
    azure = create_azure_mock('GROUP1', [1, 2])
    data = [create_everbridge_contacts([], True)]
    insert_ids = [1, 2]
    insert_data = create_everbridge_contacts(insert_ids, False)
    inserted_data = [create_everbridge_contacts(insert_ids, True)]
    inserted_exids = (
        '&[email protected]&[email protected]')
    ever = create_everbridge_mock(data)
    ever.add_group = MagicMock(return_value={'id': 123})
    ever.get_group_id_by_name = MagicMock(return_value=None)
    ever.get_contacts_by_external_ids = MagicMock(side_effect=inserted_data)
    app = Synchronizer(azure, ever)
    # Call run
    rslt = app.run([gid])
    # Tests each method call
    azure.get_group_name.assert_called_with(gid)
    ever.get_group_id_by_name.assert_called_with('GROUP1')
    ever.add_group.assert_called_with('GROUP1', None)
    ever.delete_group.assert_not_called()
    ever.delete_members_from_group.assert_not_called()
    ever.delete_contacts.assert_not_called()
    ever.upsert_contacts.assert_called_with(insert_data)
    ever.get_contacts_by_external_ids.assert_called_with(inserted_exids)
    ever.add_members_to_group.assert_called_with(gid, insert_ids)
    assert rslt == {
        'GROUP1': {
            'azure_group_id': 123,
            'everbridge_group_id': 123,
            'azure_count': 2,
            'everbridge_count': 0,
            'error_contacts': 0,
            'inserted_contacts': 2,
            'updated_contacts': 0,
            'removed_members': 0,
            'deleted_contacts': 0,
            'added_members': 2
        }
    }
def test_sync_group_with_map_only_ad():
    """
    Should synchronize AD group to Everbridge group
    """
    gid = 123
    azure = create_azure_mock('GROUP1', [1, 2, 3])
    data = [create_everbridge_contacts([], True)]
    upsert_ids = [1, 2, 3]
    upsert_data = create_everbridge_contacts(upsert_ids, False)
    inserted_data = [create_everbridge_contacts(upsert_ids, True)]
    inserted_exids = ('&[email protected]' +
                      '&[email protected]' +
                      '&[email protected]')
    ever = create_everbridge_mock(data)
    ever.get_contacts_by_external_ids = MagicMock(side_effect=inserted_data)
    members_map = azure.get_all_group_members_map(gid)
    admap = AdContactMap(gid, members_map)
    itr_ev = EverbridgeGroupMemberIterator(ever, gid)
    app = Synchronizer(azure, ever)
    # Call sync_group
    rslt = app.sync_group_with_map(admap, itr_ev)
    # Tests each method call
    ever.add_group.assert_not_called()
    ever.delete_group.assert_not_called()
    ever.delete_contacts.assert_not_called()
    ever.delete_members_from_group.assert_not_called()
    ever.upsert_contacts.assert_called_with(upsert_data)
    ever.get_contacts_by_external_ids.assert_called_with(inserted_exids)
    ever.add_members_to_group.assert_called_with(gid, upsert_ids)
    assert rslt == {
        'azure_group_id': 123,
        'everbridge_group_id': 123,
        'azure_count': 3,
        'everbridge_count': 0,
        'inserted_contacts': 3,
        'updated_contacts': 0,
        'removed_members': 0,
        'deleted_contacts': 0,
        'added_members': 3,
        'error_contacts': 0
    }
def test_sync_group_insert_and_delete():
    """
    Should synchronize AD group to Everbridge group
    """
    gid = 123
    azure = create_azure_mock('GROUP1', [1, 2, 5, 9])
    data = [create_everbridge_contacts([1, 3, 5, 7, 8], True)]
    delete_ids = [3, 7, 8]
    upsert_ids = [2, 9]
    upsert_data = create_everbridge_contacts(upsert_ids, False)
    inserted_data = [create_everbridge_contacts(upsert_ids, True)]
    inserted_exids = '&[email protected]&[email protected]'
    ever = create_everbridge_mock(data)
    ever.get_contacts_by_external_ids = MagicMock(side_effect=inserted_data)
    itr_ad = AzureGroupMemberIterator(azure, gid)
    itr_ev = EverbridgeGroupMemberIterator(ever, gid)
    app = Synchronizer(azure, ever)
    # Call sync_group
    rslt = app.sync_group(itr_ad, itr_ev)
    # Tests each method call
    ever.add_group.assert_not_called()
    ever.delete_group.assert_not_called()
    ever.delete_contacts.assert_not_called()
    ever.delete_members_from_group.assert_called_with(gid, delete_ids)
    ever.upsert_contacts.assert_called_with(upsert_data)
    ever.get_contacts_by_external_ids.assert_called_with(inserted_exids)
    ever.add_members_to_group.assert_called_with(gid, upsert_ids)
    assert rslt == {
        'azure_group_id': 123,
        'everbridge_group_id': 123,
        'azure_count': 4,
        'everbridge_count': 5,
        'inserted_contacts': 2,
        'updated_contacts': 0,
        'removed_members': 3,
        'deleted_contacts': 0,
        'added_members': 2,
        'error_contacts': 0
    }
def test_sync_group_upadte():
    """
    Should synchronize AD group to Everbridge group
    """
    gid = 123
    azure = create_azure_mock('GROUP1', [1, 2, 3, 4])
    data = [create_everbridge_contacts([1, 2, 3, 4], True)]
    upsert_ids = [2, 4]
    modify_everbridge_data(data[0], upsert_ids, 'phone', '8087779999')
    upsert_data = create_everbridge_contacts(upsert_ids, True)
    print(upsert_data)
    ever = create_everbridge_mock(data)
    itr_ad = AzureGroupMemberIterator(azure, gid)
    itr_ev = EverbridgeGroupMemberIterator(ever, gid)
    app = Synchronizer(azure, ever)
    # Call sync_group
    rslt = app.sync_group(itr_ad, itr_ev)
    # Tests each method call
    ever.add_group.assert_not_called()
    ever.delete_group.assert_not_called()
    ever.delete_contacts.assert_not_called()
    ever.delete_members_from_group.assert_not_called()
    ever.upsert_contacts.assert_called_with(upsert_data)
    ever.get_contacts_by_external_ids.assert_not_called()
    ever.add_members_to_group.assert_not_called()
    assert rslt == {
        'azure_group_id': 123,
        'everbridge_group_id': 123,
        'azure_count': 4,
        'everbridge_count': 4,
        'inserted_contacts': 0,
        'updated_contacts': 2,
        'removed_members': 0,
        'deleted_contacts': 0,
        'added_members': 0,
        'error_contacts': 0
    }
def test_run_delete_group():
    """
    Should delete the all the members and the group
    """
    gid = 123
    azure = create_azure_mock('GROUP1', [])
    data = [create_everbridge_contacts([1, 2, 3], True)]
    delete_ids = [1, 2, 3]
    modify_everbridge_data(data[0], delete_ids, 'groups', [gid])
    ever = create_everbridge_mock(data)
    app = Synchronizer(azure, ever)
    # Call run
    rslt = app.run([gid])
    # Tests each method call
    azure.get_group_name.assert_called_with(123)
    ever.get_group_id_by_name.assert_called_with('GROUP1')
    ever.add_group.assert_not_called()
    ever.delete_group.assert_called_with(gid)
    ever.delete_members_from_group.assert_called_with(gid, delete_ids)
    ever.delete_contacts.assert_called_with(delete_ids)
    ever.upsert_contacts.assert_not_called()
    ever.get_contacts_by_external_ids.assert_not_called()
    ever.add_members_to_group.assert_not_called()
    assert rslt == {
        'GROUP1': {
            'azure_group_id': 123,
            'everbridge_group_id': 123,
            'azure_count': 0,
            'everbridge_count': 3,
            'error_contacts': 0,
            'inserted_contacts': 0,
            'updated_contacts': 0,
            'removed_members': 3,
            'deleted_contacts': 3,
            'added_members': 0,
            'removed': True
        }
    }
def test_sync_group_only_everbridge():
    """
    Should synchronize AD group to Everbridge group
    """
    gid = 123
    azure = create_azure_mock('GROUP1', [])
    data = [create_everbridge_contacts([1, 2, 3], True)]
    delete_ids = [1, 2, 3]
    modify_everbridge_data(data[0], [1, 2], 'groups', [123])
    ever = create_everbridge_mock(data)
    #ever.get_contacts_by_external_ids = MagicMock(side_effect=inserted)
    itr_ad = AzureGroupMemberIterator(azure, gid)
    itr_ev = EverbridgeGroupMemberIterator(ever, gid)
    app = Synchronizer(azure, ever)
    # Call sync_group
    rslt = app.sync_group(itr_ad, itr_ev)
    # Tests each method call
    ever.add_group.assert_not_called()
    ever.delete_group.assert_not_called()
    ever.delete_members_from_group.assert_called_with(gid, delete_ids)
    ever.delete_contacts.assert_called_with([1, 2])
    ever.upsert_contacts.assert_not_called()
    ever.get_contacts_by_external_ids.assert_not_called()
    ever.add_members_to_group.assert_not_called()
    assert rslt == {
        'azure_group_id': 123,
        'everbridge_group_id': 123,
        'azure_count': 0,
        'everbridge_count': 3,
        'inserted_contacts': 0,
        'updated_contacts': 0,
        'removed_members': 3,
        'deleted_contacts': 2,
        'added_members': 0,
        'error_contacts': 0
    }