package bo.gotthardt.test;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;
import com.google.common.base.Preconditions;
import io.dropwizard.jackson.Jackson;
import io.dropwizard.testing.junit.ResourceTestRule;
import org.glassfish.jersey.internal.util.collection.MultivaluedStringMap;
import org.glassfish.jersey.test.TestProperties;
import org.junit.Before;
import org.zapodot.jackson.java8.JavaOptionalModule;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Base class for API integration tests.
*
* @author Bo Gotthardt
*/
public abstract class ApiIntegrationTest {
protected static final InMemoryEbeanServer db = new InMemoryEbeanServer();
@Before
public void clearDatabase() {
db.clear();
}
@Before
public void squelchSpammyLoggers() {
Logger.getLogger("com.sun.jersey").setLevel(Level.WARNING);
}
public ResourceTestRule getResources() {
return null;
}
protected WebTarget target(String path) {
// The base URL does not get set properly when using GrizzlyWebTestContainer, so set it explicitly.
// Unfortunately it does not seem possible to get the actual port, so use the default port and hope that's the one being used.
return getResources().client().target("http://localhost:" + TestProperties.DEFAULT_CONTAINER_PORT + path);
}
protected Response GET(String path) {
return target(path).request().get();
}
protected Response POST(String path, Object input, MediaType type) {
return target(path).request().post(Entity.entity(input, type));
}
protected Response POST(String path, MultivaluedMap input) {
return POST(path, input, MediaType.APPLICATION_FORM_URLENCODED_TYPE);
}
protected Response POST(String path, Object input) {
return POST(path, input, MediaType.APPLICATION_JSON_TYPE);
}
protected Response PUT(String path, Object input, MediaType type) {
return target(path).request().put(Entity.entity(input, type));
}
protected Response PUT(String path, Object input) {
return PUT(path, input, MediaType.APPLICATION_JSON_TYPE);
}
protected Response DELETE(String path) {
return target(path).request().delete();
}
protected static ObjectMapper getMapper() {
return Jackson.newObjectMapper()
.registerModule(new JavaOptionalModule())
.registerModule(new JSR310Module())
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}
protected static MultivaluedMap<String, String> formParameters(String... keyValues) {
Preconditions.checkArgument(keyValues.length % 2 == 0, "Must have an even number of arguments.");
MultivaluedMap<String, String> parameters = new MultivaluedStringMap();
for (int i = 0; i < keyValues.length; i = i + 2) {
parameters.add(keyValues[i], keyValues[i + 1]);
}
return parameters;
}
}