"""Test for neo4j DB connector.""" from unittest import mock from application import app from neo4j.api import READ_ACCESS from neo4j.api import WRITE_ACCESS import pytest from abacus_contract.connectors import neo4j @mock.patch('neo4j.GraphDatabase.driver') def test_read_connection(driver_create): """Test basic read connection management. Args: driver_create (MagicMock): mock of neo4j driver create method. Returns: None """ with app.test_request_context(): session_create = driver_create.return_value.session session = session_create.return_value session.has_transaction.return_value = False neo4j.neo4j_driver = None neo4j.init_driver('url', 'username', 'password') assert not session_create.called @neo4j.Neo4jSession() def func(): assert session_create.called _, args, kwargs = session_create.mock_calls[0] assert args == () assert kwargs == { 'default_access_mode': READ_ACCESS } assert not session.close.called assert not session.begin_transaction.called func() assert session.close.called assert not session.commit_transaction.called assert not session.rollback_transaction.called @mock.patch('neo4j.GraphDatabase.driver') def test_write_connection(driver_create): """Test basic write connection management. Args: driver_create (MagicMock): mock of neo4j driver create method. Returns: None """ with app.test_request_context(): session_create = driver_create.return_value.session session = session_create.return_value session.has_transaction.return_value = True neo4j.neo4j_driver = None neo4j.init_driver('url', 'username', 'password') assert not session_create.called @neo4j.Neo4jSession(transaction=True) def func(): assert session_create.called _, args, kwargs = session_create.mock_calls[0] assert args == () assert kwargs == {'default_access_mode': WRITE_ACCESS} assert not session.close.called assert session.begin_transaction.called func() assert session.close.called assert not session.rollback_transaction.called @mock.patch('neo4j.GraphDatabase.driver') def test_driver_init(driver_create): """Test re-init of driver. Args: driver_create (MagicMock): mock of neo4j driver create method. Returns: None """ neo4j.neo4j_driver = None assert not driver_create.called neo4j.init_driver('url', 'username', 'password') assert driver_create.called assert neo4j.neo4j_driver is not None with pytest.raises(neo4j.DriverAlreadyInitiated): neo4j.init_driver('url', 'username', 'password') @mock.patch('abacus_contract.connectors.neo4j.neo4j_driver') def test_session_create_fatal(driver): """Test fatal exception session create.""" driver.session.side_effect = [Exception()] raised = False try: neo4j.create_session(READ_ACCESS, 5) except Exception: raised = True assert driver.session.call_count == 1 assert raised def test_nested_decorator(): """Text exception raised when nesting decorators.""" with app.test_request_context(): with pytest.raises(neo4j.SessionAlreadyOpen): @neo4j.Neo4jSession() def func1(): @neo4j.Neo4jSession() def func2(): pass func2() func1() def test_missing_decorator(): """Test exception on missing decorator.""" with app.test_request_context(): with pytest.raises(neo4j.SessionNotCreated): neo4j.get_session() def test_session_saving(): """Test session management.""" with app.test_request_context(): session = 'test' neo4j.set_session(session) assert session == neo4j.get_session()