# -*- coding: utf-8; -*- import os import shutil import tempfile from unittest import TestCase from wuttjamaican.conf import WuttaConfig try: import sqlalchemy as sa from sqlalchemy import orm from sqlalchemy.engine import Engine from sqlalchemy.pool import NullPool from wuttjamaican.db import conf except ImportError: pass else: class TestGetEngines(TestCase): def setUp(self): self.tempdir = tempfile.mkdtemp() def tearDown(self): shutil.rmtree(self.tempdir) def write_file(self, filename, content): path = os.path.join(self.tempdir, filename) with open(path, 'wt') as f: f.write(content) return path def test_no_default(self): myfile = self.write_file('my.conf', '') config = WuttaConfig([myfile]) self.assertEqual(conf.get_engines(config, 'wuttadb'), {}) def test_default(self): myfile = self.write_file('my.conf', """\ [wuttadb] default.url = sqlite:// """) config = WuttaConfig([myfile]) result = conf.get_engines(config, 'wuttadb') self.assertEqual(len(result), 1) self.assertIn('default', result) engine = result['default'] self.assertEqual(engine.dialect.name, 'sqlite') def test_default_fallback(self): myfile = self.write_file('my.conf', """\ [wuttadb] sqlalchemy.url = sqlite:// """) config = WuttaConfig([myfile]) result = conf.get_engines(config, 'wuttadb') self.assertEqual(len(result), 1) self.assertIn('default', result) engine = result['default'] self.assertEqual(engine.dialect.name, 'sqlite') def test_other(self): myfile = self.write_file('my.conf', """\ [otherdb] keys = first, second first.url = sqlite:// second.url = sqlite:// """) config = WuttaConfig([myfile]) result = conf.get_engines(config, 'otherdb') self.assertEqual(len(result), 2) self.assertIn('first', result) self.assertIn('second', result) class TestGetSetting(TestCase): def setUp(self): Session = orm.sessionmaker() engine = sa.create_engine('sqlite://') self.session = Session(bind=engine) self.session.execute(sa.text(""" create table setting ( name varchar(255) primary key, value text ); """)) def tearDown(self): self.session.close() def test_basic_value(self): self.session.execute(sa.text("insert into setting values ('foo', 'bar');")) value = conf.get_setting(self.session, 'foo') self.assertEqual(value, 'bar') def test_missing_value(self): value = conf.get_setting(self.session, 'foo') self.assertIsNone(value) class TestMakeEngineFromConfig(TestCase): def test_basic(self): engine = conf.make_engine_from_config({ 'sqlalchemy.url': 'sqlite://', }) self.assertIsInstance(engine, Engine) def test_poolclass(self): engine = conf.make_engine_from_config({ 'sqlalchemy.url': 'sqlite://', }) self.assertNotIsInstance(engine.pool, NullPool) engine = conf.make_engine_from_config({ 'sqlalchemy.url': 'sqlite://', 'sqlalchemy.poolclass': 'sqlalchemy.pool:NullPool', }) self.assertIsInstance(engine.pool, NullPool) def test_pool_pre_ping(self): engine = conf.make_engine_from_config({ 'sqlalchemy.url': 'sqlite://', }) self.assertFalse(engine.pool._pre_ping) engine = conf.make_engine_from_config({ 'sqlalchemy.url': 'sqlite://', 'sqlalchemy.pool_pre_ping': 'true', }) self.assertTrue(engine.pool._pre_ping)