Openapi-generator: [Java rest-assured] check for “redirect” answer

Created on 13 May 2018  Â·  5Comments  Â·  Source: OpenAPITools/openapi-generator

I have a case, where I need to check if a service is sending a 302 code.
I have generated my client with the java generator, using the rest-assured library.

I was expecting to be able to write something like this:

api.myService().param1Query(“value”).execute(r -> r.thenReturn())
                .then()
                .log().ifValidationFails()
                .assertThat()
                .statusCode(HttpStatus.SC_MOVED_TEMPORARILY)
                .header("Location", "https://example.com/");

This does not work, because by default rest-assured follow the redirect.
I get 200 and the content of https://example.com/.
With Rest-Assured, the solution (1) is to add .redirects().follow(false) after RestAssured.given().

But with the client generated by OpenAPI Generator, it is not possible to access the RequestSpecification created by RestAssured.given() (or I did not find how).

In StoreApiTest.java you will use the generated StoreApi.java (the execute(..) method). This execute(..) creates the RestAssured.given(). But in my test I do not have access to it.

Should the generator be extended to generate two execute methods in order to expose requestSpecification for special cases like mine. Something like this:

public <T> T execute(Function<Response, T> handler) {
    return execute(RestAssured.given(), handler);
}

public <T> T execute(RequestSpecification requestSpecification, Function<Response, T> handler) {
    return handler.apply(requestSpecification.spec(reqSpec.build()).expect().spec(respSpec.build()).when().request(DELETE, REQ_URI));
}

(and the same for executeAs...)

Is there a better solution?

(1) https://groups.google.com/forum/#!msg/rest-assured/Sq_83Hc98Oo/2HUszbc6AgAJ

Java Question

All 5 comments

@viclovsky: since you have added the rest-assured library option in swagger-codegen, you might have an opinion on how I should solve my problem.

In this case you can use reqSpec() method:

api.myService().param1Query(“value”).reqSpec(r -> r.setConfig(RestAssuredConfig.config().redirect(redirectConfig().followRedirects(false)))
                .then()
                .log().ifValidationFails()
                .assertThat()
                .statusCode(HttpStatus.SC_MOVED_TEMPORARILY)
                .header("Location", "https://example.com/");

Also you can set RequestSpecBuilder in Config like this:

ApiClient.Config myApiConfig = ApiClient.Config
                .apiConfig()
                .reqSpecSupplier(
                        () -> new RequestSpecBuilder().setContentType(JSON)
                                .setConfig(config().objectMapperConfig(objectMapperConfig()
                                        .defaultObjectMapper(gson()))
                                        .redirect(redirectConfig().followRedirects(false)))
                );

and you can customise group requests with method reqSpec:

api.groupApi().reqSpec(r -> r.setConfig(RestAssuredConfig.config().redirect(redirectConfig().followRedirects(false)))).myService().execute(...)

I have tried it, but for the moment it does not work for me. I am using 3.0.7...


First approach (.reqSpec(r -> r.build().redirects().follow(false)) in the test case): it did not change anything.


Second approach (.addRequestSpecification(..) in the api config): I get a ConnectException. Here the stacktrace:

java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
    at org.apache.http.client.HttpClient$execute$0.call(Unknown Source)
    at io.restassured.internal.RequestSpecificationImpl$RestAssuredHttpBuilder.doRequest(RequestSpecificationImpl.groovy:2128)
    at io.restassured.internal.http.HTTPBuilder.doRequest(HTTPBuilder.java:494)
    at io.restassured.internal.http.HTTPBuilder.request(HTTPBuilder.java:451)
    at io.restassured.internal.http.HTTPBuilder$request$2.call(Unknown Source)
    at io.restassured.internal.RequestSpecificationImpl.sendHttpRequest(RequestSpecificationImpl.groovy:1531)
    at sun.reflect.GeneratedMethodAccessor445.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:810)
    at io.restassured.internal.RequestSpecificationImpl.invokeMethod(RequestSpecificationImpl.groovy)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:48)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.callCurrent(PogoInterceptableSite.java:58)
    at io.restassured.internal.RequestSpecificationImpl.sendRequest(RequestSpecificationImpl.groovy:1290)
    at sun.reflect.GeneratedMethodAccessor421.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:810)
    at io.restassured.internal.RequestSpecificationImpl.invokeMethod(RequestSpecificationImpl.groovy)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:149)
    at io.restassured.internal.filter.SendRequestFilter.filter(SendRequestFilter.groovy:30)
    at io.restassured.filter.Filter$filter$0.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at io.restassured.filter.Filter$filter.call(Unknown Source)
    at io.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:72)
    at io.restassured.filter.time.TimingFilter.filter(TimingFilter.java:56)
    at io.restassured.filter.Filter$filter.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at io.restassured.filter.Filter$filter.call(Unknown Source)
    at io.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:72)
    at io.restassured.filter.log.RequestLoggingFilter.filter(RequestLoggingFilter.java:124)
    at io.restassured.filter.Filter$filter.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at io.restassured.filter.Filter$filter.call(Unknown Source)
    at io.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:72)
    at io.restassured.filter.log.StatusCodeBasedLoggingFilter.filter(StatusCodeBasedLoggingFilter.java:93)
    at io.restassured.filter.log.ResponseLoggingFilter.filter(ResponseLoggingFilter.java:31)
    at io.restassured.filter.Filter$filter.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at io.restassured.filter.Filter$filter$0.call(Unknown Source)
    at io.restassured.internal.filter.FilterContextImpl.next(FilterContextImpl.groovy:72)
    at io.restassured.filter.FilterContext$next.call(Unknown Source)
    at io.restassured.internal.RequestSpecificationImpl.applyPathParamsAndSendRequest(RequestSpecificationImpl.groovy:1731)
    at sun.reflect.GeneratedMethodAccessor413.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:810)
    at io.restassured.internal.RequestSpecificationImpl.invokeMethod(RequestSpecificationImpl.groovy)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:48)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.callCurrent(PogoInterceptableSite.java:58)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:182)
    at io.restassured.internal.RequestSpecificationImpl.request(RequestSpecificationImpl.groovy:294)
    at io.restassured.internal.RequestSpecificationImpl.request(RequestSpecificationImpl.groovy)
    at sun.reflect.GeneratedMethodAccessor412.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:810)
    at io.restassured.internal.RequestSpecificationImpl.invokeMethod(RequestSpecificationImpl.groovy)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.call(PogoInterceptableSite.java:48)
    at org.codehaus.groovy.runtime.callsite.PogoInterceptableSite.callCurrent(PogoInterceptableSite.java:58)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:182)
    at io.restassured.internal.RequestSpecificationImpl.request(RequestSpecificationImpl.groovy:290)
    at io.restassured.internal.RequestSpecificationImpl.request(RequestSpecificationImpl.groovy)
    at ... <my test case>

Hi, Jmini
Sorry for confusing. Yes, it doesn't work cause of my fault — redirecs should be configured via RestAssured configs. For instance,
reqSpec(r->r.setConfig(RestAssuredConfig.config().redirect(redirectConfig().followRedirects(false)))

Please, check again.

Thank you a lot!

This is working for me:

.reqSpec(r -> r.setConfig(RestAssuredConfig.config().redirect(RestAssuredConfig.config().getRedirectConfig().followRedirects(false))))
Was this page helpful?
0 / 5 - 0 ratings