Add xsd and docker

Change-Id: Ifad2e3a8678a487e6f13114f910e19bce4d80964
This commit is contained in:
Dominik Adam Przybysz 2015-09-02 22:59:50 +02:00
parent d71c191f0f
commit 80dbbc034f
33 changed files with 313 additions and 348 deletions

7
Dockerfile Normal file
View file

@ -0,0 +1,7 @@
FROM java:8
ADD mockserver/target/mockserver-1.1.1-SNAPSHOT-jar-with-dependencies.jar /mockserver.jar
EXPOSE 9999
CMD java -jar /mockserver.jar

6
buildImage.sh Executable file
View file

@ -0,0 +1,6 @@
#!/bin/sh
mvn clean install
mvn -f mockserver/pom.xml package assembly:single
docker build -t mockserver .

View file

@ -17,4 +17,31 @@
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>xjc</id>
<phase>process-resources</phase>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project> </project>

View file

@ -1,33 +0,0 @@
package pl.touk.mockserver.api.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@Data
@EqualsAndHashCode(callSuper = false)
public class AddMock extends MockServerRequest {
@XmlElement(required = true)
private String name;
@XmlElement(required = true)
private String path;
@XmlElement(required = true)
private int port;
private String predicate;
private String response;
private Boolean soap;
private Integer statusCode;
private Method method;
private String responseHeaders;
}

View file

@ -1,15 +0,0 @@
package pl.touk.mockserver.api.request;
import javax.xml.bind.annotation.XmlEnum;
@XmlEnum
public enum Method {
POST,
GET,
DELETE,
PUT,
TRACE,
HEAD,
OPTIONS,
PATCH;
}

View file

@ -1,4 +0,0 @@
package pl.touk.mockserver.api.request;
public abstract class MockServerRequest {
}

View file

@ -1,15 +0,0 @@
package pl.touk.mockserver.api.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@Data
@EqualsAndHashCode(callSuper = false)
public class PeekMock extends MockServerRequest{
@XmlElement(required = true)
private String name;
}

View file

@ -1,17 +0,0 @@
package pl.touk.mockserver.api.request;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@Data
@EqualsAndHashCode(callSuper = false)
public class RemoveMock extends MockServerRequest {
@XmlElement(required = true)
private String name;
private Boolean skipReport;
}

View file

@ -1,4 +0,0 @@
@XmlAccessorType(XmlAccessType.FIELD) package pl.touk.mockserver.api.request;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

View file

@ -1,13 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;
@XmlRootElement
@Data
public class ExceptionOccured {
@XmlValue
private String message;
}

View file

@ -1,12 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@Data
@EqualsAndHashCode(callSuper = false)
public class MockAdded extends MockServerResponse {
}

View file

@ -1,14 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import javax.xml.bind.annotation.XmlElement;
@Data
public class MockEventReport {
@XmlElement(required = true)
private MockRequestReport request;
@XmlElement(required = true)
private MockResponseReport response;
}

View file

@ -1,16 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement(name = "mocks")
@Data
@EqualsAndHashCode(callSuper = false)
public class MockListing extends MockServerResponse {
@XmlElement(name = "mock")
private List<MockReport> mocks;
}

View file

@ -1,16 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement
@Data
@EqualsAndHashCode(callSuper = false)
public class MockPeeked extends MockServerResponse {
@XmlElement(name = "mockEvent")
private List<MockEventReport> mockEvents;
}

View file

@ -1,16 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement
@Data
@EqualsAndHashCode(callSuper = false)
public class MockRemoved extends MockServerResponse {
@XmlElement(name = "mockEvent")
private List<MockEventReport> mockEvents;
}

View file

@ -1,37 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import lombok.EqualsAndHashCode;
import pl.touk.mockserver.api.request.Method;
import javax.xml.bind.annotation.XmlElement;
@Data
public class MockReport {
@XmlElement(required = true)
private String name;
@XmlElement(required = true)
private String path;
@XmlElement(required = true)
private int port;
@XmlElement(required = true)
private String predicate;
@XmlElement(required = true)
private String response;
@XmlElement(required = true)
private String responseHeaders;
@XmlElement(required = true)
private boolean soap;
@XmlElement(required = true)
private Method method;
@XmlElement(required = true)
private int statusCode;
}

View file

@ -1,24 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import java.util.List;
@Data
public class MockRequestReport {
private String text;
@XmlElementWrapper(name = "headers")
@XmlElement(name = "header")
private List<Parameter> headers;
@XmlElementWrapper(name = "queryParams")
@XmlElement(name = "queryParam")
private List<Parameter> queryParams;
@XmlElementWrapper(name = "path")
@XmlElement(name = "pathPart")
private List<String> paths;
}

View file

@ -1,19 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import java.util.List;
@Data
public class MockResponseReport {
@XmlElement(required = true)
private int statusCode;
private String text;
@XmlElementWrapper(name = "headers")
@XmlElement(name = "header")
private List<Parameter> headers;
}

View file

@ -1,4 +0,0 @@
package pl.touk.mockserver.api.response;
public abstract class MockServerResponse {
}

View file

@ -1,15 +0,0 @@
package pl.touk.mockserver.api.response;
import lombok.Data;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;
@Data
public class Parameter {
@XmlAttribute(required = true)
private String name;
@XmlValue
private String value;
}

View file

@ -1,4 +0,0 @@
@XmlAccessorType(XmlAccessType.FIELD) package pl.touk.mockserver.api.response;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

View file

@ -1,4 +0,0 @@
AddMock
Method
PeekMock
RemoveMock

View file

@ -1,11 +0,0 @@
ExceptionOccured
MockAdded
MockEventReport
MockListing
MockPeeked
MockRemoved
MockReport
MockRequestReport
MockResponseReport
MockServerResponse
Parameter

View file

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings>
<jxb:globalBindings>
<xjc:simple/>
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://touk.pl/mockserver/api/common" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="method">
<xs:restriction base="xs:string">
<xs:enumeration value="POST"/>
<xs:enumeration value="GET"/>
<xs:enumeration value="DELETE"/>
<xs:enumeration value="PUT"/>
<xs:enumeration value="TRACE"/>
<xs:enumeration value="HEAD"/>
<xs:enumeration value="OPTIONS"/>
<xs:enumeration value="PATCH"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://touk.pl/mockserver/api/request" xmlns:tns="http://touk.pl/mockserver/api/request" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:common="http://touk.pl/mockserver/api/common">
<xs:import namespace="http://touk.pl/mockserver/api/common" schemaLocation="common.xsd"/>
<xs:element name="addMock" type="tns:AddMock"/>
<xs:element name="peekMock" type="tns:PeekMock"/>
<xs:element name="removeMock" type="tns:RemoveMock"/>
<xs:complexType name="AddMock">
<xs:complexContent>
<xs:extension base="tns:mockServerRequest">
<xs:sequence>
<xs:element name="path" type="xs:string"/>
<xs:element name="port" type="xs:int"/>
<xs:element name="predicate" type="xs:string" minOccurs="0"/>
<xs:element name="response" type="xs:string" minOccurs="0"/>
<xs:element name="soap" type="xs:boolean" minOccurs="0"/>
<xs:element name="statusCode" type="xs:int" minOccurs="0"/>
<xs:element name="method" type="common:method" minOccurs="0"/>
<xs:element name="responseHeaders" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="mockServerRequest" abstract="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="PeekMock">
<xs:complexContent>
<xs:extension base="tns:mockServerRequest"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="RemoveMock">
<xs:complexContent>
<xs:extension base="tns:mockServerRequest">
<xs:sequence>
<xs:element name="skipReport" type="xs:boolean" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>

View file

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://touk.pl/mockserver/api/response" xmlns:tns="http://touk.pl/mockserver/api/response" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:common="http://touk.pl/mockserver/api/common">
<xs:import namespace="http://touk.pl/mockserver/api/common" schemaLocation="common.xsd"/>
<xs:element name="exceptionOccured" type="tns:exceptionOccured"/>
<xs:element name="mockAdded" type="tns:mockAdded"/>
<xs:element name="mockPeeked" type="tns:mockPeeked"/>
<xs:element name="mockRemoved" type="tns:mockRemoved"/>
<xs:element name="mocks" type="tns:mockListing"/>
<xs:complexType name="exceptionOccured">
<xs:simpleContent>
<xs:extension base="xs:string"/>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="mockAdded">
<xs:complexContent>
<xs:extension base="tns:mockServerResponse">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="mockServerResponse" abstract="true">
<xs:sequence/>
</xs:complexType>
<xs:complexType name="mockEventReport">
<xs:sequence>
<xs:element name="request" type="tns:mockRequestReport"/>
<xs:element name="response" type="tns:mockResponseReport"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="mockRequestReport">
<xs:sequence>
<xs:element name="text" type="xs:string" minOccurs="0"/>
<xs:element name="headers" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="header" type="tns:parameter" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="queryParams" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="queryParam" type="tns:parameter" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="path" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="pathPart" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="parameter">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="mockResponseReport">
<xs:sequence>
<xs:element name="statusCode" type="xs:int"/>
<xs:element name="text" type="xs:string" minOccurs="0"/>
<xs:element name="headers" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="header" type="tns:parameter" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="mockListing">
<xs:complexContent>
<xs:extension base="tns:mockServerResponse">
<xs:sequence>
<xs:element name="mock" type="tns:mockReport" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="mockReport">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="path" type="xs:string"/>
<xs:element name="port" type="xs:int"/>
<xs:element name="predicate" type="xs:string"/>
<xs:element name="response" type="xs:string"/>
<xs:element name="responseHeaders" type="xs:string"/>
<xs:element name="soap" type="xs:boolean"/>
<xs:element name="method" type="common:method"/>
<xs:element name="statusCode" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="mockPeeked">
<xs:complexContent>
<xs:extension base="tns:mockServerResponse">
<xs:sequence>
<xs:element name="mockEvent" type="tns:mockEventReport" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="mockRemoved">
<xs:complexContent>
<xs:extension base="tns:mockServerResponse">
<xs:sequence>
<xs:element name="mockEvent" type="tns:mockEventReport" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>

View file

@ -18,9 +18,7 @@ import javax.xml.bind.JAXBContext
class RemoteMockServer { class RemoteMockServer {
private final String address private final String address
private final CloseableHttpClient client = HttpClients.createDefault() private final CloseableHttpClient client = HttpClients.createDefault()
private static final JAXBContext requestContext = JAXBContext.newInstance(AddMock.package.name, AddMock.classLoader) private static final JAXBContext requestContext = JAXBContext.newInstance(AddMock, PeekMock, RemoveMock)
private static
final JAXBContext responseContext = JAXBContext.newInstance(MockAdded.package.name, MockAdded.classLoader)
RemoteMockServer(String host, int port) { RemoteMockServer(String host, int port) {
address = "http://$host:$port/serverControl" address = "http://$host:$port/serverControl"
@ -70,7 +68,7 @@ class RemoteMockServer {
List<MockReport> listMocks() { List<MockReport> listMocks() {
HttpGet get = new HttpGet(address) HttpGet get = new HttpGet(address)
CloseableHttpResponse response = client.execute(get) CloseableHttpResponse response = client.execute(get)
MockListing mockListing = Util.extractResponse(response) as MockListing Mocks mocks = Util.extractResponse(response) as Mocks
return mockListing.mocks return mocks.mocks
} }
} }

View file

@ -35,7 +35,7 @@ class Util {
return responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as MockServerResponse return responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as MockServerResponse
} }
ExceptionOccured exceptionOccured = responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as ExceptionOccured ExceptionOccured exceptionOccured = responseContext.createUnmarshaller().unmarshal(new StringReader(responseString)) as ExceptionOccured
String message = exceptionOccured.message String message = exceptionOccured.value
if (message == 'mock already registered') { if (message == 'mock already registered') {
throw new MockAlreadyExists() throw new MockAlreadyExists()
} }

View file

@ -8,7 +8,7 @@ import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients import org.apache.http.impl.client.HttpClients
import org.apache.http.util.EntityUtils import org.apache.http.util.EntityUtils
import pl.touk.mockserver.api.request.AddMock import pl.touk.mockserver.api.request.AddMock
import pl.touk.mockserver.api.request.Method import pl.touk.mockserver.api.common.Method
import pl.touk.mockserver.api.response.MockEventReport import pl.touk.mockserver.api.response.MockEventReport
import pl.touk.mockserver.api.response.MockReport import pl.touk.mockserver.api.response.MockReport
import pl.touk.mockserver.api.response.Parameter import pl.touk.mockserver.api.response.Parameter
@ -637,14 +637,21 @@ class MockServerIntegrationTest extends Specification {
port: 9999 port: 9999
)) ))
remoteMockServer.removeMock('testRest5') remoteMockServer.removeMock('testRest5')
expect: when:
remoteMockServer.listMocks() == [ List<MockReport> mockReport = remoteMockServer.listMocks()
new MockReport(name: 'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), then:
new MockReport(name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '<response/>' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST), mockReport.size() == 5
new MockReport(name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST), assertMockReport(mockReport[0], [name:'testRest', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST])
new MockReport(name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT), assertMockReport(mockReport[1], [name: 'testRest2', path: 'testEndpoint', port: 9998, predicate: '''{ req -> req.xml.name() == 'request1'}''', response: '''{ req -> '<response/>' }''', responseHeaders: '{ _ -> [a: "b"] }', soap: false, statusCode: 200, method: Method.POST])
new MockReport(name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST) assertMockReport(mockReport[2], [name: 'testRest3', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST])
] assertMockReport(mockReport[3], [name: 'testRest4', path: 'testEndpoint', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: true, statusCode: 204, method: Method.PUT])
assertMockReport(mockReport[4], [name: 'testRest6', path: 'testEndpoint2', port: 9999, predicate: '{ _ -> true }', response: '''{ _ -> '' }''', responseHeaders: '{ _ -> [:] }', soap: false, statusCode: 200, method: Method.POST])
}
private void assertMockReport( MockReport mockReport, Map<String, Object> props) {
props.each {
assert mockReport."${it.key}" == it.value
}
} }
def "should add mock accepts path certain path params"() { def "should add mock accepts path certain path params"() {
@ -718,18 +725,18 @@ class MockServerIntegrationTest extends Specification {
then: then:
mockEvents1.size() == 2 mockEvents1.size() == 2
mockEvents1[0].request.text == '<request/>' mockEvents1[0].request.text == '<request/>'
!mockEvents1[0].request.headers?.empty !mockEvents1[0].request.headers?.headers?.empty
mockEvents1[0].request.queryParams == [] mockEvents1[0].request.queryParams.queryParams == []
mockEvents1[0].request.paths == ['testEndpoint'] mockEvents1[0].request.path.pathParts == ['testEndpoint']
!mockEvents1[0].response.headers?.empty !mockEvents1[0].response.headers?.headers?.empty
mockEvents1[0].response.text == '<goodResponseRest-request/>' mockEvents1[0].response.text == '<goodResponseRest-request/>'
mockEvents1[0].response.statusCode == 201 mockEvents1[0].response.statusCode == 201
mockEvents1[1].request.text == '<request15/>' mockEvents1[1].request.text == '<request15/>'
!mockEvents1[1].request.headers?.empty !mockEvents1[1].request.headers?.headers?.empty
mockEvents1[1].request.queryParams == [] mockEvents1[1].request.queryParams.queryParams == []
mockEvents1[1].request.paths == ['testEndpoint', 'hello'] mockEvents1[1].request.path.pathParts == ['testEndpoint', 'hello']
!mockEvents1[1].response.headers?.empty !mockEvents1[1].response.headers?.headers?.empty
mockEvents1[1].response.text == '<goodResponseRest-request15/>' mockEvents1[1].response.text == '<goodResponseRest-request15/>'
mockEvents1[1].response.statusCode == 201 mockEvents1[1].response.statusCode == 201
when: when:
@ -737,10 +744,10 @@ class MockServerIntegrationTest extends Specification {
then: then:
mockEvents2.size() == 1 mockEvents2.size() == 1
mockEvents2[0].request.text == '<reqXYZ/>' mockEvents2[0].request.text == '<reqXYZ/>'
!mockEvents2[0].request.headers?.empty !mockEvents2[0].request.headers?.headers?.empty
mockEvents2[0].request.queryParams == [new Parameter(name: 'id', value: '123')] mockEvents2[0].request.queryParams.queryParams.find { it.name == 'id' }?.value == '123'
mockEvents2[0].request.paths == ['testEndpoint'] mockEvents2[0].request.path.pathParts == ['testEndpoint']
mockEvents2[0].response.headers.find { it.name == 'aaa' }?.value == '15' mockEvents2[0].response.headers.headers.find { it.name == 'aaa' }?.value == '15'
mockEvents2[0].response.text == '<goodResponseRest/>' mockEvents2[0].response.text == '<goodResponseRest/>'
mockEvents2[0].response.statusCode == 202 mockEvents2[0].response.statusCode == 202
} }
@ -793,18 +800,18 @@ class MockServerIntegrationTest extends Specification {
then: then:
mockEvents1.size() == 2 mockEvents1.size() == 2
mockEvents1[0].request.text == '<request/>' mockEvents1[0].request.text == '<request/>'
!mockEvents1[0].request.headers?.empty !mockEvents1[0].request.headers?.headers?.empty
mockEvents1[0].request.queryParams == [] mockEvents1[0].request.queryParams.queryParams == []
mockEvents1[0].request.paths == ['testEndpoint'] mockEvents1[0].request.path.pathParts == ['testEndpoint']
!mockEvents1[0].response.headers?.empty !mockEvents1[0].response.headers?.headers?.empty
mockEvents1[0].response.text == '<goodResponseRest-request/>' mockEvents1[0].response.text == '<goodResponseRest-request/>'
mockEvents1[0].response.statusCode == 201 mockEvents1[0].response.statusCode == 201
mockEvents1[1].request.text == '<request15/>' mockEvents1[1].request.text == '<request15/>'
!mockEvents1[1].request.headers?.empty !mockEvents1[1].request.headers?.headers?.empty
mockEvents1[1].request.queryParams == [] mockEvents1[1].request.queryParams.queryParams == []
mockEvents1[1].request.paths == ['testEndpoint', 'hello'] mockEvents1[1].request.path.pathParts == ['testEndpoint', 'hello']
!mockEvents1[1].response.headers?.empty !mockEvents1[1].response.headers?.headers?.empty
mockEvents1[1].response.text == '<goodResponseRest-request15/>' mockEvents1[1].response.text == '<goodResponseRest-request15/>'
mockEvents1[1].response.statusCode == 201 mockEvents1[1].response.statusCode == 201
when: when:
@ -812,10 +819,10 @@ class MockServerIntegrationTest extends Specification {
then: then:
mockEvents2.size() == 1 mockEvents2.size() == 1
mockEvents2[0].request.text == '<reqXYZ/>' mockEvents2[0].request.text == '<reqXYZ/>'
!mockEvents2[0].request.headers?.empty !mockEvents2[0].request.headers?.headers?.empty
mockEvents2[0].request.queryParams == [new Parameter(name: 'id', value: '123')] mockEvents2[0].request.queryParams.queryParams.find{it.name == 'id'}?.value == '123'
mockEvents2[0].request.paths == ['testEndpoint'] mockEvents2[0].request.path.pathParts == ['testEndpoint']
mockEvents2[0].response.headers.find {it.name == 'aaa'}?.value == '15' mockEvents2[0].response.headers.headers.find {it.name == 'aaa'}?.value == '15'
mockEvents2[0].response.text == '<goodResponseRest/>' mockEvents2[0].response.text == '<goodResponseRest/>'
mockEvents2[0].response.statusCode == 202 mockEvents2[0].response.statusCode == 202
} }

View file

@ -3,7 +3,7 @@ package pl.touk.mockserver.server
import com.sun.net.httpserver.HttpExchange import com.sun.net.httpserver.HttpExchange
import groovy.transform.PackageScope import groovy.transform.PackageScope
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
import pl.touk.mockserver.api.request.Method import pl.touk.mockserver.api.common.Method
import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.CopyOnWriteArrayList

View file

@ -2,7 +2,10 @@ package pl.touk.mockserver.server
import com.sun.net.httpserver.HttpExchange import com.sun.net.httpserver.HttpExchange
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
import pl.touk.mockserver.api.request.* import pl.touk.mockserver.api.request.AddMock
import pl.touk.mockserver.api.request.MockServerRequest
import pl.touk.mockserver.api.request.PeekMock
import pl.touk.mockserver.api.request.RemoveMock
import pl.touk.mockserver.api.response.* import pl.touk.mockserver.api.response.*
import javax.xml.bind.JAXBContext import javax.xml.bind.JAXBContext
@ -50,7 +53,7 @@ class HttpMockServer {
} }
void listMocks(HttpExchange ex) { void listMocks(HttpExchange ex) {
MockListing mockListing = new MockListing( Mocks mockListing = new Mocks(
mocks: listMocks().collect { mocks: listMocks().collect {
new MockReport( new MockReport(
name: it.name, name: it.name,
@ -126,20 +129,20 @@ class HttpMockServer {
new MockEventReport( new MockEventReport(
request: new MockRequestReport( request: new MockRequestReport(
text: it.request.text, text: it.request.text,
headers: it.request.headers.collect { headers: new MockRequestReport.Headers(headers: it.request.headers.collect {
new Parameter(name: it.key, value: it.value) new Parameter(name: it.key, value: it.value)
}, }),
queryParams: it.request.query.collect { queryParams: new MockRequestReport.QueryParams(queryParams: it.request.query.collect {
new Parameter(name: it.key, value: it.value) new Parameter(name: it.key, value: it.value)
}, }),
paths: it.request.path path: new MockRequestReport.Path(pathParts: it.request.path)
), ),
response: new MockResponseReport( response: new MockResponseReport(
statusCode: it.response.statusCode, statusCode: it.response.statusCode,
text: it.response.text, text: it.response.text,
headers: it.response.headers.collect { headers: new MockResponseReport.Headers(headers: it.response.headers.collect {
new Parameter(name: it.key, value: it.value) new Parameter(name: it.key, value: it.value)
} })
) )
) )
} }
@ -159,7 +162,7 @@ class HttpMockServer {
} }
private static void createErrorResponse(HttpExchange ex, Exception e) { private static void createErrorResponse(HttpExchange ex, Exception e) {
createResponse(ex, new ExceptionOccured(message: e.message), 400) createResponse(ex, new ExceptionOccured(value: e.message), 400)
} }
void stop() { void stop() {

View file

@ -3,7 +3,7 @@ package pl.touk.mockserver.server
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
import groovy.transform.PackageScope import groovy.transform.PackageScope
import groovy.util.logging.Slf4j import groovy.util.logging.Slf4j
import pl.touk.mockserver.api.request.Method import pl.touk.mockserver.api.common.Method
import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.CopyOnWriteArrayList
@ -79,10 +79,8 @@ class Mock implements Comparable<Mock> {
} }
} }
void setSoap(String soap) { void setSoap(Boolean soap) {
if (soap) { this.soap = soap ?: false
this.soap = Boolean.valueOf(soap)
}
} }
void setStatusCode(String statusCode) { void setStatusCode(String statusCode) {