This commit is contained in:
2023-11-27 06:56:03 +02:00
commit 343564fcc0
236 changed files with 101156 additions and 0 deletions

View File

@@ -0,0 +1 @@
global using Xunit;

View File

@@ -0,0 +1,52 @@
using Moq;
using TaxCalculator.Api.Services;
namespace TaxCalculator.UnitTests
{
public class SalaryServiceTests
{
[Theory]
[InlineData(10000, 833.33, 9000, 750, 1000.00, 83.33)]
[InlineData(40000, 3333.33, 29000, 2416.67, 11000.00, 916.67)]
public async Task CalculateSalaryDetails_ReturnsCorrectResult(
int grossAnnualSalary, decimal grossMonthlySalary, decimal netAnnualSalary, decimal netMonthlySalary,
decimal annualTaxPaid, decimal monthlyTaxPaid)
{
// Arrange
var taxCalculatorMock = new Mock<ITaxCalculatorService>();
taxCalculatorMock.Setup(tc => tc.CalculateTax(It.IsAny<int>()))
.Returns(Task.FromResult(annualTaxPaid));
var salaryService = new SalaryService(taxCalculatorMock.Object);
// Act
var result = await salaryService.CalculateSalaryDetails(grossAnnualSalary);
// Assert
Assert.NotNull(result);
Assert.Equal(grossAnnualSalary, result.GrossAnnualSalary);
Assert.Equal(grossMonthlySalary, result.GrossMonthlySalary);
Assert.Equal(netAnnualSalary, result.NetAnnualSalary);
Assert.Equal(netMonthlySalary, result.NetMonthlySalary);
Assert.Equal(annualTaxPaid, result.AnnualTaxPaid);
Assert.Equal(monthlyTaxPaid, result.MonthlyTaxPaid);
}
[Fact]
public async Task CalculateSalaryDetails_ThrowsException_ForNegativeSalary()
{
// Arrange
var taxCalculatorMock = new Mock<ITaxCalculatorService>();
taxCalculatorMock.Setup(tc => tc.CalculateTax(It.IsAny<int>())).Returns(Task.FromResult((decimal)0));
var salaryService = new SalaryService(taxCalculatorMock.Object);
var negativeSalary = -5000;
// Act & Assert
var exception =
await Assert.ThrowsAsync<ArgumentException>(async () => await salaryService.CalculateSalaryDetails(negativeSalary));
Assert.Equal("Gross annual salary must be non-negative.", exception.Message);
}
}
}

View File

@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="Moq" Version="4.20.69" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TaxCalculator.Api\TaxCalculator.Api.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,46 @@
namespace TaxCalculator.UnitTests
{
using DAL;
using Domain;
using Moq;
using TaxCalculator.Api.Services;
public class TaxCalculatorServiceTests
{
[Theory]
[InlineData(5000, 0, 0)] // Example test case for Band A
[InlineData(15000, 20, 3000)] // Example test case for Band B
[InlineData(30000, 40, 12000)] // Example test case for Band C
// Add more test cases as needed
public async Task CalculateTax_ReturnsCorrectResult(
int annualSalary, int taxRate, int expectedTax)
{
// Arrange
var taxBandRepositoryMock = new Mock<ITaxBandRepository>();
taxBandRepositoryMock.Setup(repo => repo.GetTaxBands()).Returns(Task.FromResult(new List<TaxBand>
{
new TaxBand { LowerLimit = 0, UpperLimit = null, TaxRate = taxRate }
}));
var taxCalculator = new TaxCalculatorService(taxBandRepositoryMock.Object);
// Act
var result = await taxCalculator.CalculateTax(annualSalary);
// Assert
Assert.Equal(expectedTax, result);
}
[Fact]
public async Task CalculateTax_ThrowsException_ForNegativeSalary()
{
// Arrange
var taxBandRepositoryMock = new Mock<ITaxBandRepository>();
var taxCalculator = new TaxCalculatorService(taxBandRepositoryMock.Object);
// Act & Assert
var exception = await Assert.ThrowsAsync<ArgumentException>(async () => await taxCalculator.CalculateTax(-5000));
Assert.Equal("Gross annual salary must be non-negative.", exception.Message);
}
}
}