package testapp.endpoint;
import org.osgl.$;
import org.osgl.util.C;
import org.osgl.util.E;
import org.osgl.util.S;
import java.util.List;
import java.util.Map;
public class EndPointTestContext {
public enum RequestMethod {
GET() {
@Override
public void verify(EndpointTester tester, EndPointTestContext context) throws Exception {
tester.setup();
tester.url(context.url).get(context.params);
tester.bodyEq(context.expected);
}
},
POST_FORM_DATA() {
@Override
public void verify(EndpointTester tester, EndPointTestContext context) throws Exception {
tester.setup();
tester.url(context.url).post(context.params);
tester.bodyEq(context.expected);
}
}, POST_JSON () {
@Override
public void verify(EndpointTester tester, EndPointTestContext context) throws Exception {
tester.setup();
Map<String, Object> params = tester.prepareJsonData(context.params);
tester.url(context.url).postJSON(params);
tester.bodyEq(context.expected, context.expected2, context.expected3);
}
};
public abstract void verify(EndpointTester tester, EndPointTestContext context) throws Exception;
}
private String url;
private String expected;
// Our JSON deserializer will convert double into BigDecimal, thus
// the output string will be different, which should be acceptable
// E.g. double value: "1.7976931348623157E308" should equals to
// big decimal value: "1.7976931348623157E+308"
private String expected2;
// plus the Set of big decimals
private String expected3;
private List<$.T2<String, Object>> params;
private RequestMethod requestMethod;
public EndPointTestContext() {}
public EndPointTestContext url(String url) {
this.url = $.notNull(url);
return this;
}
public EndPointTestContext expected(String expected) {
this.expected = expected;
return this;
}
public EndPointTestContext expected(String expected, String expected2, String expected3) {
this.expected = expected;
this.expected2 = expected2;
this.expected3 = expected3;
return this;
}
public EndPointTestContext params(List<$.T2<String, Object>> params) {
this.params = params;
return this;
}
public EndPointTestContext params(String key, Object val, Object ... otherPairs) {
E.illegalArgumentIf(otherPairs.length % 2 != 0);
this.params = C.newSizedList(1 + otherPairs.length / 2);
this.params.add($.T2(key, val));
for (int i = 0; i < otherPairs.length - 1; ++i) {
this.params.add($.T2(S.string(otherPairs[i]), otherPairs[i+1]));
}
return this;
}
public EndPointTestContext method(RequestMethod requestMethod) {
this.requestMethod = requestMethod;
return this;
}
public void applyTo(EndpointTester tester) throws Exception {
requestMethod.verify(tester, this);
}
}