package org.mockserver.mock; import com.fasterxml.jackson.annotation.JsonIgnore; import org.mockserver.matchers.HttpRequestMatcher; import org.mockserver.matchers.MatcherBuilder; import org.mockserver.matchers.TimeToLive; import org.mockserver.matchers.Times; import org.mockserver.model.*; /** * @author jamesdbloom */ public class Expectation extends ObjectWithJsonToString { private final HttpRequest httpRequest; private final Times times; private final TimeToLive timeToLive; private final HttpRequestMatcher httpRequestMatcher; private HttpResponse httpResponse; private HttpForward httpForward; private HttpError httpError; private HttpClassCallback httpClassCallback; private HttpObjectCallback httpObjectCallback; public Expectation(HttpRequest httpRequest, Times times, TimeToLive timeToLive) { this.httpRequest = httpRequest; this.times = times; this.timeToLive = timeToLive; this.httpRequestMatcher = new MatcherBuilder().transformsToMatcher(this.httpRequest); } public HttpRequest getHttpRequest() { return httpRequest; } public HttpResponse getHttpResponse() { return httpResponse; } public HttpForward getHttpForward() { return httpForward; } public HttpError getHttpError() { return httpError; } public HttpClassCallback getHttpClassCallback() { return httpClassCallback; } public HttpObjectCallback getHttpObjectCallback() { return httpObjectCallback; } public Action getAction() { if (httpResponse != null) { return getHttpResponse(); } else if (httpForward != null) { return getHttpForward(); } else if (httpError != null) { return getHttpError(); } else if (httpClassCallback != null) { return getHttpClassCallback(); } else if (httpObjectCallback != null) { return getHttpObjectCallback(); } else { return null; } } public Times getTimes() { return times; } public TimeToLive getTimeToLive() { return timeToLive; } public Expectation thenRespond(HttpResponse httpResponse) { if (httpResponse != null) { if (httpForward != null) { throw new IllegalArgumentException("It is not possible to set a response once a forward has been set"); } if (httpError != null) { throw new IllegalArgumentException("It is not possible to set a response once an error has been set"); } if (httpClassCallback != null) { throw new IllegalArgumentException("It is not possible to set a response once a class callback has been set"); } if (httpObjectCallback != null) { throw new IllegalArgumentException("It is not possible to set a response once an object callback has been set"); } this.httpResponse = httpResponse; } return this; } public Expectation thenForward(HttpForward httpForward) { if (httpForward != null) { if (httpResponse != null) { throw new IllegalArgumentException("It is not possible to set a forward once a response has been set"); } if (httpError != null) { throw new IllegalArgumentException("It is not possible to set a forward once an error has been set"); } if (httpClassCallback != null) { throw new IllegalArgumentException("It is not possible to set a forward once a class callback has been set"); } if (httpObjectCallback != null) { throw new IllegalArgumentException("It is not possible to set a forward once an object callback has been set"); } this.httpForward = httpForward; } return this; } public Expectation thenError(HttpError httpError) { if (httpError != null) { if (httpResponse != null) { throw new IllegalArgumentException("It is not possible to set an error once a response has been set"); } if (httpForward != null) { throw new IllegalArgumentException("It is not possible to set an error once a forward has been set"); } if (httpClassCallback != null) { throw new IllegalArgumentException("It is not possible to set a error once a class callback has been set"); } if (httpObjectCallback != null) { throw new IllegalArgumentException("It is not possible to set a error once an object callback has been set"); } this.httpError = httpError; } return this; } public Expectation thenCallback(HttpClassCallback httpClassCallback) { if (httpClassCallback != null) { if (httpResponse != null) { throw new IllegalArgumentException("It is not possible to set a class callback once a response has been set"); } if (httpError != null) { throw new IllegalArgumentException("It is not possible to set a class callback once an error has been set"); } if (httpForward != null) { throw new IllegalArgumentException("It is not possible to set a class callback once a forward has been set"); } if (httpObjectCallback != null) { throw new IllegalArgumentException("It is not possible to set a class callback once an object callback has been set"); } this.httpClassCallback = httpClassCallback; } return this; } public Expectation thenCallback(HttpObjectCallback httpObjectCallback) { if (httpObjectCallback != null) { if (httpResponse != null) { throw new IllegalArgumentException("It is not possible to set a object callback once a response has been set"); } if (httpError != null) { throw new IllegalArgumentException("It is not possible to set a object callback once an error has been set"); } if (httpForward != null) { throw new IllegalArgumentException("It is not possible to set a object callback once a forward has been set"); } if (httpClassCallback != null) { throw new IllegalArgumentException("It is not possible to set a object callback once an class callback has been set"); } this.httpObjectCallback = httpObjectCallback; } return this; } public boolean matches(HttpRequest httpRequest) { return hasRemainingMatches() && isStillAlive() && httpRequestMatcher.matches(httpRequest, true); } public boolean hasRemainingMatches() { return times == null || times.greaterThenZero(); } @JsonIgnore public boolean isStillAlive() { return timeToLive == null || timeToLive.stillAlive(); } public void decrementRemainingMatches() { if (times != null) { times.decrement(); } } public void setNotUnlimitedResponses() { if (times != null) { times.setNotUnlimitedResponses(); } } public boolean contains(HttpRequest httpRequest) { return httpRequest != null && this.httpRequest.equals(httpRequest); } }