Beispiel #1
0
        public async Task CanServeOneBeverageTwiceInARow(Guid tabId, List <Beverage> beverages)
        {
            // Arrange
            await OpenTab(tabId);
            await AddBeveragesToDb(beverages);

            var beverageNumberToServe = beverages.First().MenuNumber;

            // We intentionally order it twice in order to be able to assert that only one was served
            await OrderBeverages(tabId, beverageNumberToServe);
            await OrderBeverages(tabId, beverageNumberToServe);

            // Act
            var command = new ServeBeverages
            {
                TabId       = tabId,
                MenuNumbers = new[] { beverageNumberToServe }
            };

            await _fixture.SendAsync(command);

            await _fixture.SendAsync(command);

            // Assert
            await AssertTabExists(
                tabId,
                tab => tab.ServedBeverages.Count == 2 &&
                tab.ServedBeverages.All(b => b.MenuNumber == beverageNumberToServe));
        }
Beispiel #2
0
        private Task <Option <Tab, Error> > AssureAllBeveragesAreOutstanding(ServeBeverages command, CancellationToken cancellationToken) =>
        GetTabIfNotClosed(command.TabId, cancellationToken).
        FilterAsync(async tab =>
        {
            var outstandingMenuNumbers = tab
                                         .OutstandingBeverages
                                         .ToLookup(x => x.MenuNumber);

            return(command
                   .MenuNumbers
                   .All(num => outstandingMenuNumbers.Contains(num)));
        }, Errors.Tab.TriedToServeUnorderedBeverages);
Beispiel #3
0
 public Task <Option <Unit, Error> > Handle(ServeBeverages request, CancellationToken cancellationToken) =>
 ValidateCommandIsNotEmpty(request).FlatMapAsync(command =>
                                                 AssureAllBeveragesAreOutstanding(command, cancellationToken).FlatMapAsync(tab =>
                                                                                                                           GetBeveragesIfInStock(command.MenuNumbers).MapAsync(beveragesToServe =>
                                                                                                                                                                               PublishEvents(tab.Id, tab.ServeBeverages(beveragesToServe)))));