From e9eb6b55e1bcd1ea1c93c7289c2addb6a01f2ae6 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 13 Dec 2014 13:14:24 +0100 Subject: [PATCH] Add query parameters validation --- .../mockserver/server/ContextExecutor.groovy | 10 +++++-- .../mockserver/server/HttpMockServer.groovy | 4 +++ .../pl/touk/mockserver/server/Mock.groovy | 2 +- .../client/AddMockRequestData.groovy | 5 ++++ .../client/ControlServerClient.groovy | 1 + .../server/MockServerIntegrationTest.groovy | 29 +++++++++++++++++-- 6 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy index d9df1df..d67727c 100644 --- a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -17,6 +17,12 @@ class ContextExecutor { httpServerWraper.createContext(path, { HttpExchange ex -> String input = ex.requestBody.text + Map queryParams = ex.requestURI.query?.split('&')?.collectEntries { + String[] keyValue = it.split('='); [(keyValue[0]): keyValue[1]] + } ?: [:] + Map headers = ex.requestHeaders.collectEntries { + [it.key.toLowerCase(), it.value.join(',')] + } println "Mock received input" for (Mock mock : mocks) { try { @@ -28,10 +34,10 @@ class ContextExecutor { continue } } - Map headers = ex.requestHeaders.collectEntries { [it.key.toLowerCase(), it.value.join(',')] } if (ex.requestMethod == mock.method && mock.predicate(xml) && - mock.requestHeaders(headers)) { + mock.requestHeaders(headers) && + mock.queryParams(queryParams)) { println "Mock ${mock.name} invoked" ++mock.counter String response = mock.responseOk(xml) diff --git a/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy index 7ef83b2..6515bc8 100644 --- a/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -69,6 +69,10 @@ class HttpMockServer { if(requestHeaders){ mock.requestHeaders = Eval.me(requestHeaders) as Closure } + String queryParams = request.queryParams + if(queryParams){ + mock.queryParams = Eval.me(queryParams) 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 a94ee1e..3f42636 100644 --- a/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -14,8 +14,8 @@ class Mock { String method = 'POST' Closure requestHeaders = {hs -> true} Closure responseHeaders = {xml -> [:]} + Closure queryParams = {qs -> true} int counter = 0 - //TODO add historical invocations Mock(String name, String path, int port) { this.name = name diff --git a/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy b/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy index a2aa728..a41fde2 100644 --- a/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy +++ b/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy @@ -13,6 +13,7 @@ class AddMockRequestData { Method method String responseHeaders String requestHeaders + String queryParams void setPredicate(String predicate) { this.predicate = StringEscapeUtils.escapeXml11(predicate) @@ -30,6 +31,10 @@ class AddMockRequestData { this.requestHeaders = StringEscapeUtils.escapeXml11(requestHeaders) } + void setQueryParams(String queryParams) { + this.queryParams = StringEscapeUtils.escapeXml11(queryParams) + } + 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 576f1ab..fcbfc5c 100644 --- a/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy +++ b/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy @@ -62,6 +62,7 @@ class ControlServerClient { ${data.method ? "${data.method}" : ''} ${data.responseHeaders ? "${data.responseHeaders}" : ''} ${data.requestHeaders ? "${data.requestHeaders}" : ''} + ${data.queryParams ? "${data.queryParams}" : ''} """, 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 8ecc9a3..c34abbe 100644 --- a/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy +++ b/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy @@ -453,7 +453,7 @@ class MockServerIntegrationTest extends Specification { restPostResponse.name() == 'goodResponse' } - def "should add mock that accepts only when certain headers exists"() { + def "should add mock that accepts only when certain request headers exists"() { given: controlServerClient.addMock(new AddMockRequestData( name: 'testRest', @@ -482,8 +482,31 @@ class MockServerIntegrationTest extends Specification { restPostResponse.name() == 'goodResponse' } - //TODO def "should dispatch rest mock with get method and query params"(){} - //TODO def "should dispatch rest mock with get method and parameters"(){} + def "should add mock that accepts only when certain query params exists"() { + given: + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest', + path: '/testEndpoint', + port: 9999, + response: '''{xml -> ""}''', + queryParams: '''{ qp -> qp['q'] == '15' && + qp.id == '1'}''' + )) + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint?q=15&id=1') + HttpPost badRestPost = new HttpPost('http://localhost:9999/testEndpoint?q=15&id=2') + when: + CloseableHttpResponse badResponse = client.execute(badRestPost) + then: + GPathResult badRestPostResponse = Util.extractXmlResponse(badResponse) + badRestPostResponse.name() == 'invalidInput' + when: + CloseableHttpResponse response = client.execute(restPost) + then: + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'goodResponse' + } + + //TODO def "should dispatch rest mock with post method and parameters"(){} //TODO def "should dispatch rest mock with post method, response headers and request headers"(){} //TODO def "should get mock report"(){}