public async Task ValidateQuoteRequest_GivenAQuoteRequestWithANullRequestItems_ShouldReturnAValidationResultWithExpectedErrorMessage()
        {
            //Arrange
            var wholesalerId = Guid.NewGuid();
            var itemId       = Guid.NewGuid();

            RequestItem[] requestedItems = null;

            var quoteRequest = new QuoteRequest
            {
                WholesalerId = wholesalerId,
                RequestItems = requestedItems
            };

            var expectedErrorMessage = "Quote request cannot be empty";

            var mockedWholesalerQuery = new Mock <IWholesalerQuery>();

            mockedWholesalerQuery.Setup(query => query.GetWholesaler(It.IsAny <Guid>()))
            .ReturnsAsync(new Wholesaler());

            var wholesalerValidation = new WholesalerValidation(mockedWholesalerQuery.Object);

            //Act
            var results = await wholesalerValidation.ValidateQuoteRequest(quoteRequest);

            //Assert
            Assert.Contains(results, result => result != null && result.ErrorMessage.Equals(expectedErrorMessage));
        }
        public async Task ValidateStockItem_GivenAStockItemWithNegativeQuantity_ShouldReturAValidationResultWithExpectedMessage()
        {
            //Arrange
            var guid = Guid.NewGuid();

            var stockItem = new StockItem
            {
                WholesalerId = guid,
                UnitPrice    = 1.0f,
                Quantity     = -1
            };

            var expectedMessage = "The quantity of a stock item cannot be negative";

            var mockedWholesalerQuery = new Mock <IWholesalerQuery>();

            mockedWholesalerQuery.Setup(query => query.GetWholesaler(It.IsAny <Guid>()))
            .ReturnsAsync(new Wholesaler());

            var wholesalerValidation = new WholesalerValidation(mockedWholesalerQuery.Object);

            //Act
            var results = await wholesalerValidation.ValidateStockItem(stockItem);

            //Assert
            Assert.Contains(results, result => result != null && result.ErrorMessage.Equals(expectedMessage));
        }
        public async Task ValidateQuoteRequest_GivenAQuoteRequestWithNonExistingWholesaler_ShouldReturnAValidationResultWithExpectedErrorMessage()
        {
            //Arrange
            var wholesalerId = Guid.NewGuid();
            var itemId       = Guid.NewGuid();

            var requestedItems = new[]
            {
                new RequestItem {
                    ItemId = itemId, Quantity = 1
                }
            };

            var quoteRequest = new QuoteRequest
            {
                WholesalerId = wholesalerId,
                RequestItems = requestedItems
            };

            var expectedErrorMessage = "The wholesaler does not exist";

            var mockedWholesalerQuery = new Mock <IWholesalerQuery>();

            mockedWholesalerQuery.Setup(query => query.GetWholesaler(It.IsAny <Guid>()))
            .ReturnsAsync((Wholesaler)null);

            var wholesalerValidation = new WholesalerValidation(mockedWholesalerQuery.Object);

            //Act
            var results = await wholesalerValidation.ValidateQuoteRequest(quoteRequest);

            //Assert
            Assert.Contains(results, result => result != null && result.ErrorMessage.Equals(expectedErrorMessage));
        }
        public async Task ValidateQuoteRequest_GivenAQuoteRequestWithoutWholesalerId_ShouldReturnAValidationResultWithExpectedErrorMessage()
        {
            //Arrange
            var wholesalerId = Guid.Empty;
            var itemId       = Guid.NewGuid();

            var requestedItems = new[]
            {
                new RequestItem {
                    ItemId = itemId, Quantity = 1
                }
            };

            var quoteRequest = new QuoteRequest
            {
                WholesalerId = wholesalerId,
                RequestItems = requestedItems
            };

            var expectedErrorMessage = "The wholesaler cannot be null or empty";


            var wholesalerValidation = new WholesalerValidation(null);

            //Act
            var results = await wholesalerValidation.ValidateQuoteRequest(quoteRequest);

            //Assert
            Assert.Contains(results, result => result != null && result.ErrorMessage.Equals(expectedErrorMessage));
        }
        public async Task ValidateStockItem_GivenAValidStockItem_ShouldReturnAllSuccessValidationResults()
        {
            //Arrange
            var guid = Guid.NewGuid();

            var stockItem = new StockItem
            {
                WholesalerId = guid,
                UnitPrice    = 1.0f,
                Quantity     = 10
            };

            var mockedWholesalerQuery = new Mock <IWholesalerQuery>();

            mockedWholesalerQuery.Setup(query => query.GetWholesaler(It.IsAny <Guid>()))
            .ReturnsAsync(new Wholesaler());

            var wholesalerValidation = new WholesalerValidation(mockedWholesalerQuery.Object);

            //Act
            var results = await wholesalerValidation.ValidateStockItem(stockItem);

            //Assert
            Assert.True(results.All(result => result == ValidationResult.Success));
        }
        public async Task ValidateQuoteRequest_GivenAQuoteRequestWithDuplicateElement_ShouldReturnAValidationResultWithExpectedErrorMessage()
        {
            //Arrange
            var wholesalerId = Guid.NewGuid();
            var itemId       = Guid.NewGuid();

            var requestedItems = new[]
            {
                new RequestItem {
                    ItemId = itemId, Quantity = 1
                },
                new RequestItem {
                    ItemId = itemId, Quantity = 1
                }
            };

            var wholesalerStock = new[]
            {
                new StockItem {
                    ItemId = itemId, Quantity = 1
                }
            };

            var quoteRequest = new QuoteRequest
            {
                WholesalerId = wholesalerId,
                RequestItems = requestedItems
            };

            var expectedErrorMessage = "All request items should be unique";

            var mockedWholesalerQuery = new Mock <IWholesalerQuery>();

            mockedWholesalerQuery.Setup(query => query.GetWholesaler(It.IsAny <Guid>()))
            .ReturnsAsync(new Wholesaler());
            mockedWholesalerQuery.Setup(query => query.GetWholesalerStock(It.IsAny <Guid>()))
            .ReturnsAsync(wholesalerStock);

            var wholesalerValidation = new WholesalerValidation(mockedWholesalerQuery.Object);

            //Act
            var results = await wholesalerValidation.ValidateQuoteRequest(quoteRequest);

            //Assert
            Assert.Contains(results, result => result != null && result.ErrorMessage.Equals(expectedErrorMessage));
        }
        public async Task ValidateQuoteRequest_GivenAQuoteRequestWithItemLargerQuantityThanSoldQuantity_ShouldReturnAValidationResultWithExpectedErrorMessage()
        {
            //Arrange
            var wholesalerId = Guid.NewGuid();
            var itemId       = Guid.NewGuid();

            var requestedItems = new[]
            {
                new RequestItem {
                    ItemId = itemId, Quantity = 2
                }
            };

            var wholesalerStock = new[]
            {
                new StockItem {
                    ItemId = itemId, Quantity = 1
                }
            };

            var quoteRequest = new QuoteRequest
            {
                WholesalerId = wholesalerId,
                RequestItems = requestedItems
            };

            var expectedErrorMessage = $"Requested quantity for item {itemId} is not available at this wholesaler";

            var mockedWholesalerQuery = new Mock <IWholesalerQuery>();

            mockedWholesalerQuery.Setup(query => query.GetWholesaler(It.IsAny <Guid>()))
            .ReturnsAsync(new Wholesaler());
            mockedWholesalerQuery.Setup(query => query.GetWholesalerStock(It.IsAny <Guid>()))
            .ReturnsAsync(wholesalerStock);

            var wholesalerValidation = new WholesalerValidation(mockedWholesalerQuery.Object);

            //Act
            var results = await wholesalerValidation.ValidateQuoteRequest(quoteRequest);

            //Assert
            Assert.Contains(results, result => result != null && result.ErrorMessage.Equals(expectedErrorMessage));
        }
        public async Task ValidateQuoteRequest_GivenAValidQuoteRequest_ShouldReturnAllSuccessValidationResults()
        {
            //Arrange
            var wholesalerId = Guid.NewGuid();
            var itemId       = Guid.NewGuid();

            var requestedItems = new[]
            {
                new RequestItem {
                    ItemId = itemId, Quantity = 1
                }
            };

            var wholesalerStock = new[]
            {
                new StockItem {
                    ItemId = itemId, Quantity = 1
                }
            };

            var quoteRequest = new QuoteRequest
            {
                WholesalerId = wholesalerId,
                RequestItems = requestedItems
            };

            var mockedWholesalerQuery = new Mock <IWholesalerQuery>();

            mockedWholesalerQuery.Setup(query => query.GetWholesaler(It.IsAny <Guid>()))
            .ReturnsAsync(new Wholesaler());
            mockedWholesalerQuery.Setup(query => query.GetWholesalerStock(It.IsAny <Guid>()))
            .ReturnsAsync(wholesalerStock);

            var wholesalerValidation = new WholesalerValidation(mockedWholesalerQuery.Object);

            //Act
            var results = await wholesalerValidation.ValidateQuoteRequest(quoteRequest);

            //Assert
            Assert.True(results.All(result => result == ValidationResult.Success));
        }
        public async Task ValidateStockItem_GivenAStockItemWithAnEmptyWholesalerId_ShouldReturAValidationResultWithExpectedMessage()
        {
            //Arrange
            var guid = Guid.NewGuid();

            var stockItem = new StockItem
            {
                WholesalerId = Guid.Empty,
                UnitPrice    = 1.0f,
                Quantity     = 10
            };

            var expectedMessage = "The wholesaler cannot be null or empty";

            var wholesalerValidation = new WholesalerValidation(null);

            //Act
            var results = await wholesalerValidation.ValidateStockItem(stockItem);

            //Assert
            Assert.Contains(results, result => result != null && result.ErrorMessage.Equals(expectedMessage));
        }