From 3b6e4c8fafd4f333152a9439883b31b8fbfef261 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Thu, 11 Dec 2014 22:52:46 +0100 Subject: [PATCH] Add support for response headers --- .../mockserver/server/ContextExecutor.groovy | 3 ++- .../mockserver/server/HttpMockServer.groovy | 4 ++++ .../pl/touk/mockserver/server/Mock.groovy | 2 +- .../client/AddMockRequestData.groovy | 5 ++++ .../client/ControlServerClient.groovy | 1 + .../server/MockServerIntegrationTest.groovy | 23 +++++++++++++++++-- 6 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy index 5cc4873..6dea468 100644 --- a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -29,10 +29,11 @@ class ContextExecutor { } } if (ex.requestMethod == mock.method && mock.predicate(xml)) { - ex.sendResponseHeaders(mock.statusCode, 0) println "Mock ${mock.name} invoked" ++mock.counter String response = mock.responseOk(xml) + mock.responseHeaders(xml).each { ex.responseHeaders.add(it.key as String, it.value as String)} + ex.sendResponseHeaders(mock.statusCode, 0) ex.responseBody << (mock.soap ? wrapSoap(response) : response) ex.responseBody.close() return diff --git a/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy index 1757c3f..ca53bb0 100644 --- a/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -61,6 +61,10 @@ class HttpMockServer { if(method){ mock.method = method } + String responseHeaders = request.responseHeaders + if(responseHeaders){ + mock.responseHeaders = Eval.me(responseHeaders) as Closure + } HttpServerWraper child = childServers.find { it.port == mockPort } if (!child) { child = new HttpServerWraper(mockPort) diff --git a/src/main/groovy/pl/touk/mockserver/server/Mock.groovy b/src/main/groovy/pl/touk/mockserver/server/Mock.groovy index 9f21d6b..2ae87cb 100644 --- a/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -13,7 +13,7 @@ class Mock { int statusCode = 200 String method = 'POST' //TODO add request headers - default [:] - //TODO add response headers - default [:] + Closure responseHeaders = {xml -> [:]} int counter = 0 //TODO add historical invocations diff --git a/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy b/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy index 003381f..e386d2d 100644 --- a/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy +++ b/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy @@ -11,6 +11,7 @@ class AddMockRequestData { Boolean soap Integer statusCode Method method + String responseHeaders void setPredicate(String predicate) { this.predicate = StringEscapeUtils.escapeXml11(predicate) @@ -20,6 +21,10 @@ class AddMockRequestData { this.response = StringEscapeUtils.escapeXml11(response) } + void setResponseHeaders(String responseHeaders) { + this.responseHeaders = StringEscapeUtils.escapeXml11(responseHeaders) + } + enum Method { POST, GET, diff --git a/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy b/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy index 9aa6976..4e6f021 100644 --- a/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy +++ b/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy @@ -60,6 +60,7 @@ class ControlServerClient { ${data.soap != null ? "${data.soap}" : ''} ${data.statusCode ? "${data.statusCode}" : ''} ${data.method ? "${data.method}" : ''} + ${data.responseHeaders ? "${data.responseHeaders}" : ''} """, ContentType.create("text/xml", "UTF-8")) } diff --git a/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy b/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy index 1d01a52..2edd88f 100644 --- a/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy +++ b/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy @@ -336,7 +336,6 @@ class MockServerIntegrationTest extends Specification { then: response.statusLine.statusCode == 200 EntityUtils.consumeQuietly(response.entity) - //TODO check headers } def "should dispatch rest mock with options method"() { @@ -434,8 +433,28 @@ class MockServerIntegrationTest extends Specification { secondXmlResponse.name() == 'goodResponseRest1' } + def "should add mock that return headers"() { + given: + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest', + path: '/testEndpoint', + port: 9999, + predicate: '''{xml -> xml.name() == 'request'}''', + response: '''{xml -> ""}''', + responseHeaders: '''{ xml -> [input:"${xml.name()}"]}''' + )) + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + when: + CloseableHttpResponse response = client.execute(restPost) + then: + response.allHeaders.findAll { it.name == 'Input' && it.value == 'request' } + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'goodResponse' + } + //TODO def "should dispatch rest mock with post method and request headers"(){} - //TODO def "should dispatch rest mock with post method and response headers"(){} + //TODO def "should dispatch rest mock with post method, response headers and request headers"(){} //TODO def "should get mock report"(){} //TODO def "should get list mocks"(){}