2025-08-31 12:42:59 -05:00
|
|
|
# -*- coding: utf-8; -*-
|
2024-12-05 07:57:51 -06:00
|
|
|
|
2026-03-17 17:15:34 -05:00
|
|
|
from unittest.mock import patch
|
|
|
|
|
|
|
|
|
|
import sqlalchemy as sa
|
|
|
|
|
|
|
|
|
|
from wuttjamaican.testing import DataTestCase
|
|
|
|
|
|
2024-12-05 07:57:51 -06:00
|
|
|
from wuttasync.importing import wutta as mod
|
2026-03-17 17:15:34 -05:00
|
|
|
from wuttasync.importing import ToWutta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestFromWuttaMirror(DataTestCase):
|
|
|
|
|
|
|
|
|
|
def make_importer(self, **kwargs):
|
|
|
|
|
return mod.FromWuttaMirror(self.config, **kwargs)
|
|
|
|
|
|
|
|
|
|
def test_basic(self):
|
|
|
|
|
importer = self.make_importer()
|
|
|
|
|
self.assertIsInstance(importer, mod.FromWuttaMirror)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestFromWuttaToWuttaBase(DataTestCase):
|
|
|
|
|
|
|
|
|
|
def make_handler(self, **kwargs):
|
|
|
|
|
return mod.FromWuttaToWuttaBase(self.config, **kwargs)
|
|
|
|
|
|
|
|
|
|
def test_dbkey(self):
|
|
|
|
|
|
|
|
|
|
# null by default
|
|
|
|
|
handler = self.make_handler()
|
|
|
|
|
self.assertIsNone(handler.dbkey)
|
|
|
|
|
|
|
|
|
|
# but caller can specify
|
|
|
|
|
handler = self.make_handler(dbkey="another")
|
|
|
|
|
self.assertEqual(handler.dbkey, "another")
|
|
|
|
|
|
|
|
|
|
def test_make_importer_factory(self):
|
|
|
|
|
model = self.app.model
|
|
|
|
|
handler = self.make_handler()
|
|
|
|
|
|
|
|
|
|
# returns a typical importer
|
|
|
|
|
factory = handler.make_importer_factory(model.User, "User")
|
|
|
|
|
self.assertTrue(issubclass(factory, mod.FromWuttaMirror))
|
|
|
|
|
self.assertTrue(issubclass(factory, ToWutta))
|
|
|
|
|
self.assertIs(factory.model_class, model.User)
|
|
|
|
|
self.assertEqual(factory.__name__, "UserImporter")
|
|
|
|
|
|
|
|
|
|
def test_define_importers(self):
|
|
|
|
|
handler = self.make_handler()
|
|
|
|
|
|
|
|
|
|
# all models are included
|
|
|
|
|
importers = handler.define_importers()
|
|
|
|
|
self.assertIn("Setting", importers)
|
|
|
|
|
self.assertIn("Person", importers)
|
|
|
|
|
self.assertIn("Role", importers)
|
|
|
|
|
self.assertIn("Permission", importers)
|
|
|
|
|
self.assertIn("User", importers)
|
|
|
|
|
self.assertIn("UserRole", importers)
|
|
|
|
|
self.assertIn("UserAPIToken", importers)
|
|
|
|
|
self.assertIn("Upgrade", importers)
|
|
|
|
|
self.assertNotIn("BatchMixin", importers)
|
|
|
|
|
self.assertNotIn("BatchRowMixin", importers)
|
|
|
|
|
self.assertNotIn("Base", importers)
|
|
|
|
|
|
|
|
|
|
# also, dependencies are implied by sort order
|
|
|
|
|
models = list(importers)
|
|
|
|
|
self.assertLess(models.index("Person"), models.index("User"))
|
|
|
|
|
self.assertLess(models.index("User"), models.index("UserRole"))
|
|
|
|
|
self.assertLess(models.index("User"), models.index("Upgrade"))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestFromWuttaToWuttaImport(DataTestCase):
|
|
|
|
|
|
|
|
|
|
def make_handler(self, **kwargs):
|
|
|
|
|
return mod.FromWuttaToWuttaImport(self.config, **kwargs)
|
|
|
|
|
|
|
|
|
|
def test_make_source_session(self):
|
|
|
|
|
|
|
|
|
|
# error if null dbkey
|
|
|
|
|
handler = self.make_handler()
|
|
|
|
|
self.assertIsNone(handler.dbkey)
|
|
|
|
|
self.assertRaises(ValueError, handler.make_source_session)
|
|
|
|
|
|
|
|
|
|
# error if dbkey not found
|
|
|
|
|
handler = self.make_handler(dbkey="another")
|
|
|
|
|
self.assertEqual(handler.dbkey, "another")
|
|
|
|
|
self.assertNotIn("another", self.config.appdb_engines)
|
|
|
|
|
self.assertRaises(ValueError, handler.make_source_session)
|
|
|
|
|
|
|
|
|
|
# error if dbkey is 'default'
|
|
|
|
|
handler = self.make_handler(dbkey="default")
|
|
|
|
|
self.assertEqual(handler.dbkey, "default")
|
|
|
|
|
self.assertIn("default", self.config.appdb_engines)
|
|
|
|
|
self.assertRaises(ValueError, handler.make_source_session)
|
|
|
|
|
|
|
|
|
|
# expected behavior
|
|
|
|
|
another_engine = sa.create_engine("sqlite://")
|
|
|
|
|
handler = self.make_handler(dbkey="another")
|
|
|
|
|
with patch.dict(self.config.appdb_engines, {"another": another_engine}):
|
|
|
|
|
session = handler.make_source_session()
|
|
|
|
|
self.assertIs(session.bind, another_engine)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestFromWuttaToWuttaExport(DataTestCase):
|
|
|
|
|
|
|
|
|
|
def make_handler(self, **kwargs):
|
|
|
|
|
return mod.FromWuttaToWuttaExport(self.config, **kwargs)
|
|
|
|
|
|
|
|
|
|
def test_make_target_session(self):
|
|
|
|
|
|
|
|
|
|
# error if null dbkey
|
|
|
|
|
handler = self.make_handler()
|
|
|
|
|
self.assertIsNone(handler.dbkey)
|
|
|
|
|
self.assertRaises(ValueError, handler.make_target_session)
|
|
|
|
|
|
|
|
|
|
# error if dbkey not found
|
|
|
|
|
handler = self.make_handler(dbkey="another")
|
|
|
|
|
self.assertEqual(handler.dbkey, "another")
|
|
|
|
|
self.assertNotIn("another", self.config.appdb_engines)
|
|
|
|
|
self.assertRaises(ValueError, handler.make_target_session)
|
|
|
|
|
|
|
|
|
|
# error if dbkey is 'default'
|
|
|
|
|
handler = self.make_handler(dbkey="default")
|
|
|
|
|
self.assertEqual(handler.dbkey, "default")
|
|
|
|
|
self.assertIn("default", self.config.appdb_engines)
|
|
|
|
|
self.assertRaises(ValueError, handler.make_target_session)
|
|
|
|
|
|
|
|
|
|
# expected behavior
|
|
|
|
|
another_engine = sa.create_engine("sqlite://")
|
|
|
|
|
handler = self.make_handler(dbkey="another")
|
|
|
|
|
with patch.dict(self.config.appdb_engines, {"another": another_engine}):
|
|
|
|
|
session = handler.make_target_session()
|
|
|
|
|
self.assertIs(session.bind, another_engine)
|