/*
* Copyright (c) 2002-2017 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.neo4j.driver.internal;
import org.junit.Test;
import org.mockito.InOrder;
import java.util.Collections;
import java.util.Map;
import org.neo4j.driver.internal.spi.Collector;
import org.neo4j.driver.internal.spi.Connection;
import org.neo4j.driver.v1.Value;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import static org.neo4j.driver.v1.Values.value;
public class ExplicitTransactionTest
{
@Test
public void shouldRollbackOnImplicitFailure() throws Throwable
{
// Given
Connection conn = mock( Connection.class );
when( conn.isOpen() ).thenReturn( true );
SessionResourcesHandler resourcesHandler = mock( SessionResourcesHandler.class );
ExplicitTransaction tx = new ExplicitTransaction( conn, resourcesHandler );
// When
tx.close();
// Then
InOrder order = inOrder( conn );
order.verify( conn ).run( "BEGIN", Collections.<String, Value>emptyMap(),Collector.NO_OP );
order.verify( conn ).pullAll( any( Collector.class ) );
order.verify( conn ).isOpen();
order.verify( conn ).run( "ROLLBACK", Collections.<String, Value>emptyMap(), Collector.NO_OP );
order.verify( conn ).pullAll( any( Collector.class ) );
order.verify( conn ).sync();
verify( resourcesHandler, only() ).onTransactionClosed( tx );
verifyNoMoreInteractions( conn, resourcesHandler );
}
@Test
public void shouldRollbackOnExplicitFailure() throws Throwable
{
// Given
Connection conn = mock( Connection.class );
when( conn.isOpen() ).thenReturn( true );
SessionResourcesHandler resourcesHandler = mock( SessionResourcesHandler.class );
ExplicitTransaction tx = new ExplicitTransaction( conn, resourcesHandler );
// When
tx.failure();
tx.success(); // even if success is called after the failure call!
tx.close();
// Then
InOrder order = inOrder( conn );
order.verify( conn ).run( "BEGIN", Collections.<String, Value>emptyMap(), Collector.NO_OP );
order.verify( conn ).pullAll( any( BookmarkCollector.class ) );
order.verify( conn ).isOpen();
order.verify( conn ).run( "ROLLBACK", Collections.<String, Value>emptyMap(), Collector.NO_OP );
order.verify( conn ).pullAll( any( BookmarkCollector.class ) );
order.verify( conn ).sync();
verify( resourcesHandler, only() ).onTransactionClosed( tx );
verifyNoMoreInteractions( conn, resourcesHandler );
}
@Test
public void shouldCommitOnSuccess() throws Throwable
{
// Given
Connection conn = mock( Connection.class );
when( conn.isOpen() ).thenReturn( true );
SessionResourcesHandler resourcesHandler = mock( SessionResourcesHandler.class );
ExplicitTransaction tx = new ExplicitTransaction( conn, resourcesHandler );
// When
tx.success();
tx.close();
// Then
InOrder order = inOrder( conn );
order.verify( conn ).run( "BEGIN", Collections.<String, Value>emptyMap(), Collector.NO_OP );
order.verify( conn ).pullAll( any( BookmarkCollector.class ) );
order.verify( conn ).isOpen();
order.verify( conn ).run( "COMMIT", Collections.<String, Value>emptyMap(), Collector.NO_OP );
order.verify( conn ).pullAll( any( BookmarkCollector.class ) );
order.verify( conn ).sync();
verify( resourcesHandler, only() ).onTransactionClosed( tx );
verifyNoMoreInteractions( conn, resourcesHandler );
}
@Test
public void shouldOnlyQueueMessagesWhenNoBookmarkGiven()
{
Connection connection = mock( Connection.class );
new ExplicitTransaction( connection, mock( SessionResourcesHandler.class ), null );
InOrder inOrder = inOrder( connection );
inOrder.verify( connection ).run( "BEGIN", Collections.<String,Value>emptyMap(), Collector.NO_OP );
inOrder.verify( connection ).pullAll( Collector.NO_OP );
inOrder.verify( connection, never() ).sync();
}
@Test
public void shouldSyncWhenBookmarkGiven()
{
String bookmark = "hi, I'm bookmark";
Connection connection = mock( Connection.class );
new ExplicitTransaction( connection, mock( SessionResourcesHandler.class ), bookmark );
Map<String,Value> expectedParams = Collections.singletonMap( "bookmark", value( bookmark ) );
InOrder inOrder = inOrder( connection );
inOrder.verify( connection ).run( "BEGIN", expectedParams, Collector.NO_OP );
inOrder.verify( connection ).pullAll( Collector.NO_OP );
inOrder.verify( connection ).sync();
}
}