I am trying to use the Groovy HTTPBuilder to write an integration test that will verify a correct error message is returned in the body along with an HTTP 409 status message. However, I can't figure out how to actually access the body of the HTTP response in failure cases.
http.request(ENV_URL, Method.POST, ContentType.TEXT) {
uri.path = "/curate/${id}/submit"
contentType = ContentType.JSON
response.failure = { failresp_inner ->
failresp = failresp_inner
}
}
then:
assert failresp.status == 409
// I would like something like
//assert failresp.data == "expected error message"
This is what the HTTP response from the server looks like:
2013-11-13 18:17:58,726 DEBUG wire - << "HTTP/1.1 409 Conflict[\r][\n]"
2013-11-13 18:17:58,726 DEBUG wire - << "Date: Wed, 13 Nov 2013 23:17:58 GMT[\r][\n]"
2013-11-13 18:17:58,726 DEBUG wire - << "Content-Type: text/plain[\r][\n]"
2013-11-13 18:17:58,726 DEBUG wire - << "Transfer-Encoding: chunked[\r][\n]"
2013-11-13 18:17:58,727 DEBUG wire - << "[\r][\n]"
2013-11-13 18:17:58,728 DEBUG wire - << "E[\r][\n]"
2013-11-13 18:17:58,728 DEBUG wire - << "expected error message"
2013-11-13 18:17:58,728 DEBUG wire - << "[\r][\n]"
2013-11-13 18:17:58,728 DEBUG wire - << "0[\r][\n]"
2013-11-13 18:17:58,728 DEBUG wire - << "[\r][\n]"
I also struggled with this when I started using HttpBuilder. The solution I came up with was to define the HTTPBuilder success and failure closures to return consistent values like this:
Thusly defined, your HTTPBuilder instance will consistently return a map containing a response object (an instance of HttpResponseDecorator) and a reader object. Your request would then look like this:
The reader will be some kind of object that'll give you access to the response body, the type of which you can determine by calling the getClass() method:
The reader object's type will be determined by the Content-Type header in the response. You can tell the server specifically what you'd like returned by adding an "Accept" header to the request.
Does it work if you use:
I was recently just struggling with this while trying to integration test my REST endpoints using Spock. I used Sam's answer as inspiration and ended up improving on it so as to continue leveraging the auto-casting that HttpBuilder provides. After messing around for a while, I had the bright idea of just assigning the success handler closure to the failure handler to standardize the behavior regardless of what status code is returned.
An example of it in action: