From a9a896827e8305ea0c43f1fa772b4d62852aec48 Mon Sep 17 00:00:00 2001 From: Dominik Przybysz Date: Wed, 21 Jan 2015 14:44:26 +0100 Subject: [PATCH] Refactor client name and add peek operation --- README.md | 59 +++++- .../client/PeekMockRequestData.groovy | 10 + ...rClient.groovy => RemoteMockServer.groovy} | 25 ++- mockserver-tests/pom.xml | 2 +- .../tests/MockServerIntegrationTest.groovy | 185 ++++++++++++------ .../touk/mockserver/tests/ServerMockPT.groovy | 4 +- .../mockserver/server/ContextExecutor.groovy | 8 + .../mockserver/server/HttpMockServer.groovy | 78 +++++--- .../mockserver/server/HttpServerWraper.groovy | 4 + pom.xml | 2 +- 10 files changed, 287 insertions(+), 90 deletions(-) create mode 100644 mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy rename mockserver-client/src/main/groovy/pl/touk/mockserver/client/{ControlServerClient.groovy => RemoteMockServer.groovy} (80%) diff --git a/README.md b/README.md index b17fb39..7fe36ad 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,61 @@ Response with error message if failure: ... ``` -## When mock was used it could be unregistered by name. It returns report of mock invocations. +## Mock could be peeked to get get report of its invocations. +Via client: + +``` +List mockEvents = controlServerClient.peekMock('...') +``` + +Via sending POST request to localhost:/serverControl + +``` + + ... + +``` + +Response if success: + +``` + + + + ... + + ... + ... + + + ... + ... + + + ... + ... + + + + ... + + ... + ... + + ... + + + ... + +``` + +Response with error message if failure: + +``` +... +``` + +## When mock was used it could be unregistered by name. It also returns report of mock invocations. Via client: ``` @@ -116,12 +170,13 @@ Response if success: ``` -Responsewith error message if failure: +Response with error message if failure: ``` ... ``` + ## List of current registered mocks could be retrieved: Via client: diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy new file mode 100644 index 0000000..3d0e546 --- /dev/null +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy @@ -0,0 +1,10 @@ +package pl.touk.mockserver.client + +import groovy.transform.CompileStatic +import groovy.transform.TypeChecked + +@CompileStatic +@TypeChecked +class PeekMockRequestData { + String name +} diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/ControlServerClient.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy similarity index 80% rename from mockserver-client/src/main/groovy/pl/touk/mockserver/client/ControlServerClient.groovy rename to mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy index 38f6c18..e06145e 100644 --- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/ControlServerClient.groovy +++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy @@ -9,11 +9,11 @@ import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients -class ControlServerClient { +class RemoteMockServer { private final String address private final CloseableHttpClient client = HttpClients.createDefault() - ControlServerClient(String host, int port) { + RemoteMockServer(String host, int port) { address = "http://$host:$port/serverControl" } @@ -44,6 +44,19 @@ class ControlServerClient { throw new MockDoesNotExist() } + List peekMock(String name) { + HttpPost removeMockPost = new HttpPost(address) + removeMockPost.entity = buildPeekMockRequest(new PeekMockRequestData(name: name)) + CloseableHttpResponse response = client.execute(removeMockPost) + GPathResult responseXml = Util.extractXmlResponse(response) + if (responseXml.name() == 'mockPeeked') { + return responseXml.'mockEvent'.collect { + new MockEvent(mockRequestFromXml(it.request), mockResponseFromXml(it.response)) + } + } + throw new MockDoesNotExist() + } + private static MockResponse mockResponseFromXml(GPathResult xml) { return new MockResponse(xml.statusCode.text() as int, xml.text.text(), xml.headers.param.collectEntries { [(it.@name.text()):it.text()] }) } @@ -65,6 +78,14 @@ class ControlServerClient { """, ContentType.create("text/xml", "UTF-8")) } + private static StringEntity buildPeekMockRequest(PeekMockRequestData data) { + return new StringEntity("""\ + + ${data.name} + + """, ContentType.create("text/xml", "UTF-8")) + } + private static StringEntity buildAddMockRequest(AddMockRequestData data) { return new StringEntity("""\ diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml index 9fcc06a..9dd24f9 100644 --- a/mockserver-tests/pom.xml +++ b/mockserver-tests/pom.xml @@ -5,7 +5,7 @@ http-mock-server pl.touk.mockserver - 1.0.0-SNAPSHOT + 1.0.1-SNAPSHOT 4.0.0 diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy index 714a9df..aaf0e8a 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy @@ -15,7 +15,7 @@ import spock.lang.Unroll class MockServerIntegrationTest extends Specification { - ControlServerClient controlServerClient + RemoteMockServer remoteMockServer HttpMockServer httpMockServer @@ -24,7 +24,7 @@ class MockServerIntegrationTest extends Specification { def setup() { httpMockServer = new HttpMockServer(9000) - controlServerClient = new ControlServerClient('localhost', 9000) + remoteMockServer = new RemoteMockServer('localhost', 9000) } def cleanup() { @@ -33,7 +33,7 @@ class MockServerIntegrationTest extends Specification { def "should add working rest mock on endpoint"() { expect: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -49,12 +49,12 @@ class MockServerIntegrationTest extends Specification { GPathResult restPostResponse = Util.extractXmlResponse(response) restPostResponse.name() == 'goodResponseRest-request' expect: - controlServerClient.removeMock('testRest')?.size() == 1 + remoteMockServer.removeMock('testRest')?.size() == 1 } def "should add soap mock on endpoint"() { expect: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -71,16 +71,16 @@ class MockServerIntegrationTest extends Specification { soapPostResponse.name() == 'Envelope' soapPostResponse.Body.'goodResponseSoap-request'.size() == 1 expect: - controlServerClient.removeMock('testSoap')?.size() == 1 + remoteMockServer.removeMock('testSoap')?.size() == 1 } def "should throw exception when try to remove mock when it does not exist"() { when: - controlServerClient.removeMock('testSoap') + remoteMockServer.removeMock('testSoap') then: thrown(MockDoesNotExist) expect: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -89,16 +89,16 @@ class MockServerIntegrationTest extends Specification { soap: true )) and: - controlServerClient.removeMock('testSoap') == [] + remoteMockServer.removeMock('testSoap') == [] when: - controlServerClient.removeMock('testSoap') + remoteMockServer.removeMock('testSoap') then: thrown(MockDoesNotExist) } def "should not add mock with existing name"() { expect: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -107,7 +107,7 @@ class MockServerIntegrationTest extends Specification { soap: true )) when: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testSoap', path: 'testEndpoint2', port: 9998, @@ -121,7 +121,7 @@ class MockServerIntegrationTest extends Specification { def "should not add mock with empty name"() { when: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: '', path: 'testEndpoint2', port: 9998, @@ -135,7 +135,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock after deleting old mock with the same name"() { expect: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -144,9 +144,9 @@ class MockServerIntegrationTest extends Specification { soap: true )) and: - controlServerClient.removeMock('testSoap') == [] + remoteMockServer.removeMock('testSoap') == [] and: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -158,14 +158,14 @@ class MockServerIntegrationTest extends Specification { def "should add simultaneously working post and rest mocks with the same predicate and endpoint nad port"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '''{req -> req.xml.name() == 'request'}''', response: '''{req -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testSoap', path: 'testEndpoint', port: 9999, @@ -193,14 +193,14 @@ class MockServerIntegrationTest extends Specification { @Unroll def "should dispatch rest mocks when second on #name"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest1', path: 'test1', port: 9999, predicate: '''{req -> req.xml.name() == 'request1'}''', response: '''{req -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: secondPath, port: secondPort, @@ -232,7 +232,7 @@ class MockServerIntegrationTest extends Specification { @Unroll def "should dispatch rest mock with response code"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest1', path: 'test1', port: 9999, @@ -254,7 +254,7 @@ class MockServerIntegrationTest extends Specification { def "should return response code 404 and error body the same as request body when mocks does not apply"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest1', path: 'test1', port: 9999, @@ -273,7 +273,7 @@ class MockServerIntegrationTest extends Specification { def "should inform that there was problem during adding mock - invalid port"() { when: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testSoap', path: 'testEndpoint2', port: -1, @@ -287,13 +287,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with get method"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -310,13 +310,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with trace method"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -333,13 +333,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with head method"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -355,13 +355,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with options method"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, response: '''{_ -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -377,13 +377,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with put method"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'test1', port: 9999, response: '''{_ -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'test1', port: 9999, @@ -402,13 +402,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with delete method"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'test1', port: 9999, response: '''{_ -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'test1', port: 9999, @@ -425,13 +425,13 @@ class MockServerIntegrationTest extends Specification { def "should dispatch rest mock with patch method"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'test1', port: 9999, response: '''{_ -> ""}''' )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'test1', port: 9999, @@ -450,7 +450,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock that return headers"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -470,7 +470,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock that accepts only when certain request headers exists"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -499,7 +499,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock that accepts only when certain query params exists"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -523,7 +523,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock that accepts only when request has specific body"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -548,7 +548,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock which response json to json"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -573,39 +573,39 @@ class MockServerIntegrationTest extends Specification { def "should get list mocks"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'testEndpoint', port: 9998 )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest4', path: 'testEndpoint', port: 9999 )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest3', path: 'testEndpoint2', port: 9999 )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest5', path: 'testEndpoint', port: 9999 )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest6', path: 'testEndpoint2', port: 9999 )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999 )) - controlServerClient.removeMock('testRest5') + remoteMockServer.removeMock('testRest5') expect: - controlServerClient.listMocks() == [ + remoteMockServer.listMocks() == [ new RegisteredMock('testRest', 'testEndpoint', 9999), new RegisteredMock('testRest2', 'testEndpoint', 9998), new RegisteredMock('testRest3', 'testEndpoint2', 9999), @@ -616,7 +616,7 @@ class MockServerIntegrationTest extends Specification { def "should add mock accepts path certain path params"() { given: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -639,7 +639,7 @@ class MockServerIntegrationTest extends Specification { def "should get mock report when deleting mock"() { expect: - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest', path: 'testEndpoint', port: 9999, @@ -649,7 +649,7 @@ class MockServerIntegrationTest extends Specification { responseHeaders: '''{req -> ['aaa':'14']}''', soap: false )) - controlServerClient.addMock(new AddMockRequestData( + remoteMockServer.addMock(new AddMockRequestData( name: 'testRest2', path: 'testEndpoint', port: 9999, @@ -681,7 +681,7 @@ class MockServerIntegrationTest extends Specification { GPathResult restPostResponse3 = Util.extractXmlResponse(response3) restPostResponse3.name() == 'goodResponseRest' when: - List mockEvents1 = controlServerClient.removeMock('testRest') + List mockEvents1 = remoteMockServer.removeMock('testRest') then: mockEvents1.size() == 2 mockEvents1[0].request.text == '' @@ -700,7 +700,82 @@ class MockServerIntegrationTest extends Specification { mockEvents1[1].response.text == '' mockEvents1[1].response.statusCode == 201 when: - List mockEvents2 = controlServerClient.removeMock('testRest2') + List mockEvents2 = remoteMockServer.removeMock('testRest2') + then: + mockEvents2.size() == 1 + mockEvents2[0].request.text == '' + !mockEvents2[0].request.headers?.keySet()?.empty + mockEvents2[0].request.query == [id: '123'] + mockEvents2[0].request.path == ['testEndpoint'] + mockEvents2[0].response.headers.aaa == '15' + mockEvents2[0].response.text == '' + mockEvents2[0].response.statusCode == 202 + } + + def "should get mock report when peeking mock"() { + expect: + remoteMockServer.addMock(new AddMockRequestData( + name: 'testRest', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name()[0..6] == 'request' }''', + response: '''{req -> ""}''', + statusCode: 201, + responseHeaders: '''{req -> ['aaa':'14']}''', + soap: false + )) + remoteMockServer.addMock(new AddMockRequestData( + name: 'testRest2', + path: 'testEndpoint', + port: 9999, + predicate: '''{req -> req.xml.name() == 'reqXYZ' }''', + response: '''{req -> ""}''', + statusCode: 202, + responseHeaders: '''{req -> ['aaa':'15']}''', + soap: false + )) + when: + HttpPost post1 = new HttpPost('http://localhost:9999/testEndpoint') + post1.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response1 = client.execute(post1) + then: + GPathResult restPostResponse1 = Util.extractXmlResponse(response1) + restPostResponse1.name() == 'goodResponseRest-request' + when: + HttpPost post2 = new HttpPost('http://localhost:9999/testEndpoint/hello') + post2.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response2 = client.execute(post2) + then: + GPathResult restPostResponse2 = Util.extractXmlResponse(response2) + restPostResponse2.name() == 'goodResponseRest-request15' + when: + HttpPost post3 = new HttpPost('http://localhost:9999/testEndpoint?id=123') + post3.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response3 = client.execute(post3) + then: + GPathResult restPostResponse3 = Util.extractXmlResponse(response3) + restPostResponse3.name() == 'goodResponseRest' + when: + List mockEvents1 = remoteMockServer.peekMock('testRest') + then: + mockEvents1.size() == 2 + mockEvents1[0].request.text == '' + !mockEvents1[0].request.headers?.keySet()?.empty + mockEvents1[0].request.query == [:] + mockEvents1[0].request.path == ['testEndpoint'] + !mockEvents1[0].response.headers?.keySet()?.empty + mockEvents1[0].response.text == '' + mockEvents1[0].response.statusCode == 201 + + mockEvents1[1].request.text == '' + !mockEvents1[1].request.headers?.keySet()?.empty + mockEvents1[1].request.query == [:] + mockEvents1[1].request.path == ['testEndpoint', 'hello'] + !mockEvents1[1].response.headers?.keySet()?.empty + mockEvents1[1].response.text == '' + mockEvents1[1].response.statusCode == 201 + when: + List mockEvents2 = remoteMockServer.peekMock('testRest2') then: mockEvents2.size() == 1 mockEvents2[0].request.text == '' diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy index 22e656a..2ee891c 100644 --- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy +++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy @@ -8,7 +8,7 @@ import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity import org.apache.http.impl.client.HttpClients import pl.touk.mockserver.client.AddMockRequestData -import pl.touk.mockserver.client.ControlServerClient +import pl.touk.mockserver.client.RemoteMockServer import pl.touk.mockserver.client.Util import pl.touk.mockserver.server.HttpMockServer import spock.lang.Specification @@ -18,7 +18,7 @@ class ServerMockPT extends Specification { def "should handle many request simultaneously"() { given: HttpMockServer httpMockServer = new HttpMockServer() - ControlServerClient controlServerClient = new ControlServerClient("localhost", 9999) + RemoteMockServer controlServerClient = new RemoteMockServer("localhost", 9999) HttpClient client = HttpClients.createDefault() int requestAmount = 1000 GPathResult[] responses = new GPathResult[requestAmount] diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy index dddf7b1..8c5b948 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -60,6 +60,14 @@ class ContextExecutor { return [] } + List peekMock(String name) { + Mock mock = mocks.find { it.name == name } + if (mock) { + return mock.history + } + return [] + } + void addMock(Mock mock) { mocks << mock } diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy index 6cdbb18..04d72cf 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -31,6 +31,8 @@ class HttpMockServer { addMock(request, ex) } else if (request.name() == 'removeMock') { removeMock(request, ex) + } else if (request.name() == 'peekMock') { + peekMock(request, ex) } else { throw new RuntimeException('Unknown request') } @@ -109,44 +111,66 @@ class HttpMockServer { createResponse(ex, createMockRemovedResponse(mockEvents), 200) } + private void peekMock(GPathResult request, HttpExchange ex) { + String name = request.name + if (!(name in mockNames)) { + throw new RuntimeException('mock not registered') + } + log.info("Peeking mock $name") + List mockEvents = childServers.collect { it.peekMock(name) }.flatten() + createResponse(ex, createMockPeekedResponse(mockEvents), 200) + } + private static String createMockRemovedResponse(List mockEvents) { StringWriter sw = new StringWriter() MarkupBuilder builder = new MarkupBuilder(sw) builder.mockRemoved { - mockEvents.each { MockEvent m -> - builder.mockEvent { - builder.request { - text m.request.text - headers { - m.request.headers.each { - builder.param(name: it.key, it.value) - } - } - query { - m.request.query.each { - builder.param(name: it.key, it.value) - } - } - path { - m.request.path.each { - builder.elem it - } + mockEventsToXml(mockEvents, builder) + } + return sw.toString() + } + + private static String createMockPeekedResponse(List mockEvents) { + StringWriter sw = new StringWriter() + MarkupBuilder builder = new MarkupBuilder(sw) + builder.mockPeeked { + mockEventsToXml(mockEvents, builder) + } + return sw.toString() + } + + private static void mockEventsToXml(List events, MarkupBuilder builder) { + events.each { MockEvent event -> + builder.mockEvent { + builder.request { + text event.request.text + headers { + event.request.headers.each { + builder.param(name: it.key, it.value) } } - builder.response { - text m.response.text - headers { - m.response.headers.each { - builder.param(name: it.key, it.value) - } + query { + event.request.query.each { + builder.param(name: it.key, it.value) } - statusCode m.response.statusCode } + path { + event.request.path.each { + builder.elem it + } + } + } + builder.response { + text event.response.text + headers { + event.response.headers.each { + builder.param(name: it.key, it.value) + } + } + statusCode event.response.statusCode } } } - String string = sw.toString() - return string } private static void createErrorResponse(HttpExchange ex, Exception e) { diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy index ce5af29..43692f6 100644 --- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy +++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy @@ -48,6 +48,10 @@ class HttpServerWraper { return executors.collect { it.removeMock(name) }.flatten() } + List peekMock(String name) { + return executors.collect { it.peekMock(name) }.flatten() + } + List getMocks() { return executors.collect { it.mocks }.flatten() } diff --git a/pom.xml b/pom.xml index 5d15973..577e2a1 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ mockserver-client mockserver - + mockserver-tests