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