diff --git a/README.md b/README.md
index b17fb39..7fe36ad 100644
--- a/README.md
+++ b/README.md
@@ -68,7 +68,61 @@ Response with error message if failure:
...
```
-## When mock was used it could be unregistered by name. It returns report of mock invocations.
+## Mock could be peeked to get get report of its invocations.
+Via client:
+
+```
+List mockEvents = controlServerClient.peekMock('...')
+```
+
+Via sending POST request to localhost:/serverControl
+
+```
+
+ ...
+
+```
+
+Response if success:
+
+```
+
+
+
+ ...
+
+ ...
+ ...
+
+
+ ...
+ ...
+
+
+ ...
+ ...
+
+
+
+ ...
+
+ ...
+ ...
+
+ ...
+
+
+ ...
+
+```
+
+Response with error message if failure:
+
+```
+...
+```
+
+## When mock was used it could be unregistered by name. It also returns report of mock invocations.
Via client:
```
@@ -116,12 +170,13 @@ Response if success:
```
-Responsewith error message if failure:
+Response with error message if failure:
```
...
```
+
## List of current registered mocks could be retrieved:
Via client:
diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy
new file mode 100644
index 0000000..3d0e546
--- /dev/null
+++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/PeekMockRequestData.groovy
@@ -0,0 +1,10 @@
+package pl.touk.mockserver.client
+
+import groovy.transform.CompileStatic
+import groovy.transform.TypeChecked
+
+@CompileStatic
+@TypeChecked
+class PeekMockRequestData {
+ String name
+}
diff --git a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/ControlServerClient.groovy b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy
similarity index 80%
rename from mockserver-client/src/main/groovy/pl/touk/mockserver/client/ControlServerClient.groovy
rename to mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy
index 38f6c18..e06145e 100644
--- a/mockserver-client/src/main/groovy/pl/touk/mockserver/client/ControlServerClient.groovy
+++ b/mockserver-client/src/main/groovy/pl/touk/mockserver/client/RemoteMockServer.groovy
@@ -9,11 +9,11 @@ import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients
-class ControlServerClient {
+class RemoteMockServer {
private final String address
private final CloseableHttpClient client = HttpClients.createDefault()
- ControlServerClient(String host, int port) {
+ RemoteMockServer(String host, int port) {
address = "http://$host:$port/serverControl"
}
@@ -44,6 +44,19 @@ class ControlServerClient {
throw new MockDoesNotExist()
}
+ List peekMock(String name) {
+ HttpPost removeMockPost = new HttpPost(address)
+ removeMockPost.entity = buildPeekMockRequest(new PeekMockRequestData(name: name))
+ CloseableHttpResponse response = client.execute(removeMockPost)
+ GPathResult responseXml = Util.extractXmlResponse(response)
+ if (responseXml.name() == 'mockPeeked') {
+ return responseXml.'mockEvent'.collect {
+ new MockEvent(mockRequestFromXml(it.request), mockResponseFromXml(it.response))
+ }
+ }
+ throw new MockDoesNotExist()
+ }
+
private static MockResponse mockResponseFromXml(GPathResult xml) {
return new MockResponse(xml.statusCode.text() as int, xml.text.text(), xml.headers.param.collectEntries { [(it.@name.text()):it.text()] })
}
@@ -65,6 +78,14 @@ class ControlServerClient {
""", ContentType.create("text/xml", "UTF-8"))
}
+ private static StringEntity buildPeekMockRequest(PeekMockRequestData data) {
+ return new StringEntity("""\
+
+ ${data.name}
+
+ """, ContentType.create("text/xml", "UTF-8"))
+ }
+
private static StringEntity buildAddMockRequest(AddMockRequestData data) {
return new StringEntity("""\
diff --git a/mockserver-tests/pom.xml b/mockserver-tests/pom.xml
index 9fcc06a..9dd24f9 100644
--- a/mockserver-tests/pom.xml
+++ b/mockserver-tests/pom.xml
@@ -5,7 +5,7 @@
http-mock-server
pl.touk.mockserver
- 1.0.0-SNAPSHOT
+ 1.0.1-SNAPSHOT
4.0.0
diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy
index 714a9df..aaf0e8a 100644
--- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy
+++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/MockServerIntegrationTest.groovy
@@ -15,7 +15,7 @@ import spock.lang.Unroll
class MockServerIntegrationTest extends Specification {
- ControlServerClient controlServerClient
+ RemoteMockServer remoteMockServer
HttpMockServer httpMockServer
@@ -24,7 +24,7 @@ class MockServerIntegrationTest extends Specification {
def setup() {
httpMockServer = new HttpMockServer(9000)
- controlServerClient = new ControlServerClient('localhost', 9000)
+ remoteMockServer = new RemoteMockServer('localhost', 9000)
}
def cleanup() {
@@ -33,7 +33,7 @@ class MockServerIntegrationTest extends Specification {
def "should add working rest mock on endpoint"() {
expect:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
@@ -49,12 +49,12 @@ class MockServerIntegrationTest extends Specification {
GPathResult restPostResponse = Util.extractXmlResponse(response)
restPostResponse.name() == 'goodResponseRest-request'
expect:
- controlServerClient.removeMock('testRest')?.size() == 1
+ remoteMockServer.removeMock('testRest')?.size() == 1
}
def "should add soap mock on endpoint"() {
expect:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testSoap',
path: 'testEndpoint',
port: 9999,
@@ -71,16 +71,16 @@ class MockServerIntegrationTest extends Specification {
soapPostResponse.name() == 'Envelope'
soapPostResponse.Body.'goodResponseSoap-request'.size() == 1
expect:
- controlServerClient.removeMock('testSoap')?.size() == 1
+ remoteMockServer.removeMock('testSoap')?.size() == 1
}
def "should throw exception when try to remove mock when it does not exist"() {
when:
- controlServerClient.removeMock('testSoap')
+ remoteMockServer.removeMock('testSoap')
then:
thrown(MockDoesNotExist)
expect:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testSoap',
path: 'testEndpoint',
port: 9999,
@@ -89,16 +89,16 @@ class MockServerIntegrationTest extends Specification {
soap: true
))
and:
- controlServerClient.removeMock('testSoap') == []
+ remoteMockServer.removeMock('testSoap') == []
when:
- controlServerClient.removeMock('testSoap')
+ remoteMockServer.removeMock('testSoap')
then:
thrown(MockDoesNotExist)
}
def "should not add mock with existing name"() {
expect:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testSoap',
path: 'testEndpoint',
port: 9999,
@@ -107,7 +107,7 @@ class MockServerIntegrationTest extends Specification {
soap: true
))
when:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testSoap',
path: 'testEndpoint2',
port: 9998,
@@ -121,7 +121,7 @@ class MockServerIntegrationTest extends Specification {
def "should not add mock with empty name"() {
when:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: '',
path: 'testEndpoint2',
port: 9998,
@@ -135,7 +135,7 @@ class MockServerIntegrationTest extends Specification {
def "should add mock after deleting old mock with the same name"() {
expect:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testSoap',
path: 'testEndpoint',
port: 9999,
@@ -144,9 +144,9 @@ class MockServerIntegrationTest extends Specification {
soap: true
))
and:
- controlServerClient.removeMock('testSoap') == []
+ remoteMockServer.removeMock('testSoap') == []
and:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testSoap',
path: 'testEndpoint',
port: 9999,
@@ -158,14 +158,14 @@ class MockServerIntegrationTest extends Specification {
def "should add simultaneously working post and rest mocks with the same predicate and endpoint nad port"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
predicate: '''{req -> req.xml.name() == 'request'}''',
response: '''{req -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testSoap',
path: 'testEndpoint',
port: 9999,
@@ -193,14 +193,14 @@ class MockServerIntegrationTest extends Specification {
@Unroll
def "should dispatch rest mocks when second on #name"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest1',
path: 'test1',
port: 9999,
predicate: '''{req -> req.xml.name() == 'request1'}''',
response: '''{req -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: secondPath,
port: secondPort,
@@ -232,7 +232,7 @@ class MockServerIntegrationTest extends Specification {
@Unroll
def "should dispatch rest mock with response code"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest1',
path: 'test1',
port: 9999,
@@ -254,7 +254,7 @@ class MockServerIntegrationTest extends Specification {
def "should return response code 404 and error body the same as request body when mocks does not apply"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest1',
path: 'test1',
port: 9999,
@@ -273,7 +273,7 @@ class MockServerIntegrationTest extends Specification {
def "should inform that there was problem during adding mock - invalid port"() {
when:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testSoap',
path: 'testEndpoint2',
port: -1,
@@ -287,13 +287,13 @@ class MockServerIntegrationTest extends Specification {
def "should dispatch rest mock with get method"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
response: '''{_ -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'testEndpoint',
port: 9999,
@@ -310,13 +310,13 @@ class MockServerIntegrationTest extends Specification {
def "should dispatch rest mock with trace method"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
response: '''{_ -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'testEndpoint',
port: 9999,
@@ -333,13 +333,13 @@ class MockServerIntegrationTest extends Specification {
def "should dispatch rest mock with head method"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
response: '''{_ -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'testEndpoint',
port: 9999,
@@ -355,13 +355,13 @@ class MockServerIntegrationTest extends Specification {
def "should dispatch rest mock with options method"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
response: '''{_ -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'testEndpoint',
port: 9999,
@@ -377,13 +377,13 @@ class MockServerIntegrationTest extends Specification {
def "should dispatch rest mock with put method"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'test1',
port: 9999,
response: '''{_ -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'test1',
port: 9999,
@@ -402,13 +402,13 @@ class MockServerIntegrationTest extends Specification {
def "should dispatch rest mock with delete method"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'test1',
port: 9999,
response: '''{_ -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'test1',
port: 9999,
@@ -425,13 +425,13 @@ class MockServerIntegrationTest extends Specification {
def "should dispatch rest mock with patch method"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'test1',
port: 9999,
response: '''{_ -> ""}'''
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'test1',
port: 9999,
@@ -450,7 +450,7 @@ class MockServerIntegrationTest extends Specification {
def "should add mock that return headers"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
@@ -470,7 +470,7 @@ class MockServerIntegrationTest extends Specification {
def "should add mock that accepts only when certain request headers exists"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
@@ -499,7 +499,7 @@ class MockServerIntegrationTest extends Specification {
def "should add mock that accepts only when certain query params exists"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
@@ -523,7 +523,7 @@ class MockServerIntegrationTest extends Specification {
def "should add mock that accepts only when request has specific body"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
@@ -548,7 +548,7 @@ class MockServerIntegrationTest extends Specification {
def "should add mock which response json to json"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
@@ -573,39 +573,39 @@ class MockServerIntegrationTest extends Specification {
def "should get list mocks"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'testEndpoint',
port: 9998
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest4',
path: 'testEndpoint',
port: 9999
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest3',
path: 'testEndpoint2',
port: 9999
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest5',
path: 'testEndpoint',
port: 9999
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest6',
path: 'testEndpoint2',
port: 9999
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999
))
- controlServerClient.removeMock('testRest5')
+ remoteMockServer.removeMock('testRest5')
expect:
- controlServerClient.listMocks() == [
+ remoteMockServer.listMocks() == [
new RegisteredMock('testRest', 'testEndpoint', 9999),
new RegisteredMock('testRest2', 'testEndpoint', 9998),
new RegisteredMock('testRest3', 'testEndpoint2', 9999),
@@ -616,7 +616,7 @@ class MockServerIntegrationTest extends Specification {
def "should add mock accepts path certain path params"() {
given:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
@@ -639,7 +639,7 @@ class MockServerIntegrationTest extends Specification {
def "should get mock report when deleting mock"() {
expect:
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest',
path: 'testEndpoint',
port: 9999,
@@ -649,7 +649,7 @@ class MockServerIntegrationTest extends Specification {
responseHeaders: '''{req -> ['aaa':'14']}''',
soap: false
))
- controlServerClient.addMock(new AddMockRequestData(
+ remoteMockServer.addMock(new AddMockRequestData(
name: 'testRest2',
path: 'testEndpoint',
port: 9999,
@@ -681,7 +681,7 @@ class MockServerIntegrationTest extends Specification {
GPathResult restPostResponse3 = Util.extractXmlResponse(response3)
restPostResponse3.name() == 'goodResponseRest'
when:
- List mockEvents1 = controlServerClient.removeMock('testRest')
+ List mockEvents1 = remoteMockServer.removeMock('testRest')
then:
mockEvents1.size() == 2
mockEvents1[0].request.text == ''
@@ -700,7 +700,82 @@ class MockServerIntegrationTest extends Specification {
mockEvents1[1].response.text == ''
mockEvents1[1].response.statusCode == 201
when:
- List mockEvents2 = controlServerClient.removeMock('testRest2')
+ List mockEvents2 = remoteMockServer.removeMock('testRest2')
+ then:
+ mockEvents2.size() == 1
+ mockEvents2[0].request.text == ''
+ !mockEvents2[0].request.headers?.keySet()?.empty
+ mockEvents2[0].request.query == [id: '123']
+ mockEvents2[0].request.path == ['testEndpoint']
+ mockEvents2[0].response.headers.aaa == '15'
+ mockEvents2[0].response.text == ''
+ mockEvents2[0].response.statusCode == 202
+ }
+
+ def "should get mock report when peeking mock"() {
+ expect:
+ remoteMockServer.addMock(new AddMockRequestData(
+ name: 'testRest',
+ path: 'testEndpoint',
+ port: 9999,
+ predicate: '''{req -> req.xml.name()[0..6] == 'request' }''',
+ response: '''{req -> ""}''',
+ statusCode: 201,
+ responseHeaders: '''{req -> ['aaa':'14']}''',
+ soap: false
+ ))
+ remoteMockServer.addMock(new AddMockRequestData(
+ name: 'testRest2',
+ path: 'testEndpoint',
+ port: 9999,
+ predicate: '''{req -> req.xml.name() == 'reqXYZ' }''',
+ response: '''{req -> ""}''',
+ statusCode: 202,
+ responseHeaders: '''{req -> ['aaa':'15']}''',
+ soap: false
+ ))
+ when:
+ HttpPost post1 = new HttpPost('http://localhost:9999/testEndpoint')
+ post1.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8"))
+ CloseableHttpResponse response1 = client.execute(post1)
+ then:
+ GPathResult restPostResponse1 = Util.extractXmlResponse(response1)
+ restPostResponse1.name() == 'goodResponseRest-request'
+ when:
+ HttpPost post2 = new HttpPost('http://localhost:9999/testEndpoint/hello')
+ post2.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8"))
+ CloseableHttpResponse response2 = client.execute(post2)
+ then:
+ GPathResult restPostResponse2 = Util.extractXmlResponse(response2)
+ restPostResponse2.name() == 'goodResponseRest-request15'
+ when:
+ HttpPost post3 = new HttpPost('http://localhost:9999/testEndpoint?id=123')
+ post3.entity = new StringEntity('', ContentType.create("text/xml", "UTF-8"))
+ CloseableHttpResponse response3 = client.execute(post3)
+ then:
+ GPathResult restPostResponse3 = Util.extractXmlResponse(response3)
+ restPostResponse3.name() == 'goodResponseRest'
+ when:
+ List mockEvents1 = remoteMockServer.peekMock('testRest')
+ then:
+ mockEvents1.size() == 2
+ mockEvents1[0].request.text == ''
+ !mockEvents1[0].request.headers?.keySet()?.empty
+ mockEvents1[0].request.query == [:]
+ mockEvents1[0].request.path == ['testEndpoint']
+ !mockEvents1[0].response.headers?.keySet()?.empty
+ mockEvents1[0].response.text == ''
+ mockEvents1[0].response.statusCode == 201
+
+ mockEvents1[1].request.text == ''
+ !mockEvents1[1].request.headers?.keySet()?.empty
+ mockEvents1[1].request.query == [:]
+ mockEvents1[1].request.path == ['testEndpoint', 'hello']
+ !mockEvents1[1].response.headers?.keySet()?.empty
+ mockEvents1[1].response.text == ''
+ mockEvents1[1].response.statusCode == 201
+ when:
+ List mockEvents2 = remoteMockServer.peekMock('testRest2')
then:
mockEvents2.size() == 1
mockEvents2[0].request.text == ''
diff --git a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy
index 22e656a..2ee891c 100644
--- a/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy
+++ b/mockserver-tests/src/test/groovy/pl/touk/mockserver/tests/ServerMockPT.groovy
@@ -8,7 +8,7 @@ import org.apache.http.entity.ContentType
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.HttpClients
import pl.touk.mockserver.client.AddMockRequestData
-import pl.touk.mockserver.client.ControlServerClient
+import pl.touk.mockserver.client.RemoteMockServer
import pl.touk.mockserver.client.Util
import pl.touk.mockserver.server.HttpMockServer
import spock.lang.Specification
@@ -18,7 +18,7 @@ class ServerMockPT extends Specification {
def "should handle many request simultaneously"() {
given:
HttpMockServer httpMockServer = new HttpMockServer()
- ControlServerClient controlServerClient = new ControlServerClient("localhost", 9999)
+ RemoteMockServer controlServerClient = new RemoteMockServer("localhost", 9999)
HttpClient client = HttpClients.createDefault()
int requestAmount = 1000
GPathResult[] responses = new GPathResult[requestAmount]
diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
index dddf7b1..8c5b948 100644
--- a/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
+++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/ContextExecutor.groovy
@@ -60,6 +60,14 @@ class ContextExecutor {
return []
}
+ List peekMock(String name) {
+ Mock mock = mocks.find { it.name == name }
+ if (mock) {
+ return mock.history
+ }
+ return []
+ }
+
void addMock(Mock mock) {
mocks << mock
}
diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy
index 6cdbb18..04d72cf 100644
--- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy
+++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpMockServer.groovy
@@ -31,6 +31,8 @@ class HttpMockServer {
addMock(request, ex)
} else if (request.name() == 'removeMock') {
removeMock(request, ex)
+ } else if (request.name() == 'peekMock') {
+ peekMock(request, ex)
} else {
throw new RuntimeException('Unknown request')
}
@@ -109,44 +111,66 @@ class HttpMockServer {
createResponse(ex, createMockRemovedResponse(mockEvents), 200)
}
+ private void peekMock(GPathResult request, HttpExchange ex) {
+ String name = request.name
+ if (!(name in mockNames)) {
+ throw new RuntimeException('mock not registered')
+ }
+ log.info("Peeking mock $name")
+ List mockEvents = childServers.collect { it.peekMock(name) }.flatten()
+ createResponse(ex, createMockPeekedResponse(mockEvents), 200)
+ }
+
private static String createMockRemovedResponse(List mockEvents) {
StringWriter sw = new StringWriter()
MarkupBuilder builder = new MarkupBuilder(sw)
builder.mockRemoved {
- mockEvents.each { MockEvent m ->
- builder.mockEvent {
- builder.request {
- text m.request.text
- headers {
- m.request.headers.each {
- builder.param(name: it.key, it.value)
- }
- }
- query {
- m.request.query.each {
- builder.param(name: it.key, it.value)
- }
- }
- path {
- m.request.path.each {
- builder.elem it
- }
+ mockEventsToXml(mockEvents, builder)
+ }
+ return sw.toString()
+ }
+
+ private static String createMockPeekedResponse(List mockEvents) {
+ StringWriter sw = new StringWriter()
+ MarkupBuilder builder = new MarkupBuilder(sw)
+ builder.mockPeeked {
+ mockEventsToXml(mockEvents, builder)
+ }
+ return sw.toString()
+ }
+
+ private static void mockEventsToXml(List events, MarkupBuilder builder) {
+ events.each { MockEvent event ->
+ builder.mockEvent {
+ builder.request {
+ text event.request.text
+ headers {
+ event.request.headers.each {
+ builder.param(name: it.key, it.value)
}
}
- builder.response {
- text m.response.text
- headers {
- m.response.headers.each {
- builder.param(name: it.key, it.value)
- }
+ query {
+ event.request.query.each {
+ builder.param(name: it.key, it.value)
}
- statusCode m.response.statusCode
}
+ path {
+ event.request.path.each {
+ builder.elem it
+ }
+ }
+ }
+ builder.response {
+ text event.response.text
+ headers {
+ event.response.headers.each {
+ builder.param(name: it.key, it.value)
+ }
+ }
+ statusCode event.response.statusCode
}
}
}
- String string = sw.toString()
- return string
}
private static void createErrorResponse(HttpExchange ex, Exception e) {
diff --git a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy
index ce5af29..43692f6 100644
--- a/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy
+++ b/mockserver/src/main/groovy/pl/touk/mockserver/server/HttpServerWraper.groovy
@@ -48,6 +48,10 @@ class HttpServerWraper {
return executors.collect { it.removeMock(name) }.flatten()
}
+ List peekMock(String name) {
+ return executors.collect { it.peekMock(name) }.flatten()
+ }
+
List getMocks() {
return executors.collect { it.mocks }.flatten()
}
diff --git a/pom.xml b/pom.xml
index 5d15973..577e2a1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
mockserver-client
mockserver
-
+ mockserver-tests