tax-calculator/TaxCalculator.UnitTests/SalaryServiceTests.cs
2023-11-27 06:56:03 +02:00

52 lines
2.1 KiB
C#

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);
}
}
}