public async Task PermissionsService_GetUserPermissionsAsync_ReturnsMultipleRolesAndPermissionsForUser()
        {
            var permissionsDataProviderLogger = new Moq.Mock <ILogger <PermissionsDataProvider> >().Object;
            var permissionsServiceLogger      = new Moq.Mock <ILogger <PermissionsService> >().Object;
            var groupDataProvider             = new Moq.Mock <IGroupDataProvider>().Object;

            var cts = new CancellationTokenSource();

            var cancellationToken = cts.Token;

            var userId = Guid.NewGuid();

            var rolesDataProvider = new Mock <IRolesDataProvider>();
            IPermissionsDataProvider permissionsDataProvider = new PermissionsDataProvider(permissionsDataProviderLogger);

            var userRolesResponse = new List <string> {
                "Standard Members", "Admin"
            };


            rolesDataProvider.Setup(x =>
                                    x.GetUserRolesAsync(userId, cancellationToken))
            .ReturnsAsync(userRolesResponse);


            var permissionsService = new PermissionsService(rolesDataProvider.Object, permissionsDataProvider, permissionsServiceLogger, groupDataProvider);

            var permissions = await permissionsService.GetUserPermissionsAsync(userId, cancellationToken);

            Assert.IsTrue(permissions.Any(x => x == "https://schema.collaborate.future.nhs.uk/admin/v1/view"));
        }
        public async Task PermissionsService_GetUserPermissionsAsync_ReturnsGuestRoleIfUserNotFound()
        {
            var permissionsDataProviderLogger = new Moq.Mock <ILogger <PermissionsDataProvider> >().Object;
            var permissionsServiceLogger      = new Moq.Mock <ILogger <PermissionsService> >().Object;
            var groupDataProvider             = new Moq.Mock <IGroupDataProvider>().Object;

            var cts = new CancellationTokenSource();

            var cancellationToken = cts.Token;

            var userId = Guid.NewGuid();

            var rolesDataProvider = new Mock <IRolesDataProvider>();
            IPermissionsDataProvider permissionsDataProvider = new PermissionsDataProvider(permissionsDataProviderLogger);

            List <string>?userRolesResponse = null;


            rolesDataProvider.Setup(x =>
                                    x.GetUserRolesAsync(userId, cancellationToken))
            .ReturnsAsync(userRolesResponse);


            var permissionsService = new PermissionsService(rolesDataProvider.Object, permissionsDataProvider, permissionsServiceLogger, groupDataProvider);

            var permissions = await permissionsService.GetUserPermissionsAsync(userId, cancellationToken);

            Assert.IsTrue(permissions is null);
        }
        public async Task PermissionsService_GetUserPermissionsForGroupAsync_ReturnsGuestIfUserNotMemberOfGroup()
        {
            var permissionsDataProviderLogger = new Moq.Mock <ILogger <PermissionsDataProvider> >().Object;
            var permissionsServiceLogger      = new Moq.Mock <ILogger <PermissionsService> >().Object;
            var groupDataProvider             = new Moq.Mock <IGroupDataProvider>().Object;

            var cts = new CancellationTokenSource();

            var cancellationToken = cts.Token;

            var userId  = Guid.NewGuid();
            var groupId = Guid.NewGuid();

            var rolesDataProvider = new Mock <IRolesDataProvider>();
            IPermissionsDataProvider permissionsDataProvider = new PermissionsDataProvider(permissionsDataProviderLogger);

            List <string>?userRolesResponse = new List <string> {
                "Admin"
            };
            List <GroupUserRole>?groupRolesResponse = new List <GroupUserRole>();

            rolesDataProvider.Setup(x =>
                                    x.GetUserAndGroupUserRolesAsync(userId, groupId, cancellationToken))
            .ReturnsAsync(new UserAndGroupRoles(userRolesResponse, groupRolesResponse));


            var permissionsService = new PermissionsService(rolesDataProvider.Object, permissionsDataProvider, permissionsServiceLogger, groupDataProvider);

            var userGroupPermissions = await permissionsService.GetUserPermissionsForGroupAsync(userId, groupId, string.Empty, cancellationToken);

            Assert.IsTrue(userGroupPermissions.Permissions.Any(x => x == "https://schema.collaborate.future.nhs.uk/groups/v1/members/add"));
        }
        public void PermissionsService_GetUserPermissionsForGroupAsync_ThrowsIfRolesProviderNull()
        {
            var permissionsDataProviderLogger = new Moq.Mock <ILogger <PermissionsDataProvider> >().Object;
            var permissionsServiceLogger      = new Moq.Mock <ILogger <PermissionsService> >().Object;
            var groupDataProvider             = new Moq.Mock <IGroupDataProvider>().Object;

            IPermissionsDataProvider permissionsDataProvider = new PermissionsDataProvider(permissionsDataProviderLogger);

            _ = new PermissionsService(null, permissionsDataProvider, permissionsServiceLogger, groupDataProvider);
        }
        public async Task PermissionsService_GetUserPermissionsForGroupAsync_ThrowsIfGroupIdEmpty()
        {
            var permissionsDataProviderLogger = new Moq.Mock <ILogger <PermissionsDataProvider> >().Object;
            var permissionsServiceLogger      = new Moq.Mock <ILogger <PermissionsService> >().Object;
            var groupDataProvider             = new Moq.Mock <IGroupDataProvider>().Object;

            var cancellationToken = CancellationToken.None;
            var rolesDataProvider = new Mock <IRolesDataProvider>().Object;
            IPermissionsDataProvider permissionsDataProvider = new PermissionsDataProvider(permissionsDataProviderLogger);

            var permissionsService = new PermissionsService(rolesDataProvider, permissionsDataProvider, permissionsServiceLogger, groupDataProvider);

            var userId  = Guid.NewGuid();
            var groupId = Guid.Empty;

            _ = await permissionsService.GetUserPermissionsForGroupAsync(userId, groupId, string.Empty, cancellationToken);
        }
        public async Task PermissionsService_GetUserPermissionsAsync_ThrowsIfCancelled()
        {
            var permissionsDataProviderLogger = new Moq.Mock <ILogger <PermissionsDataProvider> >().Object;
            var permissionsServiceLogger      = new Moq.Mock <ILogger <PermissionsService> >().Object;
            var groupDataProvider             = new Moq.Mock <IGroupDataProvider>().Object;

            var cts = new CancellationTokenSource();

            var cancellationToken = cts.Token;

            var rolesDataProvider = new Mock <IRolesDataProvider>().Object;
            IPermissionsDataProvider permissionsDataProvider = new PermissionsDataProvider(permissionsDataProviderLogger);

            cts.Cancel();

            var permissionsService = new PermissionsService(rolesDataProvider, permissionsDataProvider, permissionsServiceLogger, groupDataProvider);

            var userId = Guid.NewGuid();

            _ = await permissionsService.GetUserPermissionsAsync(userId, cancellationToken);
        }