package org.molgenis.dataexplorer;
import com.google.common.collect.ImmutableList;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.molgenis.data.Entity;
import org.molgenis.data.Repository;
import org.molgenis.data.annotation.core.RepositoryAnnotator;
import org.molgenis.data.annotation.web.CrudRepositoryAnnotator;
import org.molgenis.data.jobs.JobExecutionException;
import org.molgenis.data.jobs.Progress;
import org.molgenis.data.mem.InMemoryRepository;
import org.molgenis.data.meta.model.EntityType;
import org.molgenis.dataexplorer.controller.AnnotationJob;
import org.springframework.security.core.Authentication;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.IOException;
import static org.mockito.Mockito.*;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
public class AnnotationJobTest
{
private AnnotationJob annotationJob;
@Mock
private CrudRepositoryAnnotator crudRepositoryAnnotator;
@Mock
private RepositoryAnnotator exac;
@Mock
private RepositoryAnnotator cadd;
private Repository<Entity> repository;
@Mock
private Progress progress;
@Mock
private Authentication authentication;
@Mock
private PlatformTransactionManager transactionManager;
@BeforeMethod
public void beforeMethod()
{
MockitoAnnotations.initMocks(this);
EntityType emd = when(mock(EntityType.class).getName()).thenReturn("repo").getMock();
when(emd.getLabel()).thenReturn("My repo");
repository = new InMemoryRepository(emd);
annotationJob = new AnnotationJob(crudRepositoryAnnotator, "fdlk", ImmutableList.of(exac, cadd), repository,
progress, authentication, new TransactionTemplate(transactionManager));
}
@Test
public void testHappyPath() throws IOException
{
when(exac.getSimpleName()).thenReturn("exac");
when(cadd.getSimpleName()).thenReturn("cadd");
annotationJob.call();
Mockito.verify(crudRepositoryAnnotator).annotate(exac, repository);
Mockito.verify(crudRepositoryAnnotator).annotate(cadd, repository);
Mockito.verify(progress).start();
Mockito.verify(progress).setProgressMax(2);
Mockito.verify(progress)
.progress(0, "Annotating \"My repo\" with exac (annotator 1 of 2, started by \"fdlk\")");
Mockito.verify(progress)
.progress(1, "Annotating \"My repo\" with cadd (annotator 2 of 2, started by \"fdlk\")");
Mockito.verify(progress).success();
}
@Test
public void testFirstAnnotatorFails() throws IOException
{
when(exac.getSimpleName()).thenReturn("exac");
when(cadd.getSimpleName()).thenReturn("cadd");
IOException exception = new IOException("error");
doThrow(exception).when(crudRepositoryAnnotator).annotate(exac, repository);
try
{
annotationJob.call();
fail("Should throw exception");
}
catch (JobExecutionException actual)
{
assertEquals(actual.getCause(), exception);
}
Mockito.verify(progress).start();
Mockito.verify(progress).setProgressMax(2);
Mockito.verify(progress)
.progress(0, "Annotating \"My repo\" with exac (annotator 1 of 2, started by \"fdlk\")");
Mockito.verify(progress)
.progress(1, "Annotating \"My repo\" with cadd (annotator 2 of 2, started by \"fdlk\")");
Mockito.verify(progress).status("Failed annotators: exac. Successful annotators: cadd");
Mockito.verify(progress).failed(exception);
}
}