Add xsd and docker
Change-Id: Ifad2e3a8678a487e6f13114f910e19bce4d80964
This commit is contained in:
parent
d71c191f0f
commit
80dbbc034f
33 changed files with 313 additions and 348 deletions
7
Dockerfile
Normal file
7
Dockerfile
Normal 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
6
buildImage.sh
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
mvn clean install
|
||||||
|
mvn -f mockserver/pom.xml package assembly:single
|
||||||
|
|
||||||
|
docker build -t mockserver .
|
|
@ -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>
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
package pl.touk.mockserver.api.request;
|
|
||||||
|
|
||||||
public abstract class MockServerRequest {
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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 {
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
package pl.touk.mockserver.api.response;
|
|
||||||
|
|
||||||
public abstract class MockServerResponse {
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
|
@ -1,4 +0,0 @@
|
||||||
AddMock
|
|
||||||
Method
|
|
||||||
PeekMock
|
|
||||||
RemoveMock
|
|
|
@ -1,11 +0,0 @@
|
||||||
ExceptionOccured
|
|
||||||
MockAdded
|
|
||||||
MockEventReport
|
|
||||||
MockListing
|
|
||||||
MockPeeked
|
|
||||||
MockRemoved
|
|
||||||
MockReport
|
|
||||||
MockRequestReport
|
|
||||||
MockResponseReport
|
|
||||||
MockServerResponse
|
|
||||||
Parameter
|
|
10
mockserver-api/src/main/xjb/binding.xjb
Normal file
10
mockserver-api/src/main/xjb/binding.xjb
Normal 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>
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
134
mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd
Normal file
134
mockserver-api/src/main/xsd/pl/touk/mockserver/api/response.xsd
Normal 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>
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue