public async Task AddSingleUserToSingleRole()
        {
            var testContextBuilder = TestContextBuilder.CreateDefault(builder => builder
                                                                      .AddDatabase()
                                                                      .SeedDefaults()
                                                                      .SeedDataset(Datasets.Dataset1));

            await using var testContext = await testContextBuilder.BuildAsync();

            var command = new AddUsersToRolesCommand
            {
                UserNames = new[] { "JohnDoe", },
                RoleNames = new[] { nameof(RoleEnum.Administators) },
            };

            var commandContext = new CommandContext(command, testContext.Services);

            var handler = ActivatorUtilities.CreateInstance <AddUsersToRolesCommandHandler>(testContext.Services);

            await handler.HandleAsync(command, commandContext, default);

            await using (var dbContext = testContext.CreateReadOnlyDbContext())
            {
                var user = await dbContext.Users
                           .Include(user => user.Roles).ThenInclude(userRole => userRole.Role)
                           .FirstAsync(user => user.UserName == command.UserNames[0]);

                Assert.Equal(1, user.Roles?.Count);
                Assert.Contains(user.Roles, userRole => userRole.Role.RoleName == command.RoleNames[0]);
            }
        }
        public async Task FilterByNamePagedAndSorted()
        {
            var testContextBuilder = TestContextBuilder.CreateDefault(builder => builder
                                                                      .AddDatabase()
                                                                      .SeedDefaults()
                                                                      .SeedDataset(Datasets.Dataset1));

            await using var testContext = await testContextBuilder.BuildAsync();

            var query = new ListUsersQuery
            {
                // TODO: SQLite doesn't respect case insensitivity when matching parts of strings
                UserNamePattern = "Doe",
                PageSize        = 1,
                OrderColumns    = new[] { "+UserName" }
            };

            var queryContext = new QueryContext(query, testContext.Services);

            var handler = ActivatorUtilities.CreateInstance <ListUsersQueryHandler>(testContext.Services);

            var result = await handler.HandleAsync(query, queryContext, default);

            Assert.Equal(1, result.Items?.Length);
            Assert.Equal(2, result.TotalItemCount);

            Assert.Contains(result.Items !, item => item.UserId == 12 && item.UserName == "JaneDoe");
        }
        public async Task QueryDataAnnotationsValidatorInterceptorTest()
        {
            var testContextBuilder = TestContextBuilder.CreateDefault(builder => builder
                                                                      .AddServices(services =>
            {
                services.AddSingleton <IHostApplicationLifetime>(NullHostApplicationLifetime.Instance);
                services.AddServiceLayer(new OptionsProvider(builder.CreateDataAccessOptions()));
            })
                                                                      .AddDatabase(addDataAccessServices: false));

            await using var testContext = await testContextBuilder.BuildAsync();

            var query = new GetUserQuery {
            };

            var queryDispatcher = testContext.Services.GetRequiredService <IQueryDispatcher>();

            var ex = await Assert.ThrowsAsync <ServiceErrorException>(
                async() => await queryDispatcher.DispatchAsync(query, default));

            Assert.Equal(ServiceErrorCode.ParamNotSpecified, ex.ErrorCode);
            Assert.Equal(new[] { nameof(query.Identifier) }, ex.Args);
        }
        public async Task CommandDataAnnotationsValidatorInterceptorTest()
        {
            var testContextBuilder = TestContextBuilder.CreateDefault(builder => builder
                                                                      .AddServices(services =>
            {
                services.AddSingleton <IHostApplicationLifetime>(NullHostApplicationLifetime.Instance);
                services.AddServiceLayer(new OptionsProvider(builder.CreateDataAccessOptions()));
            })
                                                                      .AddDatabase(addDataAccessServices: false));

            await using var testContext = await testContextBuilder.BuildAsync();

            var command = new AddUsersToRolesCommand {
                UserNames = new string[] { }, RoleNames = new string[] { "x" }
            };

            var commandDispatcher = testContext.Services.GetRequiredService <ICommandDispatcher>();

            var ex = await Assert.ThrowsAsync <ServiceErrorException>(
                async() => await commandDispatcher.DispatchAsync(command, default));

            Assert.Equal(ServiceErrorCode.ParamNotValid, ex.ErrorCode);
            Assert.Equal(new[] { nameof(command.UserNames) }, ex.Args);
        }
        public async Task NoParams()
        {
            var testContextBuilder = TestContextBuilder.CreateDefault(builder => builder
                                                                      .AddDatabase()
                                                                      .SeedDefaults()
                                                                      .SeedDataset(Datasets.Dataset1));

            await using var testContext = await testContextBuilder.BuildAsync();

            var query = new ListUsersQuery {
            };

            var queryContext = new QueryContext(query, testContext.Services);

            var handler = ActivatorUtilities.CreateInstance <ListUsersQueryHandler>(testContext.Services);

            var result = await handler.HandleAsync(query, queryContext, default);

            Assert.Equal(3, result.Items?.Length);

            Assert.Contains(result.Items !, item => item.UserId == 1 && item.UserName == ApplicationConstants.BuiltInRootUserName);
            Assert.Contains(result.Items !, item => item.UserId == 11 && item.UserName == "JohnDoe");
            Assert.Contains(result.Items !, item => item.UserId == 12 && item.UserName == "JaneDoe");
        }