Skip to content

Instantly share code, notes, and snippets.

@jdgiotta
Last active August 29, 2015 14:22
Show Gist options
  • Save jdgiotta/8c33402c1a026c2ccb12 to your computer and use it in GitHub Desktop.
Save jdgiotta/8c33402c1a026c2ccb12 to your computer and use it in GitHub Desktop.
Quartz CronTrigger Integration Test Example
package com.giotta
import grails.plugins.quartz.GrailsJobClassConstants
import grails.plugins.quartz.JobManagerService
import org.quartz.JobKey
import org.quartz.Trigger
import spock.lang.Specification
/**
* SubscriptionSendJob Integration Tests
* @author John D Giotta
* @since May 30th, 2015
*/
class SubscriptionSendJobIntegrationSpec extends Specification {
JobManagerService jobManagerService
List<Trigger> triggers
def setup() {
triggers = jobManagerService.quartzScheduler.getTriggersOfJob(JobKey.jobKey(
SubscriptionSendJob.canonicalName, GrailsJobClassConstants.DEFAULT_GROUP))
}
void "test trigger size" () {
expect:
assert triggers.size() == (Periodical.values().size() - 1) // subtract IMMEDIATE
}
void "test trigger names" () {
expect:
assert triggers.get(0).getName().contains(Periodical.DAILY.name())
assert triggers.get(1).getName().contains(Periodical.WEEKLY.name())
assert triggers.get(2).getName().contains(Periodical.MONTHLY.name())
}
void "test trigger next run dates"() {
expect:
assert triggers.get(0).getNextFireTime() == calculateFireTime(Periodical.DAILY)
assert triggers.get(1).getNextFireTime() == calculateFireTime(Periodical.WEEKLY)
assert triggers.get(2).getNextFireTime() == calculateFireTime(Periodical.MONTHLY)
}
private static Date calculateFireTime(Periodical periodical) {
Calendar calendar = getCalendar()
Date nextDate = null
switch (periodical) {
case Periodical.DAILY:
calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMaximum(Calendar.HOUR_OF_DAY))
nextDate = calendar.getTime()
break
case Periodical.WEEKLY:
if (calendar.get(Calendar.DAY_OF_WEEK) <= Calendar.FRIDAY) {
calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY)
} else {
calendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY)
calendar.add(Calendar.DATE, 7)
}
nextDate = calendar.getTime()
break
case Periodical.MONTHLY:
if (calendar.get(Calendar.DAY_OF_MONTH) == calendar.getActualMaximum(Calendar.DAY_OF_MONTH)) {
calendar.add(Calendar.MONTH, 1)
} else {
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH))
}
nextDate = calendar.getTime()
break
}
return nextDate
}
private static Calendar getCalendar () {
Calendar calendar = Calendar.getInstance()
calendar.set(Calendar.HOUR_OF_DAY, 23)
calendar.set(Calendar.MINUTE, 59)
calendar.set(Calendar.SECOND, 59)
calendar.clear(Calendar.MILLISECOND)
return calendar
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment