class TestLazyLoading(TestCase):
    ''' Test concentrating on lazy-loading and actions via the assembler. '''
    def setUp(self):
        self.locator = Locator()
        self.transformer = Transformer(self.locator)
        self.assembler   = Assembler(self.transformer)

        filename = 'locator-lazy-action.xml'
        filepath = abspath(join(dirname(__file__), '..', 'data', filename))

        self.assembler.load(filepath)

    def tearDown(self):
        del self.locator
        del self.transformer
        del self.assembler

    def test_lazy_initialization(self):
        self.assertIsInstance(self.locator.get('alpha').call_accompany(), Beta)
        self.assertIsInstance(self.locator.get('beta'), Beta)

        self.assertEquals(self.locator.get('alpha').call_accompany(), self.locator.get('beta'))

    # Test for actionable events... due to be in a seperate files.

    def test_actions_without_events(self):
        c = self.locator.get('charlie')
        self.assertIsInstance(c.introduce, Action, c.introduce.__class__)

    def test_actions(self):
        self.locator.get('charlie').cook()
Beispiel #2
0
    def setUp(self):
        self.locator = Locator()
        self.transformer = Transformer(self.locator)
        self.assembler   = Assembler(self.transformer)

        filename = 'locator-lazy-action.xml'
        filepath = abspath(join(dirname(__file__), '..', 'data', filename))

        self.assembler.load(filepath)
Beispiel #3
0
    def __init__(self, locator=None):
        self.logger      = get_logger('{}.{}'.format(__name__, self.__class__.__name__))
        self.locator     = Locator()
        self.transformer = Transformer(self.locator)
        self.assembler   = Assembler(self.transformer)

        self.default_services = [
            ('finder',   'tori.common.Finder',                     [], {}),
            ('renderer', 'tori.template.service.RenderingService', [], {}),
            ('db',       'passerine.db.manager.ManagerFactory',    [], {})
        ]

        self.cache_map = None

        self._register_default_services()
 def setUp(self):
     self.locator     = Locator()
     self.transformer = Transformer(self.locator)
     self.assembler   = Assembler(self.transformer)
class test_locator_with_proxy_and_factorization(TestCase):
    '''
    Test the locator via the assembler for factorization.
    '''

    def setUp(self):
        self.locator     = Locator()
        self.transformer = Transformer(self.locator)
        self.assembler   = Assembler(self.transformer)

    def tearDown(self):
        del self.locator
        del self.transformer
        del self.assembler

    def test_good_locator_xml_on_entity_registration(self):
        self.__prepare_good_locator_from_xml()

        # Normal entity
        self.assertTrue(self.locator.has('manager'), self.locator._entities)

        # Factorized entities
        self.assertTrue(self.locator.has('worker.alpha'))
        self.assertTrue(self.locator.has('worker.bravo'))
        self.assertTrue(self.locator.has('def.doubler'))
        self.assertTrue(self.locator.has('def.trippler'))

    def test_get_object(self):
        self.__prepare_good_locator_from_xml()

        ticker  = self.locator.get('ticker')
        trigger = self.locator.get('something')
        entity  = self.locator.get('worker.alpha')

        self.assertIsInstance(entity, Worker)
        self.assertEqual(entity.name, 'Alpha')
        self.assertEqual(0, len(ticker.sequence))

        trigger.alpha()

        self.assertEqual(1, len(ticker.sequence))

    def test_get_callback(self):
        self.__prepare_good_locator_from_xml()

        ticker  = self.locator.get('ticker')
        trigger = self.locator.get('something')
        doubler = self.locator.get('def.doubler')

        self.assertTrue(callable(doubler))
        self.assertEqual(12, doubler(6))
        self.assertEqual(0, len(ticker.sequence))

        trigger.doubler()

        # No interception for callable object as of 1.9.
        self.assertEqual(0, len(ticker.sequence))

    def __get_data_path(self, filename):
        return abspath(join(dirname(__file__), '..', 'data', filename))

    def __load_from_xml(self, path_from_data):
        test_file = self.__get_data_path(path_from_data)

        self.assembler.load(test_file)

    def __prepare_good_locator_from_xml(self):
        self.__load_from_xml('locator-factorization.xml')
Beispiel #6
0
class TestAction(TestCase):
    ''' Test concentrating on lazy-loading and actions via the assembler. '''
    def setUp(self):
        self.locator = Locator()
        self.transformer = Transformer(self.locator)
        self.assembler   = Assembler(self.transformer)

        filename = 'locator-lazy-action.xml'
        filepath = abspath(join(dirname(__file__), '..', 'data', filename))

        self.assembler.load(filepath)

    def tearDown(self):
        del self.locator
        del self.transformer
        del self.assembler

    def test_interceptable_method(self):
        c = self.locator.get('charlie')

        self.assertIsInstance(c.introduce, Action)
        self.assertEquals(c.name, c.introduce())

    def test_normal_execution(self):
        ''' This is a sanity test. '''

        expected_log_sequence = [
            # sequence as charlie cooks
            'Charlie: introduce itself as "Charlie"',
            'Alpha: order "egg and becon"',
            'Charlie: repeat "egg and becon"',
            'Alpha: confirm for egg and becon',
            'Charlie: respond "wilco"',
            'Charlie: cook',

            # sequence as charlie serves
            'Alpha: speak to Beta, "watch your hand"',
            'Beta: acknowledge',
            'Alpha: wash hands',
            'Charlie: serve'
        ]

        alpha   = self.locator.get('alpha')
        charlie = self.locator.get('charlie')

        charlie.cook()
        charlie.serve()

        self.assertEquals(
            len(expected_log_sequence),
            len(Conversation.logs),
            'The number of sequences in the mock scenario must be the same.'
        )

        for step in range(len(Conversation.logs)):
            expectation = expected_log_sequence[step]
            actual      = Conversation.logs[step]
            self.assertEquals(
                expectation,
                actual,
                'Failed at step {step}: should be "{expectation}", not "{actual}"'.format(
                    step=step,
                    expectation=expectation,
                    actual=actual
                )
            )

        #print '\n'.join(Conversation.logs)
Beispiel #7
0
class TestLocator(TestCase):
    '''
    Test the locator via the assembler.
    '''
    class UnknownEntity(object): pass

    def setUp(self):
        self.locator     = Locator()
        self.transformer = Transformer(self.locator)
        self.assembler   = Assembler(self.transformer)

    def tearDown(self):
        del self.locator
        del self.transformer
        del self.assembler

    def test_checker(self):
        entity = self.__make_good_entity()

        self.assertFalse(self.locator.has('poo'))
        self.assertRaises(UnknownEntityError, self.locator.get, ('poo'))

    def test_before_activation(self):
        entity = self.__make_good_entity()

        self.locator.set('poo', entity)

        self.assertTrue(self.locator.has('poo'))
        self.assertFalse(entity.activated)

    def test_after_activation(self):
        entity = self.__make_good_entity()

        self.locator.set('poo', entity)

        self.assertIsInstance(self.locator.get('poo'), PlainOldObject)
        self.assertTrue(entity.activated)

    def test_good_locator_xml_on_entity_registration(self):
        self.__prepare_good_locator_from_xml()

        self.assertTrue(self.locator.has('poo'))
        self.assertTrue(self.locator.has('poow-1'))
        self.assertTrue(self.locator.has('poow-2'))
        self.assertTrue(self.locator.has('dioc'))
        self.assertTrue(self.locator.has('dioe'))

    def test_good_locator_xml_on_class_injection(self):
        self.__prepare_good_locator_from_xml()

        self.assertEqual(self.locator.get('dioc').r, PlainOldObject)

    def test_good_locator_xml_on_class_injection(self):
        self.__prepare_good_locator_from_xml()

        self.assertIsInstance(self.locator.get('dioe').e, PlainOldObjectWithParameters)

    def test_entities_with_same_class(self):
        self.__prepare_good_locator_from_xml()

        self.assertIsInstance(self.locator.get('poow-1'), PlainOldObjectWithParameters)
        self.assertIsInstance(self.locator.get('poow-2'), PlainOldObjectWithParameters)

        self.assertNotEquals(self.locator.get('poow-1').method(), self.locator.get('poow-2').method())
        self.assertEquals('%.2f' % self.locator.get('poow-1').method(), '0.67')
        self.assertEquals(self.locator.get('poow-2').method(), 35)

    def __make_good_entity(self):
        return Entity(
            'poo', Loader('dummy.core.PlainOldObject')
        )

    def __get_data_path(self, filename):
        return abspath(join(dirname(__file__), '..', 'data', filename))

    def __load_from_xml(self, path_from_data):
        test_file = self.__get_data_path(path_from_data)

        self.assembler.load(test_file)

    def __prepare_good_locator_from_xml(self):
        self.__load_from_xml('locator.xml')
Beispiel #8
0
class Container(object):
    def __init__(self, locator=None):
        self.logger      = get_logger('{}.{}'.format(__name__, self.__class__.__name__))
        self.locator     = Locator()
        self.transformer = Transformer(self.locator)
        self.assembler   = Assembler(self.transformer)

        self.default_services = [
            ('finder',   'tori.common.Finder',                     [], {}),
            ('renderer', 'tori.template.service.RenderingService', [], {}),
            ('db',       'passerine.db.manager.ManagerFactory',    [], {})
        ]

        self.cache_map = None

        self._register_default_services()

    @contextmanager
    def passive_mode(self):
        self.assembler.activate_passive_loading()
        yield
        self.assembler.deactivate_passive_loading()

    def get(self, id):
        return self.locator.get(id)

    def load(self, *paths):
        with self.passive_mode():
            [
                self.assembler.load(path)
                for path in paths
            ]

            self.cache_map = None

    def all(self):
        if not self.cache_map:
            self.cache_map = {
                i: self.locator.get(i)
                for i in self.locator.entity_identifiers
            }

        return self.cache_map

    def _register_default_services(self):
        for entity_id, package_path, args, kwargs in self.default_services:
            try:
                entity = self._create_entity(entity_id, package_path, *args, **kwargs)

                self.locator.set(entity_id, entity)
            except ImportError as exception:
                if entity_id == "db":
                    self.logger.info('Ignored {} as package "passerine" is neither available or loadable (containing errors).'.format(package_path))

                    continue

                raise ImportError('Failed to register {} ({})'.format(entity_id, package_path))

    def _create_entity(self, id, package_path, *args, **kwargs):
        loader = Loader(package_path)

        return Entity(id, loader, *args, **kwargs)