"""Test for neo4j DB driver.""" import importlib import sys from enum import Enum from unittest import mock import connector_neo4j from flask import Flask import pytest app = Flask(__name__) @mock.patch("neo4j.GraphDatabase.driver") def test_configure(driver_create): """Test driver explicit init. Args: driver_create (MagicMock): mock of neo4j driver constructor """ importlib.reload(connector_neo4j) assert connector_neo4j.conf is None # verify init driver called to early error with pytest.raises(connector_neo4j.exceptions.ConfigurationNotSet): connector_neo4j._init_driver() # set configuration information connector_neo4j.configure( "url", "username", "password", connector_neo4j.SessionStorageMode.SINGLE ) assert connector_neo4j.conf is not None assert connector_neo4j.conf.url == "url" assert connector_neo4j.conf.username == "username" assert connector_neo4j.conf.password == "password" assert ( connector_neo4j.conf.storage_mode == connector_neo4j.SessionStorageMode.SINGLE ) # noqa:E501 assert not driver_create.called assert connector_neo4j.neo4j_driver is None # open a session which inits driver using conf with connector_neo4j.Neo4jSession(): pass assert driver_create.called assert driver_create.call_args_list == [ mock.call("url", auth=("username", "password")) ] assert connector_neo4j.neo4j_driver == driver_create.return_value # verify double configure error with pytest.raises(connector_neo4j.exceptions.ConfigurationAlreadySet): connector_neo4j.configure("url", "username", "password") # verify double init driver error with pytest.raises(connector_neo4j.exceptions.DriverAlreadyInitiated): connector_neo4j._init_driver() @mock.patch("neo4j.GraphDatabase.driver") def test_reuse_driver(driver_create): """Test reuse driver in two sessions. Args: driver_create (MagicMock): mock of neo4j driver constructor """ importlib.reload(connector_neo4j) connector_neo4j.configure( "url", "username", "password", connector_neo4j.SessionStorageMode.FLASK ) session_create = driver_create.return_value.session with app.test_request_context(): @connector_neo4j.Neo4jSession() def func_one(): pass func_one() with app.test_request_context(): @connector_neo4j.Neo4jSession() def func_two(): pass func_two() assert driver_create.call_count == 1 assert session_create.call_count == 2 @mock.patch("neo4j.GraphDatabase.driver") def test_extra_kwargs(driver_create): """Test passing neo4j low level driver args.""" importlib.reload(connector_neo4j) connector_neo4j.configure( "url", "username", "password", connector_neo4j.SessionStorageMode.SINGLE, connection_timeout=30, ) assert connector_neo4j.conf.extras == {"connection_timeout": 30} with connector_neo4j.Neo4jSession(): pass assert driver_create.call_args_list == [ mock.call("url", auth=("username", "password"), connection_timeout=30) ] def test_storage_mode_default(): """Test flask as default storage mode when installed.""" importlib.reload(connector_neo4j) if "flask" in sys.modules: del sys.modules["flask"] assert not connector_neo4j._module_imported("flask") assert connector_neo4j.conf is None connector_neo4j.configure("url", "username", "password") assert connector_neo4j._module_imported("flask") assert connector_neo4j.conf.storage_mode == connector_neo4j.SessionStorageMode.FLASK # noqa:E501 def test_storage_mode_override(): """Test override storage mode.""" importlib.reload(connector_neo4j) if "flask" in sys.modules: del sys.modules["flask"] connector_neo4j.configure( "url", "username", "password", connector_neo4j.SessionStorageMode.SINGLE ) assert connector_neo4j._module_imported("flask") assert ( connector_neo4j.conf.storage_mode == connector_neo4j.SessionStorageMode.SINGLE ) # noqa:E501 def test_fallback_no_flask(): """Test behavior when flask not installed.""" importlib.reload(connector_neo4j) if "flask" in sys.modules: del sys.modules["flask"] with mock.patch("connector_neo4j._try_import") as mock_try_import: connector_neo4j.configure("url", "username", "password") assert mock_try_import.called assert not connector_neo4j._module_imported("flask") assert ( connector_neo4j.conf.storage_mode == connector_neo4j.SessionStorageMode.SINGLE ) # noqa:E501 def test_storage_mode_bad_overrides(): """Test invalid storage mode param type.""" importlib.reload(connector_neo4j) with pytest.raises(connector_neo4j.exceptions.InvalidSessionStorageMode): connector_neo4j.configure("url", "username", "password", "blerg") class Data(Enum): TEST = 99 with pytest.raises(connector_neo4j.exceptions.InvalidSessionStorageMode): connector_neo4j.configure("url", "username", "password", Data.TEST)