package org.molgenis.data.validation.meta;
import org.mockito.ArgumentCaptor;
import org.molgenis.data.Repository;
import org.molgenis.data.meta.model.EntityType;
import org.molgenis.data.validation.MolgenisValidationException;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.stream.Stream;
import static org.mockito.Mockito.*;
import static org.testng.Assert.assertEquals;
public class EntityTypeRepositoryValidationDecoratorTest
{
private EntityTypeRepositoryValidationDecorator entityTypeRepoValidationDecorator;
private Repository<EntityType> decoratedRepo;
private EntityTypeValidator entityTypeValidator;
@SuppressWarnings("unchecked")
@BeforeMethod
public void setUpBeforeMethod()
{
decoratedRepo = mock(Repository.class);
entityTypeValidator = mock(EntityTypeValidator.class);
entityTypeRepoValidationDecorator = new EntityTypeRepositoryValidationDecorator(decoratedRepo,
entityTypeValidator);
}
@Test(expectedExceptions = NullPointerException.class)
public void EntityTypeRepositoryValidationDecorator()
{
new EntityTypeRepositoryValidationDecorator(null, null);
}
@Test
public void delegate()
{
assertEquals(entityTypeRepoValidationDecorator.delegate(), decoratedRepo);
}
@Test
public void updateEntityValid()
{
EntityType entityType = mock(EntityType.class);
doNothing().when(entityTypeValidator).validate(entityType);
entityTypeRepoValidationDecorator.update(entityType);
}
@Test(expectedExceptions = MolgenisValidationException.class)
public void updateEntityInvalid() throws Exception
{
EntityType entityType = mock(EntityType.class);
doThrow(mock(MolgenisValidationException.class)).when(entityTypeValidator).validate(entityType);
entityTypeRepoValidationDecorator.update(entityType);
}
@Test
public void updateEntityStreamValid()
{
EntityType entityType0 = mock(EntityType.class);
EntityType entityType1 = mock(EntityType.class);
doNothing().when(entityTypeValidator).validate(entityType0);
doNothing().when(entityTypeValidator).validate(entityType1);
entityTypeRepoValidationDecorator.update(Stream.of(entityType0, entityType1));
@SuppressWarnings("unchecked")
ArgumentCaptor<Stream<EntityType>> captor = ArgumentCaptor.forClass((Class) Stream.class);
verify(decoratedRepo).update(captor.capture());
captor.getValue().count(); // process all entities in stream
}
@Test(expectedExceptions = MolgenisValidationException.class)
public void updateEntityStreamInvalid()
{
EntityType entityType0 = mock(EntityType.class);
EntityType entityType1 = mock(EntityType.class);
doNothing().when(entityTypeValidator).validate(entityType0);
doThrow(mock(MolgenisValidationException.class)).when(entityTypeValidator).validate(entityType1);
entityTypeRepoValidationDecorator.update(Stream.of(entityType0, entityType1));
@SuppressWarnings("unchecked")
ArgumentCaptor<Stream<EntityType>> captor = ArgumentCaptor.forClass((Class) Stream.class);
verify(decoratedRepo).update(captor.capture());
captor.getValue().count(); // process all entities in stream
}
@Test
public void addEntityValid()
{
EntityType entityType = mock(EntityType.class);
doNothing().when(entityTypeValidator).validate(entityType);
entityTypeRepoValidationDecorator.add(entityType);
}
@Test(expectedExceptions = MolgenisValidationException.class)
public void addEntityInvalid()
{
EntityType entityType = mock(EntityType.class);
doThrow(mock(MolgenisValidationException.class)).when(entityTypeValidator).validate(entityType);
entityTypeRepoValidationDecorator.add(entityType);
}
@Test
public void addEntityStreamValid()
{
EntityType entityType0 = mock(EntityType.class);
EntityType entityType1 = mock(EntityType.class);
doNothing().when(entityTypeValidator).validate(entityType0);
doNothing().when(entityTypeValidator).validate(entityType1);
entityTypeRepoValidationDecorator.add(Stream.of(entityType0, entityType1));
@SuppressWarnings("unchecked")
ArgumentCaptor<Stream<EntityType>> captor = ArgumentCaptor.forClass((Class) Stream.class);
verify(decoratedRepo).add(captor.capture());
captor.getValue().count(); // process all entities in stream
}
@Test(expectedExceptions = MolgenisValidationException.class)
public void addEntityStreamInvalid()
{
EntityType entityType0 = mock(EntityType.class);
EntityType entityType1 = mock(EntityType.class);
doNothing().when(entityTypeValidator).validate(entityType0);
doThrow(mock(MolgenisValidationException.class)).when(entityTypeValidator).validate(entityType1);
entityTypeRepoValidationDecorator.add(Stream.of(entityType0, entityType1));
@SuppressWarnings("unchecked")
ArgumentCaptor<Stream<EntityType>> captor = ArgumentCaptor.forClass((Class) Stream.class);
verify(decoratedRepo).add(captor.capture());
captor.getValue().count(); // process all entities in stream
}
}