Ejemplo n.º 1
0
        public Task AssignTableShouldReturnProperHypermediaLinks(HireWaiter hireWaiterCommand, AddTable addTableCommand, Fixture fixture) =>
        _apiHelper.InTheContextOfAManager(
            manager => async httpClient =>
        {
            // Arrange
            await _fixture.SendAsync(hireWaiterCommand);
            await _fixture.SendAsync(addTableCommand);

            var assignTableCommand = new AssignTable
            {
                WaiterId    = hireWaiterCommand.Id,
                TableNumber = addTableCommand.Number
            };

            // Act
            var response = await httpClient
                           .PostAsJsonAsync(WaiterRoute("table/assign"), assignTableCommand);

            // Assert
            var expectedLinks = new List <string>
            {
                LinkNames.Self,
                LinkNames.Waiter.GetEmployedWaiters,
                LinkNames.Waiter.Hire
            };

            await response.ShouldBeAResource <AssignTableResource>(expectedLinks);
        },
            fixture);
Ejemplo n.º 2
0
        public async Task CanConnectAsBarista(Register registerCommand, HireBarista hireBaristaCommand, Guid orderId, MenuItem[] menuItems)
        {
            // Arrange
            await _authTestsHelper.Register(registerCommand);

            await _fixture.SendAsync(hireBaristaCommand);

            var assignBaristaToAccountCommand = new AssignBaristaToAccount
            {
                AccountId = registerCommand.Id,
                BaristaId = hireBaristaCommand.Id
            };

            await _fixture.SendAsync(assignBaristaToAccountCommand);

            var accessToken = (await _authTestsHelper.Login(registerCommand.Email, registerCommand.Password)).TokenString;

            var testConnection = BuildTestConnection(accessToken);

            await testConnection.OpenAsync();

            // Act
            await _toGoOrdersHelper.CreateConfirmedOrder(orderId, menuItems);

            // Assert
            await testConnection
            .VerifyMessageReceived <OrderConfirmed>(
                e => e.Order.Id == orderId &&
                e.Order.OrderedItems.Count == menuItems.Length,
                Times.Once());
        }
        public async Task CanGetAllEmployedBaristas(GetEmployedBaristas query, Barista[] baristasToHire)
        {
            // Arrange
            await _fixture.ExecuteDbContextAsync(async dbContext =>
            {
                // Completed orders will be automatically generated by AutoFixture
                dbContext.Baristas.AddRange(baristasToHire);
                await dbContext.SaveChangesAsync();
            });

            // Act
            var baristas = await _fixture.SendAsync(query);

            // Assert
            (baristas.Count == baristasToHire.Length &&
             baristas.All(b => baristasToHire.Any(hiredBarista =>
                                                  b.Id == hiredBarista.Id &&
                                                  b.ShortName == hiredBarista.ShortName &&
                                                  b.CompletedOrders.Count == hiredBarista.CompletedOrders.Count &&
                                                  b.CompletedOrders.All(ov => hiredBarista.CompletedOrders.Any(o =>
                                                                                                               o.Id == ov.Id &&
                                                                                                               o.Status == ov.Status &&
                                                                                                               o.OrderedItems.Count == ov.OrderedItems.Count)))))
            .ShouldBeTrue();
        }
Ejemplo n.º 4
0
        public Task GetAllOpenTabsShouldReturnProperHypermediaLinks(Fixture fixture) =>
        _apiHelper.InTheContextOfAWaiter(
            waiter => async httpClient =>
        {
            // Arrange
            var openTabCommand = new OpenTab
            {
                Id           = Guid.NewGuid(),
                CustomerName = "Some customer",
                TableNumber  = waiter.ServedTables[0].Number
            };

            await _fixture.SendAsync(openTabCommand);

            // Act
            var response = await httpClient.GetAsync(TabRoute());

            // Assert
            var expectedLinks = new List <string>
            {
                LinkNames.Self
            };

            var resource = await response.ShouldBeAResource <TabsContainerResource>(expectedLinks);
            resource.Items.ShouldAllBe(r => r.Links.Count > 0);
        },
            fixture);
Ejemplo n.º 5
0
        public async Task CanQueryOrdersByStatus(Fixture fixture)
        {
            // Arrange
            var statusToTest = ToGoOrderStatus.Pending;

            var ordersToInsert = fixture
                                 .Build <ToGoOrder>()
                                 .With(o => o.Status, statusToTest)
                                 .CreateMany()
                                 .ToList();

            await _fixture.ExecuteDbContextAsync(async dbContext =>
            {
                dbContext.ToGoOrders.AddRange(ordersToInsert);

                await dbContext.SaveChangesAsync();
            });

            var queryToTest = new GetOrdersByStatus
            {
                Status = statusToTest
            };

            // Act
            var orders = await _fixture.SendAsync(queryToTest);

            // Assert
            (orders.Count == ordersToInsert.Count &&
             orders.All(order => ordersToInsert.Any(insertedOrder =>
                                                    order.Id == insertedOrder.Id &&
                                                    order.OrderedItems.Count == insertedOrder.OrderedItems.Count &&
                                                    order.Status == insertedOrder.Status &&
                                                    !string.IsNullOrEmpty(order.StatusText))))
            .ShouldBeTrue();
        }
Ejemplo n.º 6
0
        public async Task CanOrderMenuItems(
            Guid tabId,
            int tableNumber,
            MenuItem[] itemsToOrder)
        {
            // Arrange
            await _helper.OpenTabOnTable(tabId, tableNumber);

            await _helper.AddMenuItems(itemsToOrder);

            var orderItemsCommand = new OrderMenuItems
            {
                TabId       = tabId,
                ItemNumbers = itemsToOrder.Select(i => i.Number).ToList()
            };

            // Act
            var result = await _fixture.SendAsync(orderItemsCommand);

            // Assert
            await _helper.AssertTabExists(
                orderItemsCommand.TabId,
                t => t.IsOpen == true &&
                t.OutstandingMenuItems.Any() &&
                orderItemsCommand.ItemNumbers.All(n => t.OutstandingMenuItems.Any(i => i.Number == n)));
        }
Ejemplo n.º 7
0
        public async Task CreateConfirmedOrder(Guid orderId, MenuItem[] items)
        {
            await OrderToGo(orderId, items);

            await _fixture.SendAsync(new ConfirmToGoOrder
            {
                OrderId   = orderId,
                PricePaid = items.Sum(i => i.Price)
            });
        }
Ejemplo n.º 8
0
        public async Task CanAddTable(AddTable command)
        {
            // Arrange
            // Act
            var result = await _fixture.SendAsync(command);

            // Assert
            var tableInDb = await _fixture.ExecuteDbContextAsync(dbContext =>
                                                                 dbContext.Tables.FirstOrDefaultAsync(t => t.Id == command.Id));

            tableInDb.ShouldNotBeNull();
            tableInDb.Number.ShouldBe(command.Number);
        }
Ejemplo n.º 9
0
        public async Task CanGetTabHistory(Guid[] tabIds)
        {
            // Arrange
            await CreateClosedTabsFromIds(tabIds);

            // Act
            var tabs = await _fixture.SendAsync(new GetTabHistory());

            // Assert
            (tabs.Count == tabIds.Length &&
             tabs.All(t => tabIds.Contains(t.Id)))
            .ShouldBeTrue();
        }
Ejemplo n.º 10
0
        public async Task CanGetAllMenuItems(GetAllMenuItems query, MenuItem[] menuItems)
        {
            // Arrange
            await _helper.AddMenuItems(menuItems);

            // Act
            var items = await _fixture.SendAsync(query);

            // Assert
            (items.Count == menuItems.Length &&
             items.All(i => menuItems.Any(mi => i.Number == mi.Number &&
                                          i.Description == mi.Description &&
                                          i.Price == mi.Price)))
            .ShouldBeTrue();
        }
        public async Task ItRemovesTheIngredient()
        {
            var original = new Recipe(name: nameof(ItRemovesTheIngredient));

            var toDelete = original.AddIngredient(new Ingredient(Guid.NewGuid().ToString()),
                                                  UnitOfMeasure.Cup, 2M);

            original.AddIngredient(new Ingredient(Guid.NewGuid().ToString()), UnitOfMeasure.Pint, 5M);

            await AppFixture.InsertAsync(original);

            var request = new RemoveIngredientRequest
            {
                RecipeModelKey           = new ModelUpdateIdentifier(original),
                RecipeIngredientModelKey = new ModelUpdateIdentifier(toDelete)
            };

            await AppFixture.SendAsync(request);

            var saved = await AppFixture.ExecuteDbContextAsync(async db =>
            {
                return(await db.Recipes.Where(x => x.Id == original.Id).Include(x => x.RecipeIngredients)
                       .FirstOrDefaultAsync());
            });

            saved.RecipeIngredients.Should().HaveCount(1);
            saved.RecipeIngredients[0].UnitOfMeasure.Should().Be(UnitOfMeasure.Pint);
        }
        public async Task GetRecipe_FetchesAndMaps()
        {
            var recipe = await AppFixture.ExecuteDbContextAsync(async db =>
            {
                var recipe = new Recipe(name: nameof(GetRecipe_FetchesAndMaps) + Guid.NewGuid())
                {
                    Description = "Testing a load",
                    CookTime    = Duration.FromMinutes(60),
                    PrepTime    = Duration.FromMinutes(15)
                };

                var ingredient = new Ingredient("Sugar");
                recipe.AddIngredient(ingredient, UnitOfMeasure.Cup, 1M);
                db.Recipes.Add(recipe);
                await Task.CompletedTask;
                return(recipe);
            });

            var response = await AppFixture.SendAsync(new GetRecipeRequest { Key = recipe.Key });

            response.Name.Should().StartWith(nameof(GetRecipe_FetchesAndMaps));
            response.CookTime.Should().Be(Duration.FromHours(1));
            response.RecipeIngredients.Should().HaveCount(1);
            recipe.RecipeIngredients[0].Ingredient.Name.Should().Be("Sugar");
        }
        public async Task UserCanBetForAwayTeam(
            Fixture fixture,
            Team homeTeam,
            Team awayTeam,
            Register registerCommand)
        {
            // Arrange
            await _authTestsHelper
            .RegisterAndLogin(registerCommand);

            var match = await _matchTestHelper
                        .RegistrateMatchAsync(fixture, homeTeam, awayTeam);

            var betCommand = new UserBetForAwayTeam
            {
                UserId  = registerCommand.Id,
                MatchId = match.Id,
                AwayBet = fixture.Create <decimal>(),
            };

            // Act
            var result = await _fixture.SendAsync(betCommand);

            // Assert
            var isBetExists = await _fixture.ExecuteDbContextAsync(
                async context =>
                context.UserMatchBets
                .Any(bet => bet.UserId == registerCommand.Id &&
                     bet.MatchId == match.Id &&
                     bet.AwayBet == betCommand.AwayBet &&
                     bet.HomeBet == 0));

            isBetExists.ShouldBeTrue();
        }
        public async Task UserTeamVotesAreSentToAllSubscribers(
            Register registerCommand,
            Team teamToVote)
        {
            // Arrange
            await _authTestsHelper.Register(registerCommand);

            await _fixture.ExecuteDbContextAsync(async dbContext =>
            {
                await dbContext.Teams.AddAsync(teamToVote);
                await dbContext.SaveChangesAsync();
            });

            var testConnection = BuildTestConnection();

            var voteForTeamCommand = new VoteForTeam(teamToVote.Id, registerCommand.Id);

            // Act
            await _fixture.SendAsync(voteForTeamCommand);

            // Assert
            testConnection
            .VerifyMessageReceived(
                team => team.UserId == voteForTeamCommand.UserId &&
                team.TeamId == voteForTeamCommand.TeamId,
                Times.Never());
        }
        public async Task ItAddsAnIngredient()
        {
            var ingredientName = Guid.NewGuid().ToString();

            var recipe = new Recipe(name: nameof(ItAddsAnIngredient));
            await AppFixture.InsertAsync(recipe);

            var result = await AppFixture.SendAsync(new AddIngredientRequest
            {
                RecipeKey     = new ModelUpdateIdentifier(recipe),
                Name          = ingredientName,
                Quantity      = 42M,
                UnitOfMeasure = UnitOfMeasure.Pint
            });

            var saved = await AppFixture.ExecuteDbContextAsync(db => db.RecipeIngredients
                                                               .Include(ri => ri.Ingredient)
                                                               .Include(ri => ri.Recipe)
                                                               .Where(ri => ri.Key == result.Key)
                                                               .FirstOrDefaultAsync());

            saved.Ingredient.Name.Should().Be(ingredientName);
            saved.Recipe.Key.Should().Be(recipe.Key);
            saved.UnitOfMeasure.Should().Be(UnitOfMeasure.Pint);
            saved.Quantity.Should().Be(42M);
        }
Ejemplo n.º 16
0
        public async Task ShouldNotCreateDefaultAdminAccountWhenExisting()
        {
            // Arrange
            var configuration = await _fixture.ExecuteScopeAsync(async sp => sp.GetService <IConfiguration>());

            var expectedAdminCredentials = configuration.GetAdminCredentials();

            await _fixture.SendAsync(new Register
            {
                Id        = Guid.NewGuid(),
                Email     = expectedAdminCredentials.Email,
                Password  = expectedAdminCredentials.Password,
                FirstName = "Some",
                LastName  = "Account"
            });

            // Act
            await _fixture.ExecuteScopeAsync(async sp =>
            {
                var userManager = sp.GetService <UserManager <User> >();

                var result = await DatabaseConfiguration
                             .AddDefaultAdminAccountIfNoneExisting(userManager, configuration);

                // Assert
                result.HasValue.ShouldBeFalse();
            });
        }
Ejemplo n.º 17
0
        public async Task CanGetAllOpenTabs(Guid[] tabIds)
        {
            // Arrange
            for (int i = 0; i < tabIds.Length; i++)
            {
                await _helper.OpenTabOnTable(tabIds[i], tableNumber : i + 1);
            }

            // Act
            var tabs = await _fixture.SendAsync(new GetAllOpenTabs());

            // Assert
            (tabs.Count == tabIds.Length &&
             tabs.All(t => tabIds.Contains(t.Id)))
            .ShouldBeTrue();
        }
Ejemplo n.º 18
0
        public async Task CanRegister(Register command)
        {
            // Act
            var result = await _fixture.SendAsync(command);

            // Assert
            result.HasValue.ShouldBeTrue();

            var userInDb = await _fixture
                           .ExecuteDbContextAsync(context => context.Users.FirstOrDefaultAsync(u => u.Id == command.Id));

            userInDb.Id.ShouldBe(command.Id);
            userInDb.Email.ShouldBe(command.Email);
            userInDb.FirstName.ShouldBe(command.FirstName);
            userInDb.LastName.ShouldBe(command.LastName);
        }
Ejemplo n.º 19
0
        public async Task CanHireWaiter(HireWaiter command)
        {
            // Arrange
            // Act
            var result = await _fixture.SendAsync(command);

            // Assert
            result.HasValue.ShouldBeTrue();

            var waiterInDb = await _fixture.ExecuteDbContextAsync(dbContext =>
                                                                  dbContext
                                                                  .Waiters
                                                                  .FirstOrDefaultAsync(w => w.Id == command.Id));

            waiterInDb.Id.ShouldBe(command.Id);
            waiterInDb.ShortName.ShouldBe(command.ShortName);
        }
        public async Task CanAssignBaristaToAccount(Register accountToRegisterCommand, Barista baristaToAssign)
        {
            // Arrange
            await _fixture.ExecuteDbContextAsync(async dbContext =>
            {
                dbContext.Baristas.Add(baristaToAssign);
                await dbContext.SaveChangesAsync();
            });

            await _fixture.SendAsync(accountToRegisterCommand);

            var commandToTest = new AssignBaristaToAccount
            {
                BaristaId = baristaToAssign.Id,
                AccountId = accountToRegisterCommand.Id
            };

            // Act
            var result = await _fixture.SendAsync(commandToTest);

            // Assert
            await _helper.LoginAndCheckClaim(
                accountToRegisterCommand.Email,
                accountToRegisterCommand.Password,
                c => c.Type == AuthConstants.ClaimTypes.BaristaId &&
                c.Value == baristaToAssign.Id.ToString());
        }
Ejemplo n.º 21
0
        public async Task CanAssignWaiterToAccount(Register registerAccountCommand, Waiter waiterToAssign)
        {
            // Arrange
            await _fixture.ExecuteDbContextAsync(async dbContext =>
            {
                dbContext.Waiters.Add(waiterToAssign);
                await dbContext.SaveChangesAsync();
            });

            await _fixture.SendAsync(registerAccountCommand);

            var commandToTest = new AssignWaiterToAccount
            {
                WaiterId  = waiterToAssign.Id,
                AccountId = registerAccountCommand.Id
            };

            // Act
            var result = await _fixture.SendAsync(commandToTest);

            // Assert
            await _helper.LoginAndCheckClaim(
                registerAccountCommand.Email,
                registerAccountCommand.Password,
                c => c.Type == AuthConstants.ClaimTypes.WaiterId &&
                c.Value == waiterToAssign.Id.ToString());
        }
Ejemplo n.º 22
0
        public async Task LoginAndCheckClaim(string email, string password, Func <Claim, bool> claimPredicate)
        {
            var loginResult = await _fixture.SendAsync(new Login
            {
                Email    = email,
                Password = password
            });

            loginResult.Exists(jwt =>
            {
                var decoded = new JwtSecurityToken(jwt.TokenString);

                return(decoded
                       .Claims
                       .Any(claimPredicate));
            })
            .ShouldBeTrue();
        }
        public async Task CanGetAllEmployedCashiers(GetEmployedCashiers query, Cashier[] cashiersToHire)
        {
            // Arrange
            await _fixture.ExecuteDbContextAsync(async dbContext =>
            {
                dbContext.Cashiers.AddRange(cashiersToHire);
                await dbContext.SaveChangesAsync();
            });

            // Act
            var cashiers = await _fixture.SendAsync(query);

            // Assert
            (cashiers.Count == cashiersToHire.Length &&
             cashiers.All(c => cashiersToHire.Any(hiredCashier => c.Id == hiredCashier.Id &&
                                                  c.ShortName == hiredCashier.ShortName)))
            .ShouldBeTrue();
        }
Ejemplo n.º 24
0
        public async Task CanHireManager(HireManager command)
        {
            // Act
            var result = await _fixture.SendAsync(command);

            // Assert
            var managerInDb = await _fixture.ExecuteDbContextAsync(dbContext =>
            {
                var manager = dbContext
                              .Managers
                              .SingleAsync(m => m.Id == command.Id);

                return(manager);
            });

            managerInDb.Id.ShouldBe(command.Id);
            managerInDb.ShortName.ShouldBe(command.ShortName);
        }
Ejemplo n.º 25
0
        public async Task AuthenticatedSubscribersAreNotifiedAboutHiredWaiters(HireWaiter hireWaiterCommand)
        {
            // Arrange
            var adminAccessToken = await _authTestsHelper.GetAdminToken();

            var testConnection = BuildTestConnection(adminAccessToken);

            await testConnection.OpenAsync();

            // Act
            await _fixture.SendAsync(hireWaiterCommand);

            // Assert
            await testConnection
            .VerifyMessageReceived <WaiterHired>(
                e => e.Waiter.Id == hireWaiterCommand.Id &&
                e.Waiter.ShortName == hireWaiterCommand.ShortName,
                Times.Once());
        }
Ejemplo n.º 26
0
        public async Task CanConfirmToGoOrder(Guid orderId, MenuItem[] items)
        {
            // Arrange
            await _helper.OrderToGo(orderId, items);

            var commandToTest = new ConfirmToGoOrder
            {
                OrderId   = orderId,
                PricePaid = items.Sum(i => i.Price)
            };

            // Act
            var result = await _fixture.SendAsync(commandToTest);

            // Assert
            await _helper.AssertOrderExists(
                orderId,
                order => order.Status == ToGoOrderStatus.Issued);
        }
        public async Task CanGetAllEmployedWaiters(GetEmployedWaiters query, Waiter[] waitersToHire)
        {
            // Arrange
            await _fixture.ExecuteDbContextAsync(async dbContext =>
            {
                dbContext.Waiters.AddRange(waitersToHire);
                await dbContext.SaveChangesAsync();
            });

            // Act
            var waiters = await _fixture.SendAsync(query);

            // Assert
            (waiters.Count == waitersToHire.Length &&
             waiters.All(w => waitersToHire.Any(hiredWaiter => w.Id == hiredWaiter.Id &&
                                                w.ShortName == hiredWaiter.ShortName &&
                                                w.TablesServed.Count == hiredWaiter.ServedTables.Count)))
            .ShouldBeTrue();
        }
Ejemplo n.º 28
0
        public async Task InTheContextOfAManager(Func <Manager, Func <HttpClient, Task> > serverCall, Fixture fixture)
        {
            var hireManager = fixture.Create <HireManager>();

            await _appFixture.SendAsync(hireManager);

            var manager = await _appFixture.ExecuteDbContextAsync(dbContext =>
                                                                  dbContext
                                                                  .Managers
                                                                  .FirstAsync(m => m.Id == hireManager.Id));

            var token = await SetupUserWithClaims(
                fixture,
                new List <Claim> {
                new Claim(AuthConstants.ClaimTypes.ManagerId, manager.Id.ToString())
            });

            await _appFixture.ExecuteHttpClientAsync(serverCall(manager), token);
        }
Ejemplo n.º 29
0
        public async Task CanHireBarista(HireBarista command)
        {
            // Arrange
            // Act
            var result = await _fixture.SendAsync(command);

            // Assert
            result.HasValue.ShouldBeTrue();

            var baristaInDb = await _fixture.ExecuteDbContextAsync(dbContext =>
                                                                   dbContext
                                                                   .Baristas
                                                                   .Include(b => b.CompletedOrders)
                                                                   .FirstOrDefaultAsync(b => b.Id == command.Id &&
                                                                                        b.ShortName == command.ShortName &&
                                                                                        b.CompletedOrders.Count == 0));

            baristaInDb.Id.ShouldBe(command.Id);
            baristaInDb.ShortName.ShouldBe(command.ShortName);
        }
Ejemplo n.º 30
0
        public async Task CanCloseTabWithoutTip(Guid tabId, int tableNumber)
        {
            // Arrange
            await _helper.OpenTabOnTable(tabId, tableNumber);

            var closeTabCommand = new CloseTab
            {
                TabId      = tabId,
                AmountPaid = 0 // This should be OK as we haven't ordered anything
            };

            // Act
            var result = await _fixture.SendAsync(closeTabCommand);

            // Assert
            await _helper.AssertTabExists(
                closeTabCommand.TabId,
                t => t.IsOpen == false &&
                t.TipValue == 0);
        }