@Test public void shouldNotCloseTransactionDuringTermination() { InternalTransaction tx = mock( InternalTransaction.class ); when( tx.transactionType() ).thenReturn( KernelTransaction.Type.implicit ); Neo4jTransactionalContext context = newContext( tx ); context.terminate(); verify( tx ).terminate(); verify( tx, never() ).close(); }
@Test public void shouldBeTopLevelWithImplicitTx() { InternalTransaction tx = mock( InternalTransaction.class ); when( tx.transactionType() ).thenReturn( KernelTransaction.Type.implicit ); Neo4jTransactionalContext context = newContext( tx ); assertTrue( context.isTopLevelTx() ); }
@Test public void shouldNotBeTopLevelWithExplicitTx() { InternalTransaction tx = mock( InternalTransaction.class ); when( tx.transactionType() ).thenReturn( KernelTransaction.Type.explicit ); Neo4jTransactionalContext context = newContext( tx ); assertFalse( context.isTopLevelTx() ); }
@Test public void shouldBePossibleToTerminateWithoutActiveTransaction() { InternalTransaction tx = mock( InternalTransaction.class ); Neo4jTransactionalContext context = newContext( tx ); context.close( true ); verify( tx ).success(); verify( tx ).close(); context.terminate(); verify( tx, never() ).terminate(); }
@Test public void shouldBeOpenAfterCreation() { InternalTransaction tx = mock( InternalTransaction.class ); Neo4jTransactionalContext context = newContext( tx ); assertTrue( context.isOpen() ); }
@Test public void shouldBePossibleToCloseAfterTermination() { InternalTransaction tx = mock( InternalTransaction.class ); when( tx.transactionType() ).thenReturn( KernelTransaction.Type.implicit ); Neo4jTransactionalContext context = newContext( tx ); context.terminate(); verify( tx ).terminate(); verify( tx, never() ).close(); context.close( false ); verify( tx ).failure(); verify( tx ).close(); }
@Test public void shouldNotBePossibleToCloseMultipleTimes() { InternalTransaction tx = mock( InternalTransaction.class ); Neo4jTransactionalContext context = newContext( tx ); context.close( false ); context.close( true ); context.close( false ); verify( tx ).failure(); verify( tx, never() ).success(); verify( tx ).close(); }
@Test public void shouldThrowWhenRestartedAfterTermination() { MutableObject<Status> terminationReason = new MutableObject<>(); InternalTransaction tx = mock( InternalTransaction.class ); doAnswer( invocation -> { terminationReason.setValue( Status.Transaction.Terminated ); return null; } ).when( tx ).terminate(); when( tx.terminationReason() ).then( invocation -> Optional.ofNullable( terminationReason.getValue() ) ); Neo4jTransactionalContext context = newContext( tx ); context.terminate(); try { context.commitAndRestartTx(); fail( "Exception expected" ); } catch ( Exception e ) { assertThat( e, instanceOf( TransactionTerminatedException.class ) ); } }
@Test public void shouldThrowWhenGettingTxAfterTermination() { MutableObject<Status> terminationReason = new MutableObject<>(); InternalTransaction tx = mock( InternalTransaction.class ); doAnswer( invocation -> { terminationReason.setValue( Status.Transaction.Terminated ); return null; } ).when( tx ).terminate(); when( tx.terminationReason() ).then( invocation -> Optional.ofNullable( terminationReason.getValue() ) ); Neo4jTransactionalContext context = newContext( tx ); context.terminate(); try { context.getOrBeginNewIfClosed(); fail( "Exception expected" ); } catch ( Exception e ) { assertThat( e, instanceOf( TransactionTerminatedException.class ) ); } }