"""Test main connection module.""" import os import pytest from owsmysql import db def test_session_rollback(mocker): """Check that session will rollback on errors.""" mock = mocker.patch.object(db.default, 'session_maker') with pytest.raises(Exception): with db.default.session(): raise Exception assert mock.return_value.rollback.called def test_db_env_test_configuration(mocker): """Check DB in tests can be configured though env variables.""" mocker.patch.object(os, 'environ', { 'TEST_DB_USER': 'test_user', 'TEST_DB_PASSWORD': 'test_pass', 'TEST_DB_HOST': 'test_host', 'TEST_DB_NAME': 'test_db', }) mocker.patch.object(db, '_db_config', {'smth': None}) mocker.patch.object(db, 'connections') conn = db.TestConnection('smth') url = 'mysql+pymysql://test_user:test_pass@test_host/test_db?charset=utf8' assert str(conn.engine.url) == url def test_url_configuration(mocker): """Check that connection can be configured by URL.""" url = 'mysql+pymysql://user:pass@host/db?charset=utf8' mocker.patch.object(db, '_db_config', {'smth': {'url': url}}) mocker.patch.object(db, 'connections') mocker.patch.object(db, '_environment', 'dev') conn = db.MySQLConnection('smth') assert str(conn.engine.url) == url def test_param_configuration(mocker): """Check that connection can be configured by params.""" config = { 'user': 'test_user', 'password': 'test_pass', 'host': 'test_host', 'database': 'test_db', } mocker.patch.object(db, '_db_config', {'smth': config}) mocker.patch.object(db, 'connections') mocker.patch.object(db, '_environment', 'dev') conn = db.MySQLConnection('smth') url = 'mysql+pymysql://test_user:test_pass@test_host/test_db?charset=utf8' assert str(conn.engine.url) == url def test_connection_no_init(mocker): """Check create connection will fail if db is not configured.""" mocker.patch.object(db, '_db_config', None) with pytest.raises(db.ImproperlyConfigured) as ctx: db.MySQLConnection() msg = 'Please call db.configure() before creating connections' assert ctx.value.args[0] == msg def test_unknown_connection(mocker): """Check create connection will fail with unknown name.""" mocker.patch.object(db, '_db_config', {}) with pytest.raises(db.ImproperlyConfigured) as ctx: db.MySQLConnection() msg = 'Connection default name is not configured' assert ctx.value.args[0] == msg def test_shema_creation_only_in_tests(mocker): """Check that schema can not be created outside of test environment.""" mocker.patch.object(db, '_db_config', {'smth': None}) mocker.patch.object(db, 'connections') mocker.patch.object(db, '_environment', 'dev') conn = db.MySQLConnection('smth') with pytest.raises(db.ImproperlyConfigured) as ctx: conn.create_all() assert ctx.value.args[0] == 'Schema creation is only for test environment' with pytest.raises(db.ImproperlyConfigured) as ctx: conn.drop_all() assert ctx.value.args[0] == 'Dropping schema is only for test environment' def test_session_commit(mocker): """Check that session commits only when not read_only.""" mock = mocker.patch.object(db.default, 'session_maker') with db.default.session(read_only=True): return assert not mock.return_value.commit.called with db.default.session(read_only=False): return assert mock.return_value.commit.called