package org.molgenis.data.jobs;
import org.mockito.Mock;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.Query;
import org.molgenis.data.jobs.model.JobExecution;
import org.molgenis.data.meta.SystemEntityType;
import org.molgenis.data.meta.model.EntityType;
import org.molgenis.data.meta.system.SystemEntityTypeRegistry;
import org.molgenis.test.data.AbstractMolgenisSpringTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.stream.Stream;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.molgenis.data.jobs.model.JobExecution.Status.RUNNING;
import static org.molgenis.data.jobs.model.JobExecutionMetaData.*;
@ContextConfiguration(classes = { JobBootstrapperTest.Config.class, JobBootstrapper.class })
public class JobBootstrapperTest extends AbstractMolgenisSpringTest
{
@Autowired
private JobBootstrapper jobBootstrapper;
@Autowired
private DataService dataService;
@Autowired
private SystemEntityTypeRegistry systemEntityTypeRegistry;
@Mock
private SystemEntityType jobType1;
@Mock
private JobExecution job1;
@Mock
private JobExecution job2;
@Mock
private EntityType jobExecutionType;
@Mock
private Query<Entity> query;
@BeforeClass
public void beforeClass()
{
initMocks(this);
}
@Test
public void testBootstrap()
{
when(systemEntityTypeRegistry.getSystemEntityTypes()).thenReturn(Stream.of(jobType1));
when(jobType1.getExtends()).thenReturn(jobExecutionType);
when(jobExecutionType.getName()).thenReturn(JOB_EXECUTION);
when(jobType1.getName()).thenReturn("JobType1");
when(dataService.query("JobType1")).thenReturn(query);
when(query.eq(STATUS, RUNNING)).thenReturn(query);
when(query.eq(STATUS, PENDING)).thenReturn(query);
when(query.or()).thenReturn(query);
when(query.findAll()).thenReturn(Stream.of(job1, job2));
when(job1.get(LOG)).thenReturn("Current log");
when(job1.getEntityType()).thenReturn(jobType1);
when(job2.get(LOG)).thenReturn(null);
when(job2.getEntityType()).thenReturn(jobType1);
jobBootstrapper.bootstrap();
verify(job1).set(STATUS, FAILED);
verify(job1).set(PROGRESS_MESSAGE, "Application terminated unexpectedly");
verify(job1).set(LOG, "Current log\nFAILED - Application terminated unexpectedly");
verify(job2).set(STATUS, FAILED);
verify(job2).set(PROGRESS_MESSAGE, "Application terminated unexpectedly");
verify(job2).set(LOG, "FAILED - Application terminated unexpectedly");
verify(dataService).update("JobType1", job1);
verify(dataService).update("JobType1", job2);
}
@Configuration
public static class Config
{
@Bean
public DataService dataService()
{
return mock(DataService.class);
}
@Bean
public SystemEntityTypeRegistry systemEntityTypeRegistry()
{
return mock(SystemEntityTypeRegistry.class);
}
}
}