package org.molgenis.data.listeners;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.molgenis.data.Entity;
import org.molgenis.data.Fetch;
import org.molgenis.data.Query;
import org.molgenis.data.Repository;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.testng.Assert.assertEquals;
public class EntityListenerRepositoryDecoratorTest
{
private Repository<Entity> decoratedRepository;
private EntityListenerRepositoryDecorator entityListenerRepositoryDecorator;
private EntityListenersService entityListenersService = new EntityListenersService();
@SuppressWarnings("unchecked")
@BeforeMethod
public void setUpBeforeMethod()
{
decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(decoratedRepository,
entityListenersService);
Mockito.when(entityListenerRepositoryDecorator.getName()).thenReturn("entityFullName");
}
@AfterMethod
public void afterMethod()
{
entityListenerRepositoryDecorator = null;
}
@SuppressWarnings("resource")
@Test(expectedExceptions = NullPointerException.class)
public void EntityListenerRepositoryDecorator()
{
new EntityListenerRepositoryDecorator(null, entityListenersService);
}
@Test
public void delegate() throws Exception
{
assertEquals(entityListenerRepositoryDecorator.delegate(), decoratedRepository);
}
@Test
public void testQuery() throws Exception
{
assertEquals(entityListenerRepositoryDecorator.query().getRepository(), entityListenerRepositoryDecorator);
}
@Test
public void addStream()
{
Stream<Entity> entities = Stream.empty();
Mockito.when(decoratedRepository.add(entities)).thenReturn(Integer.valueOf(123));
Assert.assertEquals(entityListenerRepositoryDecorator.add(entities), Integer.valueOf(123));
}
@Test
public void deleteStream()
{
Stream<Entity> entities = Stream.empty();
entityListenerRepositoryDecorator.delete(entities);
Mockito.verify(decoratedRepository, Mockito.times(1)).delete(entities);
}
@SuppressWarnings("resource")
@Test
public void updateEntityWithListener()
{
@SuppressWarnings("unchecked")
Repository<Entity> decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
EntityListenerRepositoryDecorator entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(
decoratedRepository, entityListenersService);
EntityListener entityListener0 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId())
.thenReturn(Integer.valueOf(1)).getMock();
entityListenersService.addEntityListener("entityFullName", entityListener0);
Entity entity = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(1)).getMock();
entityListenerRepositoryDecorator.update(entity);
Mockito.verify(decoratedRepository).update(entity);
Mockito.verify(entityListener0, Mockito.times(1)).postUpdate(entity);
}
@SuppressWarnings("resource")
@Test
public void updateEntityWithListeners()
{
@SuppressWarnings("unchecked")
Repository<Entity> decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
EntityListenerRepositoryDecorator entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(
decoratedRepository, entityListenersService);
EntityListener entityListener0 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId())
.thenReturn(Integer.valueOf(1)).getMock();
EntityListener entityListener1 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId())
.thenReturn(Integer.valueOf(1)).getMock();
entityListenersService.addEntityListener("entityFullName", entityListener0);
entityListenersService.addEntityListener("entityFullName", entityListener1);
Entity entity = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(1)).getMock();
entityListenerRepositoryDecorator.update(entity);
Mockito.verify(decoratedRepository).update(entity);
Mockito.verify(entityListener0, Mockito.times(1)).postUpdate(entity);
Mockito.verify(entityListener1, Mockito.times(1)).postUpdate(entity);
}
@SuppressWarnings("resource")
@Test
public void updateEntityWithoutListener()
{
@SuppressWarnings("unchecked")
Repository<Entity> decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
EntityListenerRepositoryDecorator entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(
decoratedRepository, entityListenersService);
EntityListener entityListener0 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId())
.thenReturn(Integer.valueOf(-1)).getMock();
entityListenersService.addEntityListener("entityFullName", entityListener0);
Entity entity = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(1)).getMock();
entityListenerRepositoryDecorator.update(entity);
Mockito.verify(decoratedRepository).update(entity);
Mockito.verify(entityListener0, Mockito.times(0)).postUpdate(entity);
}
@SuppressWarnings("resource")
@Test
public void updateEntityNoListeners()
{
@SuppressWarnings("unchecked")
Repository<Entity> decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
EntityListenerRepositoryDecorator entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(
decoratedRepository, entityListenersService);
Entity entity = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(1)).getMock();
entityListenerRepositoryDecorator.update(entity);
Mockito.verify(decoratedRepository).update(entity);
}
@SuppressWarnings({ "resource", "unchecked", "rawtypes" })
@Test
public void updateStreamWithListeners()
{
Repository<Entity> decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
EntityListenerRepositoryDecorator entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(
decoratedRepository, entityListenersService);
EntityListener entityListener0 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId())
.thenReturn(Integer.valueOf(1)).getMock();
EntityListener entityListener1 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId())
.thenReturn(Integer.valueOf(2)).getMock();
entityListenersService.addEntityListener("entityFullName", entityListener0);
entityListenersService.addEntityListener("entityFullName", entityListener1);
Entity entity0 = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(1)).getMock();
Entity entity1 = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(2)).getMock();
Stream<Entity> entities = Stream.of(entity0, entity1);
entityListenerRepositoryDecorator.update(entities);
ArgumentCaptor<Stream<Entity>> captor = ArgumentCaptor.forClass((Class) Stream.class);
Mockito.verify(decoratedRepository).update(captor.capture());
Assert.assertEquals(captor.getValue().collect(Collectors.toList()), Arrays.asList(entity0, entity1));
Mockito.verify(entityListener0, Mockito.times(1)).postUpdate(entity0);
Mockito.verify(entityListener1, Mockito.times(1)).postUpdate(entity1);
}
@SuppressWarnings({ "resource", "unchecked", "rawtypes" })
@Test
public void updateStreamWithSomeListeners()
{
Repository<Entity> decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
EntityListenerRepositoryDecorator entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(
decoratedRepository, entityListenersService);
EntityListener entityListener1 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId())
.thenReturn(Integer.valueOf(2)).getMock();
entityListenersService.addEntityListener("entityFullName", entityListener1);
Entity entity0 = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(1)).getMock();
Entity entity1 = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(2)).getMock();
Stream<Entity> entities = Stream.of(entity0, entity1);
entityListenerRepositoryDecorator.update(entities);
ArgumentCaptor<Stream<Entity>> captor = ArgumentCaptor.forClass((Class) Stream.class);
Mockito.verify(decoratedRepository).update(captor.capture());
Assert.assertEquals(captor.getValue().collect(Collectors.toList()), Arrays.asList(entity0, entity1));
Mockito.verify(entityListener1, Mockito.times(1)).postUpdate(entity1);
}
@SuppressWarnings({ "resource", "unchecked", "rawtypes" })
@Test
public void updateStreamNoListeners()
{
Repository<Entity> decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
EntityListenerRepositoryDecorator entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(
decoratedRepository, entityListenersService);
Entity entity0 = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(1)).getMock();
Entity entity1 = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(2)).getMock();
Stream<Entity> entities = Stream.of(entity0, entity1);
entityListenerRepositoryDecorator.update(entities);
ArgumentCaptor<Stream<Entity>> captor = ArgumentCaptor.forClass((Class) Stream.class);
Mockito.verify(decoratedRepository, Mockito.times(1)).update(captor.capture());
Assert.assertEquals(captor.getValue().collect(Collectors.toList()), Arrays.asList(entity0, entity1));
}
@SuppressWarnings("resource")
@Test
public void removeEntityListener()
{
@SuppressWarnings("unchecked")
Repository<Entity> decoratedRepository = Mockito.mock(Repository.class);
Mockito.when(decoratedRepository.getName()).thenReturn("entityFullName");
EntityListenerRepositoryDecorator entityListenerRepositoryDecorator = new EntityListenerRepositoryDecorator(
decoratedRepository, entityListenersService);
EntityListener entityListener0 = Mockito.when(Mockito.mock(EntityListener.class).getEntityId())
.thenReturn(Integer.valueOf(1)).getMock();
entityListenersService.addEntityListener("entityFullName", entityListener0);
entityListenersService.removeEntityListener("entityFullName", entityListener0);
Entity entity = Mockito.when(Mockito.mock(Entity.class).getIdValue()).thenReturn(Integer.valueOf(1)).getMock();
entityListenerRepositoryDecorator.update(entity);
Mockito.verify(decoratedRepository).update(entity);
Mockito.verify(entityListener0, Mockito.times(0)).postUpdate(entity);
}
@Test
public void findAllStream()
{
Object id0 = "id0";
Object id1 = "id1";
Entity entity0 = Mockito.mock(Entity.class);
Entity entity1 = Mockito.mock(Entity.class);
Stream<Object> entityIds = Stream.of(id0, id1);
Mockito.when(decoratedRepository.findAll(entityIds)).thenReturn(Stream.of(entity0, entity1));
Stream<Entity> expectedEntities = entityListenerRepositoryDecorator.findAll(entityIds);
Assert.assertEquals(expectedEntities.collect(Collectors.toList()), Arrays.asList(entity0, entity1));
}
@Test
public void findAllStreamFetch()
{
Fetch fetch = new Fetch();
Object id0 = "id0";
Object id1 = "id1";
Entity entity0 = Mockito.mock(Entity.class);
Entity entity1 = Mockito.mock(Entity.class);
Stream<Object> entityIds = Stream.of(id0, id1);
Mockito.when(decoratedRepository.findAll(entityIds, fetch)).thenReturn(Stream.of(entity0, entity1));
Stream<Entity> expectedEntities = entityListenerRepositoryDecorator.findAll(entityIds, fetch);
Assert.assertEquals(expectedEntities.collect(Collectors.toList()), Arrays.asList(entity0, entity1));
}
@Test
public void findAllAsStream()
{
Entity entity0 = Mockito.mock(Entity.class);
@SuppressWarnings("unchecked")
Query<Entity> query = Mockito.mock(Query.class);
Mockito.when(decoratedRepository.findAll(query)).thenReturn(Stream.of(entity0));
Stream<Entity> entities = entityListenerRepositoryDecorator.findAll(query);
Assert.assertEquals(entities.collect(Collectors.toList()), Arrays.asList(entity0));
}
@Test
public void streamFetch()
{
Fetch fetch = new Fetch();
@SuppressWarnings("unchecked")
Consumer<List<Entity>> consumer = Mockito.mock(Consumer.class);
entityListenerRepositoryDecorator.forEachBatched(fetch, consumer, 543);
Mockito.verify(decoratedRepository, Mockito.times(1)).forEachBatched(fetch, consumer, 543);
}
}