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"); } }
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); }