package org.molgenis.file.ingest;
import org.molgenis.data.DataService;
import org.molgenis.data.UnknownEntityException;
import org.molgenis.data.validation.MolgenisValidationException;
import org.molgenis.file.ingest.meta.FileIngest;
import org.molgenis.file.ingest.meta.FileIngestFactory;
import org.molgenis.test.data.AbstractMolgenisSpringTest;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
import static org.molgenis.file.ingest.meta.FileIngestMetaData.FILE_INGEST;
@ContextConfiguration(classes = { FileIngesterJobSchedulerTest.Config.class })
public class FileIngesterJobSchedulerTest extends AbstractMolgenisSpringTest
{
private static DataService dataServiceMock = mock(DataService.class);
private static Scheduler schedulerMock = mock(Scheduler.class);
@Autowired
private FileIngesterJobScheduler fileIngesterJobScheduler;
@Autowired
private DataService dataService;
@Autowired
private Scheduler scheduler;
@Autowired
private FileIngestFactory fileIngestFactory;
@BeforeMethod
public void setUpBeforeMethod()
{
reset(dataServiceMock);
reset(schedulerMock);
}
@Test
public void runNow() throws SchedulerException
{
String id = "id";
FileIngest fileIngest = fileIngestFactory.create();
fileIngest.setId(id);
when(dataService.findOneById(FILE_INGEST, id, FileIngest.class)).thenReturn(fileIngest);
when(scheduler.checkExists(new JobKey(id, FileIngesterJobScheduler.JOB_GROUP))).thenReturn(false);
fileIngesterJobScheduler.runNow(id);
verify(scheduler).scheduleJob(any(JobDetail.class), any(Trigger.class));
}
@Test(expectedExceptions = UnknownEntityException.class)
public void runNowUnknownEntity()
{
String id = "id";
when(dataService.findOneById(FILE_INGEST, id)).thenReturn(null);
fileIngesterJobScheduler.runNow(id);
}
@Test
public void runNowExists() throws SchedulerException
{
String id = "id";
FileIngest fileIngest = fileIngestFactory.create();
fileIngest.setId(id);
when(dataService.findOneById(FILE_INGEST, id, FileIngest.class)).thenReturn(fileIngest);
when(scheduler.checkExists(new JobKey(id, FileIngesterJobScheduler.JOB_GROUP))).thenReturn(true);
fileIngesterJobScheduler.runNow(id);
verify(scheduler).triggerJob(new JobKey(id, FileIngesterJobScheduler.JOB_GROUP));
}
@Test
public void schedule() throws SchedulerException
{
String id = "id";
FileIngest fileIngest = fileIngestFactory.create();
fileIngest.setId(id);
fileIngest.setCronExpression(" 0/20 * * * * ?");
fileIngest.setName("name");
fileIngest.setActive(true);
when(scheduler.checkExists(new JobKey(id, FileIngesterJobScheduler.JOB_GROUP))).thenReturn(false);
fileIngesterJobScheduler.schedule(fileIngest);
verify(scheduler).scheduleJob(any(JobDetail.class), any(Trigger.class));
}
@Test
public void scheduleInactive() throws SchedulerException
{
String id = "id";
FileIngest fileIngest = fileIngestFactory.create();
fileIngest.setId(id);
fileIngest.setCronExpression(" 0/20 * * * * ?");
fileIngest.setName("name");
fileIngest.setActive(false);
when(scheduler.checkExists(new JobKey(id, FileIngesterJobScheduler.JOB_GROUP))).thenReturn(false);
fileIngesterJobScheduler.schedule(fileIngest);
verify(scheduler, never()).scheduleJob(any(JobDetail.class), any(Trigger.class));
}
@Test(expectedExceptions = MolgenisValidationException.class)
public void scheduleInvalidCronExpression() throws SchedulerException
{
String id = "id";
FileIngest fileIngest = fileIngestFactory.create();
fileIngest.setId(id);
fileIngest.setCronExpression("XXX");
fileIngest.setName("name");
fileIngest.setActive(false);
fileIngesterJobScheduler.schedule(fileIngest);
}
@Test
public void scheduleExisting() throws SchedulerException
{
String id = "id";
FileIngest fileIngest = fileIngestFactory.create();
fileIngest.setId(id);
fileIngest.setCronExpression(" 0/20 * * * * ?");
fileIngest.setName("name");
fileIngest.setActive(true);
when(scheduler.checkExists(new JobKey(id, FileIngesterJobScheduler.JOB_GROUP))).thenReturn(true);
fileIngesterJobScheduler.schedule(fileIngest);
verify(scheduler).deleteJob((new JobKey(id, FileIngesterJobScheduler.JOB_GROUP)));
verify(scheduler).scheduleJob(any(JobDetail.class), any(Trigger.class));
}
@Test
public void unschedule() throws SchedulerException
{
String id = "id";
fileIngesterJobScheduler.unschedule(id);
verify(scheduler).deleteJob((new JobKey(id, FileIngesterJobScheduler.JOB_GROUP)));
}
@Configuration
@ComponentScan({ "org.molgenis.file.ingest.meta", "org.molgenis.security.owned", "org.molgenis.file.model",
"org.molgenis.data.jobs.model", "org.molgenis.auth" })
public static class Config
{
@Bean
public FileIngesterJobScheduler fileIngesterJobScheduler()
{
return new FileIngesterJobScheduler(scheduler(), dataService());
}
@Bean
public Scheduler scheduler()
{
return schedulerMock;
}
@Bean
public DataService dataService()
{
return dataServiceMock;
}
}
}