From ff3e00d1b48b64091e07436a035fad6a88721f25 Mon Sep 17 00:00:00 2001 From: "Mathieu AMBLARD (u118971)" Date: Tue, 17 Oct 2023 15:59:18 +0200 Subject: [PATCH] Update condition to register links schema customizer, fixes #2359 --- .../SpringDocHateoasConfiguration.java | 4 +- .../SpringDocHateoasConfigurationTest.java | 84 +++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 springdoc-openapi-starter-common/src/test/java/org/springdoc/core/configuration/SpringDocHateoasConfigurationTest.java diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocHateoasConfiguration.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocHateoasConfiguration.java index 94da82d15..54f13f9b2 100644 --- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocHateoasConfiguration.java +++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocHateoasConfiguration.java @@ -97,11 +97,11 @@ CollectionModelContentConverter collectionModelContentConverter(HateoasHalProvid * @param halProvider the hal provider * @param springDocConfigProperties the spring doc config properties * @param objectMapperProvider the object mapper provider - * @return the open api customiser + * @return the open api customizer * @see org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize(Links, JsonGenerator, SerializerProvider) org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize(Links, JsonGenerator, SerializerProvider)org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize(Links, JsonGenerator, SerializerProvider)org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize(Links, JsonGenerator, SerializerProvider)org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize(Links, JsonGenerator, SerializerProvider)org.springframework.hateoas.mediatype.hal.Jackson2HalModule.HalLinkListSerializer#serialize(Links, JsonGenerator, SerializerProvider) */ @Bean(Constants.LINKS_SCHEMA_CUSTOMISER) - @ConditionalOnMissingBean + @ConditionalOnMissingBean(name = Constants.LINKS_SCHEMA_CUSTOMISER) @Lazy(false) GlobalOpenApiCustomizer linksSchemaCustomizer(HateoasHalProvider halProvider, SpringDocConfigProperties springDocConfigProperties, ObjectMapperProvider objectMapperProvider) { diff --git a/springdoc-openapi-starter-common/src/test/java/org/springdoc/core/configuration/SpringDocHateoasConfigurationTest.java b/springdoc-openapi-starter-common/src/test/java/org/springdoc/core/configuration/SpringDocHateoasConfigurationTest.java new file mode 100644 index 000000000..156fc33d0 --- /dev/null +++ b/springdoc-openapi-starter-common/src/test/java/org/springdoc/core/configuration/SpringDocHateoasConfigurationTest.java @@ -0,0 +1,84 @@ +package org.springdoc.core.configuration; + +import org.junit.jupiter.api.Test; +import org.springdoc.core.customizers.GlobalOpenApiCustomizer; +import org.springdoc.core.customizers.OpenApiHateoasLinksCustomizer; +import org.springdoc.core.properties.SpringDocConfigProperties; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +import org.springframework.hateoas.config.HateoasConfiguration; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.springdoc.core.utils.Constants.LINKS_SCHEMA_CUSTOMISER; + +class SpringDocHateoasConfigurationTest { + + @Test + void linksSchemaCustomizerShouldBeRegistered() { + new WebApplicationContextRunner() + .withPropertyValues( + "springdoc.api-docs.enabled=true", + "springdoc.enable-hateoas=true" + ) + .withConfiguration(AutoConfigurations.of( + WebMvcAutoConfiguration.class, + HateoasConfiguration.class, + SpringDocConfiguration.class, + SpringDocConfigProperties.class, + SpringDocHateoasConfiguration.class + )) + .run(context -> { + assertThat(context).getBeanNames(GlobalOpenApiCustomizer.class) + .hasSize(1) + .containsExactly(LINKS_SCHEMA_CUSTOMISER); + assertThat(context.getBean(LINKS_SCHEMA_CUSTOMISER)).isExactlyInstanceOf(OpenApiHateoasLinksCustomizer.class); + }); + } + + @Test + void linksSchemaCustomizerShouldBeRegisteredWithMultipleGlobalOpenApiCustomizer() { + new WebApplicationContextRunner() + .withPropertyValues( + "springdoc.api-docs.enabled=true", + "springdoc.enable-hateoas=true" + ) + .withConfiguration(AutoConfigurations.of( + WebMvcAutoConfiguration.class, + HateoasConfiguration.class, + SpringDocConfiguration.class, + SpringDocConfigProperties.class, + SpringDocHateoasConfiguration.class + )) + .withBean("globalOpenApiCustomizer", GlobalOpenApiCustomizer.class, () -> mock(GlobalOpenApiCustomizer.class)) + .run(context -> { + assertThat(context).getBeanNames(GlobalOpenApiCustomizer.class) + .hasSize(2) + .containsExactlyInAnyOrder(LINKS_SCHEMA_CUSTOMISER, "globalOpenApiCustomizer"); + }); + } + + @Test + void linksSchemaCustomizerShouldNotBeRegisteredIfBeanWithSameNameAlreadyExists() { + new WebApplicationContextRunner() + .withPropertyValues( + "springdoc.api-docs.enabled=true", + "springdoc.enable-hateoas=true" + ) + .withConfiguration(AutoConfigurations.of( + WebMvcAutoConfiguration.class, + HateoasConfiguration.class, + SpringDocConfiguration.class, + SpringDocConfigProperties.class, + SpringDocHateoasConfiguration.class + )) + .withBean(LINKS_SCHEMA_CUSTOMISER, GlobalOpenApiCustomizer.class, () -> mock(GlobalOpenApiCustomizer.class)) + .run(context -> { + assertThat(context).getBeanNames(GlobalOpenApiCustomizer.class) + .hasSize(1) + .containsExactly(LINKS_SCHEMA_CUSTOMISER); + assertThat(context.getBean(LINKS_SCHEMA_CUSTOMISER)).isNotExactlyInstanceOf(OpenApiHateoasLinksCustomizer.class); + }); + } +} \ No newline at end of file