chore: pom.xml + application.properties + tests + gitignore
- pom.xml : mise à jour dépendances - application.properties : ajustements config - MembreServiceTest, EntityCoverageTest : tests mis à jour pour nouveautés - .gitignore : ajout du.exe.stackdump (dump Windows bash)
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -120,3 +120,5 @@ uploads/
|
|||||||
|
|
||||||
# Claude Code agent worktrees
|
# Claude Code agent worktrees
|
||||||
.claude/
|
.claude/
|
||||||
|
du.exe.stackdump
|
||||||
|
du.exe.stackdump
|
||||||
|
|||||||
4
pom.xml
4
pom.xml
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>dev.lions.unionflow</groupId>
|
<groupId>dev.lions.unionflow</groupId>
|
||||||
<artifactId>unionflow-parent</artifactId>
|
<artifactId>unionflow-parent</artifactId>
|
||||||
<version>1.0.4</version>
|
<version>1.0.5</version>
|
||||||
<relativePath>../unionflow-server-api/parent-pom.xml</relativePath>
|
<relativePath>../unionflow-server-api/parent-pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>dev.lions.unionflow</groupId>
|
<groupId>dev.lions.unionflow</groupId>
|
||||||
<artifactId>unionflow-server-api</artifactId>
|
<artifactId>unionflow-server-api</artifactId>
|
||||||
<version>1.0.4</version>
|
<version>1.0.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Lions User Manager API (pour DTOs et client Keycloak) -->
|
<!-- Lions User Manager API (pour DTOs et client Keycloak) -->
|
||||||
|
|||||||
@@ -9,6 +9,19 @@ quarkus.application.version=1.0.0
|
|||||||
# Backup configuration
|
# Backup configuration
|
||||||
unionflow.backup.directory=${BACKUP_DIR:/tmp/unionflow-backups}
|
unionflow.backup.directory=${BACKUP_DIR:/tmp/unionflow-backups}
|
||||||
|
|
||||||
|
# Keycloak Admin API (pour la déconnexion globale des sessions)
|
||||||
|
keycloak.admin.url=${KEYCLOAK_URL:http://localhost:8180}
|
||||||
|
keycloak.admin.username=${KEYCLOAK_ADMIN_USERNAME:admin}
|
||||||
|
keycloak.admin.password=${KEYCLOAK_ADMIN_PASSWORD:admin}
|
||||||
|
keycloak.admin.realm=${KEYCLOAK_REALM:unionflow}
|
||||||
|
|
||||||
|
# Vérification des mises à jour disponibles (propriété optionnelle — Optional<String> côté Java)
|
||||||
|
# Absent par défaut : le check distant est désactivé, la version courante est retournée honnêtement.
|
||||||
|
# Pour activer : définir UNIONFLOW_UPDATES_CHECK_URL (convention MicroProfile env var) ou
|
||||||
|
# ajouter la ligne suivante dans application-prod.properties :
|
||||||
|
# unionflow.updates.check-url=https://releases.lions.dev/unionflow/latest.json
|
||||||
|
# L'endpoint doit retourner un JSON {"version": "x.y.z"}
|
||||||
|
|
||||||
# Jackson — sérialisation des dates en ISO string (pas en tableau [year, month, day])
|
# Jackson — sérialisation des dates en ISO string (pas en tableau [year, month, day])
|
||||||
quarkus.jackson.write-dates-as-timestamps=false
|
quarkus.jackson.write-dates-as-timestamps=false
|
||||||
quarkus.jackson.serialization-inclusion=non_null
|
quarkus.jackson.serialization-inclusion=non_null
|
||||||
@@ -172,3 +185,15 @@ mp.messaging.incoming.contributions-events-in.topic=unionflow.contributions.even
|
|||||||
mp.messaging.incoming.contributions-events-in.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
|
mp.messaging.incoming.contributions-events-in.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
|
||||||
mp.messaging.incoming.contributions-events-in.key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
|
mp.messaging.incoming.contributions-events-in.key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
|
||||||
mp.messaging.incoming.contributions-events-in.group.id=unionflow-websocket-server
|
mp.messaging.incoming.contributions-events-in.group.id=unionflow-websocket-server
|
||||||
|
|
||||||
|
# Chat Messages — Messagerie instantanée
|
||||||
|
mp.messaging.outgoing.chat-messages-out.connector=smallrye-kafka
|
||||||
|
mp.messaging.outgoing.chat-messages-out.topic=unionflow.chat.messages
|
||||||
|
mp.messaging.outgoing.chat-messages-out.value.serializer=org.apache.kafka.common.serialization.StringSerializer
|
||||||
|
mp.messaging.outgoing.chat-messages-out.key.serializer=org.apache.kafka.common.serialization.StringSerializer
|
||||||
|
|
||||||
|
mp.messaging.incoming.chat-messages-in.connector=smallrye-kafka
|
||||||
|
mp.messaging.incoming.chat-messages-in.topic=unionflow.chat.messages
|
||||||
|
mp.messaging.incoming.chat-messages-in.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
|
||||||
|
mp.messaging.incoming.chat-messages-in.key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
|
||||||
|
mp.messaging.incoming.chat-messages-in.group.id=unionflow-websocket-server
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ import dev.lions.unionflow.server.api.enums.membre.StatutMembre;
|
|||||||
import dev.lions.unionflow.server.api.enums.solidarite.StatutAide;
|
import dev.lions.unionflow.server.api.enums.solidarite.StatutAide;
|
||||||
import dev.lions.unionflow.server.api.enums.solidarite.TypeAide;
|
import dev.lions.unionflow.server.api.enums.solidarite.TypeAide;
|
||||||
import dev.lions.unionflow.server.api.enums.wave.StatutWebhook;
|
import dev.lions.unionflow.server.api.enums.wave.StatutWebhook;
|
||||||
import dev.lions.unionflow.server.api.enums.communication.ConversationType;
|
import dev.lions.unionflow.server.api.enums.messagerie.StatutConversation;
|
||||||
|
import dev.lions.unionflow.server.api.enums.messagerie.TypeConversation;
|
||||||
import org.junit.jupiter.api.DisplayName;
|
import org.junit.jupiter.api.DisplayName;
|
||||||
import org.junit.jupiter.api.Nested;
|
import org.junit.jupiter.api.Nested;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@@ -134,38 +135,85 @@ class EntityCoverageTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Conversation — onUpdate ─────────────────────────────────────────────
|
// ─── Conversation v4 ────────────────────────────────────────────────────
|
||||||
|
|
||||||
@Nested
|
@Nested
|
||||||
@DisplayName("Conversation — onUpdate() non couvert")
|
@DisplayName("Conversation v4 — méthodes métier")
|
||||||
class ConversationCoverage {
|
class ConversationCoverage {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@DisplayName("Conversation getters/setters de base")
|
@DisplayName("Conversation getters/setters v4")
|
||||||
void gettersSetters() {
|
void gettersSetters() {
|
||||||
Conversation c = new Conversation();
|
Conversation c = new Conversation();
|
||||||
c.setName("Chat Test");
|
c.setTypeConversation(TypeConversation.DIRECTE);
|
||||||
c.setDescription("Description");
|
c.setRoleCible("TRESORIER");
|
||||||
c.setType(ConversationType.GROUP);
|
c.setTitre("Canal Trésorier");
|
||||||
c.setIsMuted(false);
|
c.setStatut(StatutConversation.ACTIVE);
|
||||||
c.setIsPinned(true);
|
c.setDernierMessageAt(LocalDateTime.now());
|
||||||
c.setIsArchived(false);
|
c.setNombreMessages(3);
|
||||||
c.setUpdatedAt(LocalDateTime.now());
|
|
||||||
|
|
||||||
assertThat(c.getName()).isEqualTo("Chat Test");
|
assertThat(c.getTypeConversation()).isEqualTo(TypeConversation.DIRECTE);
|
||||||
assertThat(c.getType()).isEqualTo(ConversationType.GROUP);
|
assertThat(c.getRoleCible()).isEqualTo("TRESORIER");
|
||||||
assertThat(c.getIsPinned()).isTrue();
|
assertThat(c.getTitre()).isEqualTo("Canal Trésorier");
|
||||||
|
assertThat(c.getStatut()).isEqualTo(StatutConversation.ACTIVE);
|
||||||
|
assertThat(c.getNombreMessages()).isEqualTo(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@DisplayName("onUpdate() met à jour updatedAt")
|
@DisplayName("estActive() — ACTIVE → true, ARCHIVEE → false")
|
||||||
void onUpdate_setsUpdatedAt() {
|
void estActive() {
|
||||||
|
Conversation active = new Conversation();
|
||||||
|
active.setStatut(StatutConversation.ACTIVE);
|
||||||
|
assertThat(active.estActive()).isTrue();
|
||||||
|
|
||||||
|
Conversation archivee = new Conversation();
|
||||||
|
archivee.setStatut(StatutConversation.ARCHIVEE);
|
||||||
|
assertThat(archivee.estActive()).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("archiver() — passe à ARCHIVEE")
|
||||||
|
void archiver() {
|
||||||
Conversation c = new Conversation();
|
Conversation c = new Conversation();
|
||||||
c.setName("Chat");
|
c.setStatut(StatutConversation.ACTIVE);
|
||||||
c.setType(ConversationType.INDIVIDUAL);
|
c.archiver();
|
||||||
assertThat(c.getUpdatedAt()).isNull();
|
assertThat(c.getStatut()).isEqualTo(StatutConversation.ARCHIVEE);
|
||||||
c.onUpdate();
|
}
|
||||||
assertThat(c.getUpdatedAt()).isNotNull();
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("enregistrerNouveauMessage() — incrémente compteur et met à jour horodatage")
|
||||||
|
void enregistrerNouveauMessage() {
|
||||||
|
Conversation c = new Conversation();
|
||||||
|
c.setNombreMessages(2);
|
||||||
|
LocalDateTime avant = LocalDateTime.now().minusSeconds(1);
|
||||||
|
|
||||||
|
c.enregistrerNouveauMessage();
|
||||||
|
|
||||||
|
assertThat(c.getNombreMessages()).isEqualTo(3);
|
||||||
|
assertThat(c.getDernierMessageAt()).isNotNull().isAfter(avant);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("enregistrerNouveauMessage() — nombreMessages null → passe à 1")
|
||||||
|
void enregistrerNouveauMessage_nullCount() {
|
||||||
|
Conversation c = new Conversation();
|
||||||
|
c.setNombreMessages(null);
|
||||||
|
c.enregistrerNouveauMessage();
|
||||||
|
assertThat(c.getNombreMessages()).isEqualTo(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("onCreate() — statut null → initialisé à ACTIVE")
|
||||||
|
void onCreate_statut() {
|
||||||
|
Conversation c = new Conversation();
|
||||||
|
c.setStatut(null);
|
||||||
|
c.setTypeConversation(TypeConversation.ROLE_CANAL);
|
||||||
|
c.setId(java.util.UUID.randomUUID());
|
||||||
|
c.setDateCreation(LocalDateTime.now());
|
||||||
|
c.setActif(true);
|
||||||
|
c.setVersion(0L);
|
||||||
|
c.onCreate();
|
||||||
|
assertThat(c.getStatut()).isEqualTo(StatutConversation.ACTIVE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -674,14 +674,19 @@ class MembreServiceTest {
|
|||||||
doReturn(100L).when(membreRepository).count();
|
doReturn(100L).when(membreRepository).count();
|
||||||
doReturn(80L).when(membreRepository).countActifs();
|
doReturn(80L).when(membreRepository).countActifs();
|
||||||
doReturn(10L).when(membreRepository).countNouveauxMembres(any());
|
doReturn(10L).when(membreRepository).countNouveauxMembres(any());
|
||||||
|
doReturn(5L).when(organisationService).rechercherOrganisationsCount("");
|
||||||
|
|
||||||
Map<String, Object> stats = membreService.obtenirStatistiquesAvancees();
|
Map<String, Object> stats = membreService.obtenirStatistiquesAvancees();
|
||||||
|
|
||||||
assertThat(stats).containsKey("totalMembres");
|
assertThat(stats).containsKey("totalMembres");
|
||||||
|
assertThat(stats).containsKey("total"); // alias mobile
|
||||||
|
assertThat(stats).containsKey("totalOrganisations");
|
||||||
assertThat(stats).containsKey("membresActifs");
|
assertThat(stats).containsKey("membresActifs");
|
||||||
assertThat(stats).containsKey("membresInactifs");
|
assertThat(stats).containsKey("membresInactifs");
|
||||||
assertThat(stats).containsKey("tauxActivite");
|
assertThat(stats).containsKey("tauxActivite");
|
||||||
assertThat(stats.get("totalMembres")).isEqualTo(100L);
|
assertThat(stats.get("totalMembres")).isEqualTo(100L);
|
||||||
|
assertThat(stats.get("total")).isEqualTo(100L);
|
||||||
|
assertThat(stats.get("totalOrganisations")).isEqualTo(5L);
|
||||||
assertThat(stats.get("membresActifs")).isEqualTo(80L);
|
assertThat(stats.get("membresActifs")).isEqualTo(80L);
|
||||||
assertThat(stats.get("membresInactifs")).isEqualTo(20L);
|
assertThat(stats.get("membresInactifs")).isEqualTo(20L);
|
||||||
assertThat((Double) stats.get("tauxActivite")).isEqualTo(80.0);
|
assertThat((Double) stats.get("tauxActivite")).isEqualTo(80.0);
|
||||||
@@ -693,10 +698,12 @@ class MembreServiceTest {
|
|||||||
doReturn(0L).when(membreRepository).count();
|
doReturn(0L).when(membreRepository).count();
|
||||||
doReturn(0L).when(membreRepository).countActifs();
|
doReturn(0L).when(membreRepository).countActifs();
|
||||||
doReturn(0L).when(membreRepository).countNouveauxMembres(any());
|
doReturn(0L).when(membreRepository).countNouveauxMembres(any());
|
||||||
|
doReturn(0L).when(organisationService).rechercherOrganisationsCount("");
|
||||||
|
|
||||||
Map<String, Object> stats = membreService.obtenirStatistiquesAvancees();
|
Map<String, Object> stats = membreService.obtenirStatistiquesAvancees();
|
||||||
|
|
||||||
assertThat((Double) stats.get("tauxActivite")).isEqualTo(0.0);
|
assertThat((Double) stats.get("tauxActivite")).isEqualTo(0.0);
|
||||||
|
assertThat(stats.get("totalOrganisations")).isEqualTo(0L);
|
||||||
}
|
}
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user