[Checkins] SVN: megrok.rdb/trunk/ Add a test for a common initialization pattern.
Martijn Faassen
faassen at startifact.com
Fri Sep 18 07:58:18 EDT 2009
Log message for revision 104309:
Add a test for a common initialization pattern.
Changed:
U megrok.rdb/trunk/CHANGES.txt
A megrok.rdb/trunk/src/megrok/rdb/tests/initialization.py
U megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py
-=-
Modified: megrok.rdb/trunk/CHANGES.txt
===================================================================
--- megrok.rdb/trunk/CHANGES.txt 2009-09-18 11:55:05 UTC (rev 104308)
+++ megrok.rdb/trunk/CHANGES.txt 2009-09-18 11:58:17 UTC (rev 104309)
@@ -12,6 +12,9 @@
- Update buildout to use Grok 1.0b2 versions.
+- Added a test that demonstrates a common initialization pattern using
+ `rdb.setupDatabase`` in a ``IEngineCreatedEvent`` subscriber.
+
0.9.1 (2009-08-14)
------------------
Added: megrok.rdb/trunk/src/megrok/rdb/tests/initialization.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/tests/initialization.py (rev 0)
+++ megrok.rdb/trunk/src/megrok/rdb/tests/initialization.py 2009-09-18 11:58:17 UTC (rev 104309)
@@ -0,0 +1,84 @@
+"""
+We test an initialization pattern for z3c.saconfig where the metadata
+is set up in an event handler.
+
+Let's first grok things::
+
+ >>> grok.testing.grok('megrok.rdb.meta')
+ >>> grok.testing.grok(__name__)
+
+We start using the database now::
+
+ >>> session = rdb.Session()
+
+Let's start using the database now::
+
+ >>> session = rdb.Session()
+ >>> philosophy = Department(name='Philosophy')
+ >>> session.add(philosophy)
+ >>> logic = Course(name='Logic')
+ >>> ethics = Course(name='Ethics')
+ >>> metaphysics = Course(name='Metaphysics')
+ >>> session.add_all([logic, ethics, metaphysics])
+
+Let's now add them to the courses container::
+
+ >>> philosophy.courses.set(logic)
+ >>> philosophy.courses.set(ethics)
+ >>> philosophy.courses.set(metaphysics)
+
+We can now verify that the courses are there::
+
+ >>> [(course.id, course.name, course.department_id) for course in
+ ... session.query(Course)]
+ [(1, 'Logic', 1), (2, 'Ethics', 1), (3, 'Metaphysics', 1)]
+
+ >>> for key, value in sorted(philosophy.courses.items()):
+ ... print key, value.name, value.department.name
+ 1 Logic Philosophy
+ 2 Ethics Philosophy
+ 3 Metaphysics Philosophy
+"""
+
+import grokcore.component as grok
+from z3c.saconfig import EngineFactory, GloballyScopedSession
+from z3c.saconfig.interfaces import IEngineCreatedEvent
+
+from sqlalchemy import Column, ForeignKey
+from sqlalchemy.types import Integer, String
+from sqlalchemy.orm import relation
+
+from megrok import rdb
+
+TEST_DSN = 'sqlite:///:memory:'
+
+engine_factory = EngineFactory(TEST_DSN)
+scoped_session = GloballyScopedSession()
+
+grok.global_utility(engine_factory, direct=True)
+grok.global_utility(scoped_session, direct=True)
+
+metadata = rdb.MetaData()
+
+ at grok.subscribe(IEngineCreatedEvent)
+def setUpDatabase(event):
+ rdb.setupDatabase(metadata)
+
+rdb.metadata(metadata)
+
+class Courses(rdb.Container):
+ pass
+
+class Department(rdb.Model):
+ id = Column('id', Integer, primary_key=True)
+ name = Column('name', String(50))
+ courses = relation('Course',
+ backref='department',
+ collection_class=Courses)
+
+class Course(rdb.Model):
+ id = Column('id', Integer, primary_key=True)
+ department_id = Column('department_id', Integer,
+ ForeignKey('department.id'))
+ name = Column('name', String(50))
+
Modified: megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py 2009-09-18 11:55:05 UTC (rev 104308)
+++ megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py 2009-09-18 11:58:17 UTC (rev 104309)
@@ -61,6 +61,11 @@
setUp=zopeSetUp,
tearDown=zopeTearDown,
optionflags=optionflags))
+ suite.addTest(doctest.DocTestSuite(
+ 'megrok.rdb.tests.initialization',
+ setUp=zopeSetUp,
+ tearDown=zopeTearDown,
+ optionflags=optionflags))
suite.addTest(doctest.DocFileSuite(
'../schema.txt',
optionflags=optionflags,
More information about the checkins
mailing list