package dev.lions.unionflow.server.messaging; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import io.quarkus.test.junit.QuarkusTest; import jakarta.inject.Inject; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * Tests d'intégration pour KafkaEventProducer. * *

Utilise le connecteur in-memory SmallRye (configuré dans application-test.properties) * pour éviter toute dépendance à un broker Kafka réel. * Vérifie que chaque méthode de publication ne lève pas d'exception. * * @author UnionFlow Team */ @QuarkusTest @DisplayName("KafkaEventProducer") class KafkaEventProducerTest { @Inject KafkaEventProducer kafkaEventProducer; private static final UUID APPROVAL_ID = UUID.randomUUID(); private static final UUID MEMBER_ID = UUID.randomUUID(); private static final UUID CONTRIBUTION_ID = UUID.randomUUID(); private static final String ORG_ID = UUID.randomUUID().toString(); private static final String USER_ID = UUID.randomUUID().toString(); private Map sampleData() { Map data = new HashMap<>(); data.put("montant", 150000); data.put("devise", "XOF"); data.put("statut", "EN_ATTENTE"); return data; } // ========================================================================= // Injection // ========================================================================= @Test @DisplayName("KafkaEventProducer est injectable et non null") void producerIsInjected() { assertThat(kafkaEventProducer).isNotNull(); } // ========================================================================= // Finance approvals // ========================================================================= @Test @DisplayName("publishApprovalPending - ne leve pas d'exception") void publishApprovalPending_sansException() { assertThatCode(() -> kafkaEventProducer.publishApprovalPending(APPROVAL_ID, ORG_ID, sampleData()) ).doesNotThrowAnyException(); } @Test @DisplayName("publishApprovalPending - data null - ne leve pas d'exception") void publishApprovalPending_dataNul_sansException() { assertThatCode(() -> kafkaEventProducer.publishApprovalPending(APPROVAL_ID, ORG_ID, null) ).doesNotThrowAnyException(); } @Test @DisplayName("publishApprovalApproved - ne leve pas d'exception") void publishApprovalApproved_sansException() { Map data = sampleData(); data.put("approbateur", "admin@test.com"); assertThatCode(() -> kafkaEventProducer.publishApprovalApproved(APPROVAL_ID, ORG_ID, data) ).doesNotThrowAnyException(); } @Test @DisplayName("publishApprovalRejected - ne leve pas d'exception") void publishApprovalRejected_sansException() { Map data = sampleData(); data.put("motif", "Documents manquants"); assertThatCode(() -> kafkaEventProducer.publishApprovalRejected(APPROVAL_ID, ORG_ID, data) ).doesNotThrowAnyException(); } @Test @DisplayName("publishApprovalRejected - organizationId null - ne leve pas d'exception") void publishApprovalRejected_organizationIdNull_sansException() { assertThatCode(() -> kafkaEventProducer.publishApprovalRejected(APPROVAL_ID, null, sampleData()) ).doesNotThrowAnyException(); } // ========================================================================= // Dashboard stats // ========================================================================= @Test @DisplayName("publishDashboardStatsUpdate - ne leve pas d'exception") void publishDashboardStatsUpdate_sansException() { Map stats = new HashMap<>(); stats.put("totalMembres", 250); stats.put("totalCotisations", 12500000); stats.put("tauxRecouvrement", 0.85); assertThatCode(() -> kafkaEventProducer.publishDashboardStatsUpdate(ORG_ID, stats) ).doesNotThrowAnyException(); } @Test @DisplayName("publishKpiUpdate - ne leve pas d'exception") void publishKpiUpdate_sansException() { Map kpiData = new HashMap<>(); kpiData.put("kpi", "TAUX_ADHESION"); kpiData.put("valeur", 0.92); assertThatCode(() -> kafkaEventProducer.publishKpiUpdate(ORG_ID, kpiData) ).doesNotThrowAnyException(); } @Test @DisplayName("publishKpiUpdate - data vide - ne leve pas d'exception") void publishKpiUpdate_dataVide_sansException() { assertThatCode(() -> kafkaEventProducer.publishKpiUpdate(ORG_ID, new HashMap<>()) ).doesNotThrowAnyException(); } // ========================================================================= // Notifications // ========================================================================= @Test @DisplayName("publishUserNotification - ne leve pas d'exception") void publishUserNotification_sansException() { Map notif = new HashMap<>(); notif.put("titre", "Paiement recu"); notif.put("message", "Votre cotisation de 5000 XOF a ete enregistree."); notif.put("type", "COTISATION"); assertThatCode(() -> kafkaEventProducer.publishUserNotification(USER_ID, notif) ).doesNotThrowAnyException(); } @Test @DisplayName("publishUserNotification - payload minimal - ne leve pas d'exception") void publishUserNotification_payloadMinimal_sansException() { Map notif = new HashMap<>(); notif.put("message", "Test"); assertThatCode(() -> kafkaEventProducer.publishUserNotification(USER_ID, notif) ).doesNotThrowAnyException(); } @Test @DisplayName("publishBroadcastNotification - ne leve pas d'exception") void publishBroadcastNotification_sansException() { Map notif = new HashMap<>(); notif.put("titre", "Reunion annuelle"); notif.put("message", "La reunion annuelle est prevue le 15 mars 2026"); notif.put("type", "EVENEMENT"); assertThatCode(() -> kafkaEventProducer.publishBroadcastNotification(ORG_ID, notif) ).doesNotThrowAnyException(); } // ========================================================================= // Members events // ========================================================================= @Test @DisplayName("publishMemberCreated - ne leve pas d'exception") void publishMemberCreated_sansException() { Map memberData = new HashMap<>(); memberData.put("nom", "Diallo"); memberData.put("prenom", "Amadou"); memberData.put("email", "amadou.diallo@test.com"); assertThatCode(() -> kafkaEventProducer.publishMemberCreated(MEMBER_ID, ORG_ID, memberData) ).doesNotThrowAnyException(); } @Test @DisplayName("publishMemberUpdated - ne leve pas d'exception") void publishMemberUpdated_sansException() { Map memberData = new HashMap<>(); memberData.put("telephone", "+2250700000001"); assertThatCode(() -> kafkaEventProducer.publishMemberUpdated(MEMBER_ID, ORG_ID, memberData) ).doesNotThrowAnyException(); } @Test @DisplayName("publishMemberUpdated - organizationId null - ne leve pas d'exception") void publishMemberUpdated_organizationIdNull_sansException() { assertThatCode(() -> kafkaEventProducer.publishMemberUpdated(MEMBER_ID, null, sampleData()) ).doesNotThrowAnyException(); } // ========================================================================= // Contributions events // ========================================================================= @Test @DisplayName("publishContributionPaid - ne leve pas d'exception") void publishContributionPaid_sansException() { Map contributionData = new HashMap<>(); contributionData.put("montant", 5000); contributionData.put("devise", "XOF"); contributionData.put("periode", "2026-03"); assertThatCode(() -> kafkaEventProducer.publishContributionPaid(CONTRIBUTION_ID, ORG_ID, contributionData) ).doesNotThrowAnyException(); } @Test @DisplayName("publishContributionPaid - data null - ne leve pas d'exception") void publishContributionPaid_dataNul_sansException() { assertThatCode(() -> kafkaEventProducer.publishContributionPaid(CONTRIBUTION_ID, ORG_ID, null) ).doesNotThrowAnyException(); } }