package de.otto.edison.jobs.repository;
import de.otto.edison.jobs.domain.JobInfo;
import de.otto.edison.jobs.repository.cleanup.KeepLastJobs;
import de.otto.edison.jobs.repository.inmem.InMemJobRepository;
import org.junit.Test;
import java.time.Clock;
import java.time.Instant;
import static de.otto.edison.jobs.domain.JobInfo.JobStatus.ERROR;
import static de.otto.edison.jobs.domain.JobInfo.JobStatus.OK;
import static de.otto.edison.jobs.domain.JobInfo.JobStatus.SKIPPED;
import static de.otto.edison.jobs.domain.JobInfo.builder;
import static de.otto.edison.testsupport.matcher.OptionalMatchers.isAbsent;
import static de.otto.edison.testsupport.matcher.OptionalMatchers.isPresent;
import static java.time.Clock.fixed;
import static java.time.OffsetDateTime.now;
import static java.time.ZoneId.systemDefault;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
public class DeleteSkippedJobsTest {
private final Clock now = fixed(Instant.now(), systemDefault());
private final Clock earlier = fixed(Instant.now().minusSeconds(1), systemDefault());
private final Clock muchEarlier = fixed(Instant.now().minusSeconds(10), systemDefault());
@Test
public void shouldRemoveOldestJobs() {
// given
JobInfo job = builder()
.setJobId("foo")
.setJobType("TYPE")
.setStarted(now(now))
.setStopped(now(now))
.setHostname("localhost")
.setStatus(SKIPPED)
.build();
JobRepository repository = new InMemJobRepository() {{
createOrUpdate(job);
createOrUpdate(job.copy().setJobId("foobar").setStarted(now(earlier)).build());
createOrUpdate(job.copy().setJobId("bar").setStarted(now(muchEarlier)).build());
}};
KeepLastJobs strategy = new KeepLastJobs(repository, 2);
// when
strategy.doCleanUp();
// then
assertThat(repository.size(), is(2L));
assertThat(repository.findOne("bar"), isAbsent());
}
@Test
public void shouldOnlyRemoveStoppedJobs() {
// given
JobInfo job = builder()
.setJobId("foo")
.setJobType("TYPE")
.setHostname("localhost")
.setStatus(SKIPPED)
.build();
JobRepository repository = new InMemJobRepository() {{
createOrUpdate(job.copy().setStarted(now(now)).setStopped(now(now)).build());
createOrUpdate(job.copy().setStarted(now(earlier)).setJobId("foobar").setStarted(now(earlier)).build());
createOrUpdate(job.copy().setStarted(now(muchEarlier)).setJobId("bar").setStopped(now(now)).build());
}};
KeepLastJobs strategy = new KeepLastJobs(repository, 1);
// when
strategy.doCleanUp();
// then
assertThat(repository.findOne("foo"), isPresent());
assertThat(repository.findOne("foobar"), isPresent());
assertThat(repository.findOne("bar"), isAbsent());
assertThat(repository.size(), is(2L));
}
}