Files @ 328c8377c5ec
Branch filter:

Location: rattail-project/rattail/rattail/tests/importing/test_rattail.py

Lance Edgar
Add new Rattail -> Rattail main importer, with new/final framework

Plus tests, yay. Also includes a couple of other tweaks which came up
in other testing.
# -*- coding: utf-8 -*-

from __future__ import unicode_literals, absolute_import

from unittest import TestCase

import sqlalchemy as sa
from mock import patch
from fixture import TempIO

from rattail.db import model, Session, SessionBase
from rattail.importing import rattail as rattail_importing
from rattail.tests import RattailMixin, RattailTestCase


class DualRattailMixin(RattailMixin):

    def setup_rattail(self):
        super(DualRattailMixin, self).setup_rattail()

        if 'host' not in self.config.rattail_engines:
            self.config.rattail_engines['host'] = sa.create_engine('sqlite://')

        self.host_engine = self.config.rattail_engines['host']
        self.config.setdefault('rattail.db', 'keys', 'default, host')
        self.config.setdefault('rattail.db', 'host.url', unicode(self.host_engine.url))
        model = self.get_rattail_model()
        model.Base.metadata.create_all(bind=self.host_engine)
        self.host_session = Session(bind=self.host_engine)
        
    def teardown_rattail(self):
        super(DualRattailMixin, self).teardown_rattail()

        self.host_session.close()
        model = self.get_rattail_model()
        model.Base.metadata.drop_all(bind=self.config.rattail_engines['host'])

        if hasattr(self, 'tempio'):
            self.tempio = None


class DualRattailTestCase(DualRattailMixin, TestCase):
    pass


class TestFromRattailToRattail(DualRattailTestCase):

    def make_handler(self, **kwargs):
        return rattail_importing.FromRattailToRattail(self.config, **kwargs)

    def test_host_title(self):
        handler = self.make_handler()
        self.assertEqual(handler.host_title, "Rattail (host)")

    def test_make_session(self):
        handler = self.make_handler()
        session = handler.make_session()
        self.assertIsInstance(session, SessionBase)
        self.assertIs(session.bind, self.config.rattail_engine)

    def test_make_host_session(self):

        # default is 'host'
        handler = self.make_handler()
        session = handler.make_host_session()
        self.assertIsInstance(session, SessionBase)
        self.assertIs(session.bind, self.host_engine)

        # invalid dbkey
        handler = self.make_handler(dbkey='other')
        self.assertRaises(KeyError, handler.make_host_session)

        # alternate dbkey
        self.config.rattail_engines['other'] = self.config.rattail_engines['host']
        handler = self.make_handler(dbkey='other')
        session = handler.make_host_session()
        self.assertIsInstance(session, SessionBase)
        self.assertIs(session.bind, self.host_engine)


class TestFromRattail(DualRattailTestCase):

    def make_importer(self, model_class=None, **kwargs):
        kwargs.setdefault('host_session', self.host_session)
        importer = rattail_importing.FromRattail(self.config, **kwargs)
        if model_class:
            importer.model_class = model_class
        return importer

    def test_host_model_class(self):
        importer = self.make_importer()
        self.assertIsNone(importer.model_class)
        self.assertIsNone(importer.host_model_class)
        importer = self.make_importer(model.Product)
        self.assertIs(importer.host_model_class, model.Product)

    def test_query(self):
        importer = self.make_importer(model.Product)
        importer.query()

    def test_normalize_host_object(self):
        importer = self.make_importer(model.Product)
        product = model.Product()
        with patch.object(importer, 'normalize_local_object') as normalize_local:
            normalize_local.return_value = {}
            data = importer.normalize_host_object(product)
            self.assertEqual(data, {})
            normalize_local.assert_called_once_with(product)
        self.assertEqual(data, importer.normalize_local_object(product))