| 
									
										
										
										
											2023-10-28 17:48:37 -05:00
										 |  |  | # -*- coding: utf-8; -*- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import shutil | 
					
						
							|  |  |  | import tempfile | 
					
						
							|  |  |  | from unittest import TestCase | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from wuttjamaican.conf import WuttaConfig | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  | 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) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             with open(path, "wt") as f: | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |                 f.write(content) | 
					
						
							|  |  |  |             return path | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def test_no_default(self): | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             myfile = self.write_file("my.conf", "") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             config = WuttaConfig([myfile]) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             self.assertEqual(conf.get_engines(config, "wuttadb"), {}) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def test_default(self): | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             myfile = self.write_file( | 
					
						
							|  |  |  |                 "my.conf", | 
					
						
							|  |  |  |                 """\
 | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |     [wuttadb] | 
					
						
							|  |  |  |     default.url = sqlite:// | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |     """,
 | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             config = WuttaConfig([myfile]) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             result = conf.get_engines(config, "wuttadb") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertEqual(len(result), 1) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             self.assertIn("default", result) | 
					
						
							|  |  |  |             engine = result["default"] | 
					
						
							|  |  |  |             self.assertEqual(engine.dialect.name, "sqlite") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def test_default_fallback(self): | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             myfile = self.write_file( | 
					
						
							|  |  |  |                 "my.conf", | 
					
						
							|  |  |  |                 """\
 | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |     [wuttadb] | 
					
						
							|  |  |  |     sqlalchemy.url = sqlite:// | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |     """,
 | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             config = WuttaConfig([myfile]) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             result = conf.get_engines(config, "wuttadb") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertEqual(len(result), 1) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             self.assertIn("default", result) | 
					
						
							|  |  |  |             engine = result["default"] | 
					
						
							|  |  |  |             self.assertEqual(engine.dialect.name, "sqlite") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def test_other(self): | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             myfile = self.write_file( | 
					
						
							|  |  |  |                 "my.conf", | 
					
						
							|  |  |  |                 """\
 | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |     [otherdb] | 
					
						
							|  |  |  |     keys = first, second | 
					
						
							|  |  |  |     first.url = sqlite:// | 
					
						
							|  |  |  |     second.url = sqlite:// | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |     """,
 | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             config = WuttaConfig([myfile]) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             result = conf.get_engines(config, "otherdb") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertEqual(len(result), 2) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             self.assertIn("first", result) | 
					
						
							|  |  |  |             self.assertIn("second", result) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     class TestGetSetting(TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def setUp(self): | 
					
						
							|  |  |  |             Session = orm.sessionmaker() | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             engine = sa.create_engine("sqlite://") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.session = Session(bind=engine) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             self.session.execute( | 
					
						
							|  |  |  |                 sa.text( | 
					
						
							|  |  |  |                     """
 | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             create table setting ( | 
					
						
							|  |  |  |                     name varchar(255) primary key, | 
					
						
							|  |  |  |                     value text | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             """
 | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def tearDown(self): | 
					
						
							|  |  |  |             self.session.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def test_basic_value(self): | 
					
						
							|  |  |  |             self.session.execute(sa.text("insert into setting values ('foo', 'bar');")) | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             value = conf.get_setting(self.session, "foo") | 
					
						
							|  |  |  |             self.assertEqual(value, "bar") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def test_missing_value(self): | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             value = conf.get_setting(self.session, "foo") | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertIsNone(value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class TestMakeEngineFromConfig(TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def test_basic(self): | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             engine = conf.make_engine_from_config( | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "sqlalchemy.url": "sqlite://", | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertIsInstance(engine, Engine) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def test_poolclass(self): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             engine = conf.make_engine_from_config( | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "sqlalchemy.url": "sqlite://", | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertNotIsInstance(engine.pool, NullPool) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             engine = conf.make_engine_from_config( | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "sqlalchemy.url": "sqlite://", | 
					
						
							|  |  |  |                     "sqlalchemy.poolclass": "sqlalchemy.pool:NullPool", | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertIsInstance(engine.pool, NullPool) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def test_pool_pre_ping(self): | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             engine = conf.make_engine_from_config( | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "sqlalchemy.url": "sqlite://", | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertFalse(engine.pool._pre_ping) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-30 21:25:44 -05:00
										 |  |  |             engine = conf.make_engine_from_config( | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "sqlalchemy.url": "sqlite://", | 
					
						
							|  |  |  |                     "sqlalchemy.pool_pre_ping": "true", | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-04 08:00:42 -05:00
										 |  |  |             self.assertTrue(engine.pool._pre_ping) |