package org.molgenis.data.validation;
import org.molgenis.data.Entity;
import org.molgenis.data.Query;
import org.molgenis.data.Repository;
import org.molgenis.data.meta.model.EntityType;
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 QueryValidationRepositoryDecoratorTest
{
private QueryValidationRepositoryDecorator<Entity> queryValidationRepositoryDecorator;
private EntityType entityType;
private Repository<Entity> decoratedRepo;
private QueryValidator queryValidator;
@SuppressWarnings("unchecked")
@BeforeMethod
public void setUpBeforeMethod()
{
decoratedRepo = mock(Repository.class);
entityType = mock(EntityType.class);
when(decoratedRepo.getEntityType()).thenReturn(entityType);
queryValidator = mock(QueryValidator.class);
queryValidationRepositoryDecorator = new QueryValidationRepositoryDecorator<>(decoratedRepo, queryValidator);
}
@Test(expectedExceptions = NullPointerException.class)
public void testQueryValidationRepositoryDecorator()
{
new QueryValidationRepositoryDecorator<>(null, null);
}
@Test
public void testDelegate()
{
assertEquals(queryValidationRepositoryDecorator.delegate(), decoratedRepo);
}
@Test
public void testCountQueryValid()
{
@SuppressWarnings("unchecked")
Query<Entity> query = mock(Query.class);
long count = 123L;
when(decoratedRepo.count(query)).thenReturn(count);
assertEquals(count, queryValidationRepositoryDecorator.count(query));
verify(queryValidator).validate(query, entityType);
}
@Test(expectedExceptions = MolgenisValidationException.class)
public void testCountQueryInvalid()
{
@SuppressWarnings("unchecked")
Query<Entity> query = mock(Query.class);
doThrow(mock(MolgenisValidationException.class)).when(queryValidator).validate(query, entityType);
queryValidationRepositoryDecorator.count(query);
}
@Test
public void testFindAllQueryValid()
{
@SuppressWarnings("unchecked")
Query<Entity> query = mock(Query.class);
@SuppressWarnings("unchecked")
Stream<Entity> entityStream = mock(Stream.class);
when(decoratedRepo.findAll(query)).thenReturn(entityStream);
assertEquals(entityStream, queryValidationRepositoryDecorator.findAll(query));
verify(queryValidator).validate(query, entityType);
}
@Test(expectedExceptions = MolgenisValidationException.class)
public void testFindAllQueryInvalid()
{
@SuppressWarnings("unchecked")
Query<Entity> query = mock(Query.class);
doThrow(mock(MolgenisValidationException.class)).when(queryValidator).validate(query, entityType);
queryValidationRepositoryDecorator.findAll(query);
}
@Test
public void testFindOneQueryValid()
{
@SuppressWarnings("unchecked")
Query<Entity> query = mock(Query.class);
Entity entity = mock(Entity.class);
when(decoratedRepo.findOne(query)).thenReturn(entity);
assertEquals(entity, queryValidationRepositoryDecorator.findOne(query));
verify(queryValidator).validate(query, entityType);
}
@Test(expectedExceptions = MolgenisValidationException.class)
public void testFindOneQueryInvalid()
{
@SuppressWarnings("unchecked")
Query<Entity> query = mock(Query.class);
doThrow(mock(MolgenisValidationException.class)).when(queryValidator).validate(query, entityType);
queryValidationRepositoryDecorator.findOne(query);
}
}