diff --git a/pom.xml b/pom.xml
index ed657e2..8fac26c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,6 +16,8 @@
2.1.8-01
2.3.3
4.3.5
+ 1.0-groovy-2.0-SNAPSHOT
+ 3.3.2
@@ -29,6 +31,18 @@
httpclient
${httpclient.version}
+
+ org.spockframework
+ spock-core
+ ${spock-core.version}
+ test
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+ test
+
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 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) {
"""
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 -> ""}''',
+ soap: false
+ ))
+ when:
+ HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint')
+ restPost.entity = new StringEntity('',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 -> ""}''',
+ soap: true
+ ))
+ when:
+ HttpPost restPost = new HttpPost('http://localhost:9999/testEndpoint')
+ restPost.entity = new StringEntity(Util.soap(''),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("""\
+
+ ${data.name}
+
+ """,ContentType.create("text/xml", "UTF-8"))
+ }
+
+ private StringEntity buildAddMockRequest(AddMockRequestData data){
+ return new StringEntity("""\
+
+ ${data.name}
+ ${data.path}
+ ${data.port}
+ ${data.predicate}
+ ${data.response}
+ ${data.soap}
+
+ """,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 """
+
+ $request
+ """
+ }
+
+}