Skip to content

Commit

Permalink
fix for #2235: ZCatalog triggering boolean evaluation of objects
Browse files Browse the repository at this point in the history
  • Loading branch information
leorochael committed Nov 15, 2006
1 parent 1855741 commit c990228
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 4 deletions.
8 changes: 4 additions & 4 deletions ZCatalog.py
Expand Up @@ -221,7 +221,7 @@ def manage_catalogObject(self, REQUEST, RESPONSE, URL1, urls=None):

for url in urls:
obj = self.resolve_path(url)
if not obj and hasattr(self, 'REQUEST'):
if obj is None and hasattr(self, 'REQUEST'):
obj = self.resolve_url(url, REQUEST)
if obj is not None:
self.catalog_object(obj, url)
Expand Down Expand Up @@ -289,7 +289,7 @@ def refreshCatalog(self, clear=0, pghandler=None):

p = paths[i]
obj = self.resolve_path(p)
if not obj:
if obj is None:
obj = self.resolve_url(p, self.REQUEST)
if obj is not None:
try:
Expand Down Expand Up @@ -587,8 +587,8 @@ def getrid(self, path, default=None):
def getobject(self, rid, REQUEST=None):
"""Return a cataloged object given a 'data_record_id_'
"""
obj = self.aq_parent.unrestrictedTraverse(self.getpath(rid))
if not obj:
obj = self.aq_parent.unrestrictedTraverse(self.getpath(rid), None)
if obj is None:
if REQUEST is None:
REQUEST=self.REQUEST
obj = self.resolve_url(self.getpath(rid), REQUEST)
Expand Down
49 changes: 49 additions & 0 deletions tests/testCatalog.py
Expand Up @@ -28,6 +28,7 @@
from AccessControl.SecurityManagement import setSecurityManager
from AccessControl.SecurityManagement import noSecurityManager
from AccessControl import Unauthorized
from Acquisition import Implicit
from Products.ZCatalog import Vocabulary
from Products.ZCatalog.Catalog import Catalog
from Products.ZCatalog.Catalog import CatalogError
Expand Down Expand Up @@ -159,6 +160,31 @@ class zdummyFalse(zdummy):
def __nonzero__(self):
return False

# make objects with failing __len__ and __nonzero__
class dummyLenFail(zdummy):
def __init__(self, num, fail):
zdummy.__init__(self, num)
self.fail = fail

def __len__(self):
self.fail("__len__() was called")

class dummyNonzeroFail(zdummy):
def __init__(self, num, fail):
zdummy.__init__(self, num)
self.fail = fail

def __nonzero__(self):
self.fail("__nonzero__() was called")

class fakeparent(Implicit):
# fake parent mapping unrestrictedTraverse to
# catalog.resolve_path as simulated by TestZCatalog
def __init__(self, d):
self.d = d

def unrestrictedTraverse(self, path, default=None):
return self.d.get(path, default)

class TestZCatalog(unittest.TestCase):

Expand Down Expand Up @@ -246,6 +272,29 @@ def testReindexIndexesFalse(self):
result = self._catalog(title='9999')
self.assertEquals(1, len(result))

def testBooleanEvalOn_manage_catalogObject(self):
self.d['11'] = dummyLenFail(11, self.fail)
self.d['12'] = dummyNonzeroFail(12, self.fail)
# create a fake response that doesn't bomb on manage_catalogObject()
class myresponse:
def redirect(self, url):
pass
# this next call should not fail
self._catalog.manage_catalogObject(None, myresponse(), 'URL1', urls=('11', '12'))

def testBooleanEvalOn_refreshCatalog_getobject(self):
# wrap catalog under the fake parent
catalog = self._catalog.__of__(fakeparent(self.d))
# replace entries to test refreshCatalog
self.d['0'] = dummyLenFail(0, self.fail)
self.d['1'] = dummyNonzeroFail(1, self.fail)
# this next call should not fail
catalog.refreshCatalog()

for uid in ('0', '1'):
rid = self._catalog.getrid(uid)
# neither should these
catalog.getobject(rid)

class dummy(ExtensionClass.Base):
att1 = 'att1'
Expand Down

0 comments on commit c990228

Please sign in to comment.