public void Throw_ArgumentException_When_ProductCount_IsNegative()
        {
            // Arrange
            var fakeProductName  = "testProduct";
            var fakeProductCount = "-2";

            var orderServiceStub   = new Mock <IOrderService>();
            var productServiceStub = new Mock <IProductService>();
            var userSessionStub    = new Mock <IUserSession>();
            var dtoFactoryStub     = new Mock <IDataTransferObjectFactory>();
            var validatorStub      = new Mock <IValidator>();
            var writerStub         = new Mock <IWriter>();
            var readerStub         = new Mock <IReader>();
            var dateTimeStub       = new Mock <DatetimeProvider>();

            var productModelStub = new Mock <IProductModel>();

            var addOrderCmd = new AddOrderCommand(orderServiceStub.Object, productServiceStub.Object, userSessionStub.Object, dtoFactoryStub.Object, validatorStub.Object, writerStub.Object, readerStub.Object, dateTimeStub.Object);

            productModelStub.SetupGet(pm => pm.Name)
            .Returns(fakeProductName);

            userSessionStub.Setup(us => us.HasSomeoneLogged()).Returns(true);

            readerStub.SetupSequence(r => r.Read())
            .Returns(fakeProductName)
            .Returns(fakeProductCount);

            productServiceStub.Setup(ps => ps.FindProductByName(fakeProductName)).Returns(productModelStub.Object);

            Action executingAddOrderCmd = () => addOrderCmd.ExecuteThisCommand();

            // Act & Assert
            Assert.ThrowsException <ArgumentException>(executingAddOrderCmd);
        }
        public void Invoke_OrderService_MakeOrder_WithValid_OrderModel()
        {
            // Arrange
            var fakeProductName    = "testProduct";
            var fakeProductCount   = "4";
            var rejectMoreProducts = "n";

            var mockOrderService   = new Mock <IOrderService>();
            var productServiceStub = new Mock <IProductService>();
            var userSessionStub    = new Mock <IUserSession>();
            var dtoFactoryStub     = new Mock <IDataTransferObjectFactory>();
            var validatorStub      = new Mock <IValidator>();
            var writerStub         = new Mock <IWriter>();
            var readerStub         = new Mock <IReader>();
            var dateTimeStub       = new Mock <DatetimeProvider>();

            var productModelStub = new Mock <IProductModel>();
            var orderModelStub   = new Mock <IOrderMakeModel>();

            var addOrderCmd = new AddOrderCommand(mockOrderService.Object, productServiceStub.Object, userSessionStub.Object, dtoFactoryStub.Object, validatorStub.Object, writerStub.Object, readerStub.Object, dateTimeStub.Object);

            productModelStub
            .SetupGet(pm => pm.Name)
            .Returns(fakeProductName);

            userSessionStub
            .Setup(us => us.HasSomeoneLogged())
            .Returns(true);

            readerStub
            .SetupSequence(r => r.Read())
            .Returns(fakeProductName)
            .Returns(fakeProductCount)
            .Returns(rejectMoreProducts);

            productServiceStub
            .Setup(ps => ps.FindProductByName(fakeProductName))
            .Returns(productModelStub.Object);

            dtoFactoryStub
            .Setup(dtoFac => dtoFac.CreateOrderMakeModel(It.IsAny <IDictionary <string, int> >(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <DateTime>()))
            .Returns(orderModelStub.Object);

            validatorStub
            .Setup(v => v.IsValid(orderModelStub.Object))
            .Returns(true);

            // Act
            addOrderCmd.ExecuteThisCommand();

            // Assert
            mockOrderService.Verify(os => os.MakeOrder(orderModelStub.Object), Times.Once);
        }
        public void Throw_ArgumentException_When_OrderModel_IsInvalid()
        {
            // Arrange
            var fakeProductName    = "testProduct";
            var fakeProductCount   = "4";
            var rejectMoreProducts = "n";

            var productModelStub = new Mock <IProductModel>();
            var orderModelStub   = new Mock <IOrderMakeModel>();

            var orderServiceStub   = new Mock <IOrderService>();
            var productServiceStub = new Mock <IProductService>();
            var userSessionStub    = new Mock <IUserSession>();
            var dtoFactoryStub     = new Mock <IDataTransferObjectFactory>();
            var validatorStub      = new Mock <IValidator>();
            var writerStub         = new Mock <IWriter>();
            var readerStub         = new Mock <IReader>();
            var dateTimeStub       = new Mock <DatetimeProvider>();

            var addOrderCmd = new AddOrderCommand(orderServiceStub.Object, productServiceStub.Object, userSessionStub.Object, dtoFactoryStub.Object, validatorStub.Object, writerStub.Object, readerStub.Object, dateTimeStub.Object);

            productModelStub.SetupGet(pm => pm.Name)
            .Returns(fakeProductName);

            userSessionStub.Setup(us => us.HasSomeoneLogged()).Returns(true);

            readerStub.SetupSequence(r => r.Read())
            .Returns(fakeProductName)
            .Returns(fakeProductCount)
            .Returns(rejectMoreProducts);

            productServiceStub.Setup(ps => ps.FindProductByName(fakeProductName)).Returns(productModelStub.Object);

            dtoFactoryStub.Setup(dtoFac => dtoFac.CreateOrderMakeModel(It.IsAny <IDictionary <string, int> >(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <DateTime>())).Returns(orderModelStub.Object);

            validatorStub.Setup(v => v.IsValid(orderModelStub.Object)).Returns(false);

            Action executingAddOrderCmd = () => addOrderCmd.ExecuteThisCommand();

            // Act & Assert
            Assert.ThrowsException <ArgumentException>(executingAddOrderCmd);
        }
        public void Throw_ArgumentException_When_NoUser_IsLoggedIn()
        {
            // Arrange
            var orderServiceStub   = new Mock <IOrderService>();
            var productServiceStub = new Mock <IProductService>();
            var userSessionStub    = new Mock <IUserSession>();
            var dtoFactoryStub     = new Mock <IDataTransferObjectFactory>();
            var validatorStub      = new Mock <IValidator>();
            var writerStub         = new Mock <IWriter>();
            var readerStub         = new Mock <IReader>();
            var dateTimeStub       = new Mock <DatetimeProvider>();

            var addOrderCmd = new AddOrderCommand(orderServiceStub.Object, productServiceStub.Object, userSessionStub.Object, dtoFactoryStub.Object, validatorStub.Object, writerStub.Object, readerStub.Object, dateTimeStub.Object);

            userSessionStub.Setup(us => us.HasSomeoneLogged()).Returns(false);

            Action executingAddOrderCmd = () => addOrderCmd.ExecuteThisCommand();

            // Act & Assert
            Assert.ThrowsException <ArgumentException>(executingAddOrderCmd);
        }
        public void Invoke_DTOFactory_CreateOrderMakeModel_With_CorrectValues()
        {
            // Arrange
            var fakeProductName    = "testProduct";
            var fakeProductCount   = "4";
            var rejectMoreProducts = "n";
            var fakeComment        = "testComment";
            var fakeUsername       = "******";
            var fakeOrderedOnDate  = DateTime.Now;

            var orderServiceStub   = new Mock <IOrderService>();
            var productServiceStub = new Mock <IProductService>();
            var userSessionStub    = new Mock <IUserSession>();
            var mockDtoFactory     = new Mock <IDataTransferObjectFactory>();
            var validatorStub      = new Mock <IValidator>();
            var writerStub         = new Mock <IWriter>();
            var readerStub         = new Mock <IReader>();
            var dateTimeStub       = new Mock <DatetimeProvider>();

            var productModelStub = new Mock <IProductModel>();
            var orderModelStub   = new Mock <IOrderMakeModel>();

            var addOrderCmd = new AddOrderCommand(orderServiceStub.Object, productServiceStub.Object, userSessionStub.Object, mockDtoFactory.Object, validatorStub.Object, writerStub.Object, readerStub.Object, dateTimeStub.Object);

            productModelStub
            .SetupGet(pm => pm.Name)
            .Returns(fakeProductName);

            userSessionStub
            .Setup(us => us.HasSomeoneLogged())
            .Returns(true);

            readerStub
            .SetupSequence(r => r.Read())
            .Returns(fakeProductName)
            .Returns(fakeProductCount)
            .Returns(rejectMoreProducts)
            .Returns(fakeComment);

            productServiceStub
            .Setup(ps => ps.FindProductByName(fakeProductName))
            .Returns(productModelStub.Object);

            userSessionStub
            .Setup(us => us.GetLoggedUserName())
            .Returns(fakeUsername);

            dateTimeStub
            .SetupGet(dt => dt.Now)
            .Returns(fakeOrderedOnDate);

            mockDtoFactory
            .Setup(dtoFac => dtoFac.CreateOrderMakeModel(It.IsAny <IDictionary <string, int> >(), fakeComment, fakeUsername, fakeOrderedOnDate))
            .Returns(orderModelStub.Object);

            validatorStub
            .Setup(v => v.IsValid(orderModelStub.Object))
            .Returns(true);

            // Act
            addOrderCmd.ExecuteThisCommand();

            // Assert
            mockDtoFactory.Verify(dtoFac => dtoFac.CreateOrderMakeModel(It.IsAny <IDictionary <string, int> >(), fakeComment, fakeUsername, fakeOrderedOnDate), Times.Once);
        }