[Zope3-checkins] SVN: Zope3/branches/jinty-zodbless/src/zope/app/
Remove the dependency of the publication tests on ZODB (Now
we only import ZODB.POSException). Move and add some tests to
zope.app.zodb.
Brian Sutherland
jinty at web.de
Sun Apr 8 19:44:29 EDT 2007
Log message for revision 74042:
Remove the dependency of the publication tests on ZODB (Now we only import ZODB.POSException). Move and add some tests to zope.app.zodb.
Changed:
U Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_browserpublication.py
U Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_xmlrpcpublication.py
U Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_zopepublication.py
U Zope3/branches/jinty-zodbless/src/zope/app/zodb/app.py
A Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/
A Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/__init__.py
A Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/test_app.py
-=-
Modified: Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_browserpublication.py
===================================================================
--- Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_browserpublication.py 2007-04-08 19:46:09 UTC (rev 74041)
+++ Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_browserpublication.py 2007-04-08 23:44:28 UTC (rev 74042)
@@ -117,7 +117,7 @@
# so that the classes can be pickled.
import transaction
- pub = BrowserPublication(self.db)
+ pub = self.publication
ztapi.browserView(I1, 'view', DummyView)
ztapi.setDefaultViewName(I1, 'view')
@@ -131,13 +131,9 @@
# now place our object inside the application
- connection = self.db.open()
- app = connection.root()['Application']
- app.somepath = ob
- transaction.commit()
- connection.close()
+ self.app.somepath = ob
- defineChecker(app.__class__, NamesChecker(somepath='xxx'))
+ defineChecker(self.app.__class__, NamesChecker(somepath='xxx'))
req = self._createRequest(url, pub)
response = req.response
@@ -174,7 +170,7 @@
ob = mydict()
ob['bruce'] = SimpleObject('bruce')
ob['bruce2'] = SimpleObject('bruce2')
- pub = self.klass(self.db)
+ pub = self.publication
ob2 = pub.traverseName(self._createRequest('/bruce', pub), ob, 'bruce')
self.assertRaises(ForbiddenAttribute, getattr, ob2, 'v')
self.assertEqual(removeSecurityProxy(ob2).v, 'bruce')
@@ -193,14 +189,14 @@
ob = mydict()
ob['bruce'] = SimpleObject('bruce')
ob['bruce2'] = SimpleObject('bruce2')
- pub = self.klass(self.db)
+ pub = self.publication
ob2, x = pub.getDefaultTraversal(self._createRequest('/bruce',pub), ob)
self.assertEqual(x, 'dummy')
self.assertRaises(ForbiddenAttribute, getattr, ob2, 'v')
self.assertEqual(removeSecurityProxy(ob2).v, 'bruce')
def testTraverseName(self):
- pub = self.klass(self.db)
+ pub = self.publication
class C(object):
x = SimpleObject(1)
ob = C()
@@ -211,7 +207,7 @@
self.assertEqual(removeSecurityProxy(ob2).v, 1)
def testTraverseNameView(self):
- pub = self.klass(self.db)
+ pub = self.publication
class I(Interface): pass
class C(object):
implements(I)
@@ -224,7 +220,7 @@
self.assertEqual(ob2.__class__, V)
def testTraverseNameSiteManager(self):
- pub = self.klass(self.db)
+ pub = self.publication
class C(object):
def getSiteManager(self):
return SimpleObject(1)
@@ -234,21 +230,8 @@
self.assertRaises(ForbiddenAttribute, getattr, ob2, 'v')
self.assertEqual(removeSecurityProxy(ob2).v, 1)
- def testTraverseNameApplicationControl(self):
- from zope.app.applicationcontrol.applicationcontrol \
- import applicationController, applicationControllerRoot
- pub = self.klass(self.db)
- r = self._createRequest('/++etc++process',pub)
- ac = pub.traverseName(r,
- applicationControllerRoot,
- '++etc++process')
- self.assertEqual(ac, applicationController)
- r = self._createRequest('/++etc++process',pub)
- app = r.publication.getApplication(r)
- self.assertEqual(app, applicationControllerRoot)
-
def testHEADFuxup(self):
- pub = self.klass(self.db)
+ pub = self.publication
class User(object):
id = 'bob'
@@ -303,7 +286,7 @@
factoryRegistry.register('HEAD', '*', 'BROWSER', 10, BrowserFactory())
def testGetBackSamePublication(self):
- factory = HTTPPublicationRequestFactory(db=self.db)
+ factory = HTTPPublicationRequestFactory(db=self.resource_factory)
args = (StringIO(''), {})
self.assert_(id(factory(*args).publication) ==
id(factory(*args).publication))
Modified: Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_xmlrpcpublication.py
===================================================================
--- Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_xmlrpcpublication.py 2007-04-08 19:46:09 UTC (rev 74041)
+++ Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_xmlrpcpublication.py 2007-04-08 23:44:28 UTC (rev 74042)
@@ -46,7 +46,7 @@
return request
def testTraverseName(self):
- pub = self.klass(self.db)
+ pub = self.publication
class C(object):
x = SimpleObject(1)
ob = C()
@@ -57,7 +57,7 @@
self.assertEqual(removeAllProxies(ob2).v, 1)
def testDenyDirectMethodAccess(self):
- pub = self.klass(self.db)
+ pub = self.publication
class I(Interface):
pass
@@ -81,7 +81,7 @@
def testTraverseNameView(self):
- pub = self.klass(self.db)
+ pub = self.publication
class I(Interface):
pass
@@ -114,7 +114,7 @@
def testTraverseNameSiteManager(self):
- pub = self.klass(self.db)
+ pub = self.publication
class C(object):
def getSiteManager(self):
return SimpleObject(1)
Modified: Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_zopepublication.py
===================================================================
--- Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_zopepublication.py 2007-04-08 19:46:09 UTC (rev 74041)
+++ Zope3/branches/jinty-zodbless/src/zope/app/publication/tests/test_zopepublication.py 2007-04-08 23:44:28 UTC (rev 74042)
@@ -19,10 +19,6 @@
import sys
from cStringIO import StringIO
-from persistent import Persistent
-from ZODB.interfaces import IDatabase
-from ZODB.DB import DB
-from ZODB.DemoStorage import DemoStorage
import transaction
import zope.component
@@ -47,11 +43,19 @@
from zope.app.security.interfaces import IUnauthenticatedPrincipal, IPrincipal
from zope.app.publication.zopepublication import ZopePublication
from zope.app.publication.interfaces import IResourceFactory
-from zope.app.zodb.app import ZODBApplicationFactory
from zope.app.folder import Folder, rootFolder
from zope.location import Location
from zope.app.security.interfaces import IAuthenticationUtility
+class ResourceFactoryStub:
+ implements(IResourceFactory)
+
+ def __init__(self, app):
+ self.app = app
+
+ def __call__(self, request):
+ return self.app
+
class Principal(object):
implements(IPrincipal)
def __init__(self, id):
@@ -103,33 +107,20 @@
class BasePublicationTests(PlacelessSetup, unittest.TestCase):
+ klass = ZopePublication
+
def setUp(self):
super(BasePublicationTests, self).setUp()
from zope.security.management import endInteraction
endInteraction()
ztapi.provideAdapter(IHTTPRequest, IUserPreferredCharsets,
HTTPCharsets)
- ztapi.provideAdapter(IDatabase, IResourceFactory,
- ZODBApplicationFactory)
self.policy = setSecurityPolicy(
simplepolicies.PermissiveSecurityPolicy
)
- self.storage = DemoStorage('test_storage')
- self.db = db = DB(self.storage)
- connection = db.open()
- root = connection.root()
- app = getattr(root, ZopePublication.root_name, None)
+ self.app = rootFolder()
- if app is None:
- from zope.app.folder import rootFolder
- app = rootFolder()
- root[ZopePublication.root_name] = app
- transaction.commit()
-
- connection.close()
- self.app = app
-
from zope.traversing.namespace import view, resource, etc
ztapi.provideNamespaceHandler('view', view)
ztapi.provideNamespaceHandler('resource', resource)
@@ -142,7 +133,8 @@
self.presentation_type = Interface
self.request._presentation_type = self.presentation_type
self.object = object()
- self.publication = ZopePublication(self.db)
+ self.resource_factory = ResourceFactoryStub(self.app)
+ self.publication = self.klass(self.resource_factory)
def tearDown(self):
# Close the request, otherwise a Cleanup object will start logging
@@ -383,13 +375,17 @@
self.assert_(txn is not transaction.get())
def testAbortTransactionWithErrorReportingUtility(self):
+ self.committed = False
+ def hook(status, self):
+ self.committed = True
+ txn = transaction.get()
+ txn.addAfterCommitHook(hook, (self, ))
# provide our fake error reporting utility
zope.component.provideUtility(ErrorReportingUtility())
class FooError(Exception):
pass
- last_txn_info = self.db.undoInfo()[0]
try:
raise FooError
except FooError:
@@ -397,9 +393,10 @@
self.publication.handleException(
self.object, self.request, sys.exc_info(), retry_allowed=False)
- # assert that the last transaction is NOT our transaction
- new_txn_info = self.db.undoInfo()[0]
- self.assertEqual(last_txn_info, new_txn_info)
+ # assert that we get a new transaction
+ self.assert_(txn is not transaction.get())
+ # No transaction should be committed
+ self.assertEqual(self.committed, False)
# instead, we expect a message in our logging utility
error_log = zope.component.getUtility(IErrorReportingUtility)
@@ -417,10 +414,8 @@
setup.setUpSiteManagerLookup()
principalRegistry.defineDefaultPrincipal('anonymous', '')
- root = self.db.open().root()
- app = root[ZopePublication.root_name]
- app['f1'] = rootFolder()
- f1 = app['f1']
+ self.app['f1'] = rootFolder()
+ f1 = self.app['f1']
f1['f2'] = Folder()
sm1 = setup.createSiteManager(f1)
setup.addUtility(sm1, '', IAuthenticationUtility, AuthUtility1())
@@ -459,62 +454,58 @@
self.assertEqual(queryInteraction(), None)
def testTransactionCommitAfterCall(self):
- root = self.db.open().root()
+ self.committed = False
+ def hook(status, self):
+ self.committed = True
txn = transaction.get()
- # we just need a change in the database to make the
- # transaction notable in the undo log
- root['foo'] = object()
- last_txn_info = self.db.undoInfo()[0]
+ txn.addAfterCommitHook(hook, (self, ))
self.publication.afterCall(self.request, self.object)
+ # Make sure we have a new transaction
self.assert_(txn is not transaction.get())
- new_txn_info = self.db.undoInfo()[0]
- self.failIfEqual(last_txn_info, new_txn_info)
+ # and that the last one was committed
+ self.assertEqual(self.committed, True)
def testDoomedTransaction(self):
- # Test that a doomed transaction is aborted without error in afterCall
- root = self.db.open().root()
+ self.committed = False
+ def hook(status, self):
+ self.committed = True
+ # start a new transaction
txn = transaction.get()
- # we just need a change in the database to make the
- # transaction notable in the undo log
- root['foo'] = object()
- last_txn_info = self.db.undoInfo()[0]
+ txn.addAfterCommitHook(hook, (self, ))
# doom the transaction
txn.doom()
self.publication.afterCall(self.request, self.object)
# assert that we get a new transaction
self.assert_(txn is not transaction.get())
- new_txn_info = self.db.undoInfo()[0]
# No transaction should be committed
- self.assertEqual(last_txn_info, new_txn_info)
+ self.assertEqual(self.committed, False)
def testTransactionAnnotation(self):
from zope.interface import directlyProvides
from zope.location.traversing import LocationPhysicallyLocatable
from zope.location.interfaces import ILocation
from zope.traversing.interfaces import IPhysicallyLocatable
- from zope.traversing.interfaces import IContainmentRoot
ztapi.provideAdapter(ILocation, IPhysicallyLocatable,
LocationPhysicallyLocatable)
- root = self.db.open().root()
- root['foo'] = foo = LocatableObject()
- root['bar'] = bar = LocatableObject()
+ self.app['foo'] = foo = LocatableObject()
+ self.app['bar'] = bar = LocatableObject()
bar.__name__ = 'bar'
foo.__name__ = 'foo'
bar.__parent__ = foo
- foo.__parent__ = root
- directlyProvides(root, IContainmentRoot)
+ foo.__parent__ = self.app
from zope.publisher.interfaces import IRequest
expected_path = "/foo/bar"
expected_user = "/ " + self.user.id
expected_request = IRequest.__module__ + '.' + IRequest.getName()
+ txn = transaction.get()
self.publication.afterCall(self.request, bar)
- txn_info = self.db.undoInfo()[0]
+ txn_info = txn._extension
self.assertEqual(txn_info['location'], expected_path)
- self.assertEqual(txn_info['user_name'], expected_user)
self.assertEqual(txn_info['request_type'], expected_request)
+ self.assertEqual(txn.user, expected_user)
# also, assert that we still get the right location when
# passing an instance method as object.
Modified: Zope3/branches/jinty-zodbless/src/zope/app/zodb/app.py
===================================================================
--- Zope3/branches/jinty-zodbless/src/zope/app/zodb/app.py 2007-04-08 19:46:09 UTC (rev 74041)
+++ Zope3/branches/jinty-zodbless/src/zope/app/zodb/app.py 2007-04-08 23:44:28 UTC (rev 74042)
@@ -1,3 +1,16 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
import logging
from zope.app.appsetup.interfaces import IApplicationFactory
Added: Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/__init__.py
===================================================================
Property changes on: Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
+ native
Added: Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/test_app.py
===================================================================
--- Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/test_app.py 2007-04-08 19:46:09 UTC (rev 74041)
+++ Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/test_app.py 2007-04-08 23:44:28 UTC (rev 74042)
@@ -0,0 +1,77 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+import doctest
+
+import transaction
+from ZODB.DB import DB
+from ZODB.DemoStorage import DemoStorage
+from zope.app.folder import rootFolder
+from zope.publisher.base import TestPublication
+from zope.publisher.browser import TestRequest
+from zope.app.applicationcontrol.applicationcontrol \
+ import applicationController, applicationControllerRoot
+
+from zope.app.zodb import ROOT_NAME
+from zope.app.zodb.app import ZODBApplicationFactory
+
+def setUp(test):
+ transaction.begin()
+
+ storage = DemoStorage('test_storage')
+ db = DB(storage)
+
+ connection = db.open()
+ root = connection.root()
+ app = rootFolder()
+ root[ROOT_NAME] = app
+ transaction.commit()
+
+ connection.close()
+
+ test.globs['app'] = app
+ test.globs['resource_factory'] = ZODBApplicationFactory(db)
+
+def createRequest(path, publication, **kw):
+ request = TestRequest(PATH_INFO=path, **kw)
+ request.setPublication(publication)
+ return request
+
+def testGetApplication():
+ """
+ Make sure that if we call the resource_factory, we get the application
+ object:
+
+ >>> r = createRequest('/foo', TestPublication(None))
+ >>> app is resource_factory(r)
+ True
+ """
+
+def testTraverseNameApplicationControl():
+ # XXX - applicationControllerRoot traversal should not be tested here.
+ #r = self._createRequest('/++etc++process', TestPublication(None))
+ #ac = pub.traverseName(r,
+ # applicationControllerRoot,
+ # '++etc++process')
+ #self.assertEqual(ac, applicationController)
+ """
+ Make sure that if we traverse to /++etc++process, we get the application controller root.
+
+ >>> r = createRequest('/++etc++process', TestPublication(None))
+ >>> acr = resource_factory(r)
+ >>> acr is applicationControllerRoot
+ True
+ """
+
+def test_suite():
+ return doctest.DocTestSuite(setUp=setUp)
Property changes on: Zope3/branches/jinty-zodbless/src/zope/app/zodb/tests/test_app.py
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the Zope3-Checkins
mailing list