public async Task CalculateTaxAsync_WhenValidPostalCode_ShouldUseCorrectTaxCalculator(TaxType taxType, decimal annualIncome, string postalCode) { // Arrange var loggerMock = Substitute.For <ILogger <TaxCalculatorController> >(); var factory = TestHelper.GetTaxRateCalculatorFactorySubstitude(annualIncome); var taxQueryServiceSubstitude = Substitute.For <ITaxQueryService>(); taxQueryServiceSubstitude.GetTaxCalculationTypeByPostalCodeAsync(Arg.Any <string>()).Returns(Task.FromResult(taxType)); var taxCommandServiceSubstitude = Substitute.For <ITaxCommandService>(); var controller = new TaxCalculatorController(loggerMock, factory, taxQueryServiceSubstitude, taxCommandServiceSubstitude); var request = new TaxCalculationRequest { PostalCode = postalCode, AnnualIncome = annualIncome, }; // Act var response = await controller.CalculateTaxAsync(request); // Assert var okResult = response as OkObjectResult; factory.Received(1)(Arg.Is <TaxType>(value => value == taxType)); okResult.ShouldNotBeNull(); okResult.StatusCode.ShouldBe(200); okResult.Value.ShouldBeOfType <ApiResponse <TaxCalculationResponse> >(); var okResultObj = okResult.Value as ApiResponse <TaxCalculationResponse>; okResultObj.Payload.TaxAmountPayable.ShouldBe(annualIncome); }
public async Task TaxCalculatorController_SelfEmployedCalculatorEnum_ReturnsOkResponse() { var loggerMock = Substitute.For <ILogger <TaxCalculatorController> >(); var selfEmployedLoggerMock = Substitute.For <ILogger <SelfEmployedTaxCalculator> >(); var factoryMock = Substitute.For <ITaxCalculatorFactory>(); var calculatorClientMock = Substitute.For <ICalculatorClient>(); calculatorClientMock.Add(Arg.Is(9), Arg.Is(9)).Returns(18); factoryMock.CreateTaxCalculator(Arg.Is <Enums.Calculator>(x => x == Enums.Calculator.SelfEmployed)) .Returns(new SelfEmployedTaxCalculator(selfEmployedLoggerMock, calculatorClientMock)); var sut = new TaxCalculatorController(loggerMock, factoryMock); var result = await sut.GetTaxCalculation(new TaxCalculationDto { CalculationType = Enums.Calculator.SelfEmployed }); var okResult = result as OkObjectResult; Assert.IsNotNull(okResult); Assert.That(okResult.StatusCode, Is.EqualTo(200)); var taxCalculationSummary = (okResult.Value as TaxCalculationSummary); Assert.That(taxCalculationSummary.CalculatorName, Is.EqualTo(nameof(SelfEmployedTaxCalculator))); Assert.That(taxCalculationSummary.TotalTax, Is.EqualTo(18)); loggerMock.Received(1); calculatorClientMock.Received(1); }
async Task Controller_returns_BadRequest_when_LineItems_Empty() { // Arrange var taxCalculatorMock = new Mock <ITaxCalculator>(); var loggerMock = new Mock <ILogger <TaxCalculatorController> >(); OrderTax orderTax = new() { OrderId = "1", CustomerId = "1", TaxCalculatorId = "TAXJAR", AmountToCollect = 1.50m, FreightTaxable = false, OrderTotalAmount = 16.5m, Shipping = 1.5m, TaxableAmount = 15.0m }; taxCalculatorMock.Setup(tx => tx.GetSalesTax(It.IsAny <Order>())).ReturnsAsync(orderTax); var taxCalculatorProviderMock = new Mock <ITaxCalculatorProvider>(); taxCalculatorProviderMock.Setup(tp => tp.GetTaxCalculator(It.IsAny <string>())).Returns(taxCalculatorMock.Object); var controller = new TaxCalculatorController(taxCalculatorProviderMock.Object, loggerMock.Object); // Order without LineItems var order = new Order { Id = "1", CustomerId = "1", TaxCalculatorId = "TAXJAR", Shipping = 1.5m, AddressFrom = new() { CountryCode = "US", StateCode = "FL", Zip = "33029" }, AddressTo = new() { CountryCode = "US", StateCode = "FL", Zip = "33174" }, LineItems = new() { } }; // Act ActionResult <OrderTax> response = await controller.GetTaxes(order); // Assert BadRequestObjectResult result = response.Result as BadRequestObjectResult; Assert.NotNull(result); Assert.Equal(400, result.StatusCode); Assert.Contains("Orders must contain at least one LineItem", (string)result.Value); } } }
async Task Controller_returns_the_right_TaxRates() { // Arrange var loggerMock = new Mock <ILogger <TaxCalculatorController> >(); var taxCalculatorMock = new Mock <ITaxCalculator>(); TaxRates taxRates = new() { Location = new Location { Zip = "33029", City = "Hollywood", CountryCode = "US", State = "FL", County = "BROWARD" }, CityRate = 0m, CountryRate = 0m, StateRate = 0.06m, CountyRate = 0.01m, CombinedDistrictRate = 0m, CombinedRate = 0.07m, FreightTaxable = false }; taxCalculatorMock.Setup(tx => tx.GetTaxRates(It.IsAny <Location>())).ReturnsAsync(taxRates); var taxCalculatorProviderMock = new Mock <ITaxCalculatorProvider>(); taxCalculatorProviderMock.Setup(tp => tp.GetTaxCalculator(It.IsAny <string>())).Returns(taxCalculatorMock.Object); var controller = new TaxCalculatorController(taxCalculatorProviderMock.Object, loggerMock.Object); // Act ActionResult <TaxRates> response = await controller.GetTaxRates("33029", null); // Assert OkObjectResult result = response.Result as OkObjectResult; Assert.NotNull(result); TaxRates tr = Assert.IsAssignableFrom <TaxRates>(result.Value); Assert.IsType <ActionResult <TaxRates> >(response); Assert.Equal(taxRates.CombinedRate, tr.CombinedRate); Assert.Equal(taxRates.Location.City, tr.Location.City); Assert.Equal(taxRates.CityRate, tr.CityRate); Assert.Equal(taxRates.CombinedDistrictRate, tr.CombinedDistrictRate); Assert.Equal(taxRates.Location.Country, tr.Location.Country); Assert.Equal(taxRates.CountryRate, tr.CountryRate); Assert.Equal(taxRates.Location.County, tr.Location.County); Assert.Equal(taxRates.CountyRate, tr.CountyRate); Assert.Equal(taxRates.FreightTaxable, tr.FreightTaxable); Assert.Equal(taxRates.Location.State, tr.Location.State); Assert.Equal(taxRates.StateRate, tr.StateRate); Assert.Equal(taxRates.Location.Zip, tr.Location.Zip); }
public void CalculateTax() { var controller = new TaxCalculatorController(); var result = controller.CalculateTax(new TaxCalculatorController.TaxQuery { Code = "7441", Income = 8351 }); Assert.IsNotNull(result); Assert.AreEqual(1252.65M, result); Assert.AreNotEqual(0M, result); }
public TaxCalculatorApiControllerTests() { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var mockLogger = new Mock <ILogger <TaxCalculatorController> >(); ILogger <TaxCalculatorController> logger = mockLogger.Object; _controller = new TaxCalculatorController(config, logger); }
public TaxServiceControllerTests() { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var mockLogger = new Mock <ILogger <TaxCalculatorController> >(); ILogger <TaxCalculatorController> logger = mockLogger.Object; //TODO Change to moq. ITaxService[] taxService = new ITaxService[0]; TaxStrategy taxStrategy = new TaxStrategy(taxService); _controller = new TaxCalculatorController(logger, config, taxStrategy); }
public TaxCalculatorControllerTests() { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var mockLogger = new Mock <ILogger <TaxCalculatorController> >(); ILogger <TaxCalculatorController> logger = mockLogger.Object; _controller = new TaxCalculatorController(config, logger); var taxRateLocation = new TaxRateLocation() { Zip = "90404", State = "CA" }; var mockTaxCalculatorService = new Mock <ITaxCalculatorService>(logger); mockTaxCalculatorService.Setup(svc => svc.GetRateByLocation("90404")).Returns(Task.FromResult(taxRateLocation)); // TODO: refactor the controller to DI TaxCalculatorService. }
public TaxCalculatorControllerTests() { _mockTaxCalculatorService = new Mock <ITaxCalculatorService>(); _sut = new TaxCalculatorController(_mockTaxCalculatorService.Object); }
async Task Controller_returns_the_right_SalesTaxForOrder() { // Arrange var taxCalculatorMock = new Mock <ITaxCalculator>(); var loggerMock = new Mock <ILogger <TaxCalculatorController> >(); OrderTax orderTax = new() { OrderId = "1", CustomerId = "1", TaxCalculatorId = "TAXJAR", AmountToCollect = 1.50m, FreightTaxable = false, OrderTotalAmount = 16.5m, Shipping = 1.5m, TaxableAmount = 15.0m }; taxCalculatorMock.Setup(tx => tx.GetSalesTax(It.IsAny <Order>())).ReturnsAsync(orderTax); var taxCalculatorProviderMock = new Mock <ITaxCalculatorProvider>(); taxCalculatorProviderMock.Setup(tp => tp.GetTaxCalculator(It.IsAny <string>())).Returns(taxCalculatorMock.Object); var controller = new TaxCalculatorController(taxCalculatorProviderMock.Object, loggerMock.Object); // Minimal Order To Pass Validation var order = new Order { Id = "1", CustomerId = "1", TaxCalculatorId = "TAXJAR", Shipping = 1.5m, AddressFrom = new() { CountryCode = "US", StateCode = "FL", Zip = "33029" }, AddressTo = new() { CountryCode = "US", StateCode = "FL", Zip = "33174" }, LineItems = new() { new() { Id = "abc", ProductTaxCode = "1111", Quantity = 10, UnitPrice = 1.5m, Discount = 0 } } }; // Act ActionResult <OrderTax> response = await controller.GetTaxes(order); // Assert OkObjectResult result = response.Result as OkObjectResult; Assert.NotNull(result); OrderTax tax = Assert.IsAssignableFrom <OrderTax>(result.Value); Assert.Equal(orderTax.OrderId, tax.OrderId); Assert.Equal(orderTax.CustomerId, tax.CustomerId); Assert.Equal(orderTax.AmountToCollect, tax.AmountToCollect); Assert.Equal(orderTax.FreightTaxable, tax.FreightTaxable); Assert.Equal(orderTax.OrderTotalAmount, tax.OrderTotalAmount); Assert.Equal(orderTax.Shipping, tax.Shipping); Assert.Equal(orderTax.TaxableAmount, tax.TaxableAmount); }
public void SetUp() { _manager = new Mock <ITaxCalculatorManager>(); _controller = new TaxCalculatorController(_manager.Object); }