public void AddItemsToCheckout_IfCheckoutExists_ShouldAddItemsToExistingCheckout()
        {
            // arrange
            Mock <IItemOrchestrator> mockItem = new Mock <IItemOrchestrator>();

            mockItem.Setup(mock => mock.GetItem(It.IsAny <string>())).Returns(new Item {
                SKU = "A99", Price = 0.50m
            });
            var orchestrator = new CheckoutOrchestrator(mockItem.Object, new Mock <IOfferOrchestrator>().Object, new Mock <DiscountOrchestrator>().Object);

            orchestrator._listCheckout = new List <Checkout> {
                new Checkout {
                    Id = checkoutId, Items = new List <Item> {
                        new
                        Item {
                            Price = 0.50m, SKU = "A99"
                        }
                    }
                }
            };
            //act
            var itemAdded = orchestrator.ScanItem("A99", checkoutId);

            //assert
            itemAdded.Should().BeTrue();
        }
        public void GetTotalPrice_IfOfferExists_ShouldApplyDiscount()
        {
            // arrange
            var offerMock = new Mock <IOfferOrchestrator>();

            offerMock.Setup(mock => mock.GetOffer("B15"))
            .Returns(new ItemOffer {
                OfferPrice = 0.45m, Quantity = 2, SKU = "B15"
            });
            offerMock.Setup(mock => mock.GetOffer("A99"))
            .Returns(new ItemOffer {
                OfferPrice = 1.30m, Quantity = 3, SKU = "A99"
            });
            var orchestrator = new CheckoutOrchestrator(new Mock <ItemOrchestrator>().Object, offerMock.Object, new Mock <DiscountOrchestrator>().Object);
            var expected     = 4.05m;

            orchestrator._listCheckout = new List <Checkout>()
            {
                checkoutItems
            };
            //act
            var actual = orchestrator.GetTotalPriceWithDiscount(checkoutId);

            //assert

            actual.Should().Be(expected);
        }
        public void AddItemsToCheckout_IfSkuNullOrEmpty_ShouldThrowArgumentNullException()
        {
            // arrange
            var orchestrator = new CheckoutOrchestrator(new Mock <ItemOrchestrator>().Object, new Mock <IOfferOrchestrator>().Object, new Mock <DiscountOrchestrator>().Object);
            //act
            Func <bool> action = () => { return(orchestrator.ScanItem(null, checkoutId)); };

            //assert
            action.Should().Throw <ArgumentNullException>();
        }
        public void CalculateDiscount_IfNoOfferFound_ShouldNotCalculateDiscount()
        {
            // arrange
            var orchestrator = new CheckoutOrchestrator(new Mock <ItemOrchestrator>().Object, new Mock <IOfferOrchestrator>().Object, new Mock <DiscountOrchestrator>().Object);
            var sku          = "B15";
            var expected     = 0.0m;
            //act
            var actual = orchestrator.CalculateDiscount(sku);

            //assert
            actual.Should().Be(expected);
        }
        public void CalculateDiscount_IfSKUEmptyOrNull_ShouldThrowArgumentNullException()
        {
            // arrange
            var orchestrator = new CheckoutOrchestrator(new Mock <ItemOrchestrator>().Object, new Mock <IOfferOrchestrator>().Object, new Mock <DiscountOrchestrator>().Object);
            //act
            Func <decimal> action = () =>
            {
                return(orchestrator.CalculateDiscount(null));
            };

            //assert
            action.Should().Throw <ArgumentNullException>();
        }
        public void AddItemsToCheckout_IfCheckoutNotFoundAddItem_ShouldCreateNewCheckout()
        {
            // arrange
            Mock <IItemOrchestrator> mockItem = new Mock <IItemOrchestrator>();

            mockItem.Setup(mock => mock.GetItem(It.IsAny <string>())).Returns(new Item {
                SKU = "A99", Price = 0.50m
            });
            var orchestrator = new CheckoutOrchestrator(mockItem.Object, new Mock <IOfferOrchestrator>().Object, new Mock <DiscountOrchestrator>().Object);
            //act
            var itemAdded = orchestrator.ScanItem("A99", Guid.NewGuid());

            //assert
            itemAdded.Should().BeTrue();
        }
        public void GetTotalPrice_ShouldReturnTotalPriceWithoutDiscount()
        {
            // arrange
            var orchestrator = new CheckoutOrchestrator(new Mock <ItemOrchestrator>().Object, new Mock <IOfferOrchestrator>().Object, new Mock <DiscountOrchestrator>().Object);
            var expected     = checkoutItems.Items.Sum(p => p.Price);

            orchestrator._listCheckout = new List <Checkout>()
            {
                checkoutItems
            };
            //act
            var actual = orchestrator.GetTotalPrice(checkoutId);

            //assert

            actual.Should().Be(expected);
        }
        public void CalculateDiscount_IfOfferFound_ShouldCalculateDiscount()
        {
            // arrange
            var offerMock = new Mock <IOfferOrchestrator>();

            offerMock.Setup(mock => mock.GetOffer("B15"))
            .Returns(new ItemOffer {
                OfferPrice = 0.45m, Quantity = 2, SKU = "B15"
            });
            var orchestrator = new CheckoutOrchestrator(new Mock <ItemOrchestrator>().Object, offerMock.Object, new Mock <DiscountOrchestrator>().Object);
            var sku          = "B15";
            var expected     = 0.45m;

            orchestrator._listCheckout = new List <Checkout>()
            {
                checkoutItems
            };
            //act
            var actual = orchestrator.CalculateDiscount(sku);

            //assert
            actual.Should().Be(expected);
        }