Files @ 87c70c437565
Branch filter:

Location: rattail-project/rattail/tests/db/test_util.py - annotation

lance
Accept config section name within `db.util.get_engines()`.

This is to set the stage for leveraging this function to establish database
connections to other systems, e.g. for `rattail_locsms`.
# -*- coding: utf-8 -*-

import warnings
from unittest import TestCase

from sqlalchemy.pool import SingletonThreadPool, NullPool

from edbob.configuration import AppConfigParser

from rattail.db import util


class TestEngineConfig(TestCase):

    def test_standard(self):
        config = {
            'sqlalchemy.url': 'sqlite://',
            }
        engine = util.engine_from_config(config)
        self.assertEqual(str(engine.url), 'sqlite://')
        self.assertTrue(isinstance(engine.pool, SingletonThreadPool))

    def test_custom_poolclass(self):
        config = {
            'sqlalchemy.url': 'sqlite://',
            'sqlalchemy.poolclass': 'sqlalchemy.pool:NullPool',
            }
        engine = util.engine_from_config(config)
        self.assertEqual(str(engine.url), 'sqlite://')
        self.assertTrue(isinstance(engine.pool, NullPool))


class TestGetEngines(TestCase):

    def setUp(self):
        self.config = AppConfigParser(u'rattail')

    def test_default_section_is_rattail_db(self):
        self.config.set(u'rattail.db', u'keys', u'default')
        self.config.set(u'rattail.db', u'default.url', u'sqlite://')
        engines = util.get_engines(self.config)
        self.assertEqual(len(engines), 1)
        self.assertEqual(engines.keys()[0], u'default')
        self.assertEqual(unicode(engines[u'default'].url), u'sqlite://')

    def test_custom_section_is_honored(self):
        self.config.set(u'mycustomdb', u'keys', u'default')
        self.config.set(u'mycustomdb', u'default.url', u'sqlite://')
        engines = util.get_engines(self.config, section=u'mycustomdb')
        self.assertEqual(len(engines), 1)
        self.assertEqual(engines.keys()[0], u'default')
        self.assertEqual(unicode(engines[u'default'].url), u'sqlite://')

    def test_default_section_falls_back_to_edbob_db(self):
        self.config.set(u'edbob.db', u'keys', u'default')
        self.config.set(u'edbob.db', u'default.url', u'sqlite://')
        with warnings.catch_warnings(record=True) as ignore_warnings:
            engines = util.get_engines(self.config)
        self.assertEqual(len(engines), 1)
        self.assertEqual(engines.keys()[0], u'default')
        self.assertEqual(unicode(engines[u'default'].url), u'sqlite://')

    def test_default_prefix_does_not_require_keys_declaration(self):
        self.config.set(u'rattail.db', u'default.url', u'sqlite://')
        engines = util.get_engines(self.config)
        self.assertEqual(len(engines), 1)
        self.assertEqual(engines.keys()[0], u'default')
        self.assertEqual(unicode(engines[u'default'].url), u'sqlite://')

    def test_default_prefix_falls_back_to_sqlalchemy(self):
        # Still no need to define "keys" option here.
        self.config.set(u'rattail.db', u'sqlalchemy.url', u'sqlite://')
        engines = util.get_engines(self.config)
        self.assertEqual(len(engines), 1)
        self.assertEqual(engines.keys()[0], u'default')
        self.assertEqual(unicode(engines[u'default'].url), u'sqlite://')

    def test_defined_keys_are_included_in_engines_result(self):
        # Note there is no "default" key here.
        self.config.set(u'rattail.db', u'keys', u'host, store')
        self.config.set(u'rattail.db', u'host.url', u'sqlite:///rattail.host.sqlite')
        self.config.set(u'rattail.db', u'store.url', u'sqlite:///rattail.store.sqlite')
        engines = util.get_engines(self.config)
        self.assertEqual(len(engines), 2)
        self.assertEqual(sorted(engines.keys()), [u'host', u'store'])
        self.assertEqual(unicode(engines[u'host'].url), u'sqlite:///rattail.host.sqlite')
        self.assertEqual(unicode(engines[u'store'].url), u'sqlite:///rattail.store.sqlite')