diff --git a/onyxia-api/pom.xml b/onyxia-api/pom.xml index 56238fa2..e371f375 100644 --- a/onyxia-api/pom.xml +++ b/onyxia-api/pom.xml @@ -36,6 +36,16 @@ spring-restdocs-mockmvc test + + org.springframework.boot + spring-boot-webmvc-test + test + + + org.springframework.boot + spring-boot-restdocs + test + org.springframework.boot spring-boot-starter-webflux @@ -43,7 +53,7 @@ org.springdoc springdoc-openapi-starter-webmvc-ui - 2.10.0 + 3.2.0 @@ -99,6 +109,12 @@ com.fasterxml.jackson.core jackson-databind + + + org.springframework.boot + spring-boot-jackson2 + com.github.erosb diff --git a/onyxia-api/src/main/java/fr/insee/onyxia/api/security/OIDCConfiguration.java b/onyxia-api/src/main/java/fr/insee/onyxia/api/security/OIDCConfiguration.java index dc5d934e..205f8dd6 100644 --- a/onyxia-api/src/main/java/fr/insee/onyxia/api/security/OIDCConfiguration.java +++ b/onyxia-api/src/main/java/fr/insee/onyxia/api/security/OIDCConfiguration.java @@ -1,6 +1,6 @@ package fr.insee.onyxia.api.security; -import static org.springframework.security.web.util.matcher.AntPathRequestMatcher.antMatcher; +import static org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher.pathPattern; import fr.insee.onyxia.api.services.UserProvider; import fr.insee.onyxia.api.services.utils.HttpRequestUtils; @@ -121,43 +121,47 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { configurer -> { configurer.requestMatchers(HttpMethod.OPTIONS).permitAll(); // configuration pour Swagger - configurer.requestMatchers(antMatcher("/")).permitAll(); - configurer.requestMatchers(antMatcher("/swagger-ui**")).permitAll(); - configurer.requestMatchers(antMatcher("/swagger-ui/**")).permitAll(); - configurer.requestMatchers(antMatcher("/v2/api-docs")).permitAll(); - configurer.requestMatchers(antMatcher("/v3/api-docs")).permitAll(); - configurer.requestMatchers(antMatcher("/v3/api-docs/*")).permitAll(); - configurer.requestMatchers(antMatcher("/csrf")).permitAll(); - configurer.requestMatchers(antMatcher("/webjars/**")).permitAll(); + configurer.requestMatchers(pathPattern("/")).permitAll(); + configurer.requestMatchers(pathPattern("/swagger-ui**")).permitAll(); + configurer.requestMatchers(pathPattern("/swagger-ui/**")).permitAll(); + configurer.requestMatchers(pathPattern("/v2/api-docs")).permitAll(); + configurer.requestMatchers(pathPattern("/v3/api-docs")).permitAll(); + configurer.requestMatchers(pathPattern("/v3/api-docs/*")).permitAll(); + configurer.requestMatchers(pathPattern("/csrf")).permitAll(); + configurer.requestMatchers(pathPattern("/webjars/**")).permitAll(); configurer - .requestMatchers(antMatcher("/swagger-resources/**")) + .requestMatchers(pathPattern("/swagger-resources/**")) .permitAll(); - configurer.requestMatchers(antMatcher("/actuator/**")).permitAll(); - configurer.requestMatchers(antMatcher("/actuator")).permitAll(); - configurer.requestMatchers(antMatcher("/api")).permitAll(); - configurer.requestMatchers(antMatcher("/api/swagger-ui**")).permitAll(); + configurer.requestMatchers(pathPattern("/actuator/**")).permitAll(); + configurer.requestMatchers(pathPattern("/actuator")).permitAll(); + configurer.requestMatchers(pathPattern("/api")).permitAll(); configurer - .requestMatchers(antMatcher("/api/swagger-ui/**")) + .requestMatchers(pathPattern("/api/swagger-ui**")) .permitAll(); - configurer.requestMatchers(antMatcher("/api/v2/api-docs")).permitAll(); - configurer.requestMatchers(antMatcher("/api/v3/api-docs")).permitAll(); configurer - .requestMatchers(antMatcher("/api/v3/api-docs/*")) + .requestMatchers(pathPattern("/api/swagger-ui/**")) .permitAll(); - configurer.requestMatchers(antMatcher("/api/csrf")).permitAll(); - configurer.requestMatchers(antMatcher("/api/webjars/**")).permitAll(); + configurer.requestMatchers(pathPattern("/api/v2/api-docs")).permitAll(); + configurer.requestMatchers(pathPattern("/api/v3/api-docs")).permitAll(); configurer - .requestMatchers(antMatcher("/api/swagger-resources/**")) + .requestMatchers(pathPattern("/api/v3/api-docs/*")) .permitAll(); - configurer.requestMatchers(antMatcher("/api/actuator/**")).permitAll(); - configurer.requestMatchers(antMatcher("/api/actuator")).permitAll(); - configurer.requestMatchers(antMatcher("/configuration/**")).permitAll(); + configurer.requestMatchers(pathPattern("/api/csrf")).permitAll(); + configurer.requestMatchers(pathPattern("/api/webjars/**")).permitAll(); configurer - .requestMatchers(antMatcher("/swagger-resources/**")) + .requestMatchers(pathPattern("/api/swagger-resources/**")) + .permitAll(); + configurer.requestMatchers(pathPattern("/api/actuator/**")).permitAll(); + configurer.requestMatchers(pathPattern("/api/actuator")).permitAll(); + configurer + .requestMatchers(pathPattern("/configuration/**")) + .permitAll(); + configurer + .requestMatchers(pathPattern("/swagger-resources/**")) .permitAll(); // configuration pour public - configurer.requestMatchers(antMatcher("/public/**")).permitAll(); - configurer.requestMatchers(antMatcher("/api/public/**")).permitAll(); + configurer.requestMatchers(pathPattern("/public/**")).permitAll(); + configurer.requestMatchers(pathPattern("/api/public/**")).permitAll(); configurer.anyRequest().authenticated(); }) .oauth2ResourceServer( diff --git a/onyxia-api/src/main/resources/application.properties b/onyxia-api/src/main/resources/application.properties index 2be3b8a8..c4774739 100644 --- a/onyxia-api/src/main/resources/application.properties +++ b/onyxia-api/src/main/resources/application.properties @@ -64,3 +64,6 @@ health.custom-crd.checks[0].kind=Cluster health.custom-crd.checks[0].strategy=FIELDS health.custom-crd.checks[0].desired-field=instances health.custom-crd.checks[0].ready-field=readyInstances + +# Spring Boot 4 defaults to Jackson 3 for HTTP messages; keep using our Jackson 2 ObjectMapper (see CustomObjectMapper) +spring.http.converters.preferred-json-mapper=jackson2 diff --git a/onyxia-api/src/test/java/fr/insee/onyxia/api/UserControllerTest.java b/onyxia-api/src/test/java/fr/insee/onyxia/api/UserControllerTest.java index 35452393..e32df02a 100644 --- a/onyxia-api/src/test/java/fr/insee/onyxia/api/UserControllerTest.java +++ b/onyxia-api/src/test/java/fr/insee/onyxia/api/UserControllerTest.java @@ -22,8 +22,8 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; @@ -34,15 +34,15 @@ public class UserControllerTest extends BaseTest { @Autowired private ObjectMapper mapper; - @MockBean private HttpRequestUtils httpRequestUtils; + @MockitoBean private HttpRequestUtils httpRequestUtils; - @MockBean private RegionsConfiguration regionsConfiguration; + @MockitoBean private RegionsConfiguration regionsConfiguration; - @MockBean private SecurityConfig securityConfig; + @MockitoBean private SecurityConfig securityConfig; - @MockBean private OnyxiaUserProvider onyxiaUserProvider; + @MockitoBean private OnyxiaUserProvider onyxiaUserProvider; - @MockBean private UserProvider userProvider; + @MockitoBean private UserProvider userProvider; @BeforeEach public void setUp() { diff --git a/onyxia-api/src/test/java/fr/insee/onyxia/api/configuration/BaseTest.java b/onyxia-api/src/test/java/fr/insee/onyxia/api/configuration/BaseTest.java index 17ac4d94..589cde52 100644 --- a/onyxia-api/src/test/java/fr/insee/onyxia/api/configuration/BaseTest.java +++ b/onyxia-api/src/test/java/fr/insee/onyxia/api/configuration/BaseTest.java @@ -2,7 +2,7 @@ import fr.insee.onyxia.api.security.NoSecurityConfiguration; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.restdocs.test.autoconfigure.AutoConfigureRestDocs; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; diff --git a/onyxia-api/src/test/java/fr/insee/onyxia/api/configuration/checks/DisableChecksForTests.java b/onyxia-api/src/test/java/fr/insee/onyxia/api/configuration/checks/DisableChecksForTests.java index ac8f1d82..4ef90e72 100644 --- a/onyxia-api/src/test/java/fr/insee/onyxia/api/configuration/checks/DisableChecksForTests.java +++ b/onyxia-api/src/test/java/fr/insee/onyxia/api/configuration/checks/DisableChecksForTests.java @@ -1,12 +1,12 @@ package fr.insee.onyxia.api.configuration.checks; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @Configuration public class DisableChecksForTests { - @MockBean CompatibilityChecks compatibilityChecks; + @MockitoBean CompatibilityChecks compatibilityChecks; public CompatibilityChecks getCompatibilityChecks() { return compatibilityChecks; diff --git a/onyxia-api/src/test/java/fr/insee/onyxia/api/controller/api/onboarding/OnboardingControllerTest.java b/onyxia-api/src/test/java/fr/insee/onyxia/api/controller/api/onboarding/OnboardingControllerTest.java index 4302b347..b0897c60 100644 --- a/onyxia-api/src/test/java/fr/insee/onyxia/api/controller/api/onboarding/OnboardingControllerTest.java +++ b/onyxia-api/src/test/java/fr/insee/onyxia/api/controller/api/onboarding/OnboardingControllerTest.java @@ -19,8 +19,8 @@ import fr.insee.onyxia.model.region.Region; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(OnboardingController.class) @@ -29,13 +29,13 @@ class OnboardingControllerTest extends BaseTest { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper mapper; - @MockBean private UserProvider userProvider; - @MockBean private RegionsConfiguration regionsConfiguration; + @MockitoBean private UserProvider userProvider; + @MockitoBean private RegionsConfiguration regionsConfiguration; - @MockBean private HttpRequestUtils httpRequestUtils; - @MockBean private SecurityConfig securityConfig; - @MockBean private OnyxiaUserProvider onyxiaUserProvider; - @MockBean private KubernetesService kubernetesService; + @MockitoBean private HttpRequestUtils httpRequestUtils; + @MockitoBean private SecurityConfig securityConfig; + @MockitoBean private OnyxiaUserProvider onyxiaUserProvider; + @MockitoBean private KubernetesService kubernetesService; @Test public void should_not_create_namespace_when_single_project() throws Exception { diff --git a/onyxia-api/src/test/java/fr/insee/onyxia/api/user/OnyxiaUserProviderTest.java b/onyxia-api/src/test/java/fr/insee/onyxia/api/user/OnyxiaUserProviderTest.java index c3a917ee..1c3c824a 100644 --- a/onyxia-api/src/test/java/fr/insee/onyxia/api/user/OnyxiaUserProviderTest.java +++ b/onyxia-api/src/test/java/fr/insee/onyxia/api/user/OnyxiaUserProviderTest.java @@ -18,16 +18,16 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @SpringBootTest(classes = {OnyxiaUserProvider.class, UserProvider.class}) public class OnyxiaUserProviderTest { @Autowired OnyxiaUserProvider onyxiaUserProvider; - @MockBean private KubernetesService kubernetesService; + @MockitoBean private KubernetesService kubernetesService; - @MockBean private UserProvider userProvider; + @MockitoBean private UserProvider userProvider; Region region; User user; diff --git a/onyxia-model/pom.xml b/onyxia-model/pom.xml index 0a7f2cb8..2e4fc40e 100644 --- a/onyxia-model/pom.xml +++ b/onyxia-model/pom.xml @@ -39,7 +39,7 @@ org.springdoc springdoc-openapi-starter-common - 2.10.0 + 3.2.0 diff --git a/pom.xml b/pom.xml index 2746b3ba..c4251c80 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.16 + 4.1.2 onyxia-model