public void ThrowArgumentException_WhenOrderModelIsNull()
        {
            //Arrange
            var fakeContext = new Mock <IOnlineStoreContext>();
            var orderModel  = new Logic.Services.OrderService(fakeContext.Object);

            //Act & Assert
            Assert.ThrowsException <ArgumentNullException>(() => orderModel.MakeOrder(null));
        }
        public void InvokeAddMethodOnOrders_WhenCourierFoundAndUsernameExists()
        {
            // Arrange
            var mockContext = new Mock <IOnlineStoreContext>();
            var usersMock   = new List <User> {
                new User {
                    Username = "******"
                }
            }.GetQueryableMockDbSet();
            var couriersMock = new List <Courier> {
                new Courier {
                    FirstName = "Peshko", LastName = "Peshkov"
                }
            }.GetQueryableMockDbSet();
            var ordersMock = new List <Order> {
                new Order()
            }.GetQueryableMockDbSet();
            var productsMock = new List <Product> {
                new Product {
                    Name = "Testproduct", Quantity = 5
                }
            }.GetQueryableMockDbSet();
            var orderProductsMock = new List <OrderProduct> {
                new OrderProduct()
            }.GetQueryableMockDbSet();

            IDictionary <string, int> productsCounts = new Dictionary <string, int>();

            productsCounts.Add("Testproduct", 2);
            var mockDateTimeProvider = new MockDateTimeProvider();

            mockContext.Setup(x => x.Users).Returns(usersMock.Object);
            mockContext.Setup(x => x.Couriers).Returns(couriersMock.Object);
            mockContext.Setup(s => s.Orders).Returns(ordersMock.Object);
            mockContext.Setup(s => s.Products).Returns(productsMock.Object);
            mockContext.Setup(s => s.OrderProducts).Returns(orderProductsMock.Object);

            var service     = new Logic.Services.OrderService(mockContext.Object);
            var orderToMake = new OrderMakeModel
            {
                Username             = "******",
                OrderedOn            = mockDateTimeProvider.Now,
                Comment              = "Tralala",
                ProductNameAndCounts = productsCounts
            };

            // Act
            service.MakeOrder(orderToMake);

            //Assert
            ordersMock.Verify(v => v.Add(It.IsNotNull <Order>()), Times.Once);
        }
        public void ReduceTheAvailableProductQuantity_WhenOrderIsFinished()
        {
            // Arrange
            var mockContext = new Mock <IOnlineStoreContext>();
            var usersMock   = new List <User> {
                new User {
                    Username = "******"
                }
            }.GetQueryableMockDbSet();
            var couriersMock = new List <Courier> {
                new Courier {
                    FirstName = "Peshko", LastName = "Peshkov"
                }
            }.GetQueryableMockDbSet();
            var ordersMock = new List <Order> {
                new Order()
            }.GetQueryableMockDbSet();
            var productsMock = new List <Product> {
                new Product {
                    Name = "Testproduct", Quantity = 5
                }
            }.GetQueryableMockDbSet();
            var orderProductsMock = new List <OrderProduct> {
                new OrderProduct()
            }.GetQueryableMockDbSet();

            IDictionary <string, int> productsCounts = new Dictionary <string, int>();

            productsCounts.Add("Testproduct", 2);
            var mockDateTimeProvider = new MockDateTimeProvider();

            mockContext.Setup(x => x.Users).Returns(usersMock.Object);
            mockContext.Setup(x => x.Couriers).Returns(couriersMock.Object);
            mockContext.Setup(s => s.Orders).Returns(ordersMock.Object);
            mockContext.Setup(s => s.Products).Returns(productsMock.Object);
            mockContext.Setup(s => s.OrderProducts).Returns(orderProductsMock.Object);

            var service     = new Logic.Services.OrderService(mockContext.Object);
            var orderToMake = new OrderMakeModel
            {
                Username             = "******",
                OrderedOn            = mockDateTimeProvider.Now,
                Comment              = "Tralala",
                ProductNameAndCounts = productsCounts
            };

            // Act
            service.MakeOrder(orderToMake);

            //Assert
            Assert.AreEqual(3, mockContext.Object.Products.FirstOrDefault(f => f.Name == "Testproduct").Quantity);
        }
        public void ThrowArgumentException_WhenQuantityIsNotEnough()
        {
            // Arrange
            var mockContext = new Mock <IOnlineStoreContext>();
            var usersMock   = new List <User> {
                new User {
                    Username = "******"
                }
            }.GetQueryableMockDbSet();
            var couriersMock = new List <Courier> {
                new Courier {
                    FirstName = "Peshko", LastName = "Peshkov"
                }
            }.GetQueryableMockDbSet();
            var ordersMock = new List <Order> {
                new Order()
            }.GetQueryableMockDbSet();
            var productsMock = new List <Product> {
                new Product {
                    Name = "Testproduct", Quantity = 5
                }
            }.GetQueryableMockDbSet();
            var orderProductsMock = new List <OrderProduct> {
                new OrderProduct()
            }.GetQueryableMockDbSet();

            IDictionary <string, int> productsCounts = new Dictionary <string, int>();

            productsCounts.Add("Testproduct", 7);
            var mockDateTimeProvider = new MockDateTimeProvider();

            mockContext.Setup(x => x.Users).Returns(usersMock.Object);
            mockContext.Setup(x => x.Couriers).Returns(couriersMock.Object);
            mockContext.Setup(s => s.Orders).Returns(ordersMock.Object);
            mockContext.Setup(s => s.Products).Returns(productsMock.Object);
            mockContext.Setup(s => s.OrderProducts).Returns(orderProductsMock.Object);

            var service     = new Logic.Services.OrderService(mockContext.Object);
            var orderToMake = new OrderMakeModel
            {
                Username             = "******",
                OrderedOn            = mockDateTimeProvider.Now,
                Comment              = "Tralala",
                ProductNameAndCounts = productsCounts
            };

            //Act && Assert
            Assert.ThrowsException <ArgumentException>(() => service.MakeOrder(orderToMake));
        }
        public void ThrowArgumentException_WhenUserNotFound()
        {
            // Arrange
            var mockContext = new Mock <IOnlineStoreContext>();
            var usersMock   = new List <User>().GetQueryableMockDbSet();

            mockContext.Setup(x => x.Users).Returns(usersMock.Object);

            var service     = new Logic.Services.OrderService(mockContext.Object);
            var orderToMake = new OrderMakeModel
            {
                Username = "******"
            };

            // Act & Assert
            Assert.ThrowsException <ArgumentException>(() => service.MakeOrder(orderToMake));
        }