public void ReturnCorrectData_WhenInvoked()
        {
            // Arrange
            Mapper.Reset();
            AutomapperConfiguration.Initialize();
            var mockContext          = new Mock <IOnlineStoreContext>();
            var stubDateTimeProvider = new MockDateTimeProvider();
            var orders = new List <Order> {
                new Order {
                    Comment = "Patka", CourierId = 1, OrderedOn = stubDateTimeProvider.Now, UserId = 1, User = new User()
                    {
                        Username = "******"
                    }
                }
            };


            var mockSet = new Mock <DbSet <Order> >();

            mockSet.SetupData(orders);


            mockContext.Setup(s => s.Orders).Returns(mockSet.Object);

            var service = new Logic.Services.OrderService(mockContext.Object);


            // Act
            var ordersGot = service.GetAllOrders();

            //Assert
            Assert.AreEqual(orders.Count, ordersGot.Count());
        }
        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));
        }
        public void ReturnInstanceOfTypeIEnumerableIOrderProduct_WhenInvoked()
        {
            // Arrange
            Mapper.Reset();
            AutomapperConfiguration.Initialize();
            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);
            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);

            // Act
            var orders = service.GetAllOrders();

            //Assert
            Assert.IsInstanceOfType(orders, typeof(IEnumerable <IOrderModel>));
        }