javatestingplayframeworkplayframework-2.0ws-client

How to create a WSResponse object from string for Play WSClient


Documentation suggests testing API client based on WSClient using a mock web service, that is, create a play.server.Server which will respond to real HTTP requests.

I would prefer to create WSResponse objects directly from files, complete with status line, header lines and body, without real TCP connections. That would require less dependencies and run faster. Also there may be other cases when this is useful.

But I can't find a simple way to do it. It seems all implementations wrapped by WSResponse are tied to reading from network.

Should I just create my own subclass of WSResponse for this, or maybe I'm wrong and it already exists?


Solution

  • The API for Play seems intentionally obtuse. You have to use their "Cacheable" classes, which are the only ones that seem directly instantiable from objects you'd have lying around.

    This should get you started:

    import play.api.libs.ws.ahc.AhcWSResponse;
    import play.api.libs.ws.ahc.cache.CacheableHttpResponseBodyPart;
    import play.api.libs.ws.ahc.cache.CacheableHttpResponseHeaders;
    import play.api.libs.ws.ahc.cache.CacheableHttpResponseStatus;
    import play.shaded.ahc.io.netty.handler.codec.http.DefaultHttpHeaders;
    import play.shaded.ahc.org.asynchttpclient.Response;
    import play.shaded.ahc.org.asynchttpclient.uri.Uri;
    
    AhcWSResponse response = new AhcWSResponse(new Response.ResponseBuilder()
            .accumulate(new CacheableHttpResponseStatus(Uri.create("uri"), 200, "status text", "protocols!"))
            .accumulate(new CacheableHttpResponseHeaders(false, new DefaultHttpHeaders().add("My-Header", "value")))
            .accumulate(new CacheableHttpResponseBodyPart("my body".getBytes(), true))
            .build());
    

    The mystery boolean values aren't documented. My guess is the boolean for BodyPart is whether that is the last part of the body. My guess for Headers is whether the headers are in the trailer of a message.