예제 #1
0
        public IActionResult AddNewTaxCalculation(CalculateTaxModel calculateTaxCommand)
        {
            var entity = new CalculatedTaxEntity(calculateTaxCommand.PostalCode, calculateTaxCommand.AnnualIncome);

            calculationService.CalculateTax(entity);
            return(Ok());
        }
        private static CalculatedTaxEntity CalulateTaxAnPopulateEntity(CalculatedTaxEntity calculatedTaxEntity, ITaxTypeCalculator taxTypeCalculator)
        {
            var calculatedTaxAmount = taxTypeCalculator.CalulateTax(calculatedTaxEntity.AnnualIncome);

            calculatedTaxEntity.CalculatedTaxAmount = calculatedTaxAmount;
            return(calculatedTaxEntity);
        }
        private CalculatedTaxEntity PersistCalculatedTax(CalculatedTaxEntity calculatedTaxEntity)
        {
            var savedEntity = calculatedTaxRepostiory.Add(calculatedTaxEntity);

            calculatedTaxRepostiory.SaveChanges();
            return(savedEntity);
        }
        public Guid CalculateTax(CalculatedTaxEntity calculatedTaxEntity)
        {
            ValidateEntityIntegrity(calculatedTaxEntity);
            var taxTypeCalculator = TaxTypeCalculator(calculatedTaxEntity, taxTypeCalculatorStrategy);
            var savedEntity       = PersistCalculatedTax(CalulateTaxAnPopulateEntity(calculatedTaxEntity, taxTypeCalculator));

            return(savedEntity.Id);
        }
        private static ITaxTypeCalculator TaxTypeCalculator(CalculatedTaxEntity calculatedTaxEntity, Func <string, ITaxTypeCalculator> taxTypeCalculatorStrategy)
        {
            var taxTypeCalculator = taxTypeCalculatorStrategy.Invoke(calculatedTaxEntity.PostalCode);

            if (taxTypeCalculator == null)
            {
                throw new ValidationException($"The postal code of {calculatedTaxEntity.PostalCode} is not known.");
            }

            return(taxTypeCalculator);
        }
        private static void ValidateEntityIntegrity(CalculatedTaxEntity calculatedTaxEntity)
        {
            if (calculatedTaxEntity.AnnualIncome < 0)
            {
                throw new ValidationException("Annaul Income cannot be less than 0");
            }

            if (string.IsNullOrWhiteSpace(calculatedTaxEntity.PostalCode))
            {
                throw new ValidationException("Postal Code Cannot be empty");
            }
        }
예제 #7
0
        public void ShouldCalculateTaxAndPerist()
        {
            var calculatedTaxEntity = new CalculatedTaxEntity("PostalCode", 5m);
            var calculatedTax       = fixture.Create <decimal>();

            mocktaxTypeCalculatorStrategy.Setup(x => x.Invoke(It.IsAny <string>())).Returns(mockTaxTypeCalculator.Object);
            mockTaxTypeCalculator.Setup(x => x.CalulateTax(It.IsAny <decimal>())).Returns(calculatedTax);
            mockCalculatedTaxRepostiory.Setup(x => x.Add(It.IsAny <CalculatedTaxEntity>())).Returns(calculatedTaxEntity);

            taxCalculationService = new TaxCalculationService(mocktaxTypeCalculatorStrategy.Object, mockCalculatedTaxRepostiory.Object);
            taxCalculationService.CalculateTax(calculatedTaxEntity);

            mockCalculatedTaxRepostiory.Verify(x => x.Add(It.Is <CalculatedTaxEntity>(y => y.CalculatedTaxAmount == calculatedTax)), Times.Once);
        }