181 lines
4.9 KiB
Python
181 lines
4.9 KiB
Python
"""Test Database URI Helper.
|
|
|
|
Simple Grocery List (Sigl) | sigl.app
|
|
Copyright (c) 2022 Asymworks, LLC. All Rights Reserved.
|
|
"""
|
|
|
|
|
|
import pytest
|
|
|
|
from sigl.database.util import make_uri
|
|
from sigl.exc import ConfigError
|
|
|
|
BASE_TEST_CONFIG = {
|
|
'APP_SESSION_KEY': 'test',
|
|
'APP_TOKEN_KEY': 'test',
|
|
'APP_TOKEN_SALT': 'test',
|
|
'DB_DRIVER': 'sqlite',
|
|
'DB_FILE': '/dev/null',
|
|
'MAIL_SERVER': 'localhost',
|
|
'MAIL_SENDER': 'test@localhost',
|
|
}
|
|
|
|
|
|
class MockApp(object):
|
|
def __init__(self, config):
|
|
self.config = config
|
|
|
|
|
|
def test_dbconfig_no_driver():
|
|
'''
|
|
Application startup should fail if DB_DRIVER is not in the configuration
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
del test_cfg['DB_DRIVER']
|
|
|
|
app = MockApp(test_cfg)
|
|
with pytest.raises(ConfigError, match='application configuration') as excinfo:
|
|
make_uri(app)
|
|
|
|
# Ensure that the offending key is DB_DRIVER
|
|
assert excinfo.value.config_key == 'DB_DRIVER'
|
|
|
|
|
|
def test_dbconfig_sqlite_no_file():
|
|
'''
|
|
Application Startup should fail if an SQlite database is specified
|
|
without a DB_FILE key
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
del test_cfg['DB_FILE']
|
|
|
|
app = MockApp(test_cfg)
|
|
with pytest.raises(ConfigError, match='application configuration') as excinfo:
|
|
make_uri(app)
|
|
|
|
# Ensure that the offending key is DB_FILE
|
|
assert excinfo.value.config_key == 'DB_FILE'
|
|
|
|
|
|
def test_dbconfig_sqlite_with_file():
|
|
'''
|
|
Application Startup should succeed if an SQlite database is specified
|
|
with a DB_FILE key
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
app = MockApp(test_cfg)
|
|
uri = make_uri(app)
|
|
|
|
# Ensure that the URI was correctly configured and logged
|
|
assert uri == 'sqlite:////dev/null'
|
|
|
|
|
|
def test_dbconfig_mysql_no_host():
|
|
'''
|
|
Application Startup should fail if a MySQL database is specified
|
|
without a DB_HOST key
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
test_cfg['DB_DRIVER'] = 'mysql'
|
|
app = MockApp(test_cfg)
|
|
|
|
with pytest.raises(ConfigError, match='application configuration') as excinfo:
|
|
make_uri(app)
|
|
|
|
# Ensure that the offending key is DB_FILE
|
|
assert excinfo.value.config_key == 'DB_HOST'
|
|
|
|
|
|
def test_dbconfig_mysql_no_name():
|
|
'''
|
|
Application Startup should fail if a MySQL database is specified
|
|
without a DB_HOST key
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
test_cfg['DB_DRIVER'] = 'mysql'
|
|
test_cfg['DB_HOST'] = 'localhost'
|
|
app = MockApp(test_cfg)
|
|
|
|
with pytest.raises(ConfigError, match='application configuration') as excinfo:
|
|
make_uri(app)
|
|
|
|
# Ensure that the offending key is DB_NAME
|
|
assert excinfo.value.config_key == 'DB_NAME'
|
|
|
|
|
|
def test_dbconfig_mysql_no_username():
|
|
'''
|
|
Application Startup should fail if a MySQL database is specified
|
|
with a DB_USERNAME key but without a DB_PASSWORD key
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
test_cfg['DB_DRIVER'] = 'mysql'
|
|
test_cfg['DB_HOST'] = 'localhost'
|
|
test_cfg['DB_NAME'] = 'test'
|
|
test_cfg['DB_PASSWORD'] = 'hunter2'
|
|
app = MockApp(test_cfg)
|
|
|
|
with pytest.raises(ConfigError, match='application configuration') as excinfo:
|
|
make_uri(app)
|
|
|
|
# Ensure that the offending key is DB_USERNAME
|
|
assert excinfo.value.config_key == 'DB_USERNAME'
|
|
|
|
|
|
def test_dbconfig_mysql_without_port():
|
|
'''
|
|
Application Startup should succeed when a MySQL database is specified
|
|
with a DB_PORT key
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
test_cfg['DB_DRIVER'] = 'mysql'
|
|
test_cfg['DB_HOST'] = 'localhost'
|
|
test_cfg['DB_NAME'] = 'test'
|
|
test_cfg['DB_USERNAME'] = 'root'
|
|
test_cfg['DB_PASSWORD'] = 'hunter^2'
|
|
|
|
app = MockApp(test_cfg)
|
|
uri = make_uri(app)
|
|
|
|
# Ensure that the application startup succeeded
|
|
assert uri == 'mysql://root:hunter%5E2@localhost/test'
|
|
|
|
|
|
def test_dbconfig_mysql_with_port():
|
|
'''
|
|
Application Startup should succeed when a MySQL database is specified
|
|
with a DB_PORT key
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
test_cfg['DB_DRIVER'] = 'mysql'
|
|
test_cfg['DB_HOST'] = 'localhost'
|
|
test_cfg['DB_PORT'] = 1234
|
|
test_cfg['DB_NAME'] = 'test'
|
|
test_cfg['DB_USERNAME'] = 'root'
|
|
test_cfg['DB_PASSWORD'] = 'hunter^2'
|
|
|
|
app = MockApp(test_cfg)
|
|
uri = make_uri(app)
|
|
|
|
# Ensure that the application startup succeeded
|
|
assert uri == 'mysql://root:hunter%5E2@localhost:1234/test'
|
|
|
|
|
|
def test_dbconfig_mysql_with_username():
|
|
'''
|
|
Application Startup should succeed when a MySQL database is specified
|
|
with a DB_USERNAME key and without a DB_PASSWORD key
|
|
'''
|
|
test_cfg = dict(BASE_TEST_CONFIG)
|
|
test_cfg['DB_DRIVER'] = 'mysql'
|
|
test_cfg['DB_HOST'] = 'localhost'
|
|
test_cfg['DB_PORT'] = 1234
|
|
test_cfg['DB_NAME'] = 'test'
|
|
test_cfg['DB_USERNAME'] = 'root'
|
|
|
|
app = MockApp(test_cfg)
|
|
uri = make_uri(app)
|
|
|
|
# Ensure that the application startup succeeded
|
|
assert uri == 'mysql://root@localhost:1234/test'
|