From dfc0332d5aeaa38643ceb5c3217202ac8ee9f2fb Mon Sep 17 00:00:00 2001 From: Dominik Adam Przybysz <alien11689@gmail.com> Date: Tue, 9 Dec 2014 23:05:50 +0100 Subject: [PATCH] Refactor tests --- pom.xml | 14 +++ .../mockserver/ContextExecutor.groovy | 6 +- .../mockserver/HttpServerWraper.groovy | 2 +- src/test/groovy/MockServerTest.groovy | 105 ++++++++++++++++++ .../client/AddMockRequestData.groovy | 22 ++++ .../client/ControlServerClient.groovy | 56 ++++++++++ .../client/RemoveMockRequestData.groovy | 5 + .../pl/touk/mockserver/client/Util.groovy | 25 +++++ 8 files changed, 233 insertions(+), 2 deletions(-) create mode 100644 src/test/groovy/MockServerTest.groovy create mode 100644 src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy create mode 100644 src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy create mode 100644 src/test/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy create mode 100644 src/test/groovy/pl/touk/mockserver/client/Util.groovy diff --git a/pom.xml b/pom.xml index ed657e2..8fac26c 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,8 @@ <groovy-eclipse-batch.version>2.1.8-01</groovy-eclipse-batch.version> <groovy.version>2.3.3</groovy.version> <httpclient.version>4.3.5</httpclient.version> + <spock-core.version>1.0-groovy-2.0-SNAPSHOT</spock-core.version> + <commons-lang3.version>3.3.2</commons-lang3.version> </properties> <dependencies> @@ -29,6 +31,18 @@ <artifactId>httpclient</artifactId> <version>${httpclient.version}</version> </dependency> + <dependency> + <groupId>org.spockframework</groupId> + <artifactId>spock-core</artifactId> + <version>${spock-core.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>${commons-lang3.version}</version> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/src/main/groovy/com/blogspot/przybyszd/mockserver/ContextExecutor.groovy b/src/main/groovy/com/blogspot/przybyszd/mockserver/ContextExecutor.groovy index 43ce61c..c44dd13 100644 --- a/src/main/groovy/com/blogspot/przybyszd/mockserver/ContextExecutor.groovy +++ b/src/main/groovy/com/blogspot/przybyszd/mockserver/ContextExecutor.groovy @@ -7,7 +7,7 @@ import java.util.concurrent.CopyOnWriteArrayList class ContextExecutor { private final HttpServerWraper httpServerWraper - private final String path + final String path private final List<Mock> mocks ContextExecutor(HttpServerWraper httpServerWraper, String path, Mock initialMock) { @@ -59,6 +59,10 @@ class ContextExecutor { return mock.counter } + void addMock(Mock mock){ + mocks << mock + } + private static String wrapSoap(String request) { """<?xml version='1.0' encoding='UTF-8'?> <soap-env:Envelope xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/' xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"> diff --git a/src/main/groovy/com/blogspot/przybyszd/mockserver/HttpServerWraper.groovy b/src/main/groovy/com/blogspot/przybyszd/mockserver/HttpServerWraper.groovy index bf32aca..4e2d048 100644 --- a/src/main/groovy/com/blogspot/przybyszd/mockserver/HttpServerWraper.groovy +++ b/src/main/groovy/com/blogspot/przybyszd/mockserver/HttpServerWraper.groovy @@ -28,7 +28,7 @@ class HttpServerWraper { void addMock(String path, Mock mock) { ContextExecutor executor = executors.find { it.path == path } if (executor) { - executor.mocks << mock + executor.addMock(mock) } else { executors << new ContextExecutor(this, path, mock) } diff --git a/src/test/groovy/MockServerTest.groovy b/src/test/groovy/MockServerTest.groovy new file mode 100644 index 0000000..f34fafa --- /dev/null +++ b/src/test/groovy/MockServerTest.groovy @@ -0,0 +1,105 @@ +import com.blogspot.przybyszd.mockserver.HttpMockServer +import groovy.util.slurpersupport.GPathResult +import org.apache.http.HttpEntity +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpPost +import org.apache.http.entity.ContentType +import org.apache.http.entity.StringEntity +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients +import org.apache.http.util.EntityUtils +import pl.touk.mockserver.client.AddMockRequestData +import pl.touk.mockserver.client.ControlServerClient +import pl.touk.mockserver.client.Util +import spock.lang.Shared +import spock.lang.Specification + +class MockServerTest extends Specification{ + + private static final String controlServerUrl = 'http://localhost:9000/serverControl' + + ControlServerClient controlServerClient + + HttpMockServer httpMockServer + + @Shared + CloseableHttpClient client = HttpClients.createDefault() + + def setup(){ + httpMockServer = new HttpMockServer(9000) + controlServerClient = new ControlServerClient('localhost', 9000) + } + + def cleanup(){ + httpMockServer.stop() + } + + def "should add working rest mock on endpoint"(){ + expect: + controlServerClient.addMock(new AddMockRequestData( + name: 'testRest', + path: '/testEndpoint', + port: 9999, + predicate: '''{xml -> xml.name() == 'request'}''', + response: '''{xml -> "<goodResponseRest-${xml.name()}/>"}''', + soap: false + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity('<request/>',ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then: + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'goodResponseRest-request' + expect: + controlServerClient.removeMock('testRest') == 1 + } + + def "should add soap mock on endpoint"(){ + expect: + controlServerClient.addMock(new AddMockRequestData( + name: 'testSoap', + path: '/testEndpoint', + port: 9999, + predicate: '''{xml -> xml.name() == 'request'}''', + response: '''{xml -> "<goodResponseSoap-${xml.name()}/>"}''', + soap: true + )) + when: + HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint') + restPost.entity = new StringEntity(Util.soap('<request/>'),ContentType.create("text/xml", "UTF-8")) + CloseableHttpResponse response = client.execute(restPost) + then: + GPathResult restPostResponse = Util.extractXmlResponse(response) + restPostResponse.name() == 'Envelope' + restPostResponse.Body.'goodResponseSoap-request'.size() == 1 + expect: + controlServerClient.removeMock('testSoap') == 1 + } + +//TODO def "should add simultanously working post and rest mocks with the same predicate and endpoint nad port"(){}" + //TODO def "should add mock minimal(){}" + //TODO def "should dispatch mocks with the same predicates on another ports" + //TODO def "should not add mock with existing name"(){} + //TODO def "should not remove the same mock two times"(){} + //TODO def "should add mock after deleteing old mock with the same name"(){} + //TODO def "should dispatch rest mocks with the another predicates"(){} + //TODO def "should dispatch soap mocks with the another predicates"(){} + //TODO def "should dispatch rest and soap mocks with the same predicates"(){} + //TODO def "should get mock report"(){} + //TODO def "should get list mocks"(){} + //TODO def "should dispatch rest mock with response code"(){} + //TODO def "should dispatch rest mock with post method"(){} + //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 get method"(){} + //TODO def "should dispatch rest mock with get method and request headers"(){} + //TODO def "should dispatch rest mock with get method and response headers"(){} + //TODO def "should dispatch rest mock with put method"(){} + //TODO def "should dispatch rest mock with put method and request headers"(){} + //TODO def "should dispatch rest mock with put method and response headers"(){} + //TODO def "should dispatch rest mock with delete method"(){} + //TODO def "should dispatch rest mock with delete method and request headers"(){} + //TODO def "should dispatch rest mock with delete method and response headers"(){} + //TODO def "should dispatch rest mocks with all methods"(){} +} diff --git a/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy b/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy new file mode 100644 index 0000000..893332f --- /dev/null +++ b/src/test/groovy/pl/touk/mockserver/client/AddMockRequestData.groovy @@ -0,0 +1,22 @@ +package pl.touk.mockserver.client + +import org.apache.commons.lang3.StringEscapeUtils + +class AddMockRequestData { + String name + String path + Integer port + String predicate + String response + Boolean soap + + void setPredicate(String predicate){ + this.predicate = StringEscapeUtils.escapeXml11(predicate) + } + + void setResponse(String response){ + this.response = StringEscapeUtils.escapeXml11(response) + } + + +} diff --git a/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy b/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy new file mode 100644 index 0000000..e300994 --- /dev/null +++ b/src/test/groovy/pl/touk/mockserver/client/ControlServerClient.groovy @@ -0,0 +1,56 @@ +package pl.touk.mockserver.client + +import groovy.util.slurpersupport.GPathResult +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.client.methods.HttpPost +import org.apache.http.entity.ContentType +import org.apache.http.entity.StringEntity +import org.apache.http.impl.client.CloseableHttpClient +import org.apache.http.impl.client.HttpClients + +class ControlServerClient { + private final String address + private final CloseableHttpClient client = HttpClients.createDefault() + + ControlServerClient(String host, int port) { + address = "http://$host:$port/serverControl" + } + + boolean addMock(AddMockRequestData addMockRequestData){ + HttpPost addMockPost = new HttpPost(address) + addMockPost.entity = buildAddMockRequest(addMockRequestData) + CloseableHttpResponse response = client.execute(addMockPost) + GPathResult responseXml = Util.extractXmlResponse(response) + return responseXml.name() == 'mockAdded' + } + + int removeMock(String name){ + HttpPost removeMockPost = new HttpPost(address) + removeMockPost.entity = buildRemoveMockRequest(new RemoveMockRequestData(name:name)) + CloseableHttpResponse response = client.execute(removeMockPost) + GPathResult responseXml = Util.extractXmlResponse(response) + return responseXml.name() == 'mockRemoved' ? responseXml.text() as int:-1 + } + + + private StringEntity buildRemoveMockRequest(RemoveMockRequestData data){ + return new StringEntity("""\ + <removeMock> + <name>${data.name}</name> + </removeMock> + """,ContentType.create("text/xml", "UTF-8")) + } + + private StringEntity buildAddMockRequest(AddMockRequestData data){ + return new StringEntity("""\ + <addMock> + <name>${data.name}</name> + <path>${data.path}</path> + <port>${data.port}</port> + <predicate>${data.predicate}</predicate> + <response>${data.response}</response> + <soap>${data.soap}</soap> + </addMock> + """,ContentType.create("text/xml", "UTF-8")) + } +} diff --git a/src/test/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy b/src/test/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy new file mode 100644 index 0000000..58c936a --- /dev/null +++ b/src/test/groovy/pl/touk/mockserver/client/RemoveMockRequestData.groovy @@ -0,0 +1,5 @@ +package pl.touk.mockserver.client + +class RemoveMockRequestData { + String name +} diff --git a/src/test/groovy/pl/touk/mockserver/client/Util.groovy b/src/test/groovy/pl/touk/mockserver/client/Util.groovy new file mode 100644 index 0000000..5c223ab --- /dev/null +++ b/src/test/groovy/pl/touk/mockserver/client/Util.groovy @@ -0,0 +1,25 @@ +package pl.touk.mockserver.client + +import groovy.transform.PackageScope +import groovy.util.slurpersupport.GPathResult +import org.apache.http.HttpEntity +import org.apache.http.client.methods.CloseableHttpResponse +import org.apache.http.util.EntityUtils + +class Util { + @PackageScope + static GPathResult extractXmlResponse(CloseableHttpResponse response){ + HttpEntity entity = response.entity + GPathResult xml = new XmlSlurper().parseText(EntityUtils.toString(entity)) + EntityUtils.consumeQuietly(entity) + return xml + } + + static String soap(String request) { + return """<?xml version='1.0' encoding='UTF-8'?> + <soap-env:Envelope xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/' xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"> + <soap-env:Body>$request</soap-env:Body> + </soap-env:Envelope>""" + } + +}