public void IsPurchaseReady_ProductNotInStock_ReturnsNotInStock()
        {
            Nullable <ProductIssues> expected = ProductIssues.NotInStock;

            Mock <Product> product = new Mock <Product>();

            product.SetupGet(x => x.Active).Returns(true);
            product.SetupGet(x => x.Id).Returns(Guid.Empty);
            product.SetupGet(x => x.Quantity).Returns(0);
            product.SetupGet(x => x.Returns).Returns(new ReadOnlyCollection <Return>(new List <Return>()));

            Mock <CartProduct> cartProduct = new Mock <CartProduct>();

            cartProduct.CallBase = true;
            cartProduct.SetupGet(x => x.Quantity).Returns(1);
            cartProduct.SetupGet(x => x.Product).Returns(product.Object);

            Mock <Cart> cart = new Mock <Cart>();

            cart.CallBase = true;
            cart.SetupGet(x => x.Products)
            .Returns(new ReadOnlyCollection <CartProduct>(new List <CartProduct>()
            {
                cartProduct.Object
            }));

            Nullable <ProductIssues> actual = cart.Object.IsPurchaseReady();

            actual.ShouldBeEquivalentTo(expected);
        }
        public void IsPurchaseReady_CartEmpty_ReturnsNull()
        {
            Nullable <ProductIssues> expected = null;

            Mock <Cart> cart = new Mock <Cart>();

            cart.CallBase = true;
            cart.SetupGet(x => x.Products).Returns(new ReadOnlyCollection <CartProduct>(new List <CartProduct>()));

            Nullable <ProductIssues> actual = cart.Object.IsPurchaseReady();

            actual.ShouldBeEquivalentTo(expected);
        }
        public void IsPayReady_HasNoCreditCards_PaymentIssueNoCreditCardsAvailable()
        {
            Nullable <PaymentIssues> expected = PaymentIssues.NoActiveCreditCardAvailable;

            Mock <Customer> customer = new Mock <Customer>();

            customer.SetupGet(x => x.Balance).Returns(0);
            customer.Setup(x => x.GetCreditCardsAvailble())
            .Returns(new ReadOnlyCollection <CreditCard>(new List <CreditCard>()));

            Nullable <PaymentIssues> actual = customer.Object.IsPayReady();

            actual.ShouldBeEquivalentTo(expected);
        }
        public void IsPayReady_HasUnpaidBalance_PaymentIssueUnpaidBalance()
        {
            Nullable <PaymentIssues> expected = PaymentIssues.UnpaidBalance;

            Mock <Customer> customer = new Mock <Customer>();

            customer.SetupGet(x => x.Balance).Returns(-10);

            //To keep customer locked, use mock to override properties.
            //Don't make IsPayReady virtual as it will lose it's programmed behaviour
            Nullable <PaymentIssues> actual = customer.Object.IsPayReady();

            actual.ShouldBeEquivalentTo(expected);
        }