1
0
Fork 0
http-mock-server/mockserver/src/main/groovy/pl/touk/mockserver/server/Mock.groovy
Dominik Adam Przybysz ee42225e9c Compile mock closures with mockserver classloader
Change-Id: Ic57efa8017650f308c1862dce418b629262a3ef7
2015-05-16 14:22:41 +02:00

107 lines
3.2 KiB
Groovy

package pl.touk.mockserver.server
import groovy.transform.EqualsAndHashCode
import groovy.transform.PackageScope
import groovy.util.logging.Slf4j
import java.util.concurrent.CopyOnWriteArrayList
@PackageScope
@EqualsAndHashCode(excludes = ["counter"])
@Slf4j
class Mock implements Comparable<Mock> {
final String name
final String path
final int port
String predicateClosureText = '{ _ -> true }'
String responseClosureText = '''{ _ -> '' }'''
String responseHeadersClosureText = '{ _ -> [:] }'
Closure predicate = toClosure(predicateClosureText)
Closure response = toClosure(responseClosureText)
Closure responseHeaders =toClosure(responseHeadersClosureText)
boolean soap = false
int statusCode = 200
String method = 'POST'
int counter = 0
final List<MockEvent> history = new CopyOnWriteArrayList<>()
Mock(String name, String path, int port) {
if (!(name)) {
throw new RuntimeException("Mock name must be given")
}
this.name = name
this.path = path
this.port = port
}
boolean match(String method, MockRequest request) {
return this.method == method && predicate(request)
}
MockResponse apply(MockRequest request) {
log.debug("Mock $name invoked")
++counter
String responseText = response(request)
String response = soap ? wrapSoap(responseText) : responseText
Map<String, String> headers = responseHeaders(request)
MockResponse mockResponse = new MockResponse(statusCode, response, headers)
history << new MockEvent(request, mockResponse)
return mockResponse
}
private static String wrapSoap(String request) {
"""<?xml version='1.0' encoding='UTF-8'?>
<soap-env:Envelope xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/' xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<soap-env:Body>${request}</soap-env:Body>
</soap-env:Envelope>"""
}
void setPredicate(String predicate) {
if (predicate) {
this.predicateClosureText = predicate
this.predicate = toClosure(predicate)
}
}
private Closure toClosure(String predicate) {
GroovyShell sh = new GroovyShell(this.class.classLoader);
return sh.evaluate(predicate) as Closure
}
void setResponse(String response) {
if (response) {
this.responseClosureText = response
this.response = toClosure(response)
}
}
void setSoap(String soap) {
if (soap) {
this.soap = Boolean.valueOf(soap)
}
}
void setStatusCode(String statusCode) {
if (statusCode) {
this.statusCode = Integer.valueOf(statusCode)
}
}
void setMethod(String method) {
if (method) {
this.method = method
}
}
void setResponseHeaders(String responseHeaders) {
if (responseHeaders) {
this.responseHeadersClosureText = responseHeaders
this.responseHeaders = toClosure(responseHeaders)
}
}
@Override
int compareTo(Mock o) {
return name.compareTo(o.name)
}
}