package org.jooby.internal.quartz;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Map.Entry;
import org.jooby.quartz.Scheduled;
import org.jooby.test.MockUnit;
import org.junit.Test;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigException;
public class JobBeanExpanderTest {
public static class NoScheduled {
public void job() {
}
}
public static class StaticCallback {
@Scheduled("5s")
public static void runAt() {
}
}
public static class PrivateCallback {
@Scheduled("5s")
private void runAt() {
}
}
public static class BadArgCallback {
@Scheduled("5s")
public void runAt(final String something) {
}
}
public static class BadArgsCallback {
@Scheduled("5s")
public void runAt(final String something, final int x) {
}
}
public static class IntervalJob {
@Scheduled("5s")
public void runAt() {
}
}
public static class CronJob {
@Scheduled("0/3 * * * * ?")
public void doWork() {
}
}
public static class InvervalPropertyRefJob {
@Scheduled("job.scheduled")
public void doWork() {
}
}
public static class CronRefJob {
@Scheduled("job.scheduled")
public void doWork(final JobExecutionContext ctx) {
}
}
@Test(expected = IllegalArgumentException.class)
public void shouldFailWhenAnnotationIsMissing() throws Exception {
new MockUnit(Config.class)
.run(unit -> {
JobExpander.jobs(unit.get(Config.class), Arrays.asList(NoScheduled.class));
});
}
@Test(expected = IllegalArgumentException.class)
public void shouldFailOnStaticCallbacks() throws Exception {
new MockUnit(Config.class)
.run(unit -> {
JobExpander.jobs(unit.get(Config.class), Arrays.asList(StaticCallback.class));
});
}
@Test(expected = IllegalArgumentException.class)
public void shouldFailOnPrivateCallback() throws Exception {
new MockUnit(Config.class)
.run(unit -> {
JobExpander.jobs(unit.get(Config.class), Arrays.asList(PrivateCallback.class));
});
}
@Test(expected = IllegalArgumentException.class)
public void shouldFailOnBadArgCallback() throws Exception {
new MockUnit(Config.class)
.run(unit -> {
JobExpander.jobs(unit.get(Config.class), Arrays.asList(BadArgCallback.class));
});
}
@Test(expected = IllegalArgumentException.class)
public void shouldFailOnBadArgsCallback() throws Exception {
new MockUnit(Config.class)
.run(unit -> {
JobExpander.jobs(unit.get(Config.class), Arrays.asList(BadArgsCallback.class));
});
}
@Test
public void shouldBuildIntervalJob() throws Exception {
new MockUnit(Config.class)
.expect(unit -> {
Config config = unit.get(Config.class);
expect(config.getString("5s")).andThrow(new ConfigException.BadPath("5s", "5s"));
})
.run(unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(IntervalJob.class)).entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(ReflectiveJob.class, job.getJobClass());
assertEquals(IntervalJob.class.getPackage().getName(), job.getKey().getGroup());
assertEquals("JobBeanExpanderTest$IntervalJob.runAt", job.getKey().getName());
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(5000L, trigger.getRepeatInterval());
assertEquals(IntervalJob.class.getPackage().getName(), trigger.getKey().getGroup());
assertEquals("JobBeanExpanderTest$IntervalJob.runAt", trigger.getKey().getName());
});
}
@Test
public void shouldBuildCronJob() throws Exception {
new MockUnit(Config.class)
.expect(
unit -> {
Config config = unit.get(Config.class);
expect(config.getString("0/3 * * * * ?")).andThrow(
new ConfigException.BadPath("0/3 * * * * ?", "0/3 * * * * ?"));
})
.run(unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(CronJob.class)).entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(ReflectiveJob.class, job.getJobClass());
assertEquals(CronJob.class.getPackage().getName(), job.getKey().getGroup());
assertEquals("JobBeanExpanderTest$CronJob.doWork", job.getKey().getName());
CronTrigger trigger = (CronTrigger) entry.getValue();
assertEquals("0/3 * * * * ?", trigger.getCronExpression());
assertEquals(CronJob.class.getPackage().getName(), trigger.getKey().getGroup());
assertEquals("JobBeanExpanderTest$CronJob.doWork", trigger.getKey().getName());
});
}
@Test
public void shouldBuildInvervalJobWithPropertyRef() throws Exception {
new MockUnit(Config.class)
.expect(
unit -> {
Config config = unit.get(Config.class);
expect(config.getString("job.scheduled")).andReturn("3000");
})
.run(
unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(InvervalPropertyRefJob.class))
.entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(ReflectiveJob.class, job.getJobClass());
assertEquals(InvervalPropertyRefJob.class.getPackage().getName(), job.getKey()
.getGroup());
assertEquals("JobBeanExpanderTest$InvervalPropertyRefJob.doWork", job.getKey()
.getName());
SimpleTrigger trigger = (SimpleTrigger) entry.getValue();
assertEquals(3000L, trigger.getRepeatInterval());
assertEquals(InvervalPropertyRefJob.class.getPackage().getName(), trigger.getKey()
.getGroup());
assertEquals("JobBeanExpanderTest$InvervalPropertyRefJob.doWork", trigger
.getKey().getName());
});
}
@Test
public void shouldBuildCronJobWithPropertyRef() throws Exception {
new MockUnit(Config.class)
.expect(
unit -> {
Config config = unit.get(Config.class);
expect(config.getString("job.scheduled")).andReturn("0/3 * * * * ?");
})
.run(
unit -> {
Entry<JobDetail, Trigger> entry = JobExpander
.jobs(unit.get(Config.class), Arrays.asList(CronRefJob.class))
.entrySet()
.iterator().next();
JobDetail job = entry.getKey();
assertEquals(ReflectiveJob.class, job.getJobClass());
assertEquals(CronRefJob.class.getPackage().getName(), job.getKey()
.getGroup());
assertEquals("JobBeanExpanderTest$CronRefJob.doWork", job.getKey()
.getName());
CronTrigger trigger = (CronTrigger) entry.getValue();
assertEquals("0/3 * * * * ?", trigger.getCronExpression());
assertEquals(CronRefJob.class.getPackage().getName(), trigger.getKey()
.getGroup());
assertEquals("JobBeanExpanderTest$CronRefJob.doWork", trigger.getKey()
.getName());
});
}
}