Initial
This commit is contained in:
1
TaxCalculator.UnitTests/GlobalUsings.cs
Normal file
1
TaxCalculator.UnitTests/GlobalUsings.cs
Normal file
@@ -0,0 +1 @@
|
||||
global using Xunit;
|
||||
52
TaxCalculator.UnitTests/SalaryServiceTests.cs
Normal file
52
TaxCalculator.UnitTests/SalaryServiceTests.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
30
TaxCalculator.UnitTests/TaxCalculator.UnitTests.csproj
Normal file
30
TaxCalculator.UnitTests/TaxCalculator.UnitTests.csproj
Normal 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>
|
||||
46
TaxCalculator.UnitTests/TaxCalculatorServiceTests.cs
Normal file
46
TaxCalculator.UnitTests/TaxCalculatorServiceTests.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user