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"(){}