package net.joelinn.quartz; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import org.quartz.Calendar; import org.quartz.JobDetail; import org.quartz.JobPersistenceException; import org.quartz.impl.calendar.HolidayCalendar; import org.quartz.impl.triggers.CronTriggerImpl; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.collection.IsMapContaining.hasKey; import static org.junit.Assert.*; /** * Joe Linn * 7/17/2014 */ public class StoreCalendarTest extends BaseTest{ @Test public void storeCalendar() throws Exception { final String calendarName = "weekdayCalendar"; Calendar calendar = getCalendar(); jobStore.storeCalendar(calendarName, calendar, false, false); final String calendarHashKey = schema.calendarHashKey(calendarName); Map<String, String> calendarMap = jedis.hgetAll(calendarHashKey); assertThat(calendarMap, hasKey("calendar_class")); assertEquals(calendar.getClass().getName(), calendarMap.get("calendar_class")); assertThat(calendarMap, hasKey("calendar_json")); ObjectMapper mapper = new ObjectMapper(); Map<String, Object> calendarJson = mapper.readValue(calendarMap.get("calendar_json"), new TypeReference<HashMap<String, Object>>() { }); assertThat(calendarJson, hasKey("description")); assertEquals("Only run on weekdays.", calendarJson.get("description")); } @Test public void storeCalendarWithReplace() throws Exception { final String calendarName = "weekdayCalendar"; Calendar calendar = getCalendar(); jobStore.storeCalendar(calendarName, calendar, true, false); jobStore.storeCalendar(calendarName, calendar, true, false); } @Test(expected = JobPersistenceException.class) public void storeCalendarNoReplace() throws Exception { final String calendarName = "weekdayCalendar"; Calendar calendar = getCalendar(); jobStore.storeCalendar(calendarName, calendar, false, false); jobStore.storeCalendar(calendarName, calendar, false, false); } @Test public void retrieveCalendar() throws Exception { final String calendarName = "weekdayCalendar"; Calendar calendar = getCalendar(); jobStore.storeCalendar(calendarName, calendar, false, false); Calendar retrievedCalendar = jobStore.retrieveCalendar(calendarName); assertEquals(calendar.getClass(), retrievedCalendar.getClass()); assertEquals(calendar.getDescription(), retrievedCalendar.getDescription()); long currentTime = System.currentTimeMillis(); assertEquals(calendar.getNextIncludedTime(currentTime), retrievedCalendar.getNextIncludedTime(currentTime)); } @Test public void getNumberOfCalendars() throws Exception { jobStore.storeCalendar("calendar1", getCalendar(), false, false); jobStore.storeCalendar("calendar1", getCalendar(), true, false); jobStore.storeCalendar("calendar2", getCalendar(), false, false); int numberOfCalendars = jobStore.getNumberOfCalendars(); assertEquals(2, numberOfCalendars); } @Test public void getCalendarNames() throws Exception { List<String> calendarNames = jobStore.getCalendarNames(); assertThat(calendarNames, not(nullValue())); assertThat(calendarNames, hasSize(0)); jobStore.storeCalendar("calendar1", getCalendar(), false, false); jobStore.storeCalendar("calendar2", getCalendar(), false, false); calendarNames = jobStore.getCalendarNames(); assertThat(calendarNames, hasSize(2)); assertThat(calendarNames, containsInAnyOrder("calendar2", "calendar1")); } @Test public void removeCalendar() throws Exception { assertFalse(jobStore.removeCalendar("foo")); jobStore.storeCalendar("calendar1", getCalendar(), false, false); assertTrue(jobStore.removeCalendar("calendar1")); assertThat(jobStore.retrieveCalendar("calendar1"), nullValue()); } @Test(expected = JobPersistenceException.class) public void removeCalendarWithTrigger() throws Exception { // store trigger and job JobDetail job = getJobDetail(); jobStore.storeJob(job, false); CronTriggerImpl trigger1 = getCronTrigger("trigger1", "group1", job.getKey()); jobStore.storeTrigger(trigger1, false); jobStore.removeCalendar(trigger1.getCalendarName()); } @Test public void holidayCalendar() throws Exception { // HolidayCalendar sets the time of any given Date to 00:00:00 java.util.Calendar cal = java.util.Calendar.getInstance(); cal.set(java.util.Calendar.HOUR_OF_DAY, 0); cal.set(java.util.Calendar.MINUTE, 0); cal.set(java.util.Calendar.SECOND, 0); cal.set(java.util.Calendar.MILLISECOND, 0); final Date excludedDate = cal.getTime(); HolidayCalendar calendar = new HolidayCalendar(); calendar.addExcludedDate(excludedDate); final String name = "holidayCalendar"; jobStore.storeCalendar(name, calendar, true, true); final String calendarHashKey = schema.calendarHashKey(name); Map<String, String> calendarMap = jedis.hgetAll(calendarHashKey); assertThat(calendarMap, hasKey("calendar_class")); assertThat(calendarMap.get("calendar_class"), equalTo(HolidayCalendar.class.getName())); assertThat(calendarMap, hasKey("calendar_json")); String json = calendarMap.get("calendar_json"); assertThat(json, containsString("\"dates\":[")); assertThat(json, not(containsString("\"excludedDates\":"))); Calendar retrieved = jobStore.retrieveCalendar(name); assertThat(retrieved, notNullValue()); assertThat(retrieved, instanceOf(HolidayCalendar.class)); HolidayCalendar retrievedHoliday = (HolidayCalendar) retrieved; assertThat(retrievedHoliday.getExcludedDates(), hasItem(excludedDate)); } }