public void PurchaseProduct_When_OneEuroCoinsAddedEspressoProductPurchased_Then_ReturnFailed() { //Arrange var coin = Coin.OneEuro; var product = Product.Espresso; var inventory = new List <ProductSlot> { new ProductSlot(product) }; var purse = new List <CoinSlot> { new CoinSlot(Coin.TwentyCents) }; var vendingMachine = new VendingMachine(inventory, purse); var sut = new PurchaseProductUseCase(vendingMachine); //Act sut.InsertCoin(coin); var actual = sut.PurchaseProduct(product); //Assert actual.HasFailed.Should().BeTrue(); actual.PurchaseFailedReason.Should().Be(PurchaseFailedType.InsufficientCoins); actual.ProductPurchased.Should().Be(product); }
public void PurchaseProduct_When_TwoOneEuroCoinsAddedChickenSoupProductPurchased_Then_ReturnSuccess() { //Arrange var coin = Coin.OneEuro; var product = Product.ChickenSoup; var coinReturned = new List <CoinSlot> { new CoinSlot(Coin.TwentyCents) }; var inventory = new List <ProductSlot> { new ProductSlot(product) }; var purse = new List <CoinSlot> { new CoinSlot(Coin.TwentyCents), new CoinSlot(Coin.FiftyCents) }; var vendingMachine = new VendingMachine(inventory, purse); var sut = new PurchaseProductUseCase(vendingMachine); //Act sut.InsertCoin(coin); sut.InsertCoin(coin); var actual = sut.PurchaseProduct(product); //Assert actual.HasFailed.Should().BeFalse(); actual.ProductPurchased.Should().Be(product); actual.CoinsReturned.Should().BeEquivalentTo(coinReturned); }
public async Task ReceiveSelectedProduct(string productId) { Product productSelected; switch (productId) { case "teaProduct": productSelected = Product.Tea; break; case "espressoProduct": productSelected = Product.Espresso; break; case "juiceProduct": productSelected = Product.Juice; break; case "chickenSoupProduct": productSelected = Product.ChickenSoup; break; default: await SendVendingMachineMessage("Product not found, please try again!"); throw new Exception($"Please insert valid productId, actual: {productId}"); } var result = _useCase.PurchaseProduct(productSelected); string message; if (result.HasFailed) { message = $"{result.Message}"; if (result.PurchaseFailedReason == PurchaseFailedType.ProductOutOfStock) { SendProductOutOfStock(result.ProductPurchased.Name); } } else { message = $"{result.Message} \r\n" + $"Coins to return: {string.Join(", ", result.CoinsReturned.Select(slot => $"{slot.Amount} x €{slot.Value}"))}"; } await SendVendingMachineMessage(message); }