Compare commits
5 Commits
7d68caef40
...
31e8d5534c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
31e8d5534c | ||
|
|
065b0008b0 | ||
|
|
bc95f24c35 | ||
|
|
a6ad4c9aea | ||
|
|
5e21ef9573 |
@@ -34,6 +34,28 @@ services:
|
|||||||
- postgres-dev
|
- postgres-dev
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Kafka est géré comme conteneur standalone (apache/kafka:4.0.0) sur port 9092.
|
||||||
|
# Ne pas le redéfinir ici pour éviter le conflit de port.
|
||||||
|
# Démarrer manuellement si nécessaire :
|
||||||
|
# docker run -d --name kafka --network unionflow-dev \
|
||||||
|
# -p 9092:9092 apache/kafka:4.0.0
|
||||||
|
# Puis recréer les topics :
|
||||||
|
# docker exec kafka /opt/kafka/bin/kafka-topics.sh --create \
|
||||||
|
# --bootstrap-server localhost:9092 --topic unionflow.finance.approvals --partitions 3 --replication-factor 1
|
||||||
|
|
||||||
|
kafka-ui:
|
||||||
|
image: ghcr.io/kafbat/kafka-ui:v1.4.2
|
||||||
|
container_name: unionflow-kafka-ui-dev
|
||||||
|
environment:
|
||||||
|
KAFKA_CLUSTERS_0_NAME: unionflow-dev
|
||||||
|
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: host.docker.internal:9092
|
||||||
|
DYNAMIC_CONFIG_ENABLED: "true"
|
||||||
|
ports:
|
||||||
|
- "8082:8080"
|
||||||
|
networks:
|
||||||
|
- unionflow-dev
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_dev_data:
|
postgres_dev_data:
|
||||||
driver: local
|
driver: local
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ public class TypeOrganisationReferenceResource {
|
|||||||
.estDefaut(request.estDefaut())
|
.estDefaut(request.estDefaut())
|
||||||
.estSysteme(request.estSysteme())
|
.estSysteme(request.estSysteme())
|
||||||
.organisationId(request.organisationId())
|
.organisationId(request.organisationId())
|
||||||
|
.categorie(request.categorie())
|
||||||
|
.modulesRequis(request.modulesRequis())
|
||||||
.build();
|
.build();
|
||||||
try {
|
try {
|
||||||
TypeReferenceResponse created = typeReferenceService.creer(withDomaine);
|
TypeReferenceResponse created = typeReferenceService.creer(withDomaine);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import dev.lions.unionflow.server.entity.SystemAlert;
|
|||||||
import dev.lions.unionflow.server.repository.AlertConfigurationRepository;
|
import dev.lions.unionflow.server.repository.AlertConfigurationRepository;
|
||||||
import dev.lions.unionflow.server.repository.SystemAlertRepository;
|
import dev.lions.unionflow.server.repository.SystemAlertRepository;
|
||||||
import dev.lions.unionflow.server.repository.SystemLogRepository;
|
import dev.lions.unionflow.server.repository.SystemLogRepository;
|
||||||
|
import io.quarkus.arc.Arc;
|
||||||
import io.quarkus.scheduler.Scheduled;
|
import io.quarkus.scheduler.Scheduled;
|
||||||
import jakarta.enterprise.context.ApplicationScoped;
|
import jakarta.enterprise.context.ApplicationScoped;
|
||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
@@ -47,6 +48,10 @@ public class AlertMonitoringService {
|
|||||||
@Scheduled(cron = "0 * * * * ?") // Toutes les minutes à la seconde 0
|
@Scheduled(cron = "0 * * * * ?") // Toutes les minutes à la seconde 0
|
||||||
@Transactional
|
@Transactional
|
||||||
public void monitorSystemMetrics() {
|
public void monitorSystemMetrics() {
|
||||||
|
// Guard contre l'exécution pendant le shutdown Quarkus (Arc.container() null → NPE)
|
||||||
|
if (!Arc.container().isRunning()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
log.debug("Running scheduled system metrics monitoring...");
|
log.debug("Running scheduled system metrics monitoring...");
|
||||||
|
|
||||||
|
|||||||
@@ -322,7 +322,7 @@ public class BudgetService {
|
|||||||
// Champs calculés
|
// Champs calculés
|
||||||
.realizationRate(budget.getRealizationRate())
|
.realizationRate(budget.getRealizationRate())
|
||||||
.variance(budget.getVariance())
|
.variance(budget.getVariance())
|
||||||
.varianceRate(budget.getTotalPlanned() != null && budget.getTotalPlanned().doubleValue() > 0
|
.varianceRate(budget.getTotalPlanned().compareTo(BigDecimal.ZERO) > 0
|
||||||
? budget.getVariance().doubleValue() / budget.getTotalPlanned().doubleValue() * 100
|
? budget.getVariance().doubleValue() / budget.getTotalPlanned().doubleValue() * 100
|
||||||
: 0.0)
|
: 0.0)
|
||||||
.isOverBudget(budget.isOverBudget())
|
.isOverBudget(budget.isOverBudget())
|
||||||
|
|||||||
@@ -533,15 +533,21 @@ public class MembreKeycloakSyncService {
|
|||||||
.temporary(false)
|
.temporary(false)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// Tentative via lions-user-manager ; fallback sur l'API Admin Keycloak directe si 403
|
// Tentative via lions-user-manager ; fallback sur l'API Admin Keycloak directe si 403/503
|
||||||
|
// Note : le REST client MicroProfile peut lever WebApplicationException (pas nécessairement
|
||||||
|
// ForbiddenException) selon la configuration du mapper de réponse — on capture la classe mère.
|
||||||
try {
|
try {
|
||||||
userServiceClient.resetPassword(keycloakUserId, DEFAULT_REALM, resetRequest);
|
userServiceClient.resetPassword(keycloakUserId, DEFAULT_REALM, resetRequest);
|
||||||
} catch (jakarta.ws.rs.ForbiddenException | jakarta.ws.rs.ServiceUnavailableException e) {
|
} catch (jakarta.ws.rs.WebApplicationException e) {
|
||||||
LOGGER.warning("lions-user-manager reset-password échoué (" + e.getMessage()
|
int status = e.getResponse() != null ? e.getResponse().getStatus() : 0;
|
||||||
|
if (status == 403 || status == 503) {
|
||||||
|
LOGGER.warning("lions-user-manager reset-password échoué (HTTP " + status
|
||||||
+ "), fallback sur API Admin Keycloak directe.");
|
+ "), fallback sur API Admin Keycloak directe.");
|
||||||
changerMotDePasseDirectKeycloak(membre.getId(), nouveauMotDePasse);
|
changerMotDePasseDirectKeycloak(membre.getId(), nouveauMotDePasse);
|
||||||
return; // changerMotDePasseDirectKeycloak persiste déjà les flags
|
return; // changerMotDePasseDirectKeycloak persiste déjà les flags
|
||||||
}
|
}
|
||||||
|
throw e; // Statuts inattendus (400, 500…) : propager
|
||||||
|
}
|
||||||
|
|
||||||
membre.setPremiereConnexion(false);
|
membre.setPremiereConnexion(false);
|
||||||
// Auto-activation : le membre prouve son identité en changeant son mot de passe temporaire
|
// Auto-activation : le membre prouve son identité en changeant son mot de passe temporaire
|
||||||
|
|||||||
@@ -304,6 +304,16 @@ public class MembreService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
membre.setActif(false);
|
membre.setActif(false);
|
||||||
|
|
||||||
|
// Décrémenter le compteur nombreMembres pour chaque organisation active du membre
|
||||||
|
// (fix DATA-01 : le compteur restait figé lors d'une désactivation directe)
|
||||||
|
membreOrganisationRepository.findOrganisationsActivesParMembre(id).forEach(mo -> {
|
||||||
|
mo.getOrganisation().retirerMembre();
|
||||||
|
mo.setStatutMembre(dev.lions.unionflow.server.api.enums.membre.StatutMembre.SUSPENDU);
|
||||||
|
LOG.infof("Compteur membres décrémenté pour organisation %s (membre désactivé)",
|
||||||
|
mo.getOrganisation().getId());
|
||||||
|
});
|
||||||
|
|
||||||
LOG.infof("Membre désactivé: %s", membre.getNomComplet());
|
LOG.infof("Membre désactivé: %s", membre.getNomComplet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,10 +50,12 @@ quarkus.log.category."io.quarkus.security".level=INFO
|
|||||||
wave.mock.enabled=true
|
wave.mock.enabled=true
|
||||||
wave.redirect.base.url=http://localhost:8085
|
wave.redirect.base.url=http://localhost:8085
|
||||||
|
|
||||||
# OIDC client "admin-service" — service account pour appels admin vers lions-user-manager
|
# OIDC client "admin-service" — service account pour appels vers lions-user-manager
|
||||||
quarkus.oidc-client.admin-service.auth-server-url=http://localhost:8180/realms/unionflow
|
# Utilise le realm lions-user-manager (cohérent avec le serveur LUM qui valide ce realm)
|
||||||
|
# Le client unionflow-server existe dans lions-user-manager realm avec ce secret
|
||||||
|
quarkus.oidc-client.admin-service.auth-server-url=http://localhost:8180/realms/lions-user-manager
|
||||||
quarkus.oidc-client.admin-service.client-id=unionflow-server
|
quarkus.oidc-client.admin-service.client-id=unionflow-server
|
||||||
quarkus.oidc-client.admin-service.credentials.secret=unionflow-secret-2025
|
quarkus.oidc-client.admin-service.credentials.secret=Esj0DzyRt7wSPtcePDae1dQQdqmQxlJm
|
||||||
quarkus.oidc-client.admin-service.grant.type=client
|
quarkus.oidc-client.admin-service.grant.type=client
|
||||||
quarkus.oidc-client.admin-service.tls.verification=none
|
quarkus.oidc-client.admin-service.tls.verification=none
|
||||||
quarkus.oidc-client.admin-service.early-tokens-acquisition=true
|
quarkus.oidc-client.admin-service.early-tokens-acquisition=true
|
||||||
|
|||||||
@@ -58,9 +58,10 @@ quarkus.log.category."org.jboss.resteasy".level=WARN
|
|||||||
quarkus.rest-client.lions-user-manager-api.url=${LIONS_USER_MANAGER_URL:http://lions-user-manager:8081}
|
quarkus.rest-client.lions-user-manager-api.url=${LIONS_USER_MANAGER_URL:http://lions-user-manager:8081}
|
||||||
|
|
||||||
# OIDC client "admin-service" — service account pour appels admin vers lions-user-manager
|
# OIDC client "admin-service" — service account pour appels admin vers lions-user-manager
|
||||||
quarkus.oidc-client.admin-service.auth-server-url=${KEYCLOAK_AUTH_SERVER_URL:https://security.lions.dev/realms/unionflow}
|
# Utilise le realm lions-user-manager (cohérent avec le serveur LUM qui valide ce realm)
|
||||||
|
quarkus.oidc-client.admin-service.auth-server-url=${KEYCLOAK_LUM_AUTH_SERVER_URL:https://security.lions.dev/realms/lions-user-manager}
|
||||||
quarkus.oidc-client.admin-service.client-id=unionflow-server
|
quarkus.oidc-client.admin-service.client-id=unionflow-server
|
||||||
quarkus.oidc-client.admin-service.credentials.secret=${KEYCLOAK_CLIENT_SECRET}
|
quarkus.oidc-client.admin-service.credentials.secret=${KEYCLOAK_ADMIN_SERVICE_SECRET:${KEYCLOAK_CLIENT_SECRET}}
|
||||||
quarkus.oidc-client.admin-service.grant.type=client
|
quarkus.oidc-client.admin-service.grant.type=client
|
||||||
|
|
||||||
# Wave Money — Production
|
# Wave Money — Production
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ quarkus.hibernate-orm.metrics.enabled=false
|
|||||||
quarkus.flyway.migrate-at-start=true
|
quarkus.flyway.migrate-at-start=true
|
||||||
quarkus.flyway.baseline-on-migrate=true
|
quarkus.flyway.baseline-on-migrate=true
|
||||||
quarkus.flyway.baseline-version=0
|
quarkus.flyway.baseline-version=0
|
||||||
|
quarkus.flyway.out-of-order=true
|
||||||
|
|
||||||
# Configuration Keycloak OIDC — base commune
|
# Configuration Keycloak OIDC — base commune
|
||||||
quarkus.oidc.application-type=service
|
quarkus.oidc.application-type=service
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
-- V10 : Correction type colonne version dans modules_disponibles
|
||||||
|
-- La colonne version était VARCHAR(20) (version produit comme "1.0.0")
|
||||||
|
-- mais BaseEntity attend BIGINT (@Version Hibernate pour optimistic locking)
|
||||||
|
-- L'entité ModuleDisponible n'a pas de champ version propre → la colonne VARCHAR était orpheline
|
||||||
|
-- Correction : supprimer l'ancienne VARCHAR, ajouter BIGINT version=0
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
-- Supprimer version VARCHAR si elle existe encore
|
||||||
|
IF EXISTS (
|
||||||
|
SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'modules_disponibles'
|
||||||
|
AND column_name = 'version'
|
||||||
|
AND data_type = 'character varying'
|
||||||
|
) THEN
|
||||||
|
ALTER TABLE modules_disponibles DROP COLUMN version;
|
||||||
|
ALTER TABLE modules_disponibles ADD COLUMN version BIGINT NOT NULL DEFAULT 0;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
@@ -2,9 +2,13 @@ package dev.lions.unionflow.server.resource;
|
|||||||
|
|
||||||
import static io.restassured.RestAssured.given;
|
import static io.restassured.RestAssured.given;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.mockito.ArgumentMatchers.*;
|
import static org.mockito.ArgumentMatchers.*;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
import dev.lions.unionflow.server.api.dto.reference.request.CreateTypeReferenceRequest;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
|
||||||
import dev.lions.unionflow.server.api.dto.reference.response.TypeReferenceResponse;
|
import dev.lions.unionflow.server.api.dto.reference.response.TypeReferenceResponse;
|
||||||
import dev.lions.unionflow.server.service.TypeReferenceService;
|
import dev.lions.unionflow.server.service.TypeReferenceService;
|
||||||
import io.quarkus.security.identity.SecurityIdentity;
|
import io.quarkus.security.identity.SecurityIdentity;
|
||||||
@@ -83,6 +87,40 @@ class TypeOrganisationReferenceResourceTest {
|
|||||||
.contentType(ContentType.JSON);
|
.contentType(ContentType.JSON);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestSecurity(user = "superadmin@test.com", roles = {"SUPER_ADMIN"})
|
||||||
|
void creerType_withCategorieAndModules_forwardsFields() {
|
||||||
|
TypeReferenceResponse response = TypeReferenceResponse.builder()
|
||||||
|
.domaine("TYPE_ORGANISATION")
|
||||||
|
.code("TONTINE")
|
||||||
|
.libelle("Tontine")
|
||||||
|
.categorie("FINANCIER_SOLIDAIRE")
|
||||||
|
.modulesRequis("TONTINE,COTISATIONS")
|
||||||
|
.build();
|
||||||
|
response.setId(UUID.randomUUID());
|
||||||
|
ArgumentCaptor<CreateTypeReferenceRequest> captor =
|
||||||
|
ArgumentCaptor.forClass(CreateTypeReferenceRequest.class);
|
||||||
|
when(typeReferenceService.creer(captor.capture())).thenReturn(response);
|
||||||
|
|
||||||
|
String body = """
|
||||||
|
{"code":"TONTINE","libelle":"Tontine","domaine":"TYPE_ORGANISATION",
|
||||||
|
"categorie":"FINANCIER_SOLIDAIRE","modulesRequis":"TONTINE,COTISATIONS"}
|
||||||
|
""";
|
||||||
|
|
||||||
|
given()
|
||||||
|
.contentType(ContentType.JSON)
|
||||||
|
.body(body)
|
||||||
|
.when()
|
||||||
|
.post(BASE_PATH)
|
||||||
|
.then()
|
||||||
|
.statusCode(201);
|
||||||
|
|
||||||
|
CreateTypeReferenceRequest captured = captor.getValue();
|
||||||
|
assertEquals("FINANCIER_SOLIDAIRE", captured.categorie());
|
||||||
|
assertEquals("TONTINE,COTISATIONS", captured.modulesRequis());
|
||||||
|
assertEquals("TYPE_ORGANISATION", captured.domaine());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestSecurity(user = "superadmin@test.com", roles = {"SUPER_ADMIN"})
|
@TestSecurity(user = "superadmin@test.com", roles = {"SUPER_ADMIN"})
|
||||||
void creerType_illegalArg_returns400() {
|
void creerType_illegalArg_returns400() {
|
||||||
|
|||||||
@@ -6,8 +6,10 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import dev.lions.unionflow.server.api.dto.finance_workflow.request.CreateBudgetRequest;
|
import dev.lions.unionflow.server.api.dto.finance_workflow.request.CreateBudgetRequest;
|
||||||
|
import dev.lions.unionflow.server.api.dto.finance_workflow.request.CreateBudgetLineRequest;
|
||||||
import dev.lions.unionflow.server.api.dto.finance_workflow.response.BudgetResponse;
|
import dev.lions.unionflow.server.api.dto.finance_workflow.response.BudgetResponse;
|
||||||
import dev.lions.unionflow.server.entity.Budget;
|
import dev.lions.unionflow.server.entity.Budget;
|
||||||
|
import dev.lions.unionflow.server.entity.BudgetLine;
|
||||||
import dev.lions.unionflow.server.entity.Organisation;
|
import dev.lions.unionflow.server.entity.Organisation;
|
||||||
import dev.lions.unionflow.server.repository.BudgetRepository;
|
import dev.lions.unionflow.server.repository.BudgetRepository;
|
||||||
import dev.lions.unionflow.server.repository.OrganisationRepository;
|
import dev.lions.unionflow.server.repository.OrganisationRepository;
|
||||||
@@ -15,7 +17,9 @@ import io.quarkus.test.InjectMock;
|
|||||||
import io.quarkus.test.junit.QuarkusTest;
|
import io.quarkus.test.junit.QuarkusTest;
|
||||||
import jakarta.inject.Inject;
|
import jakarta.inject.Inject;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import org.eclipse.microprofile.jwt.JsonWebToken;
|
import org.eclipse.microprofile.jwt.JsonWebToken;
|
||||||
@@ -139,4 +143,68 @@ class BudgetServiceCoverageTest {
|
|||||||
|
|
||||||
assertThat(result).isEqualTo(LocalDate.of(2026, 2, 28));
|
assertThat(result).isEqualTo(LocalDate.of(2026, 2, 28));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// toResponse — varianceRate : totalPlanned=0 → 0.0 (pas de division par zéro)
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("varianceRate=0.0 quand totalPlanned=0 (guard BigDecimal.ZERO.compareTo)")
|
||||||
|
void toResponse_totalPlannedZero_varianceRateIsZero() {
|
||||||
|
// Budget sans ligne → totalPlanned=0, totalRealized=0
|
||||||
|
Budget b = Budget.builder()
|
||||||
|
.name("Budget Vide")
|
||||||
|
.organisation(org)
|
||||||
|
.period("ANNUAL")
|
||||||
|
.year(2026)
|
||||||
|
.currency("XOF")
|
||||||
|
.createdById(USER_ID)
|
||||||
|
.createdAtBudget(LocalDateTime.now())
|
||||||
|
.startDate(LocalDate.of(2026, 1, 1))
|
||||||
|
.endDate(LocalDate.of(2026, 12, 31))
|
||||||
|
.build();
|
||||||
|
b.setId(UUID.randomUUID());
|
||||||
|
when(budgetRepository.findByIdOptional(b.getId())).thenReturn(Optional.of(b));
|
||||||
|
|
||||||
|
BudgetResponse response = budgetService.getBudgetById(b.getId());
|
||||||
|
|
||||||
|
assertThat(response.getTotalPlanned()).isEqualByComparingTo(BigDecimal.ZERO);
|
||||||
|
assertThat(response.getVarianceRate()).isEqualTo(0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("varianceRate calculé correctement quand totalPlanned > 0")
|
||||||
|
void toResponse_totalPlannedPositive_varianceRateCalculated() {
|
||||||
|
// Budget avec totalPlanned=500000, totalRealized=300000
|
||||||
|
// variance = 300000 - 500000 = -200000 → varianceRate = -200000/500000*100 = -40.0%
|
||||||
|
Budget b = Budget.builder()
|
||||||
|
.name("Budget avec lignes")
|
||||||
|
.organisation(org)
|
||||||
|
.period("ANNUAL")
|
||||||
|
.year(2026)
|
||||||
|
.currency("XOF")
|
||||||
|
.createdById(USER_ID)
|
||||||
|
.createdAtBudget(LocalDateTime.now())
|
||||||
|
.startDate(LocalDate.of(2026, 1, 1))
|
||||||
|
.endDate(LocalDate.of(2026, 12, 31))
|
||||||
|
.build();
|
||||||
|
b.setId(UUID.randomUUID());
|
||||||
|
|
||||||
|
BudgetLine line = BudgetLine.builder()
|
||||||
|
.budget(b)
|
||||||
|
.category("CONTRIBUTIONS")
|
||||||
|
.name("Cotisations")
|
||||||
|
.amountPlanned(BigDecimal.valueOf(500_000))
|
||||||
|
.amountRealized(BigDecimal.valueOf(300_000))
|
||||||
|
.build();
|
||||||
|
line.setId(UUID.randomUUID());
|
||||||
|
b.addLine(line);
|
||||||
|
|
||||||
|
when(budgetRepository.findByIdOptional(b.getId())).thenReturn(Optional.of(b));
|
||||||
|
|
||||||
|
BudgetResponse response = budgetService.getBudgetById(b.getId());
|
||||||
|
|
||||||
|
assertThat(response.getTotalPlanned()).isEqualByComparingTo(BigDecimal.valueOf(500_000));
|
||||||
|
assertThat(response.getVarianceRate()).isEqualTo(-40.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ class TypeReferenceServiceTest {
|
|||||||
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
||||||
null, // code (pas de changement)
|
null, // code (pas de changement)
|
||||||
"Nouveau libellé",
|
"Nouveau libellé",
|
||||||
null, null, null, null, null, null, null);
|
null, null, null, null, null, null, null, null, null);
|
||||||
|
|
||||||
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
||||||
assertThat(updated.getLibelle()).isEqualTo("Nouveau libellé");
|
assertThat(updated.getLibelle()).isEqualTo("Nouveau libellé");
|
||||||
@@ -212,7 +212,7 @@ class TypeReferenceServiceTest {
|
|||||||
@DisplayName("modifier avec UUID inexistant lance IllegalArgumentException")
|
@DisplayName("modifier avec UUID inexistant lance IllegalArgumentException")
|
||||||
void modifier_inexistant_throws() {
|
void modifier_inexistant_throws() {
|
||||||
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
||||||
null, "Libellé", null, null, null, null, null, null, null);
|
null, "Libellé", null, null, null, null, null, null, null, null, null);
|
||||||
|
|
||||||
assertThatThrownBy(() -> typeReferenceService.modifier(UUID.randomUUID(), updateRequest))
|
assertThatThrownBy(() -> typeReferenceService.modifier(UUID.randomUUID(), updateRequest))
|
||||||
.isInstanceOf(IllegalArgumentException.class)
|
.isInstanceOf(IllegalArgumentException.class)
|
||||||
@@ -317,7 +317,7 @@ class TypeReferenceServiceTest {
|
|||||||
.build());
|
.build());
|
||||||
|
|
||||||
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
||||||
newCode, null, null, null, null, null, null, null, null);
|
newCode, null, null, null, null, null, null, null, null, null, null);
|
||||||
|
|
||||||
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
||||||
assertThat(updated.getCode()).isEqualTo(newCode.toUpperCase());
|
assertThat(updated.getCode()).isEqualTo(newCode.toUpperCase());
|
||||||
@@ -340,7 +340,7 @@ class TypeReferenceServiceTest {
|
|||||||
.build());
|
.build());
|
||||||
|
|
||||||
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
||||||
"CHANGED_CODE", null, null, null, null, null, null, null, null);
|
"CHANGED_CODE", null, null, null, null, null, null, null, null, null, null);
|
||||||
|
|
||||||
assertThatThrownBy(() -> typeReferenceService.modifier(created.getId(), updateRequest))
|
assertThatThrownBy(() -> typeReferenceService.modifier(created.getId(), updateRequest))
|
||||||
.isInstanceOf(IllegalArgumentException.class)
|
.isInstanceOf(IllegalArgumentException.class)
|
||||||
@@ -365,7 +365,7 @@ class TypeReferenceServiceTest {
|
|||||||
|
|
||||||
// Même code (case-insensitive) → !equalsIgnoreCase = false → if body skipped
|
// Même code (case-insensitive) → !equalsIgnoreCase = false → if body skipped
|
||||||
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
||||||
code.toLowerCase(), "Nouveau libelle", null, null, null, null, null, null, null);
|
code.toLowerCase(), "Nouveau libelle", null, null, null, null, null, null, null, null, null);
|
||||||
|
|
||||||
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
||||||
assertThat(updated).isNotNull();
|
assertThat(updated).isNotNull();
|
||||||
@@ -457,7 +457,7 @@ class TypeReferenceServiceTest {
|
|||||||
|
|
||||||
// Modifier le code avec l'organisation non-null → L195-197 : orgId = entity.getOrganisation().getId()
|
// Modifier le code avec l'organisation non-null → L195-197 : orgId = entity.getOrganisation().getId()
|
||||||
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
UpdateTypeReferenceRequest updateRequest = new UpdateTypeReferenceRequest(
|
||||||
newCode, null, null, null, null, null, null, null, null);
|
newCode, null, null, null, null, null, null, null, null, null, null);
|
||||||
|
|
||||||
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
||||||
|
|
||||||
@@ -491,7 +491,9 @@ class TypeReferenceServiceTest {
|
|||||||
"warning", // severity
|
"warning", // severity
|
||||||
10, // ordreAffichage
|
10, // ordreAffichage
|
||||||
true, // estDefaut
|
true, // estDefaut
|
||||||
false // actif
|
false, // actif
|
||||||
|
null, // categorie
|
||||||
|
null // modulesRequis
|
||||||
);
|
);
|
||||||
|
|
||||||
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
TypeReferenceResponse updated = typeReferenceService.modifier(created.getId(), updateRequest);
|
||||||
|
|||||||
Reference in New Issue
Block a user