From ba63d36fa035c1290e4e0ae93d357da3769aa089 Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz Date: Sat, 13 Dec 2014 21:12:56 +0100 Subject: [PATCH] Add mock list --- .../mockserver/server/ContextExecutor.groovy | 3 +- .../mockserver/server/HttpMockServer.groovy | 30 ++++++++--- .../mockserver/server/HttpServerWraper.groovy | 6 ++- .../pl/touk/mockserver/server/Mock.groovy | 12 ++++- .../client/ControlServerClient.groovy | 11 ++++ .../mockserver/client/RegisteredMock.groovy | 20 +++++++ .../server/MockServerIntegrationTest.groovy | 52 +++++++++++++++++-- 7 files changed, 120 insertions(+), 14 deletions(-) create mode 100644 src/test/groovy/pl/touk/mockserver/client/RegisteredMock.groovy diff --git a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy index c62981e..ff790a2 100644 --- a/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy @@ -69,6 +69,7 @@ class ContextExecutor { mocks << mock } - void stop(){ + List getMocks(){ + return mocks } } diff --git a/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy index bb95396..fd78d3f 100644 --- a/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy @@ -20,20 +20,38 @@ class HttpMockServer { httpServerWraper.createContext('/serverControl', { HttpExchange ex -> try { - GPathResult request = new XmlSlurper().parse(ex.requestBody) - if (ex.requestMethod == 'POST' && request.name() == 'addMock') { - addMock(request, ex) - } else if (ex.requestMethod == 'POST' && request.name() == 'removeMock') { - removeMock(request, ex) + if (ex.requestMethod == 'GET') { + listMocks(ex) + } else if (ex.requestMethod == 'POST') { + GPathResult request = new XmlSlurper().parse(ex.requestBody) + if (request.name() == 'addMock') { + addMock(request, ex) + } else if (request.name() == 'removeMock') { + removeMock(request, ex) + } else { + throw new RuntimeException('Unknown request') + } + } else { + throw new RuntimeException('Unknown request') } //TODO add get mock report - //TODO add list mock } catch (Exception e) { createErrorResponse(ex, e) } }) } + void listMocks(HttpExchange ex) { + String response = '' + listMocks().join('') + '' + ex.sendResponseHeaders(200, 0) + ex.responseBody << response + ex.responseBody.close() + } + + Set listMocks() { + return childServers.collect { it.mocks }.flatten() as TreeSet + } + private void addMock(GPathResult request, HttpExchange ex) { String name = request.name if (name in mockNames) { diff --git a/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy b/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy index c685e15..36ef984 100644 --- a/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy @@ -43,6 +43,10 @@ class HttpServerWraper { } int removeMock(String name) { - executors.inject(0) { int res, ContextExecutor e -> e.removeMock(name) + res } + return executors.inject(0) { int res, ContextExecutor e -> e.removeMock(name) + res } + } + + List getMocks(){ + return executors.collect {it.mocks}.flatten() } } diff --git a/src/main/groovy/pl/touk/mockserver/server/Mock.groovy b/src/main/groovy/pl/touk/mockserver/server/Mock.groovy index eb3ea54..c0ef222 100644 --- a/src/main/groovy/pl/touk/mockserver/server/Mock.groovy +++ b/src/main/groovy/pl/touk/mockserver/server/Mock.groovy @@ -5,7 +5,7 @@ import groovy.transform.PackageScope @PackageScope @EqualsAndHashCode(excludes = ["counter"]) -class Mock { +class Mock implements Comparable{ final String name final String path final int port @@ -81,4 +81,14 @@ class Mock { this.responseHeaders = Eval.me(responseHeaders) as Closure } } + + @Override + public String toString() { + return """$port$path$name""" + } + + @Override + int compareTo(Mock o) { + return name.compareTo(o.name) + } } diff --git a/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy b/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy index e5c0bb5..6fa5613 100644 --- a/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy +++ b/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy @@ -2,6 +2,7 @@ package pl.touk.mockserver.client import groovy.util.slurpersupport.GPathResult import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpGet import org.apache.http.client.methods.HttpPost import org.apache.http.entity.ContentType import org.apache.http.entity.StringEntity @@ -64,4 +65,14 @@ class ControlServerClient { """, ContentType.create("text/xml", "UTF-8")) } + + List listMocks() { + HttpGet get = new HttpGet(address) + CloseableHttpResponse response = client.execute(get) + GPathResult xml = Util.extractXmlResponse(response) + if(xml.name() == 'mocks'){ + return xml.mock.collect {new RegisteredMock(it.name.text(), it.path.text(), it.port.text() as int)} + } + return [] + } } diff --git a/src/test/groovy/pl/touk/mockserver/client/RegisteredMock.groovy b/src/test/groovy/pl/touk/mockserver/client/RegisteredMock.groovy new file mode 100644 index 0000000..d8a92d3 --- /dev/null +++ b/src/test/groovy/pl/touk/mockserver/client/RegisteredMock.groovy @@ -0,0 +1,20 @@ +package pl.touk.mockserver.client + +import groovy.transform.CompileStatic +import groovy.transform.EqualsAndHashCode +import groovy.transform.TypeChecked + +@CompileStatic +@TypeChecked +@EqualsAndHashCode +class RegisteredMock { + final String name + final String path + final int port + + RegisteredMock(String name, String path, int port) { + this.name = name + this.path = path + this.port = port + } +} diff --git a/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy b/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy index 5773fb0..bf8070b 100644 --- a/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy +++ b/src/test/groovy/pl/touk/mockserver/server/MockServerIntegrationTest.groovy @@ -222,10 +222,10 @@ class MockServerIntegrationTest extends Specification { secondXmlResponse.name() == 'goodResponseRest2' where: secondPort | secondPath | name - 9999 | 'test1' | 'the same port and path' - 9998 | 'test1' | 'the same path and another port' - 9999 | 'test2' | 'the same port and another path' - 9998 | 'test2' | 'another port and path' + 9999 | 'test1' | 'the same port and path' + 9998 | 'test1' | 'the same path and another port' + 9999 | 'test2' | 'the same port and another path' + 9998 | 'test2' | 'another port and path' } @Unroll @@ -570,6 +570,48 @@ class MockServerIntegrationTest extends Specification { restPostResponse.name == 'goodResponse-1' } + def "should get list mocks"() { + given: + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest2', + path: 'testEndpoint', + port: 9998 + )) + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest4', + path: 'testEndpoint', + port: 9999 + )) + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest3', + path: 'testEndpoint2', + port: 9999 + )) + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest5', + path: 'testEndpoint', + port: 9999 + )) + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest6', + path: 'testEndpoint2', + port: 9999 + )) + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest', + path: 'testEndpoint', + port: 9999 + )) + controlServerClient.removeMock('testRest5') + expect: + controlServerClient.listMocks() == [ + new RegisteredMock('testRest', 'testEndpoint', 9999), + new RegisteredMock('testRest2', 'testEndpoint', 9998), + new RegisteredMock('testRest3', 'testEndpoint2', 9999), + new RegisteredMock('testRest4', 'testEndpoint', 9999), + new RegisteredMock('testRest6', 'testEndpoint2', 9999) + ] + + } //TODO def "should get mock report"(){} - //TODO def "should get list mocks"(){} }