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)); }
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);
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)))));