Skip to content

Commit

Permalink
Feature/cache environment based docket (#421)
Browse files Browse the repository at this point in the history
* cache 'effective' Docket instance in DefaultAsyncApiDocketService

* test caching of dockets in DefaultAsyncApiDocketServiceTest.java

Took 6 hours 16 minutes

* refactor(core): extract createDocket method in DefaultAsyncApiDocketService

Co-authored-by: sam0r040 <[email protected]>

---------

Co-authored-by: Thomas Vahrst <[email protected]>
Co-authored-by: sam0r040 <[email protected]>
  • Loading branch information
3 people authored Oct 27, 2023
1 parent d76ecb1 commit 0e3009c
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,32 @@ public class DefaultAsyncApiDocketService implements AsyncApiDocketService {
*/
private final SpringwolfConfigProperties configProperties;

/**
* valid Docket instance, either reference to customDocket (if set) or environment based Docket.
* Lazy initialized on first invocation of getAsyncApiDocket().
*/
@Nullable
private AsyncApiDocket docket;

@Override
public AsyncApiDocket getAsyncApiDocket() {
if (docket == null) {
createDocket();
}
return docket;
}

private void createDocket() {
if (customDocket.isPresent()) {
log.debug("Reading springwolf configuration from custom defined @Bean AsyncApiDocket");
return customDocket.get();
docket = customDocket.get();
} else {
log.debug("Reading springwolf configuration from application.properties files");
return parseApplicationConfigProperties(configProperties);
docket = parseApplicationConfigProperties();
}
}

private AsyncApiDocket parseApplicationConfigProperties(SpringwolfConfigProperties configProperties) {
private AsyncApiDocket parseApplicationConfigProperties() {
if (configProperties.getDocket() == null || configProperties.getDocket().getBasePackage() == null) {
throw new IllegalArgumentException(
"One or more required fields (docket, basePackage) " + "in application.properties with path prefix "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
class DefaultAsyncApiDocketServiceTest {

@Test
void testConfigurationShouldMapAllPropertiesToTheDocket() {
void testServiceShouldMapAllPropertiesToTheDocket() {
// given
ConfigDocket configDocket = new ConfigDocket();
configDocket.setBasePackage("test-base-package");
Expand All @@ -39,10 +39,10 @@ void testConfigurationShouldMapAllPropertiesToTheDocket() {
SpringwolfConfigProperties properties = new SpringwolfConfigProperties();
properties.setDocket(configDocket);

AsyncApiDocketService docketService = new DefaultAsyncApiDocketService(Optional.empty(), properties);

// when
DefaultAsyncApiDocketService docketConfiguration =
new DefaultAsyncApiDocketService(Optional.empty(), properties);
AsyncApiDocket asyncApiDocket = docketConfiguration.getAsyncApiDocket();
AsyncApiDocket asyncApiDocket = docketService.getAsyncApiDocket();

// then
assertThat(asyncApiDocket.getDefaultContentType()).isEqualTo(configDocket.getDefaultContentType());
Expand All @@ -53,4 +53,63 @@ void testConfigurationShouldMapAllPropertiesToTheDocket() {
assertThat(asyncApiDocket.getInfo().getLicense()).isEqualTo(info.getLicense());
assertThat(asyncApiDocket.getInfo().getContact()).isEqualTo(info.getContact());
}

@Test
void docketServiceShouldDeliverCachedConfigDocketBean() {
// repeatable invocations of AsyncApiDocketService.getAsyncApiDocket() should return the same docket instance
// if a ConfigDocket @Bean is present.

// given
AsyncApiDocket customDocket = AsyncApiDocket.builder()
.basePackage("test-base-package")
.info(com.asyncapi.v2._6_0.model.info.Info.builder()
.title("some-title")
.version("some-version")
.build())
.build();

SpringwolfConfigProperties configProperties = new SpringwolfConfigProperties();

AsyncApiDocketService docketService =
new DefaultAsyncApiDocketService(Optional.of(customDocket), configProperties);

// when
AsyncApiDocket asyncApiDocket = docketService.getAsyncApiDocket();

// then
// second invocation should again return same instance
assertThat(docketService.getAsyncApiDocket()).isSameAs(asyncApiDocket);
}

@Test
void docketServiceShouldDeliverCachedSpringPropertiesBasedDocket() {
// repeatable invocations of AsyncApiDocketService.getAsyncApiDocket() should return the same docket instance
// if docket is based on environment properties.

// given
ConfigDocket configDocket = new ConfigDocket();
configDocket.setBasePackage("test-base-package");
configDocket.setDefaultContentType("application/json");

Info info = new Info();
info.setTitle("some-title");
info.setVersion("some-version");
configDocket.setInfo(info);

Server server =
Server.builder().protocol("some-protocol").url("some-url").build();
configDocket.setServers(newHashMap("some-protocol", server));

SpringwolfConfigProperties configProperties = new SpringwolfConfigProperties();
configProperties.setDocket(configDocket);

AsyncApiDocketService docketService = new DefaultAsyncApiDocketService(Optional.empty(), configProperties);

// when
AsyncApiDocket asyncApiDocket = docketService.getAsyncApiDocket();

// then
// second invocation should again return same instance
assertThat(docketService.getAsyncApiDocket()).isSameAs(asyncApiDocket);
}
}

0 comments on commit 0e3009c

Please sign in to comment.