package org.molgenis.data.index; import org.molgenis.data.Entity; import org.molgenis.data.Repository; import org.molgenis.data.meta.model.Attribute; import org.molgenis.data.meta.model.EntityType; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.EnumSet; import java.util.stream.Stream; import static java.util.Collections.singleton; import static org.mockito.Mockito.*; import static org.mockito.internal.verification.VerificationModeFactory.times; import static org.molgenis.data.RepositoryCapability.INDEXABLE; import static org.molgenis.data.RepositoryCapability.MANAGABLE; import static org.testng.Assert.assertEquals; public class IndexActionRepositoryDecoratorTest { private Repository<Entity> decoratedRepo; private IndexActionRegisterService indexActionRegisterService; private IndexActionRepositoryDecorator indexActionRepositoryDecorator; private EntityType entityType; @SuppressWarnings("unchecked") @BeforeMethod public void setUpBeforeMethod() { decoratedRepo = mock(Repository.class); when(decoratedRepo.getName()).thenReturn("entity"); when(decoratedRepo.getCapabilities()).thenReturn(singleton(MANAGABLE)); entityType = mock(EntityType.class); when(decoratedRepo.getEntityType()).thenReturn(entityType); indexActionRegisterService = mock(IndexActionRegisterService.class); indexActionRepositoryDecorator = new IndexActionRepositoryDecorator(decoratedRepo, indexActionRegisterService); } @Test public void updateEntity() { initEntityMeta(); Entity entity0 = mock(Entity.class); when(entity0.getIdValue()).thenReturn("1"); indexActionRepositoryDecorator.update(entity0); verify(decoratedRepo, times(1)).update(entity0); verify(indexActionRegisterService).register("entity", "1"); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void updateEntityBidi() { initEntityMetaBidi(); Entity entity0 = mock(Entity.class); when(entity0.getIdValue()).thenReturn("1"); indexActionRepositoryDecorator.update(entity0); verify(decoratedRepo, times(1)).update(entity0); verify(indexActionRegisterService).register("entity", "1"); verify(indexActionRegisterService).register("mappedByEntity", null); verify(indexActionRegisterService).register("inversedByEntity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void getCapabilities() { assertEquals(indexActionRepositoryDecorator.getCapabilities(), EnumSet.of(INDEXABLE, MANAGABLE)); } @Test public void updateStreamEntities() { initEntityMeta(); Stream<Entity> entities = Stream.empty(); indexActionRepositoryDecorator.update(entities); verify(decoratedRepo, times(1)).update(entities); verify(indexActionRegisterService).register("entity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void updateStreamEntitiesBidi() { initEntityMetaBidi(); Stream<Entity> entities = Stream.empty(); indexActionRepositoryDecorator.update(entities); verify(decoratedRepo, times(1)).update(entities); verify(indexActionRegisterService).register("entity", null); verify(indexActionRegisterService).register("mappedByEntity", null); verify(indexActionRegisterService).register("inversedByEntity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteEntity() { initEntityMeta(); Entity entity0 = mock(Entity.class); when(entity0.getIdValue()).thenReturn("1"); indexActionRepositoryDecorator.delete(entity0); verify(decoratedRepo, times(1)).delete(entity0); verify(indexActionRegisterService).register("entity", "1"); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteEntityBidi() { initEntityMetaBidi(); Entity mappedByEntity0 = mock(Entity.class); when(mappedByEntity0.getIdValue()).thenReturn("mappedBy0"); Entity inversedByEntity0 = mock(Entity.class); when(inversedByEntity0.getIdValue()).thenReturn("inversedBy0"); Entity entity0 = mock(Entity.class); when(entity0.getEntities("mappedByAttr")).thenReturn(singleton(mappedByEntity0)); when(entity0.getEntity("inversedByAttr")).thenReturn(inversedByEntity0); when(entity0.getIdValue()).thenReturn("1"); indexActionRepositoryDecorator.delete(entity0); verify(decoratedRepo, times(1)).delete(entity0); verify(indexActionRegisterService).register("entity", "1"); verify(indexActionRegisterService).register("mappedByEntity", "mappedBy0"); verify(indexActionRegisterService).register("inversedByEntity", "inversedBy0"); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteStreamEntities() { initEntityMeta(); Stream<Entity> entities = Stream.empty(); indexActionRepositoryDecorator.delete(entities); verify(decoratedRepo, times(1)).delete(entities); verify(indexActionRegisterService, times(1)).register("entity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteStreamEntitiesBidi() { initEntityMetaBidi(); Stream<Entity> entities = Stream.empty(); indexActionRepositoryDecorator.delete(entities); verify(decoratedRepo, times(1)).delete(entities); verify(indexActionRegisterService, times(1)).register("entity", null); verify(indexActionRegisterService).register("mappedByEntity", null); verify(indexActionRegisterService).register("inversedByEntity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteEntityById() { initEntityMeta(); Entity entity0 = mock(Entity.class); when(entity0.getIdValue()).thenReturn("1"); indexActionRepositoryDecorator.deleteById("1"); verify(decoratedRepo, times(1)).deleteById("1"); verify(indexActionRegisterService).register("entity", "1"); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteEntityByIdBidi() { initEntityMetaBidi(); Entity entity0 = mock(Entity.class); when(entity0.getIdValue()).thenReturn("1"); indexActionRepositoryDecorator.deleteById("1"); verify(decoratedRepo, times(1)).deleteById("1"); verify(indexActionRegisterService).register("entity", "1"); verify(indexActionRegisterService).register("mappedByEntity", null); verify(indexActionRegisterService).register("inversedByEntity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteEntityByIdStream() { initEntityMeta(); Stream<Object> ids = Stream.empty(); indexActionRepositoryDecorator.deleteAll(ids); verify(decoratedRepo, times(1)).deleteAll(ids); verify(indexActionRegisterService, times(1)).register("entity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteEntityByIdStreamBidi() { initEntityMetaBidi(); Stream<Object> ids = Stream.empty(); indexActionRepositoryDecorator.deleteAll(ids); verify(decoratedRepo, times(1)).deleteAll(ids); verify(indexActionRegisterService, times(1)).register("entity", null); verify(indexActionRegisterService).register("mappedByEntity", null); verify(indexActionRegisterService).register("inversedByEntity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteAll() { initEntityMeta(); indexActionRepositoryDecorator.deleteAll(); verify(decoratedRepo, times(1)).deleteAll(); verify(indexActionRegisterService, times(1)).register("entity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void deleteAllBidi() { initEntityMetaBidi(); indexActionRepositoryDecorator.deleteAll(); verify(decoratedRepo, times(1)).deleteAll(); verify(indexActionRegisterService, times(1)).register("entity", null); verify(indexActionRegisterService).register("mappedByEntity", null); verify(indexActionRegisterService).register("inversedByEntity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void addEntity() { initEntityMeta(); Entity entity0 = mock(Entity.class); when(entity0.getIdValue()).thenReturn("1"); indexActionRepositoryDecorator.add(entity0); verify(decoratedRepo, times(1)).add(entity0); verify(indexActionRegisterService).register("entity", "1"); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void addEntityBidi() { initEntityMetaBidi(); Entity mappedByEntity0 = mock(Entity.class); when(mappedByEntity0.getIdValue()).thenReturn("mappedBy0"); Entity inversedByEntity0 = mock(Entity.class); when(inversedByEntity0.getIdValue()).thenReturn("inversedBy0"); Entity entity0 = mock(Entity.class); when(entity0.getEntities("mappedByAttr")).thenReturn(singleton(mappedByEntity0)); when(entity0.getEntity("inversedByAttr")).thenReturn(inversedByEntity0); when(entity0.getIdValue()).thenReturn("1"); indexActionRepositoryDecorator.add(entity0); verify(decoratedRepo, times(1)).add(entity0); verify(indexActionRegisterService).register("entity", "1"); verify(indexActionRegisterService).register("mappedByEntity", "mappedBy0"); verify(indexActionRegisterService).register("inversedByEntity", "inversedBy0"); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void addEntitiesStream() { initEntityMeta(); Stream<Entity> entities = Stream.empty(); when(decoratedRepo.add(entities)).thenReturn(123); assertEquals(indexActionRepositoryDecorator.add(entities), Integer.valueOf(123)); verify(decoratedRepo, times(1)).add(entities); verify(indexActionRegisterService).register("entity", null); verifyNoMoreInteractions(indexActionRegisterService); } @Test public void addEntitiesStreamBidi() { initEntityMetaBidi(); Stream<Entity> entities = Stream.empty(); when(decoratedRepo.add(entities)).thenReturn(123); assertEquals(indexActionRepositoryDecorator.add(entities), Integer.valueOf(123)); verify(decoratedRepo, times(1)).add(entities); verify(indexActionRegisterService).register("entity", null); verify(indexActionRegisterService).register("mappedByEntity", null); verify(indexActionRegisterService).register("inversedByEntity", null); verifyNoMoreInteractions(indexActionRegisterService); } private void initEntityMeta() { when(entityType.getMappedByAttributes()).thenReturn(Stream.empty()); when(entityType.getInversedByAttributes()).thenReturn(Stream.empty()); } private void initEntityMetaBidi() { EntityType mappedByEntity = mock(EntityType.class); when(mappedByEntity.getName()).thenReturn("mappedByEntity"); Attribute mappedByAttr = mock(Attribute.class); when(mappedByAttr.getName()).thenReturn("mappedByAttr"); when(mappedByAttr.getRefEntity()).thenReturn(mappedByEntity); EntityType inversedByEntity = mock(EntityType.class); when(inversedByEntity.getName()).thenReturn("inversedByEntity"); Attribute inversedByAttr = mock(Attribute.class); when(inversedByAttr.getName()).thenReturn("inversedByAttr"); when(inversedByAttr.getRefEntity()).thenReturn(inversedByEntity); when(entityType.getMappedByAttributes()).thenReturn(Stream.of(mappedByAttr)); when(entityType.getInversedByAttributes()).thenReturn(Stream.of(inversedByAttr)); } }