Commit 84f69299 authored by Tres Seaver's avatar Tres Seaver

Simplify / normalize test suite.

parent b39b67ab
...@@ -11,15 +11,10 @@ ...@@ -11,15 +11,10 @@
# #
############################################################################## ##############################################################################
"""PathIndex unit tests. """PathIndex unit tests.
$Id$
""" """
import unittest import unittest
import Testing
import Zope2
from Products.PluginIndexes.PathIndex.PathIndex import PathIndex
class Dummy: class Dummy:
...@@ -29,13 +24,7 @@ class Dummy: ...@@ -29,13 +24,7 @@ class Dummy:
def getPhysicalPath(self): def getPhysicalPath(self):
return self.path.split('/') return self.path.split('/')
DUMMIES = {
class PathIndexTests(unittest.TestCase):
""" Test PathIndex objects """
def setUp(self):
self._index = PathIndex( 'path' )
self._values = {
1 : Dummy("/aa/aa/aa/1.html"), 1 : Dummy("/aa/aa/aa/1.html"),
2 : Dummy("/aa/aa/bb/2.html"), 2 : Dummy("/aa/aa/bb/2.html"),
3 : Dummy("/aa/aa/cc/3.html"), 3 : Dummy("/aa/aa/cc/3.html"),
...@@ -54,69 +43,122 @@ class PathIndexTests(unittest.TestCase): ...@@ -54,69 +43,122 @@ class PathIndexTests(unittest.TestCase):
16 : Dummy("/bb/cc/aa/16.html"), 16 : Dummy("/bb/cc/aa/16.html"),
17 : Dummy("/bb/cc/bb/17.html"), 17 : Dummy("/bb/cc/bb/17.html"),
18 : Dummy("/bb/cc/cc/18.html") 18 : Dummy("/bb/cc/cc/18.html")
} }
def _populateIndex(self): def _populateIndex(index):
for k, v in self._values.items(): for k, v in DUMMIES.items():
self._index.index_object( k, v ) index.index_object(k, v)
def test_z3interfaces(self): _marker = object()
from Products.PluginIndexes.interfaces import IPathIndex
from Products.PluginIndexes.interfaces import IUniqueValueIndex
from zope.interface.verify import verifyClass
verifyClass(IPathIndex, PathIndex) class PathIndexTests(unittest.TestCase):
verifyClass(IUniqueValueIndex, PathIndex) """ Test PathIndex objects """
def testEmpty(self): def _getTargetClass(self):
self.assertEqual(self._index.numObjects() ,0) from Products.PluginIndexes.PathIndex.PathIndex import PathIndex
self.assertEqual(self._index.getEntryForObject(1234), None) return PathIndex
self._index.unindex_object( 1234 ) # nothrow
self.assertEqual(self._index._apply_index(dict(suxpath="xxx")), None)
def testUnIndex(self): def _makeOne(self, id='path', caller=_marker):
self._populateIndex() if caller is not _marker:
self.assertEqual(self._index.numObjects(), 18) return self._getTargetClass()(id, caller)
return self._getTargetClass()(id)
for k in self._values.keys(): def test_class_conforms_to_IPathIndex(self):
self._index.unindex_object(k) from Products.PluginIndexes.interfaces import IPathIndex
from zope.interface.verify import verifyClass
verifyClass(IPathIndex, self._getTargetClass())
self.assertEqual(self._index.numObjects(), 0) def test_instance_conforms_to_IPathIndex(self):
self.assertEqual(len(self._index._index), 0) from Products.PluginIndexes.interfaces import IPathIndex
self.assertEqual(len(self._index._unindex), 0) from zope.interface.verify import verifyObject
verifyObject(IPathIndex, self._makeOne())
def testReindex(self): def test_class_conforms_to_IUniqueValueIndex(self):
self._populateIndex() from Products.PluginIndexes.interfaces import IUniqueValueIndex
self.assertEqual(self._index.numObjects(), 18) from zope.interface.verify import verifyClass
verifyClass(IUniqueValueIndex, self._getTargetClass())
def test_instance_conforms_to_IUniqueValueIndex(self):
from Products.PluginIndexes.interfaces import IUniqueValueIndex
from zope.interface.verify import verifyObject
verifyObject(IUniqueValueIndex, self._makeOne())
def test_numObjects_empty(self):
index = self._makeOne()
self.assertEqual(index.numObjects(), 0)
def test_numObjects_filled(self):
index = self._makeOne()
_populateIndex(index)
self.assertEqual(index.numObjects(), len(DUMMIES))
def test_getEntryForObject_miss(self):
index = self._makeOne()
self.assertEqual(index.getEntryForObject(1234), None)
def test_getEntryForObject_hit(self):
index = self._makeOne()
_populateIndex(index)
self.assertEqual(index.getEntryForObject(1), DUMMIES[1].path)
def test_unindex_object_nonesuch(self):
index = self._makeOne()
index.unindex_object( 1234 ) # nothrow
def test_unindex_object_broken_path(self):
index = self._makeOne()
_populateIndex(index)
index._unindex[1] = "/broken/thing"
index.unindex_object(1) # nothrow
def test_unindex_object_found(self):
index = self._makeOne()
_populateIndex(index)
for k in DUMMIES.keys():
index.unindex_object(k)
self.assertEqual(index.numObjects(), 0)
self.assertEqual(len(index._index), 0)
self.assertEqual(len(index._unindex), 0)
def test_index_object_again(self):
index = self._makeOne()
_populateIndex(index)
before = index.numObjects()
o = Dummy('/foo/bar') o = Dummy('/foo/bar')
self._index.index_object(19, o) index.index_object(1234, o)
self.assertEqual(self._index.numObjects(), 19) self.assertEqual(index.numObjects(), before + 1)
self._index.index_object(19, o) index.index_object(1234, o)
self.assertEqual(self._index.numObjects(), 19) self.assertEqual(index.numObjects(), before + 1)
def testUnIndexError(self): def test__apply_index_no_match_in_query(self):
self._populateIndex() index = self._makeOne()
# this should not raise an error self.assertEqual(index._apply_index({'foo': 'xxx'}), None)
self._index.unindex_object(-1)
def test__apply_index_nonesuch(self):
# nor should this index = self._makeOne()
self._index._unindex[1] = "/broken/thing" res = index._apply_index({'path': 'xxx'})
self._index.unindex_object(1) self.assertEqual(len(res[0]), 0)
self.assertEqual(res[1], ('path',))
def testRoot(self):
self._populateIndex() def test___apply_index_root_levelO_dict(self):
index = self._makeOne()
queries = ( _populateIndex(index)
dict(path=dict(query='/', level=0)), query = {'path': {'query': '/', 'level': 0}}
dict(path=(('/', 0),)), res = index._apply_index(query)
) self.assertEqual(list(res[0].keys()), range(1,19))
for q in queries:
res = self._index._apply_index(q) def test___apply_index_root_levelO_tuple(self):
index = self._makeOne()
_populateIndex(index)
query = {'path': (('/', 0),)}
res = index._apply_index(query)
self.assertEqual(list(res[0].keys()), range(1,19)) self.assertEqual(list(res[0].keys()), range(1,19))
def testSimpleTests(self): def test__apply_index_simple(self):
self._populateIndex() index = self._makeOne()
_populateIndex(index)
tests = [ tests = [
# component, level, expected results # component, level, expected results
("aa", 0, [1,2,3,4,5,6,7,8,9]), ("aa", 0, [1,2,3,4,5,6,7,8,9]),
...@@ -135,34 +177,36 @@ class PathIndexTests(unittest.TestCase): ...@@ -135,34 +177,36 @@ class PathIndexTests(unittest.TestCase):
("cc/18.html", 2, [18]), ("cc/18.html", 2, [18]),
] ]
for comp, level, results in tests: for comp, level, expected in tests:
for path in [comp, "/"+comp, "/"+comp+"/"]: for path in [comp, "/"+comp, "/"+comp+"/"]:
# Test with the level passed in as separate parameter # Test with the level passed in as separate parameter
res = self._index._apply_index(dict(path= query = {'path': {'query':path, 'level': level}}
dict(query=path, level=level))) res = index._apply_index(query)
self.assertEqual(list(res[0].keys()), results) self.assertEqual(list(res[0].keys()), expected)
# Test with the level passed in as part of the path parameter # Test with the level passed in as part of the path parameter
res = self._index._apply_index(dict(path= query = {'path': ((path, level),)}
dict(query=((path, level),)))) res = index._apply_index(query)
self.assertEqual(list(res[0].keys()), results) self.assertEqual(list(res[0].keys()), expected)
def testComplexOrTests(self): def test__apply_index_ComplexOrTests(self):
self._populateIndex() index = self._makeOne()
_populateIndex(index)
tests = [ tests = [
(['aa','bb'],1,[1,2,3,4,5,6,10,11,12,13,14,15]), (['aa','bb'],1,[1,2,3,4,5,6,10,11,12,13,14,15]),
(['aa','bb','xx'],1,[1,2,3,4,5,6,10,11,12,13,14,15]), (['aa','bb','xx'],1,[1,2,3,4,5,6,10,11,12,13,14,15]),
([('cc',1),('cc',2)],0,[3,6,7,8,9,12,15,16,17,18]), ([('cc',1),('cc',2)],0,[3,6,7,8,9,12,15,16,17,18]),
] ]
for lst, level, results in tests: for lst, level, expected in tests:
res = self._index._apply_index(dict(path= query = {'path': {'query': lst, 'level': level, 'operator': 'or'}}
dict(query=lst, level=level, operator='or'))) res = index._apply_index(query)
lst = list(res[0].keys()) lst = list(res[0].keys())
self.assertEqual(lst, results) self.assertEqual(lst, expected)
def testComplexANDTests(self): def test__apply_index_ComplexANDTests(self):
self._populateIndex() index = self._makeOne()
_populateIndex(index)
tests = [ tests = [
# Path query (as list or (path, level) tuple), level, expected # Path query (as list or (path, level) tuple), level, expected
(['aa','bb'], 1, []), (['aa','bb'], 1, []),
...@@ -170,19 +214,19 @@ class PathIndexTests(unittest.TestCase): ...@@ -170,19 +214,19 @@ class PathIndexTests(unittest.TestCase):
([('aa',0), ('cc',2)], 0, [3,6,9]), ([('aa',0), ('cc',2)], 0, [3,6,9]),
] ]
for lst, level, results in tests: for lst, level, expected in tests:
res = self._index._apply_index(dict(path= query = {'path': {'query': lst, 'level': level, 'operator': 'and'}}
dict(query=lst, level=level, operator='and'))) res = index._apply_index(query)
lst = list(res[0].keys()) lst = list(res[0].keys())
self.assertEqual(lst, results) self.assertEqual(lst, expected)
def testQueryPathReturnedInResult(self): def test__apply_index_QueryPathReturnedInResult(self):
index = self._index index = self._makeOne()
index.index_object(1, Dummy("/ff")) index.index_object(1, Dummy("/ff"))
index.index_object(2, Dummy("/ff/gg")) index.index_object(2, Dummy("/ff/gg"))
index.index_object(3, Dummy("/ff/gg/3.html")) index.index_object(3, Dummy("/ff/gg/3.html"))
index.index_object(4, Dummy("/ff/gg/4.html")) index.index_object(4, Dummy("/ff/gg/4.html"))
res = index._apply_index(dict(path=dict(query='/ff/gg'))) res = index._apply_index({'path': {'query': '/ff/gg'}})
lst = list(res[0].keys()) lst = list(res[0].keys())
self.assertEqual(lst, [2, 3, 4]) self.assertEqual(lst, [2, 3, 4])
...@@ -191,6 +235,3 @@ def test_suite(): ...@@ -191,6 +235,3 @@ def test_suite():
return unittest.TestSuite(( return unittest.TestSuite((
unittest.makeSuite(PathIndexTests), unittest.makeSuite(PathIndexTests),
)) ))
if __name__ == '__main__':
unittest.main(defaultTest='test_suite')
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment