async def test_group_roles_operations(self, fs):
        # Instantiate Mock Client
        client = MockOktaClient(fs)

        # Create Group Object
        GROUP_NAME = "Group-Target-Test"
        group_profile = models.GroupProfile({
            "name": GROUP_NAME
        })
        group_obj = models.Group({
            "profile": group_profile
        })

        try:
            # Create Group
            group, _, err = await client.create_group(group_obj)
            assert err is None
            assert isinstance(group, models.Group)

            # Create roles
            assign_role_req_ua = models.AssignRoleRequest({
                "type": models.RoleType.USER_ADMIN
            })
            assign_role_req_aa = models.AssignRoleRequest({
                "type": models.RoleType.APP_ADMIN
            })

            ua_role, _, err = await client.assign_role_to_group(
                group.id, assign_role_req_ua)
            assert err is None
            aa_role, _, err = await client.assign_role_to_group(
                group.id, assign_role_req_aa)
            assert err is None

            group_roles, _, err = await client.list_group_assigned_roles(group.id)
            assert err is None
            assert len(group_roles) == 2
            assert next((rle for rle in group_roles if rle.id == ua_role.id))
            assert next((rle for rle in group_roles if rle.id == aa_role.id))

            _, err = await client.remove_role_from_group(group.id, ua_role.id)
            assert err is None

            group_roles, _, err = await client.list_group_assigned_roles(group.id)
            assert err is None
            assert len(group_roles) == 1
            assert next((rle for rle in group_roles if rle.id ==
                         ua_role.id), None) is None
            assert next((rle for rle in group_roles if rle.id == aa_role.id))

        finally:
            # Delete created group
            _, err = await client.delete_group(group.id)
            assert err is None
    async def test_assign_user_to_role(self, fs):
        # Instantiate Mock Client
        test_client = MockOktaClient(fs)

        # Create Password
        password = models.PasswordCredential({"value": "Password150kta"})
        # Create User Credentials
        user_creds = models.UserCredentials({"password": password})

        # Create User Profile and CreateUser Request
        user_profile = models.UserProfile()
        user_profile.first_name = "John"
        user_profile.last_name = "Doe-Assign-User-Role"
        user_profile.email = "*****@*****.**"
        user_profile.login = "******"

        create_user_req = models.CreateUserRequest({
            "credentials": user_creds,
            "profile": user_profile
        })

        # Create Query Parameters and Create User
        query_params_create = {"activate": "True"}
        user, _, err = await test_client.create_user(create_user_req,
                                                     query_params_create)
        assert err is None

        # Create Assign Role Request with Roletype Enum
        USER_ADMIN = models.RoleType.USER_ADMIN
        assign_role_req = models.AssignRoleRequest({"type": USER_ADMIN})

        # Assign Role to User
        _, _, err = await test_client.assign_role_to_user(
            user.id, assign_role_req)
        assert err is None

        # Get Roles for user and ensure role assigned is found
        roles, _, err = await test_client.list_assigned_roles_for_user(user.id)
        found_role = next((role for role in roles if role.type == USER_ADMIN),
                          None)
        assert found_role is not None

        # Remove assigned role from user
        _, err = await test_client.remove_role_from_user(
            user.id, found_role.id)
        assert err is None

        # Get Roles for user and ensure role assigned is NOT found
        roles, _, err = await test_client.list_assigned_roles_for_user(user.id)
        found_role = next((role for role in roles if role.type == USER_ADMIN),
                          None)
        assert found_role is None

        # Deactivate, then delete created user
        _, err = await test_client.deactivate_or_delete_user(user.id)
        assert err is None

        _, err = await test_client.deactivate_or_delete_user(user.id)
        assert err is None
    async def test_group_target_add(self, fs):
        # Instantiate Mock Client
        client = MockOktaClient(fs)

        # Create Group Objects
        GROUP_1_NAME = "Group-Target-Test 1"
        group_1_profile = models.GroupProfile({"name": GROUP_1_NAME})
        group_1_obj = models.Group({"profile": group_1_profile})

        GROUP_2_NAME = "Group-Target-Test 2"
        group_2_profile = models.GroupProfile({"name": GROUP_2_NAME})
        group_2_obj = models.Group({"profile": group_2_profile})

        # Create Groups
        group_1, _, err = await client.create_group(group_1_obj)
        assert err is None
        assert isinstance(group_1, models.Group)

        group_2, _, err = await client.create_group(group_2_obj)
        assert err is None
        assert isinstance(group_2, models.Group)

        # Create role and add group targets
        assign_role_req_ua = models.AssignRoleRequest(
            {"type": models.RoleType.USER_ADMIN})

        ua_role, _, err = await client.assign_role_to_group(
            group_1.id, assign_role_req_ua)
        assert err is None

        _, err = await\
            client.add_group_target_to_group_administrator_role_for_group(
                group_1.id, ua_role.id, group_2.id)

        # Make sure targets are listed
        groups_list, _, err = await client.list_group_targets_for_group_role(
            group_1.id, ua_role.id)
        assert err is None
        assert next((grp for grp in groups_list if grp.id == group_2.id))

        # Delete created groups
        _, err = await client.delete_group(group_1.id)
        assert err is None
        _, err = await client.delete_group(group_2.id)
        assert err is None
    async def test_user_group_target_to_role(self, fs):
        # Instantiate Mock Client
        test_client = MockOktaClient(fs)

        # Create Password
        password = models.PasswordCredential({"value": "Password150kta"})
        # Create User Credentials
        user_creds = models.UserCredentials({"password": password})

        # Create User Profile and CreateUser Request
        user_profile = models.UserProfile()
        user_profile.first_name = "John"
        user_profile.last_name = "Doe-Group-Target-Role-Assign"
        user_profile.email = "*****@*****.**"
        user_profile.login = "******"

        create_user_req = models.CreateUserRequest({
            "credentials": user_creds,
            "profile": user_profile
        })

        # Create Query Parameters and Create User
        query_params_create = {"activate": "True"}
        user, _, err = await test_client.create_user(create_user_req,
                                                     query_params_create)
        assert err is None

        # Create Group Object
        NEW_GROUP_NAME = "Group-Target-Test-Assign"
        new_group_profile = models.GroupProfile({"name": NEW_GROUP_NAME})
        new_group = models.Group({"profile": new_group_profile})

        # Create Group
        group, _, err = await test_client.create_group(new_group)
        assert err is None

        # Create request to assign role to user
        USER_ADMIN = models.RoleType.USER_ADMIN
        assign_role_req = models.AssignRoleRequest({"type": USER_ADMIN})

        # Assign Role to User
        user_role, _, err = await test_client.assign_role_to_user(
            user.id, assign_role_req)
        assert err is None

        # Add Group Target to the Role
        _, err = await test_client.add_group_target_to_role(
            user.id, user_role.id, group.id)
        assert err is None

        # Retrieve group targets for role and ensure added one is there
        groups, _, err = await test_client.list_group_targets_for_role(
            user.id, user_role.id)
        assert next((grp for grp in groups if grp.id == group.id),
                    None) is not None

        # Create another group to add
        NEW_GROUP_NAME = "Temp-Group-Target-Test-Assign"
        new_group_profile = models.GroupProfile({"name": NEW_GROUP_NAME})
        new_group = models.Group({"profile": new_group_profile})

        # Create 2nd group
        temp_group, _, err = await test_client.create_group(new_group)
        assert err is None

        # Add new group target to role and remove original
        _, err = await test_client.add_group_target_to_role(
            user.id, user_role.id, temp_group.id)
        assert err is None
        _, err = await test_client.remove_group_target_from_role(
            user.id, user_role.id, group.id)
        assert err is None

        # Deactivate, then delete created user
        _, err = await test_client.deactivate_or_delete_user(user.id)
        assert err is None

        _, err = await test_client.deactivate_or_delete_user(user.id)
        assert err is None

        # Delete groups created
        await test_client.delete_group(group.id)
        await test_client.delete_group(temp_group.id)
    async def test_group_target_remove(self, fs):
        # Instantiate Mock Client
        client = MockOktaClient(fs)

        # Create Group Objects
        GROUP_1_NAME = "Group-Target-Test 1"
        group_1_profile = models.GroupProfile({
            "name": GROUP_1_NAME
        })
        group_1_obj = models.Group({
            "profile": group_1_profile
        })

        GROUP_2_NAME = "Group-Target-Test 2"
        group_2_profile = models.GroupProfile({
            "name": GROUP_2_NAME
        })
        group_2_obj = models.Group({
            "profile": group_2_profile
        })

        GROUP_3_NAME = "Group-Target-Test 3"
        group_3_profile = models.GroupProfile({
            "name": GROUP_3_NAME
        })
        group_3_obj = models.Group({
            "profile": group_3_profile
        })

        try:
            # Create Groups
            group_1, _, err = await client.create_group(group_1_obj)
            assert err is None
            assert isinstance(group_1, models.Group)

            group_2, _, err = await client.create_group(group_2_obj)
            assert err is None
            assert isinstance(group_2, models.Group)

            group_3, _, err = await client.create_group(group_3_obj)
            assert err is None
            assert isinstance(group_3, models.Group)

            # Create role and add group targets
            assign_role_req_ua = models.AssignRoleRequest({
                "type": models.RoleType.USER_ADMIN
            })

            ua_role, _, err = await client.assign_role_to_group(
                group_1.id, assign_role_req_ua)
            assert err is None

            _, err = await\
                client.add_group_target_to_group_administrator_role_for_group(
                    group_1.id, ua_role.id, group_2.id)
            _, err = await\
                client.add_group_target_to_group_administrator_role_for_group(
                    group_1.id, ua_role.id, group_3.id)

            groups_list, _, err = await client.list_group_targets_for_group_role(
                group_1.id, ua_role.id)
            assert err is None
            assert next((grp for grp in groups_list if grp.id == group_2.id))
            assert next((grp for grp in groups_list if grp.id == group_3.id))

            # Remove from 2 and ensure 2 isn't listed
            _, err = await \
                client.remove_group_target_from_group_admin_role_given_to_group(
                    group_1.id, ua_role.id, group_2.id)

            groups_list, _, err = await client.list_group_targets_for_group_role(
                group_1.id, ua_role.id)
            assert err is None
            assert next((grp for grp in groups_list if grp.id ==
                         group_2.id), None) is None
            assert next((grp for grp in groups_list if grp.id == group_3.id))

        finally:
            errors = []
            # Delete created groups
            try:
                _, err = await client.delete_group(group_1.id)
                assert err is None
            except Exception as exc:
                errors.append(exc)
            try:
                _, err = await client.delete_group(group_2.id)
                assert err is None
            except Exception as exc:
                errors.append(exc)
            try:
                _, err = await client.delete_group(group_3.id)
                assert err is None
            except Exception as exc:
                errors.append(exc)
            assert len(errors) == 0