import unittest from unittest.mock import MagicMock, patch from admin_app.db import bootstrap as bootstrap_module from admin_app.db import init_db as init_db_module class AdminBootstrapRuntimeTests(unittest.TestCase): @patch.object(bootstrap_module, "_ensure_admin_schema_evolution") @patch.object(bootstrap_module.AdminBase.metadata, "create_all") def test_bootstrap_admin_database_creates_schema(self, create_all, ensure_admin_schema_evolution): bootstrap_module.bootstrap_admin_database() create_all.assert_called_once_with(bind=bootstrap_module.admin_engine) ensure_admin_schema_evolution.assert_called_once_with() @patch.object( bootstrap_module.AdminBase.metadata, "create_all", side_effect=RuntimeError("admin db down"), ) def test_bootstrap_admin_database_wraps_failures(self, create_all): with self.assertRaisesRegex(RuntimeError, "admin db down"): bootstrap_module.bootstrap_admin_database() create_all.assert_called_once_with(bind=bootstrap_module.admin_engine) @patch.object(bootstrap_module, "text", side_effect=lambda statement: statement) @patch.object(bootstrap_module, "inspect") def test_schema_evolution_adds_version_columns_when_missing(self, inspect_mock, text_mock): inspector = inspect_mock.return_value inspector.get_table_names.return_value = ["tool_drafts"] inspector.get_columns.return_value = [ {"name": "id"}, {"name": "draft_id"}, {"name": "tool_name"}, ] connection = MagicMock() transaction = MagicMock() transaction.__enter__.return_value = connection transaction.__exit__.return_value = None with patch.object(bootstrap_module.admin_engine, "begin", return_value=transaction) as begin: bootstrap_module._ensure_admin_schema_evolution() begin.assert_called_once_with() executed_statements = [call.args[0] for call in connection.execute.call_args_list] self.assertEqual( executed_statements, [ "ALTER TABLE tool_drafts ADD COLUMN current_version_number INT NOT NULL DEFAULT 1", "ALTER TABLE tool_drafts ADD COLUMN version_count INT NOT NULL DEFAULT 1", "ALTER TABLE tool_drafts ADD COLUMN generation_model VARCHAR(120)", ], ) @patch.object(init_db_module, "bootstrap_admin_database") def test_init_db_wrapper_delegates_to_bootstrap_admin_database(self, bootstrap_admin_database): init_db_module.init_db() bootstrap_admin_database.assert_called_once_with() if __name__ == "__main__": unittest.main()