コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
    }
}
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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.
        }
コード例 #9
0
 public TaxCalculatorControllerTests()
 {
     _mockTaxCalculatorService = new Mock <ITaxCalculatorService>();
     _sut = new TaxCalculatorController(_mockTaxCalculatorService.Object);
 }
コード例 #10
0
        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);
        }
コード例 #11
0
 public void SetUp()
 {
     _manager    = new Mock <ITaxCalculatorManager>();
     _controller = new TaxCalculatorController(_manager.Object);
 }