package org.molgenis.data.transaction; import org.molgenis.data.Entity; import org.molgenis.data.Fetch; import org.molgenis.data.Query; import org.molgenis.data.Repository; import org.molgenis.data.aggregation.AggregateQuery; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.List; import java.util.function.Consumer; import java.util.stream.Stream; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.testng.Assert.assertEquals; public class TransactionalRepositoryDecoratorTest { private TransactionalRepositoryDecorator<Entity> transactionalRepo; private Repository<Entity> decoratedRepo; private PlatformTransactionManager transactionManager; @SuppressWarnings("unchecked") @BeforeMethod public void setUpBeforeMethod() { decoratedRepo = mock(Repository.class); transactionManager = mock(PlatformTransactionManager.class); transactionalRepo = new TransactionalRepositoryDecorator<>(decoratedRepo, transactionManager); } @Test public void delegate() throws Exception { assertEquals(transactionalRepo.delegate(), decoratedRepo); } @Test public void forEachBatched() throws Exception { @SuppressWarnings("unchecked") Consumer<List<Entity>> consumer = mock(Consumer.class); int batchSize = 1000; transactionalRepo.forEachBatched(consumer, batchSize); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).forEachBatched(consumer, batchSize); } @Test public void forEachBatchedFetch() throws Exception { Fetch fetch = mock(Fetch.class); @SuppressWarnings("unchecked") Consumer<List<Entity>> consumer = mock(Consumer.class); int batchSize = 1000; transactionalRepo.forEachBatched(fetch, consumer, batchSize); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).forEachBatched(fetch, consumer, batchSize); } @Test public void count() throws Exception { transactionalRepo.count(); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).count(); } @Test public void countQuery() throws Exception { @SuppressWarnings("unchecked") Query<Entity> query = mock(Query.class); transactionalRepo.count(query); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).count(query); } @Test public void findAllQuery() throws Exception { @SuppressWarnings("unchecked") Query<Entity> query = mock(Query.class); transactionalRepo.findAll(query); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).findAll(query); } @Test public void findAllStream() throws Exception { @SuppressWarnings("unchecked") Stream<Object> entityIds = mock(Stream.class); transactionalRepo.findAll(entityIds); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).findAll(entityIds); } @Test public void findAllStreamFetch() throws Exception { @SuppressWarnings("unchecked") Stream<Object> entityIds = mock(Stream.class); Fetch fetch = mock(Fetch.class); transactionalRepo.findAll(entityIds, fetch); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).findAll(entityIds, fetch); } @Test public void findOne() throws Exception { @SuppressWarnings("unchecked") Query<Entity> query = mock(Query.class); transactionalRepo.findOne(query); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).findOne(query); } @Test public void findOneById() throws Exception { Object id = mock(Object.class); transactionalRepo.findOneById(id); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).findOneById(id); } @Test public void findOneByIdFetch() throws Exception { Object id = mock(Object.class); Fetch fetch = mock(Fetch.class); transactionalRepo.findOneById(id, fetch); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).findOneById(id, fetch); } @Test public void aggregate() throws Exception { AggregateQuery aggregateQuery = mock(AggregateQuery.class); transactionalRepo.aggregate(aggregateQuery); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).aggregate(aggregateQuery); } @Test public void update() throws Exception { Entity entity = mock(Entity.class); transactionalRepo.update(entity); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).update(entity); } @Test public void updateStream() throws Exception { @SuppressWarnings("unchecked") Stream<Entity> entityStream = mock(Stream.class); transactionalRepo.update(entityStream); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).update(entityStream); } @Test public void delete() throws Exception { Entity entity = mock(Entity.class); transactionalRepo.delete(entity); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).delete(entity); } @Test public void deleteStream() throws Exception { @SuppressWarnings("unchecked") Stream<Entity> entityStream = mock(Stream.class); transactionalRepo.delete(entityStream); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).delete(entityStream); } @Test public void deleteById() throws Exception { Object id = mock(Object.class); transactionalRepo.deleteById(id); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).deleteById(id); } @Test public void deleteAll() throws Exception { transactionalRepo.deleteAll(); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).deleteAll(); } @Test public void deleteAllStream() throws Exception { @SuppressWarnings("unchecked") Stream<Object> entityIds = mock(Stream.class); transactionalRepo.deleteAll(entityIds); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).deleteAll(entityIds); } @Test public void add() throws Exception { Entity entity = mock(Entity.class); transactionalRepo.add(entity); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).add(entity); } @Test public void addStream() throws Exception { @SuppressWarnings("unchecked") Stream<Entity> entityStream = mock(Stream.class); transactionalRepo.add(entityStream); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).add(entityStream); } @Test public void iterator() throws Exception { transactionalRepo.iterator(); verify(transactionManager).getTransaction(any(TransactionDefinition.class)); verify(decoratedRepo).iterator(); } }