示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }