20
20
21
21
package org .springdoc .api ;
22
22
23
+ import java .util .ArrayList ;
23
24
import java .util .HashMap ;
24
25
import java .util .List ;
25
26
import java .util .Locale ;
43
44
import org .mockito .junit .jupiter .MockitoExtension ;
44
45
import org .springdoc .core .customizers .OpenApiCustomizer ;
45
46
import org .springdoc .core .customizers .OperationCustomizer ;
47
+ import org .springdoc .core .customizers .ServerBaseUrlCustomizer ;
46
48
import org .springdoc .core .filters .OpenApiMethodFilter ;
47
49
import org .springdoc .core .fn .RouterOperation ;
48
50
import org .springdoc .core .properties .SpringDocConfigProperties ;
68
70
import static org .mockito .Mockito .when ;
69
71
import static org .springframework .web .bind .annotation .RequestMethod .GET ;
70
72
73
+
71
74
@ ExtendWith (MockitoExtension .class )
72
75
class AbstractOpenApiResourceTest {
73
76
@@ -111,6 +114,7 @@ public void setUp() {
111
114
openAPI = new OpenAPI ();
112
115
openAPI .setPaths (new Paths ().addPathItem (PATH , new PathItem ()));
113
116
ReflectionTestUtils .setField (openAPIService , "cachedOpenAPI" , new HashMap <>());
117
+ ReflectionTestUtils .setField (openAPIService , "serverBaseUrlCustomizers" , Optional .empty ());
114
118
115
119
when (openAPIService .getCalculatedOpenAPI ()).thenReturn (openAPI );
116
120
when (openAPIService .getContext ()).thenReturn (context );
@@ -187,7 +191,7 @@ void preLoadingModeShouldNotOverwriteServers() throws InterruptedException {
187
191
188
192
String customUrl = "https://custom.com" ;
189
193
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 )));
191
195
SpringDocConfigProperties properties = new SpringDocConfigProperties ();
192
196
properties .setPreLoadingEnabled (true );
193
197
@@ -198,7 +202,7 @@ void preLoadingModeShouldNotOverwriteServers() throws InterruptedException {
198
202
responseBuilder ,
199
203
operationParser ,
200
204
Optional .empty (),
201
- Optional .of (singletonList (openApiCustomizer )),
205
+ Optional .of (singletonList (openApiCustomiser )),
202
206
Optional .empty (),
203
207
properties , springDocProviders
204
208
);
@@ -215,6 +219,71 @@ void preLoadingModeShouldNotOverwriteServers() throws InterruptedException {
215
219
assertThat (after .getServers ().get (0 ).getUrl (), is (customUrl ));
216
220
}
217
221
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
+ }
218
287
219
288
private static class EmptyPathsOpenApiResource extends AbstractOpenApiResource {
220
289
0 commit comments