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>"""
+    }
+
+}