package me.atam.atam4jsampleapp.testsupport;
import io.dropwizard.testing.DropwizardTestSupport;
import me.atam.atam4j.PollingPredicate;
import me.atam.atam4jdomain.TestsRunResult;
import me.atam.atam4jsampleapp.ApplicationConfiguration;
import org.glassfish.jersey.client.JerseyClientBuilder;
import org.junit.After;
import javax.ws.rs.core.Response;
import static me.atam.atam4jsampleapp.testsupport.AcceptanceTestTimeouts.MAX_ATTEMPTS;
import static me.atam.atam4jsampleapp.testsupport.AcceptanceTestTimeouts.RETRY_POLL_INTERVAL;
import static org.junit.Assert.assertTrue;
public abstract class AcceptanceTest {
protected DropwizardTestSupport<ApplicationConfiguration> dropwizardTestSupportAppConfig;
@After
public void stopApplication() {
dropwizardTestSupportAppConfig.after();
}
public Response getTestRunResultFromServer(String testsURI){
return new JerseyClientBuilder().build().target(
testsURI)
.request()
.get();
}
public String getTestsURI() {
return String.format("http://localhost:%d/tests", dropwizardTestSupportAppConfig.getLocalPort());
}
public Response getResponseFromTestsWithCategoryOnceTestRunHasCompleted(String category) {
waitUntilTestRunHasCompleted();
return getTestRunResultFromServer(getTestsURI() + "/" + category);
}
public Response getResponseFromTestsEndpointOnceTestsRunHasCompleted() {
waitUntilTestRunHasCompleted();
return getTestRunResultFromServer(getTestsURI());
}
public Response getCustomListenerStatusOnceTestsRunHasCompleted() {
waitUntilTestRunHasCompleted();
return getTestRunResultFromServer(getCustomListenerStatusURI());
}
public String getCustomListenerStatusURI() {
return String.format("http://localhost:%d/customlistenerstatus", dropwizardTestSupportAppConfig.getLocalPort());
}
private void waitUntilTestRunHasCompleted() {
PollingPredicate<Response> responsePollingPredicate = new PollingPredicate<>(
MAX_ATTEMPTS,
RETRY_POLL_INTERVAL,
response -> !response.readEntity(TestsRunResult.class).getStatus().equals(TestsRunResult.Status.TOO_EARLY),
() -> getTestRunResultFromServer(getTestsURI()));
assertTrue(responsePollingPredicate.pollUntilPassedOrMaxAttemptsExceeded());
}
}