2020
2121package org .springdoc .api ;
2222
23- import java .util .List ;
24- import java .util .Locale ;
25- import java .util .Map ;
26- import java .util .Optional ;
23+ import java .util .*;
2724
2825import io .swagger .v3 .oas .annotations .enums .ParameterIn ;
2926import io .swagger .v3 .oas .models .OpenAPI ;
3330import io .swagger .v3 .oas .models .media .NumberSchema ;
3431import io .swagger .v3 .oas .models .media .StringSchema ;
3532import io .swagger .v3 .oas .models .parameters .Parameter ;
33+ import io .swagger .v3 .oas .models .servers .Server ;
3634import org .junit .jupiter .api .BeforeEach ;
3735import org .junit .jupiter .api .Test ;
3836import org .junit .jupiter .api .extension .ExtendWith ;
3937import org .mockito .Mock ;
38+ import org .mockito .internal .stubbing .answers .CallsRealMethods ;
4039import org .mockito .junit .jupiter .MockitoExtension ;
41- import org .springdoc .core .AbstractRequestService ;
42- import org .springdoc .core .GenericResponseService ;
43- import org .springdoc .core .OpenAPIService ;
44- import org .springdoc .core .OperationService ;
45- import org .springdoc .core .SpringDocConfigProperties ;
40+ import org .springdoc .core .*;
41+ import org .springdoc .core .customizers .OpenApiCustomiser ;
42+ import org .springdoc .core .customizers .OperationCustomizer ;
4643import org .springdoc .core .fn .RouterOperation ;
4744
4845import org .springframework .beans .factory .ObjectFactory ;
4946import org .springframework .context .ApplicationContext ;
5047import org .springframework .web .bind .annotation .RequestMethod ;
5148
5249import static java .util .Arrays .asList ;
50+ import static java .util .Collections .singletonList ;
5351import static org .hamcrest .MatcherAssert .assertThat ;
5452import static org .hamcrest .Matchers .containsInAnyOrder ;
5553import static org .hamcrest .Matchers .is ;
5654import static org .hamcrest .Matchers .nullValue ;
55+ import static org .mockito .ArgumentMatchers .any ;
56+ import static org .mockito .Mockito .doAnswer ;
5757import static org .mockito .Mockito .when ;
5858import static org .springframework .web .bind .annotation .RequestMethod .GET ;
5959
@@ -97,8 +97,11 @@ public void setUp() {
9797 when (openAPIService .getContext ()).thenReturn (context );
9898
9999 when (openAPIBuilderObjectFactory .getObject ()).thenReturn (openAPIService );
100+ }
100101
101- resource = new AbstractOpenApiResource (
102+ @ Test
103+ void calculatePathFromRouterOperation () {
104+ resource = new EmptyPathsOpenApiResource (
102105 GROUP_NAME ,
103106 openAPIBuilderObjectFactory ,
104107 requestBuilder ,
@@ -108,15 +111,8 @@ public void setUp() {
108111 Optional .empty (),
109112 new SpringDocConfigProperties (),
110113 Optional .empty ()
111- ) {
114+ );
112115
113- @ Override
114- protected void getPaths (final Map <String , Object > findRestControllers , Locale locale ) { }
115- };
116- }
117-
118- @ Test
119- void calculatePathFromRouterOperation () {
120116 final Parameter refParameter = new Parameter ().$ref (PARAMETER_REFERENCE );
121117
122118 final Parameter numberParameterInPath = new Parameter ()
@@ -160,4 +156,54 @@ void calculatePathFromRouterOperation() {
160156 assertThat (parameterWithoutSchema .getSchema (), is (new StringSchema ()));
161157 assertThat (parameterWithoutSchema .getIn (), is (ParameterIn .QUERY .toString ()));
162158 }
159+
160+ @ Test
161+ void preLoadingModeShouldNotOverwriteServers () throws InterruptedException {
162+ when (openAPIService .updateServers (any ())).thenCallRealMethod ();
163+ when (openAPIService .getCachedOpenAPI ()).thenCallRealMethod ();
164+ doAnswer (new CallsRealMethods ()).when (openAPIService ).setServersPresent (true );
165+ doAnswer (new CallsRealMethods ()).when (openAPIService ).setServerBaseUrl (any ());
166+ doAnswer (new CallsRealMethods ()).when (openAPIService ).setCachedOpenAPI (any ());
167+
168+ String customUrl = "https://custom.com" ;
169+ String generatedUrl = "https://generated.com" ;
170+ OpenApiCustomiser openApiCustomiser = openApi -> openApi .setServers (singletonList (new Server ().url (customUrl )));
171+ SpringDocConfigProperties properties = new SpringDocConfigProperties ();
172+ properties .setPreLoadingEnabled (true );
173+
174+ resource = new EmptyPathsOpenApiResource (
175+ GROUP_NAME ,
176+ openAPIBuilderObjectFactory ,
177+ requestBuilder ,
178+ responseBuilder ,
179+ operationParser ,
180+ Optional .empty (),
181+ Optional .of (singletonList (openApiCustomiser )),
182+ properties ,
183+ Optional .empty ()
184+ );
185+
186+ // wait for executor to be done
187+ Thread .sleep (1_000 );
188+
189+ // emulate generating base url
190+ openAPIService .setServerBaseUrl (generatedUrl );
191+ openAPIService .updateServers (openAPI );
192+
193+ OpenAPI after = resource .getOpenApi (Locale .getDefault ());
194+
195+ assertThat (after .getServers ().get (0 ).getUrl (), is (customUrl ));
196+ }
197+
198+
199+ private static class EmptyPathsOpenApiResource extends AbstractOpenApiResource {
200+
201+ EmptyPathsOpenApiResource (String groupName , ObjectFactory <OpenAPIService > openAPIBuilderObjectFactory , AbstractRequestService requestBuilder , GenericResponseService responseBuilder , OperationService operationParser , Optional <List <OperationCustomizer >> operationCustomizers , Optional <List <OpenApiCustomiser >> openApiCustomisers , SpringDocConfigProperties springDocConfigProperties , Optional <ActuatorProvider > actuatorProvider ) {
202+ super (groupName , openAPIBuilderObjectFactory , requestBuilder , responseBuilder , operationParser , operationCustomizers , openApiCustomisers , springDocConfigProperties , actuatorProvider );
203+ }
204+
205+ @ Override
206+ public void getPaths (Map <String , Object > findRestControllers , Locale locale ) {
207+ }
208+ }
163209}
0 commit comments