package dev.lions.compliance; import io.quarkus.test.junit.QuarkusTest; import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeEach; import static org.junit.jupiter.api.Assertions.*; @QuarkusTest public class IvorianTaxServiceTest { @Inject IvorianTaxService taxService; @Test void testCalculateTVAStandard() { double amountHT = 1000000.0; // 1M FCFA TaxCalculation result = taxService.calculateTVA(amountHT, false); assertNotNull(result); assertEquals(amountHT, result.getAmountHT()); assertEquals(18.0, result.getTaxRate()); // Taux standard 18% assertEquals(180000.0, result.getTaxAmount(), 0.01); // 18% de 1M assertEquals(1180000.0, result.getAmountTTC(), 0.01); // HT + TVA assertEquals("TVA", result.getTaxType()); } @Test void testCalculateTVAReduced() { double amountHT = 1000000.0; // 1M FCFA TaxCalculation result = taxService.calculateTVA(amountHT, true); assertNotNull(result); assertEquals(amountHT, result.getAmountHT()); assertEquals(9.0, result.getTaxRate()); // Taux réduit 9% assertEquals(90000.0, result.getTaxAmount(), 0.01); // 9% de 1M assertEquals(1090000.0, result.getAmountTTC(), 0.01); // HT + TVA assertEquals("TVA", result.getTaxType()); } @Test void testCalculateISStandard() { double profit = 10000000.0; // 10M FCFA TaxCalculation result = taxService.calculateIS(profit, false); assertNotNull(result); assertEquals(25.0, result.getTaxRate()); // Taux standard 25% assertEquals(2500000.0, result.getTaxAmount(), 0.01); // 25% de 10M assertEquals("IS", result.getTaxType()); } @Test void testCalculateISPME() { double profit = 10000000.0; // 10M FCFA TaxCalculation result = taxService.calculateIS(profit, true); assertNotNull(result); assertEquals(20.0, result.getTaxRate()); // Taux PME 20% assertEquals(2000000.0, result.getTaxAmount(), 0.01); // 20% de 10M assertEquals("IS", result.getTaxType()); } @Test void testTaxRateConstants() { // Vérifier les constantes de taux assertEquals(18.0, IvorianTaxService.TVA_RATE); assertEquals(9.0, IvorianTaxService.TVA_REDUCED_RATE); assertEquals(25.0, IvorianTaxService.IS_RATE); assertEquals(20.0, IvorianTaxService.IS_REDUCED_RATE); assertEquals(200_000_000.0, IvorianTaxService.PME_TURNOVER_THRESHOLD); } @Test void testZeroAmounts() { // Test avec montant zéro TaxCalculation tvaResult = taxService.calculateTVA(0.0, false); assertEquals(0.0, tvaResult.getTaxAmount()); assertEquals(0.0, tvaResult.getAmountTTC()); TaxCalculation isResult = taxService.calculateIS(0.0, false); assertEquals(0.0, isResult.getTaxAmount()); } @Test void testLargeAmounts() { // Test avec gros montants double largeAmount = 1_000_000_000.0; // 1 milliard FCFA TaxCalculation tvaResult = taxService.calculateTVA(largeAmount, false); assertEquals(180_000_000.0, tvaResult.getTaxAmount(), 0.01); // 18% de 1B TaxCalculation isResult = taxService.calculateIS(largeAmount, false); assertEquals(250_000_000.0, isResult.getTaxAmount(), 0.01); // 25% de 1B } @Test void testNegativeAmounts() { // Les montants négatifs devraient être traités correctement TaxCalculation tvaResult = taxService.calculateTVA(-1000000.0, false); assertTrue(tvaResult.getTaxAmount() <= 0); // TVA négative ou nulle TaxCalculation isResult = taxService.calculateIS(-1000000.0, false); assertTrue(isResult.getTaxAmount() <= 0); // IS négative ou nulle } @Test void testPMEThreshold() { // Vérifier le seuil PME double threshold = IvorianTaxService.PME_TURNOVER_THRESHOLD; assertEquals(200_000_000.0, threshold); // 200M FCFA // Test avec montant juste en dessous du seuil PME double belowThreshold = threshold - 1000000.0; TaxCalculation pmeResult = taxService.calculateIS(belowThreshold * 0.1, true); // 10% de marge assertEquals(20.0, pmeResult.getTaxRate()); // Taux PME // Test avec montant au-dessus du seuil double aboveThreshold = threshold + 1000000.0; TaxCalculation standardResult = taxService.calculateIS(aboveThreshold * 0.1, false); // 10% de marge assertEquals(25.0, standardResult.getTaxRate()); // Taux standard } }