2020
2121package org .springdoc .api ;
2222
23+ import java .util .ArrayList ;
2324import java .util .HashMap ;
2425import java .util .List ;
2526import java .util .Locale ;
4344import org .mockito .junit .jupiter .MockitoExtension ;
4445import org .springdoc .core .customizers .OpenApiCustomizer ;
4546import org .springdoc .core .customizers .OperationCustomizer ;
47+ import org .springdoc .core .customizers .ServerBaseUrlCustomizer ;
4648import org .springdoc .core .filters .OpenApiMethodFilter ;
4749import org .springdoc .core .fn .RouterOperation ;
4850import org .springdoc .core .properties .SpringDocConfigProperties ;
6870import static org .mockito .Mockito .when ;
6971import static org .springframework .web .bind .annotation .RequestMethod .GET ;
7072
73+
7174@ ExtendWith (MockitoExtension .class )
7275class AbstractOpenApiResourceTest {
7376
@@ -111,6 +114,7 @@ public void setUp() {
111114 openAPI = new OpenAPI ();
112115 openAPI .setPaths (new Paths ().addPathItem (PATH , new PathItem ()));
113116 ReflectionTestUtils .setField (openAPIService , "cachedOpenAPI" , new HashMap <>());
117+ ReflectionTestUtils .setField (openAPIService , "serverBaseUrlCustomizers" , Optional .empty ());
114118
115119 when (openAPIService .getCalculatedOpenAPI ()).thenReturn (openAPI );
116120 when (openAPIService .getContext ()).thenReturn (context );
@@ -187,7 +191,7 @@ void preLoadingModeShouldNotOverwriteServers() throws InterruptedException {
187191
188192 String customUrl = "https://custom.com" ;
189193 String generatedUrl = "https://generated.com" ;
190- OpenApiCustomizer openApiCustomizer = openApi -> openApi .setServers (singletonList (new Server ().url (customUrl )));
194+ OpenApiCustomizer openApiCustomiser = openApi -> openApi .setServers (singletonList (new Server ().url (customUrl )));
191195 SpringDocConfigProperties properties = new SpringDocConfigProperties ();
192196 properties .setPreLoadingEnabled (true );
193197
@@ -198,7 +202,7 @@ void preLoadingModeShouldNotOverwriteServers() throws InterruptedException {
198202 responseBuilder ,
199203 operationParser ,
200204 Optional .empty (),
201- Optional .of (singletonList (openApiCustomizer )),
205+ Optional .of (singletonList (openApiCustomiser )),
202206 Optional .empty (),
203207 properties , springDocProviders
204208 );
@@ -215,6 +219,71 @@ void preLoadingModeShouldNotOverwriteServers() throws InterruptedException {
215219 assertThat (after .getServers ().get (0 ).getUrl (), is (customUrl ));
216220 }
217221
222+ @ Test
223+ void serverBaseUrlCustomisersTest () throws InterruptedException {
224+ when (openAPIService .updateServers (any ())).thenCallRealMethod ();
225+ when (openAPIService .getCachedOpenAPI (any ())).thenCallRealMethod ();
226+ doAnswer (new CallsRealMethods ()).when (openAPIService ).setServerBaseUrl (any ());
227+ doAnswer (new CallsRealMethods ()).when (openAPIService ).setCachedOpenAPI (any (), any ());
228+
229+ SpringDocConfigProperties properties = new SpringDocConfigProperties ();
230+ properties .setPreLoadingEnabled (true );
231+
232+ resource = new EmptyPathsOpenApiResource (
233+ GROUP_NAME ,
234+ openAPIBuilderObjectFactory ,
235+ requestBuilder ,
236+ responseBuilder ,
237+ operationParser ,
238+ Optional .empty (),
239+ Optional .empty (),
240+ Optional .empty (),
241+ properties ,
242+ springDocProviders
243+ );
244+
245+ // wait for executor to be done
246+ Thread .sleep (1_000 );
247+
248+ Locale locale = Locale .US ;
249+
250+ // Test that setting generated URL works fine with no customizers present
251+ String generatedUrl = "https://generated-url.com/context-path" ;
252+ openAPIService .setServerBaseUrl (generatedUrl );
253+ openAPIService .updateServers (openAPI );
254+ OpenAPI after = resource .getOpenApi (locale );
255+ assertThat (after .getServers ().get (0 ).getUrl (), is (generatedUrl ));
256+
257+ // Test that adding a serverBaseUrlCustomizer has the desired effect
258+ ServerBaseUrlCustomizer serverBaseUrlCustomizer = serverBaseUrl -> serverBaseUrl .replace ("/context-path" , "" );
259+ List <ServerBaseUrlCustomizer > serverBaseUrlCustomizerList = new ArrayList <>();
260+ serverBaseUrlCustomizerList .add (serverBaseUrlCustomizer );
261+
262+ ReflectionTestUtils .setField (openAPIService , "serverBaseUrlCustomizers" , Optional .of (serverBaseUrlCustomizerList ));
263+ openAPIService .setServerBaseUrl (generatedUrl );
264+ openAPIService .updateServers (openAPI );
265+ after = resource .getOpenApi (locale );
266+ assertThat (after .getServers ().get (0 ).getUrl (), is ("https://generated-url.com" ));
267+
268+ // Test that serverBaseUrlCustomisers are performed in order
269+ generatedUrl = "https://generated-url.com/context-path/second-path" ;
270+ ServerBaseUrlCustomizer serverBaseUrlCustomiser2 = serverBaseUrl -> serverBaseUrl .replace ("/context-path/second-path" , "" );
271+ serverBaseUrlCustomizerList .add (serverBaseUrlCustomiser2 );
272+
273+ openAPIService .setServerBaseUrl (generatedUrl );
274+ openAPIService .updateServers (openAPI );
275+ after = resource .getOpenApi (locale );
276+ assertThat (after .getServers ().get (0 ).getUrl (), is ("https://generated-url.com/second-path" ));
277+
278+ // Test that all serverBaseUrlCustomisers in the List are performed
279+ ServerBaseUrlCustomizer serverBaseUrlCustomiser3 = serverBaseUrl -> serverBaseUrl .replace ("/second-path" , "" );
280+ serverBaseUrlCustomizerList .add (serverBaseUrlCustomiser3 );
281+
282+ openAPIService .setServerBaseUrl (generatedUrl );
283+ openAPIService .updateServers (openAPI );
284+ after = resource .getOpenApi (locale );
285+ assertThat (after .getServers ().get (0 ).getUrl (), is ("https://generated-url.com" ));
286+ }
218287
219288 private static class EmptyPathsOpenApiResource extends AbstractOpenApiResource {
220289
0 commit comments