public async Task <ActionResult <TaxCalculationResponseModel> > Calculate(TaxCalculationRequestModel model) { if (!ModelState.IsValid) { return(BadRequest()); } var result = await _calculatorManager.CalculateTax(new TaxCalculationRequest { AnnualIncome = model.AnnualIncome, PostalCode = model.PostalCode, RequestedBy = Guid.NewGuid()// to be set when authentication is available }).ConfigureAwait(false); if (result.HasErrors) { ModelState.AddErrors(result.GetErrorMessages()); return(BadRequest(ModelState)); } var responseModel = new TaxCalculationResponseModel { CalculationType = result.Response.CalculationType.GetDescription(), TaxAmount = result.Response.TaxAmount, TaxYear = result.Response.TaxYear }; return(Ok(responseModel)); }
public async Task Calculate_Should_Calculate() { //Arrange const decimal annualIncome = 250000; const string postalCode = "1234"; const string expectedTaxYear = "Tax Year"; const decimal expectedTaxAmount = 234.56M; const TaxCalculationType expectedCalculationType = TaxCalculationType.PROGRESSIVE_TAX; string expectedCalculationTypeDescription = expectedCalculationType.GetDescription(); TaxCalculationRequestModel model = new TaxCalculationRequestModel { AnnualIncome = annualIncome, PostalCode = postalCode }; TaxCalculationRequest actualManagerRequest = null; TaxCalculationResponse managerResponse = new TaxCalculationResponse { CalculationType = expectedCalculationType, TaxAmount = expectedTaxAmount, TaxYear = expectedTaxYear }; _manager.Setup(r => r.CalculateTax(It.IsAny <TaxCalculationRequest>())) .Callback((TaxCalculationRequest r) => actualManagerRequest = r) .ReturnsAsync(() => new OperationResult <TaxCalculationResponse>(managerResponse)); //Act var result = await _controller.Calculate(model); //Assert Assert.IsInstanceOf <OkObjectResult>(result.Result); TaxCalculationResponseModel responseMode = (TaxCalculationResponseModel)((OkObjectResult)result.Result).Value; Assert.AreEqual(expectedCalculationTypeDescription, responseMode.CalculationType); Assert.AreEqual(expectedTaxYear, responseMode.TaxYear); Assert.AreEqual(expectedTaxAmount, responseMode.TaxAmount); _manager.Verify(f => f.CalculateTax(It.IsAny <TaxCalculationRequest>()), Times.Once); Assert.AreEqual(annualIncome, actualManagerRequest.AnnualIncome); Assert.AreEqual(postalCode, actualManagerRequest.PostalCode); }