package org.molgenis.file.ingest; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.molgenis.auth.User; import org.molgenis.auth.UserFactory; import org.molgenis.auth.UserMetaData; import org.molgenis.data.DataService; import org.molgenis.data.Query; import org.molgenis.data.meta.model.EntityType; import org.molgenis.data.meta.model.EntityTypeFactory; import org.molgenis.file.ingest.execution.FileIngestJob; import org.molgenis.file.ingest.execution.FileIngestJobFactory; import org.molgenis.file.ingest.meta.FileIngest; import org.molgenis.file.ingest.meta.FileIngestFactory; import org.molgenis.file.ingest.meta.FileIngestJobExecution; import org.molgenis.file.ingest.meta.FileIngestMetaData; import org.molgenis.file.model.FileMeta; import org.molgenis.test.data.AbstractMolgenisSpringTest; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; 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.Mockito.*; import static org.testng.Assert.assertEquals; @ContextConfiguration(classes = { FileIngesterQuartzJobTest.Config.class }) public class FileIngesterQuartzJobTest extends AbstractMolgenisSpringTest { @Autowired private FileIngesterQuartzJob fileIngesterQuartzJob; @Autowired private DataService dataService; @Autowired private FileIngestJobFactory fileIngestJobFactory; @Autowired private EntityTypeFactory entityTypeFactory; @Autowired private FileIngestFactory fileIngestFactory; @Autowired private UserFactory userFactory; private JobExecutionContext contextMock; @BeforeMethod public void setUpBeforeMethod() { contextMock = mock(JobExecutionContext.class); } @Test public void quartzJobRetrievesFileIngestCreatesJobExecutionEntityAndJobAndRunsJob() throws Exception { JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put(FileIngesterQuartzJob.ENTITY_KEY, "abcde"); when(contextMock.getMergedJobDataMap()).thenReturn(jobDataMap); EntityType targetEntity = entityTypeFactory.create(); targetEntity.setName("org_molgenis_test_TypeTest"); FileIngest fileIngest = fileIngestFactory.create(); fileIngest.setFailureEmail("x@y.z"); fileIngest.setTargetEntity(targetEntity); when(dataService.findOneById(FileIngestMetaData.FILE_INGEST, "abcde", FileIngest.class)).thenReturn(fileIngest); Query<User> queryMock = Mockito.mock(Query.class); User admin = userFactory.create(); admin.setUsername("admin"); when(dataService.query(UserMetaData.USER, User.class)).thenReturn(queryMock); when(queryMock.eq(UserMetaData.USERNAME, "admin")).thenReturn(queryMock); when(queryMock.findOne()).thenReturn(admin); ArgumentCaptor<FileIngestJobExecution> captor = ArgumentCaptor.forClass(FileIngestJobExecution.class); FileIngestJob fileIngestJobMock = mock(FileIngestJob.class); when(fileIngestJobFactory.createJob(captor.capture())).thenReturn(fileIngestJobMock); FileMeta fileMeta = mock(FileMeta.class); when(fileIngestJobMock.call()).thenReturn(fileMeta); fileIngesterQuartzJob.execute(contextMock); // check that properly filled jobExecution entity was fed to the factory FileIngestJobExecution jobExecution = captor.getValue(); assertEquals(jobExecution.getFailureEmail(), new String[] { "x@y.z" }); assertEquals(jobExecution.getFileIngest(), fileIngest); verify(dataService).add("sys_FileMeta", fileMeta); } @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 FileIngesterQuartzJob fileIngesterQuartzJob() { return new FileIngesterQuartzJob(); } @Bean public FileIngestJobFactory fileIngestJobFactory() { return mock(FileIngestJobFactory.class); } @Bean public DataService dataService() { return mock(DataService.class); } } }