package org.swisspush.reststorage;
import com.jayway.restassured.http.ContentType;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.TimeUnit;
import static com.jayway.awaitility.Awaitility.await;
import static com.jayway.restassured.RestAssured.get;
import static com.jayway.restassured.RestAssured.given;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.core.IsEqual.equalTo;
@RunWith(VertxUnitRunner.class)
public class CleanupTest extends AbstractTestCase {
@Test
public void testNothingToCleanup(TestContext testContext) throws InterruptedException {
Async async = testContext.async();
validateCleanupResults(0,0);
async.complete();
}
@Test
public void testCleanupAmountBelowBulkSize(TestContext testContext) throws InterruptedException {
Async async = testContext.async();
generateResourcesAndWaitUntilExpired(100);
validateCleanupResults(100,0);
async.complete();
}
@Test
public void testCleanupAmountHigherThanBulkSize(TestContext testContext) throws InterruptedException {
Async async = testContext.async();
generateResourcesAndWaitUntilExpired(300);
validateCleanupResults(300,0);
async.complete();
}
private void generateResourcesAndWaitUntilExpired(int amountOfResources){
for (int i = 1; i <= amountOfResources; i++) {
given().
header("x-expire-after", "1").
body("{ \"foo\": \"bar1\" }").
when().
put("resource_"+i).
then().
assertThat().statusCode(200);
}
await().atMost(3, TimeUnit.SECONDS).until(() -> get("resource_"+ amountOfResources).statusCode(), equalTo(404));
}
private void validateCleanupResults(int cleanedResources, int expiredResourcesLeft){
given()
.post("/server/_cleanup")
.then()
.assertThat()
.statusCode(200)
.contentType(ContentType.JSON)
.body("", allOf(hasKey("cleanedResources"), hasKey("expiredResourcesLeft")))
.body("cleanedResources", equalTo(cleanedResources))
.body("expiredResourcesLeft", equalTo(expiredResourcesLeft));
}
}