summaryrefslogtreecommitdiff
path: root/pyramid/tests/test_registry.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyramid/tests/test_registry.py')
-rw-r--r--pyramid/tests/test_registry.py351
1 files changed, 351 insertions, 0 deletions
diff --git a/pyramid/tests/test_registry.py b/pyramid/tests/test_registry.py
index c3104bd31..29803346a 100644
--- a/pyramid/tests/test_registry.py
+++ b/pyramid/tests/test_registry.py
@@ -42,11 +42,362 @@ class TestRegistry(unittest.TestCase):
registry.settings = 'foo'
self.assertEqual(registry._settings, 'foo')
+class TestIntrospector(unittest.TestCase):
+ def _getTargetClass(slf):
+ from pyramid.registry import Introspector
+ return Introspector
+
+ def _makeOne(self):
+ return self._getTargetClass()()
+
+ def test_conformance(self):
+ from zope.interface.verify import verifyClass
+ from zope.interface.verify import verifyObject
+ from pyramid.interfaces import IIntrospector
+ verifyClass(IIntrospector, self._getTargetClass())
+ verifyObject(IIntrospector, self._makeOne())
+
+ def test_add(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ inst.add(intr)
+ self.assertEqual(intr.order, 0)
+ category = {'discriminator':intr, 'discriminator_hash':intr}
+ self.assertEqual(inst._categories, {'category':category})
+
+ def test_get_success(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ inst.add(intr)
+ self.assertEqual(inst.get('category', 'discriminator'), intr)
+
+ def test_get_success_byhash(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ inst.add(intr)
+ self.assertEqual(inst.get('category', 'discriminator_hash'), intr)
+
+ def test_get_fail(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ inst.add(intr)
+ self.assertEqual(inst.get('category', 'wontexist', 'foo'), 'foo')
+
+ def test_get_category(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ intr2 = DummyIntrospectable()
+ intr2.discriminator = 'discriminator2'
+ intr2.discriminator_hash = 'discriminator2_hash'
+ inst.add(intr2)
+ inst.add(intr)
+ expected = [
+ {'introspectable':intr2, 'related':[]},
+ {'introspectable':intr, 'related':[]},
+ ]
+ self.assertEqual(inst.get_category('category'), expected)
+
+ def test_get_category_returns_default_on_miss(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.get_category('category', '123'), '123')
+
+ def test_get_category_with_sortkey(self):
+ import operator
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ intr.foo = 2
+ intr2 = DummyIntrospectable()
+ intr2.discriminator = 'discriminator2'
+ intr2.discriminator_hash = 'discriminator2_hash'
+ intr2.foo = 1
+ inst.add(intr)
+ inst.add(intr2)
+ expected = [
+ {'introspectable':intr2, 'related':[]},
+ {'introspectable':intr, 'related':[]},
+ ]
+ self.assertEqual(
+ inst.get_category('category', sort_key=operator.attrgetter('foo')),
+ expected)
+
+ def test_categorized(self):
+ import operator
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ intr.foo = 2
+ intr2 = DummyIntrospectable()
+ intr2.discriminator = 'discriminator2'
+ intr2.discriminator_hash = 'discriminator2_hash'
+ intr2.foo = 1
+ inst.add(intr)
+ inst.add(intr2)
+ expected = [('category', [
+ {'introspectable':intr2, 'related':[]},
+ {'introspectable':intr, 'related':[]},
+ ])]
+ self.assertEqual(
+ inst.categorized(sort_key=operator.attrgetter('foo')), expected)
+
+ def test_categories(self):
+ inst = self._makeOne()
+ inst._categories['a'] = 1
+ inst._categories['b'] = 2
+ self.assertEqual(list(inst.categories()), ['a', 'b'])
+
+ def test_remove(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ intr2 = DummyIntrospectable()
+ intr2.category_name = 'category2'
+ intr2.discriminator = 'discriminator2'
+ intr2.discriminator_hash = 'discriminator2_hash'
+ inst.add(intr)
+ inst.add(intr2)
+ inst.relate(('category', 'discriminator'),
+ ('category2', 'discriminator2'))
+ inst.remove('category', 'discriminator')
+ self.assertEqual(inst._categories,
+ {'category':
+ {},
+ 'category2':
+ {'discriminator2': intr2,
+ 'discriminator2_hash': intr2}
+ })
+ self.assertEqual(inst._refs.get(intr), None)
+ self.assertEqual(inst._refs[intr2], [])
+
+ def test_remove_fail(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.remove('a', 'b'), None)
+
+ def test_relate(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ intr2 = DummyIntrospectable()
+ intr2.category_name = 'category2'
+ intr2.discriminator = 'discriminator2'
+ intr2.discriminator_hash = 'discriminator2_hash'
+ inst.add(intr)
+ inst.add(intr2)
+ inst.relate(('category', 'discriminator'),
+ ('category2', 'discriminator2'))
+ self.assertEqual(inst._categories,
+ {'category':
+ {'discriminator':intr,
+ 'discriminator_hash':intr},
+ 'category2':
+ {'discriminator2': intr2,
+ 'discriminator2_hash': intr2}
+ })
+ self.assertEqual(inst._refs[intr], [intr2])
+ self.assertEqual(inst._refs[intr2], [intr])
+
+ def test_relate_fail(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ inst.add(intr)
+ self.assertRaises(
+ KeyError,
+ inst.relate,
+ ('category', 'discriminator'),
+ ('category2', 'discriminator2')
+ )
+
+ def test_unrelate(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ intr2 = DummyIntrospectable()
+ intr2.category_name = 'category2'
+ intr2.discriminator = 'discriminator2'
+ intr2.discriminator_hash = 'discriminator2_hash'
+ inst.add(intr)
+ inst.add(intr2)
+ inst.relate(('category', 'discriminator'),
+ ('category2', 'discriminator2'))
+ inst.unrelate(('category', 'discriminator'),
+ ('category2', 'discriminator2'))
+ self.assertEqual(inst._categories,
+ {'category':
+ {'discriminator':intr,
+ 'discriminator_hash':intr},
+ 'category2':
+ {'discriminator2': intr2,
+ 'discriminator2_hash': intr2}
+ })
+ self.assertEqual(inst._refs[intr], [])
+ self.assertEqual(inst._refs[intr2], [])
+
+ def test_related(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ intr2 = DummyIntrospectable()
+ intr2.category_name = 'category2'
+ intr2.discriminator = 'discriminator2'
+ intr2.discriminator_hash = 'discriminator2_hash'
+ inst.add(intr)
+ inst.add(intr2)
+ inst.relate(('category', 'discriminator'),
+ ('category2', 'discriminator2'))
+ self.assertEqual(inst.related(intr), [intr2])
+
+ def test_related_fail(self):
+ inst = self._makeOne()
+ intr = DummyIntrospectable()
+ intr2 = DummyIntrospectable()
+ intr2.category_name = 'category2'
+ intr2.discriminator = 'discriminator2'
+ intr2.discriminator_hash = 'discriminator2_hash'
+ inst.add(intr)
+ inst.add(intr2)
+ inst.relate(('category', 'discriminator'),
+ ('category2', 'discriminator2'))
+ del inst._categories['category']
+ self.assertRaises(KeyError, inst.related, intr)
+
+class Test_noop_introspector(unittest.TestCase):
+ def _makeOne(self):
+ from pyramid.registry import noop_introspector
+ return noop_introspector
+
+ def test_conformance(self):
+ from zope.interface.verify import verifyObject
+ from pyramid.interfaces import IIntrospector
+ verifyObject(IIntrospector, self._makeOne())
+
+ def test_add(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.add('a'), None)
+
+ def test_get(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.get('category', 'd', default='123'), '123')
+
+ def test_get_category(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.get_category('category', default='123'), '123')
+
+ def test_categorized(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.categorized(), [])
+
+ def test_categories(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.categories(), [])
+
+ def test_remove(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.remove('cat', 'discrim'), None)
+
+ def test_relate(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.relate(), None)
+
+ def test_unrelate(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.unrelate(), None)
+
+ def test_related(self):
+ inst = self._makeOne()
+ self.assertEqual(inst.related('a'), [])
+
+class TestIntrospectable(unittest.TestCase):
+ def _getTargetClass(slf):
+ from pyramid.registry import Introspectable
+ return Introspectable
+
+ def _makeOne(self, *arg, **kw):
+ return self._getTargetClass()(*arg, **kw)
+
+ def _makeOnePopulated(self):
+ return self._makeOne('category', 'discrim', 'title', 'type')
+
+ def test_conformance(self):
+ from zope.interface.verify import verifyClass
+ from zope.interface.verify import verifyObject
+ from pyramid.interfaces import IIntrospectable
+ verifyClass(IIntrospectable, self._getTargetClass())
+ verifyObject(IIntrospectable, self._makeOnePopulated())
+
+ def test_relate(self):
+ inst = self._makeOnePopulated()
+ inst.relate('a', 'b')
+ self.assertEqual(inst._relations, [(True, 'a', 'b')])
+
+ def test_unrelate(self):
+ inst = self._makeOnePopulated()
+ inst.unrelate('a', 'b')
+ self.assertEqual(inst._relations, [(False, 'a', 'b')])
+
+ def test_discriminator_hash(self):
+ inst = self._makeOnePopulated()
+ self.assertEqual(inst.discriminator_hash, hash(inst.discriminator))
+
+ def test___hash__(self):
+ inst = self._makeOnePopulated()
+ self.assertEqual(hash(inst),
+ hash((inst.category_name,) + (inst.discriminator,)))
+
+ def test___repr__(self):
+ inst = self._makeOnePopulated()
+ self.assertEqual(
+ repr(inst),
+ "<Introspectable category 'category', discriminator 'discrim'>")
+
+ def test___nonzero__(self):
+ inst = self._makeOnePopulated()
+ self.assertEqual(inst.__nonzero__(), True)
+
+ def test___bool__(self):
+ inst = self._makeOnePopulated()
+ self.assertEqual(inst.__bool__(), True)
+
+ def test_register(self):
+ introspector = DummyIntrospector()
+ action_info = object()
+ inst = self._makeOnePopulated()
+ inst._relations.append((True, 'category1', 'discrim1'))
+ inst._relations.append((False, 'category2', 'discrim2'))
+ inst.register(introspector, action_info)
+ self.assertEqual(inst.action_info, action_info)
+ self.assertEqual(introspector.intrs, [inst])
+ self.assertEqual(introspector.relations,
+ [(('category', 'discrim'), ('category1', 'discrim1'))])
+ self.assertEqual(introspector.unrelations,
+ [(('category', 'discrim'), ('category2', 'discrim2'))])
+
+class DummyIntrospector(object):
+ def __init__(self):
+ self.intrs = []
+ self.relations = []
+ self.unrelations = []
+
+ def add(self, intr):
+ self.intrs.append(intr)
+
+ def relate(self, *pairs):
+ self.relations.append(pairs)
+
+ def unrelate(self, *pairs):
+ self.unrelations.append(pairs)
+
class DummyModule:
__path__ = "foo"
__name__ = "dummy"
__file__ = ''
+class DummyIntrospectable(object):
+ category_name = 'category'
+ discriminator = 'discriminator'
+ title = 'title'
+ type_name = 'type'
+ order = None
+ action_info = None
+ discriminator_hash = 'discriminator_hash'
+
+ def __hash__(self):
+ return hash((self.category_name,) + (self.discriminator,))
+
+
from zope.interface import Interface
from zope.interface import implementer
class IDummyEvent(Interface):