[Checkins] SVN: grokcore.content/trunk/src/grokcore/content/tests/ Added existing tests from grok. removed the container_model test that made no sense here.

Souheil CHELFOUH souheil at chelfouh.com
Sun Jan 3 12:52:37 EST 2010


Log message for revision 107597:
  Added existing tests from grok. removed the container_model test that made no sense here.
  

Changed:
  A   grokcore.content/trunk/src/grokcore/content/tests/__init__.py
  A   grokcore.content/trunk/src/grokcore/content/tests/container/
  A   grokcore.content/trunk/src/grokcore/content/tests/container/__init__.py
  A   grokcore.content/trunk/src/grokcore/content/tests/container/container.py
  A   grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainer.py
  A   grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainerfiresevent.py
  A   grokcore.content/trunk/src/grokcore/content/tests/test_all.py

-=-
Added: grokcore.content/trunk/src/grokcore/content/tests/__init__.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/__init__.py	                        (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/__init__.py	2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1 @@
+# make this directory a package

Added: grokcore.content/trunk/src/grokcore/content/tests/container/__init__.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/container/__init__.py	                        (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/container/__init__.py	2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1 @@
+# this is a package

Added: grokcore.content/trunk/src/grokcore/content/tests/container/container.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/container/container.py	                        (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/container/container.py	2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1,39 @@
+"""
+
+The grokcore.content.Container is a a model that is also a container.
+It has a dictionary API. It in fact stores its information in a BTree so
+you can store a lot of items in a scalable way.
+
+    >>> from zope.container.interfaces import IContainer
+    >>> bag = BoneBag()
+    >>> IContainer.providedBy(bag)
+    True
+
+    >>> from zope.container.btree import BTreeContainer
+    >>> isinstance(bag, BTreeContainer)
+    True
+     
+We had problems when switching to grokcore.content.Container
+with the __parent__ attribute being set, we better make sure
+this doesn't happen again:
+
+    >>> skull = Bone()
+    >>> print skull.__parent__
+    None
+    >>> print skull.__name__
+    None
+    >>> bag['skull'] = skull
+    >>> skull.__parent__
+    <grokcore.content.tests.container.container.BoneBag object at 0x...>
+    >>> skull.__name__
+    u'skull'
+
+"""
+
+from grokcore.content import Model, Container
+
+class BoneBag(Container):
+    pass
+    
+class Bone(Model):
+    pass

Added: grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainer.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainer.py	                        (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainer.py	2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1,77 @@
+"""
+
+The grokcore.content.OrderedContainer is a a model that is also a container.
+Unlike plain grokcore.content Containers, OrderedContainers keep the mapping
+keys in the order items were added. It has a dictionary API. It in fact
+stores its information in a BTree so you can store a lot of items in a
+scalable way.
+
+  >>> from zope.container.interfaces import IContainer
+  >>> bones = OrderedBones()
+  >>> IContainer.providedBy(bones)
+  True
+  >>> from zope.container.interfaces import IOrderedContainer
+  >>> IOrderedContainer.providedBy(bones)
+  True
+  >>> from zope.container.btree import BTreeContainer
+  >>> isinstance(bones, BTreeContainer)
+  True
+
+Order is initially determined by the sequence in which items were added (mind
+that there is a subscriber to the containermodified event in order to
+illustrate an ordered container fires events just like normal containers)::
+
+  >>> bones['thigh'] = Bone('Thigh Bone')
+  >>> bones['knee'] = Bone('Knee Cap')
+  >>> bones['shin'] = Bone('Shin Bone')
+  >>> bones['ankle'] = Bone('Ankle Joint')
+  >>> bones.keys()
+  ['thigh', 'knee', 'shin', 'ankle']
+
+Now change the order::
+
+  >>> bones.updateOrder(order=['ankle', 'shin', 'knee', 'thigh'])
+  >>> bones.keys()
+  ['ankle', 'shin', 'knee', 'thigh']
+
+  >>> list(bones.items())
+  [('ankle', <grokcore.content.tests.container.orderedcontainer.Bone object at ...>),
+  ('shin', <grokcore.content.tests.container.orderedcontainer.Bone object at ...>),
+  ('knee', <grokcore.content.tests.container.orderedcontainer.Bone object at ...>),
+  ('thigh', <grokcore.content.tests.container.orderedcontainer.Bone object at ...>)]
+
+  >>> [bone.name for bone in bones.values()]
+  ['Ankle Joint', 'Shin Bone', 'Knee Cap', 'Thigh Bone']
+
+  >>> del bones['knee']
+  >>> bones.keys()
+  ['ankle', 'shin', 'thigh']
+
+  >>> bones['toe'] = Bone('Toe')
+  >>> bones.keys()
+  ['ankle', 'shin', 'thigh', 'toe']
+
+Adding a new object under an existing key, raises a DuplicationError::
+
+  >>> bones['shin'] = Bone('Another Shin Bone')
+  Traceback (most recent call last):
+  ...
+  KeyError: u'shin'
+
+Reordering with a wrong set of keys should fail::
+
+  >>> bones.updateOrder(order=['ankle', 'shin', 'knee', 'thigh'])
+  Traceback (most recent call last):
+  ...
+  ValueError: Incompatible key set.
+
+"""
+
+from grokcore.content import Model, OrderedContainer
+
+class OrderedBones(OrderedContainer):
+    pass
+
+class Bone(Model):
+    def __init__(self, name):
+        self.name = name

Added: grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainerfiresevent.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainerfiresevent.py	                        (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/container/orderedcontainerfiresevent.py	2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1,41 @@
+"""
+Mind that there is a subscriber to the containermodified event in order to
+illustrate an ordered container fires events just like normal containers::
+
+  >>> from grokcore.component import testing
+  >>> testing.grok(__name__)
+  >>> bones = OrderedBones()
+
+Add an item::
+
+  >>> bones['thigh'] = Bone('Thigh Bone')
+  Container has changed!
+
+Now change the order::
+
+  >>> bones.updateOrder(order=['thigh'])
+  Container has changed!
+
+Delete an item::
+
+  >>> del bones['thigh']
+  Container has changed!
+  >>> bones.keys()
+  []
+
+"""
+
+from grokcore.component import subscribe
+from grokcore.content import Model, OrderedContainer
+from zope.container.interfaces import IContainerModifiedEvent
+
+class OrderedBones(OrderedContainer):
+    pass
+
+class Bone(Model):
+    def __init__(self, name):
+        self.name = name
+
+ at subscribe(OrderedBones, IContainerModifiedEvent)
+def container_changed(object, event):
+    print 'Container has changed!'

Added: grokcore.content/trunk/src/grokcore/content/tests/test_all.py
===================================================================
--- grokcore.content/trunk/src/grokcore/content/tests/test_all.py	                        (rev 0)
+++ grokcore.content/trunk/src/grokcore/content/tests/test_all.py	2010-01-03 17:52:37 UTC (rev 107597)
@@ -0,0 +1,40 @@
+import unittest
+from pkg_resources import resource_listdir
+from zope.testing import doctest, cleanup
+import zope.component.eventtesting
+
+def setUpZope(test):
+    zope.component.eventtesting.setUp(test)
+
+def cleanUpZope(test):
+    cleanup.cleanUp()
+
+def suiteFromPackage(name):
+    files = resource_listdir(__name__, name)
+    suite = unittest.TestSuite()
+    for filename in files:
+        if not filename.endswith('.py'):
+            continue
+        if filename.endswith('_fixture.py'):
+            continue
+        if filename == '__init__.py':
+            continue
+
+        dottedname = 'grokcore.content.tests.%s.%s' % (name, filename[:-3])
+        test = doctest.DocTestSuite(dottedname,
+                                    setUp=setUpZope,
+                                    tearDown=cleanUpZope,
+                                    optionflags=doctest.ELLIPSIS+
+                                    doctest.NORMALIZE_WHITESPACE)
+
+        suite.addTest(test)
+    return suite
+
+def test_suite():
+    suite = unittest.TestSuite()
+    for name in ['container',]:
+        suite.addTest(suiteFromPackage(name))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')



More information about the checkins mailing list