chore(quarkus-327): bump to Quarkus 3.27.3 LTS, make pom autonomous, fix UserServiceImpl tests (search → searchByUsername), rename deprecated config keys
Some checks failed
CI/CD Pipeline / pipeline (push) Failing after 1m57s
Some checks failed
CI/CD Pipeline / pipeline (push) Failing after 1m57s
This commit is contained in:
57
pom.xml
57
pom.xml
@@ -4,11 +4,58 @@
|
|||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<groupId>dev.lions.user.manager</groupId>
|
||||||
<groupId>dev.lions.user.manager</groupId>
|
<version>1.1.0</version>
|
||||||
<artifactId>lions-user-manager-parent</artifactId>
|
|
||||||
<version>1.0.0</version>
|
<properties>
|
||||||
</parent>
|
<java.version>21</java.version>
|
||||||
|
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||||
|
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<quarkus.platform.version>3.27.3</quarkus.platform.version>
|
||||||
|
<lombok.version>1.18.38</lombok.version>
|
||||||
|
<mapstruct.version>1.6.3</mapstruct.version>
|
||||||
|
<!-- Overrides BOM : Docker Desktop 29.x compat (bundled TC 1.21.3 / docker-java 3.4.2 OK) -->
|
||||||
|
<testcontainers.version>1.21.4</testcontainers.version>
|
||||||
|
<docker-java.version>3.4.2</docker-java.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.quarkus.platform</groupId>
|
||||||
|
<artifactId>quarkus-bom</artifactId>
|
||||||
|
<version>${quarkus.platform.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testcontainers</groupId>
|
||||||
|
<artifactId>testcontainers-bom</artifactId>
|
||||||
|
<version>${testcontainers.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.lions.user.manager</groupId>
|
||||||
|
<artifactId>lions-user-manager-server-api</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- Lombok : pas dans Quarkus BOM -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<!-- MapStruct : pas dans Quarkus BOM -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapstruct</groupId>
|
||||||
|
<artifactId>mapstruct</artifactId>
|
||||||
|
<version>${mapstruct.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
<artifactId>lions-user-manager-server-impl-quarkus</artifactId>
|
<artifactId>lions-user-manager-server-impl-quarkus</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|||||||
@@ -43,8 +43,7 @@ public class UserResource implements UserResourceApi {
|
|||||||
public UserDTO getUserById(String userId, String realmName) {
|
public UserDTO getUserById(String userId, String realmName) {
|
||||||
log.info("GET /api/users/{} - realm: {}", userId, realmName);
|
log.info("GET /api/users/{} - realm: {}", userId, realmName);
|
||||||
return userService.getUserById(userId, realmName)
|
return userService.getUserById(userId, realmName)
|
||||||
.orElseThrow(() -> new RuntimeException("Utilisateur non trouvé")); // ExceptionMapper should handle/map
|
.orElseThrow(() -> new jakarta.ws.rs.NotFoundException("Utilisateur non trouvé"));
|
||||||
// to 404
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:543
|
|||||||
# ============================================
|
# ============================================
|
||||||
# Hibernate ORM Configuration DEV
|
# Hibernate ORM Configuration DEV
|
||||||
# ============================================
|
# ============================================
|
||||||
quarkus.hibernate-orm.database.generation=update
|
quarkus.hibernate-orm.schema-management.strategy=update
|
||||||
quarkus.hibernate-orm.log.sql=true
|
quarkus.hibernate-orm.log.sql=true
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
@@ -89,11 +89,11 @@ quarkus.log.category."io.quarkus.oidc.runtime".level=DEBUG
|
|||||||
quarkus.log.category."io.quarkus.security".level=DEBUG
|
quarkus.log.category."io.quarkus.security".level=DEBUG
|
||||||
quarkus.log.category."io.quarkus.security.runtime".level=DEBUG
|
quarkus.log.category."io.quarkus.security.runtime".level=DEBUG
|
||||||
|
|
||||||
quarkus.log.console.enable=true
|
quarkus.log.console.enabled=true
|
||||||
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n
|
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n
|
||||||
|
|
||||||
# File Logging pour Audit DEV
|
# File Logging pour Audit DEV
|
||||||
quarkus.log.file.enable=true
|
quarkus.log.file.enabled=true
|
||||||
quarkus.log.file.path=logs/dev/lions-user-manager.log
|
quarkus.log.file.path=logs/dev/lions-user-manager.log
|
||||||
quarkus.log.file.rotation.max-file-size=10M
|
quarkus.log.file.rotation.max-file-size=10M
|
||||||
quarkus.log.file.rotation.max-backup-index=3
|
quarkus.log.file.rotation.max-backup-index=3
|
||||||
@@ -102,7 +102,7 @@ quarkus.log.file.rotation.max-backup-index=3
|
|||||||
# OpenAPI/Swagger Configuration DEV
|
# OpenAPI/Swagger Configuration DEV
|
||||||
# ============================================
|
# ============================================
|
||||||
quarkus.swagger-ui.always-include=true
|
quarkus.swagger-ui.always-include=true
|
||||||
quarkus.swagger-ui.enable=true
|
quarkus.swagger-ui.enabled=true
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Dev Services DEV
|
# Dev Services DEV
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST}:${DB_PORT:5432}/${DB_NA
|
|||||||
# ============================================
|
# ============================================
|
||||||
# Hibernate ORM Configuration PROD
|
# Hibernate ORM Configuration PROD
|
||||||
# ============================================
|
# ============================================
|
||||||
quarkus.hibernate-orm.database.generation=none
|
quarkus.hibernate-orm.schema-management.strategy=none
|
||||||
quarkus.hibernate-orm.log.sql=false
|
quarkus.hibernate-orm.log.sql=false
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
@@ -91,17 +91,17 @@ quarkus.log.category."dev.lions.user.manager".level=INFO
|
|||||||
quarkus.log.category."org.keycloak".level=WARN
|
quarkus.log.category."org.keycloak".level=WARN
|
||||||
quarkus.log.category."io.quarkus".level=INFO
|
quarkus.log.category."io.quarkus".level=INFO
|
||||||
|
|
||||||
quarkus.log.console.enable=true
|
quarkus.log.console.enabled=true
|
||||||
quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n
|
quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n
|
||||||
|
|
||||||
# File Logging désactivé en PROD (logs centralisés via Kubernetes)
|
# File Logging désactivé en PROD (logs centralisés via Kubernetes)
|
||||||
quarkus.log.file.enable=false
|
quarkus.log.file.enabled=false
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# OpenAPI/Swagger Configuration PROD
|
# OpenAPI/Swagger Configuration PROD
|
||||||
# ============================================
|
# ============================================
|
||||||
quarkus.swagger-ui.always-include=true
|
quarkus.swagger-ui.always-include=true
|
||||||
quarkus.swagger-ui.enable=true
|
quarkus.swagger-ui.enabled=true
|
||||||
quarkus.swagger-ui.urls.default=/lions-user-manager/q/openapi
|
quarkus.swagger-ui.urls.default=/lions-user-manager/q/openapi
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ quarkus.application.version=1.0.0
|
|||||||
# HTTP Configuration (COMMUNE)
|
# HTTP Configuration (COMMUNE)
|
||||||
# ============================================
|
# ============================================
|
||||||
quarkus.http.host=0.0.0.0
|
quarkus.http.host=0.0.0.0
|
||||||
quarkus.http.cors=true
|
quarkus.http.cors.enabled=true
|
||||||
quarkus.http.cors.methods=GET,POST,PUT,DELETE,PATCH,OPTIONS
|
quarkus.http.cors.methods=GET,POST,PUT,DELETE,PATCH,OPTIONS
|
||||||
quarkus.http.cors.headers=*
|
quarkus.http.cors.headers=*
|
||||||
|
|
||||||
|
|||||||
@@ -756,7 +756,7 @@ class UserServiceImplCompleteTest {
|
|||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
UserRepresentation existing = new UserRepresentation();
|
UserRepresentation existing = new UserRepresentation();
|
||||||
existing.setUsername("existinguser");
|
existing.setUsername("existinguser");
|
||||||
when(usersResource.search("existinguser", 0, 1, true)).thenReturn(List.of(existing));
|
when(usersResource.searchByUsername("existinguser", true)).thenReturn(List.of(existing));
|
||||||
|
|
||||||
assertTrue(userService.usernameExists("existinguser", REALM));
|
assertTrue(userService.usernameExists("existinguser", REALM));
|
||||||
}
|
}
|
||||||
@@ -764,7 +764,7 @@ class UserServiceImplCompleteTest {
|
|||||||
@Test
|
@Test
|
||||||
void testUsernameExists_False() {
|
void testUsernameExists_False() {
|
||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
when(usersResource.search("newuser", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByUsername("newuser", true)).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
assertFalse(userService.usernameExists("newuser", REALM));
|
assertFalse(userService.usernameExists("newuser", REALM));
|
||||||
}
|
}
|
||||||
@@ -772,7 +772,7 @@ class UserServiceImplCompleteTest {
|
|||||||
@Test
|
@Test
|
||||||
void testUsernameExists_Exception() {
|
void testUsernameExists_Exception() {
|
||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
when(usersResource.search("user", 0, 1, true)).thenThrow(new RuntimeException("error"));
|
when(usersResource.searchByUsername("user", true)).thenThrow(new RuntimeException("error"));
|
||||||
|
|
||||||
assertFalse(userService.usernameExists("user", REALM)); // returns false on exception
|
assertFalse(userService.usernameExists("user", REALM)); // returns false on exception
|
||||||
}
|
}
|
||||||
@@ -969,7 +969,7 @@ class UserServiceImplCompleteTest {
|
|||||||
when(usersResource.searchByEmail("john@test.com", true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByEmail("john@test.com", true)).thenReturn(Collections.emptyList());
|
||||||
// Username doesn't exist
|
// Username doesn't exist
|
||||||
when(usersResource.search("\"john\"", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.search("\"john\"", 0, 1, true)).thenReturn(Collections.emptyList());
|
||||||
when(usersResource.search("john", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByUsername("john", true)).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
// Mock create response
|
// Mock create response
|
||||||
jakarta.ws.rs.core.Response response = mock(jakarta.ws.rs.core.Response.class);
|
jakarta.ws.rs.core.Response response = mock(jakarta.ws.rs.core.Response.class);
|
||||||
@@ -998,7 +998,7 @@ class UserServiceImplCompleteTest {
|
|||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
// Email doesn't exist
|
// Email doesn't exist
|
||||||
when(usersResource.searchByEmail("john@test.com", true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByEmail("john@test.com", true)).thenReturn(Collections.emptyList());
|
||||||
when(usersResource.search("john", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByUsername("john", true)).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
jakarta.ws.rs.core.Response response = mock(jakarta.ws.rs.core.Response.class);
|
jakarta.ws.rs.core.Response response = mock(jakarta.ws.rs.core.Response.class);
|
||||||
when(response.getStatus()).thenReturn(201);
|
when(response.getStatus()).thenReturn(201);
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ class UserServiceImplExtendedTest {
|
|||||||
UserRepresentation existingUser = new UserRepresentation();
|
UserRepresentation existingUser = new UserRepresentation();
|
||||||
existingUser.setUsername("existinguser");
|
existingUser.setUsername("existinguser");
|
||||||
existingUser.setEnabled(true);
|
existingUser.setEnabled(true);
|
||||||
when(usersResource.search("existinguser", 0, 1, true)).thenReturn(List.of(existingUser));
|
when(usersResource.searchByUsername("existinguser", true)).thenReturn(List.of(existingUser));
|
||||||
|
|
||||||
UserDTO userDTO = UserDTO.builder()
|
UserDTO userDTO = UserDTO.builder()
|
||||||
.username("existinguser")
|
.username("existinguser")
|
||||||
@@ -282,7 +282,7 @@ class UserServiceImplExtendedTest {
|
|||||||
@Test
|
@Test
|
||||||
void testCreateUser_EmailExists() {
|
void testCreateUser_EmailExists() {
|
||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
when(usersResource.search("newuser", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByUsername("newuser", true)).thenReturn(Collections.emptyList());
|
||||||
// emailExists calls searchByEmail which should return a non-empty list
|
// emailExists calls searchByEmail which should return a non-empty list
|
||||||
UserRepresentation existingUser = new UserRepresentation();
|
UserRepresentation existingUser = new UserRepresentation();
|
||||||
existingUser.setEmail("existing@example.com");
|
existingUser.setEmail("existing@example.com");
|
||||||
@@ -304,7 +304,7 @@ class UserServiceImplExtendedTest {
|
|||||||
@Test
|
@Test
|
||||||
void testCreateUser_StatusNot201() {
|
void testCreateUser_StatusNot201() {
|
||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
when(usersResource.search("newuser", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByUsername("newuser", true)).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
UserDTO userDTO = UserDTO.builder()
|
UserDTO userDTO = UserDTO.builder()
|
||||||
.username("newuser")
|
.username("newuser")
|
||||||
@@ -323,7 +323,7 @@ class UserServiceImplExtendedTest {
|
|||||||
@Test
|
@Test
|
||||||
void testCreateUser_WithTemporaryPassword() {
|
void testCreateUser_WithTemporaryPassword() {
|
||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
when(usersResource.search("newuser", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByUsername("newuser", true)).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
UserDTO userDTO = UserDTO.builder()
|
UserDTO userDTO = UserDTO.builder()
|
||||||
.username("newuser")
|
.username("newuser")
|
||||||
@@ -354,7 +354,7 @@ class UserServiceImplExtendedTest {
|
|||||||
@Test
|
@Test
|
||||||
void testCreateUser_Exception() {
|
void testCreateUser_Exception() {
|
||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
when(usersResource.search("newuser", 0, 1, true)).thenThrow(new RuntimeException("Connection error"));
|
when(usersResource.searchByUsername("newuser", true)).thenThrow(new RuntimeException("Connection error"));
|
||||||
|
|
||||||
UserDTO userDTO = UserDTO.builder()
|
UserDTO userDTO = UserDTO.builder()
|
||||||
.username("newuser")
|
.username("newuser")
|
||||||
|
|||||||
@@ -460,7 +460,7 @@ class UserServiceImplIntegrationTest {
|
|||||||
|
|
||||||
UserRepresentation user = new UserRepresentation();
|
UserRepresentation user = new UserRepresentation();
|
||||||
user.setUsername("existinguser");
|
user.setUsername("existinguser");
|
||||||
when(usersResource.search("existinguser", 0, 1, true)).thenReturn(List.of(user));
|
when(usersResource.searchByUsername("existinguser", true)).thenReturn(List.of(user));
|
||||||
|
|
||||||
boolean exists = userService.usernameExists("existinguser", REALM);
|
boolean exists = userService.usernameExists("existinguser", REALM);
|
||||||
|
|
||||||
@@ -470,7 +470,7 @@ class UserServiceImplIntegrationTest {
|
|||||||
@Test
|
@Test
|
||||||
void testUsernameExists_False() {
|
void testUsernameExists_False() {
|
||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
when(usersResource.search("nonexistent", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByUsername("nonexistent", true)).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
boolean exists = userService.usernameExists("nonexistent", REALM);
|
boolean exists = userService.usernameExists("nonexistent", REALM);
|
||||||
|
|
||||||
@@ -480,7 +480,7 @@ class UserServiceImplIntegrationTest {
|
|||||||
@Test
|
@Test
|
||||||
void testUsernameExists_Exception() {
|
void testUsernameExists_Exception() {
|
||||||
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
when(keycloakAdminClient.getUsers(REALM)).thenReturn(usersResource);
|
||||||
when(usersResource.search("erroruser", 0, 1, true)).thenThrow(new RuntimeException("Error"));
|
when(usersResource.searchByUsername("erroruser", true)).thenThrow(new RuntimeException("Error"));
|
||||||
|
|
||||||
boolean exists = userService.usernameExists("erroruser", REALM);
|
boolean exists = userService.usernameExists("erroruser", REALM);
|
||||||
|
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ class UserServiceImplTest {
|
|||||||
UserDTO newUser = UserDTO.builder().username("newuser").email("new@example.com").build();
|
UserDTO newUser = UserDTO.builder().username("newuser").email("new@example.com").build();
|
||||||
|
|
||||||
// Check exists
|
// Check exists
|
||||||
when(usersResource.search("newuser", 0, 1, true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByUsername("newuser", true)).thenReturn(Collections.emptyList());
|
||||||
when(usersResource.searchByEmail("new@example.com", true)).thenReturn(Collections.emptyList());
|
when(usersResource.searchByEmail("new@example.com", true)).thenReturn(Collections.emptyList());
|
||||||
|
|
||||||
// Mock creation response
|
// Mock creation response
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ quarkus.log.category."dev.lions.user.manager".level=WARN
|
|||||||
# Base de données H2 pour @QuarkusTest (pas de Docker requis)
|
# Base de données H2 pour @QuarkusTest (pas de Docker requis)
|
||||||
quarkus.datasource.db-kind=h2
|
quarkus.datasource.db-kind=h2
|
||||||
quarkus.datasource.jdbc.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=PostgreSQL
|
quarkus.datasource.jdbc.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=PostgreSQL
|
||||||
quarkus.hibernate-orm.database.generation=drop-and-create
|
quarkus.hibernate-orm.schema-management.strategy=drop-and-create
|
||||||
quarkus.flyway.enabled=false
|
quarkus.flyway.enabled=false
|
||||||
|
|
||||||
# Désactiver tous les DevServices (Docker non disponible en local)
|
# Désactiver tous les DevServices (Docker non disponible en local)
|
||||||
|
|||||||
Reference in New Issue
Block a user