[1739] | 1 | import unittest |
---|
[1765] | 2 | import transaction |
---|
[1739] | 3 | |
---|
[1753] | 4 | from zope.interface import Interface |
---|
| 5 | from zope.component import queryUtility |
---|
| 6 | from zope.component import provideAdapter |
---|
| 7 | |
---|
| 8 | from plone.indexer.decorator import indexer |
---|
| 9 | from plone.indexer.interfaces import IIndexableObject |
---|
[1739] | 10 | from Testing import ZopeTestCase as ztc |
---|
| 11 | |
---|
| 12 | from Products.Five import zcml |
---|
| 13 | from Products.Five import fiveconfigure |
---|
[1753] | 14 | from Products.CMFCore.utils import getToolByName |
---|
[1739] | 15 | from Products.PloneTestCase import PloneTestCase as ptc |
---|
| 16 | from Products.PloneTestCase.layer import PloneSite |
---|
[1753] | 17 | from Products.Archetypes.tests.utils import makeContent |
---|
[1739] | 18 | |
---|
[1753] | 19 | from quintagroup.catalogupdater.utility import ICatalogUpdater |
---|
[1739] | 20 | |
---|
| 21 | class TestCase(ptc.PloneTestCase): |
---|
| 22 | class layer(PloneSite): |
---|
| 23 | @classmethod |
---|
| 24 | def setUp(cls): |
---|
[1753] | 25 | import quintagroup.catalogupdater |
---|
[1739] | 26 | fiveconfigure.debug_mode = True |
---|
[1753] | 27 | zcml.load_config('configure.zcml', quintagroup.catalogupdater) |
---|
[1739] | 28 | fiveconfigure.debug_mode = False |
---|
| 29 | |
---|
[1753] | 30 | ptc.setupPloneSite() |
---|
[1739] | 31 | |
---|
| 32 | |
---|
[1753] | 33 | class TestUtility(TestCase): |
---|
[1739] | 34 | |
---|
[1753] | 35 | def afterSetUp(self): |
---|
| 36 | self.loginAsPortalOwner() |
---|
| 37 | self.my_doc = makeContent(self.portal, portal_type='Document', id='my_doc') |
---|
| 38 | self.catalog = getToolByName(self.portal, 'portal_catalog') |
---|
| 39 | self.logout() |
---|
| 40 | self.addIndexer() |
---|
[1739] | 41 | |
---|
[1753] | 42 | def addIndexer(self): |
---|
| 43 | @indexer(Interface) |
---|
| 44 | def test_column(obj): |
---|
| 45 | return obj.id |
---|
[1739] | 46 | |
---|
[1753] | 47 | provideAdapter(test_column, name='test_column') |
---|
| 48 | self.catalog.addColumn('test_column') |
---|
[1739] | 49 | |
---|
[1756] | 50 | def testSingleColumnUpdate(self): |
---|
[1753] | 51 | """ Test is metadata column updated with utility |
---|
| 52 | """ |
---|
[1756] | 53 | mydoc = self.catalog.unrestrictedSearchResults(id='my_doc')[0] |
---|
| 54 | self.assertFalse(mydoc.test_column == 'my_doc', |
---|
| 55 | "'test_column' metadata updated in catalog " \ |
---|
| 56 | "before utility call: '%s'" % mydoc.test_column) |
---|
[1739] | 57 | |
---|
[1753] | 58 | cu = queryUtility(ICatalogUpdater, name="catalog_updater") |
---|
| 59 | cu.updateMetadata4All(self.catalog, 'test_column') |
---|
[1739] | 60 | |
---|
[1756] | 61 | mydoc = self.catalog.unrestrictedSearchResults(id='my_doc')[0] |
---|
| 62 | self.assertTrue(mydoc.test_column == 'my_doc', |
---|
| 63 | "'test_column' metadata has wrong metadata in catalog: " \ |
---|
| 64 | "'%s'" % mydoc.test_column) |
---|
[1753] | 65 | |
---|
[1756] | 66 | def testOnlyPointedColumnUpdate(self): |
---|
| 67 | """ Update a title property for the my_doc object |
---|
| 68 | (without reindexing) then, after utility usage |
---|
| 69 | - check is that metadata is leave unchanged. |
---|
[1753] | 70 | """ |
---|
| 71 | self.loginAsPortalOwner() |
---|
| 72 | self.my_doc.update(title="My document") |
---|
| 73 | self.logout() |
---|
| 74 | |
---|
| 75 | mydoc = self.catalog.unrestrictedSearchResults(id='my_doc')[0] |
---|
| 76 | self.assertTrue(mydoc.Title == "My document", mydoc.Title) |
---|
| 77 | |
---|
| 78 | self.my_doc.setTitle('New my document') # catalog not updated |
---|
| 79 | cu = queryUtility(ICatalogUpdater, name="catalog_updater") |
---|
| 80 | cu.updateMetadata4All(self.catalog, 'test_column') |
---|
| 81 | |
---|
| 82 | mydoc = self.catalog.unrestrictedSearchResults(id='my_doc')[0] |
---|
| 83 | self.assertTrue(mydoc.Title == 'My document', |
---|
| 84 | "Other metadata updated: Title='%s'" % mydoc.Title) |
---|
| 85 | |
---|
| 86 | |
---|
[1757] | 87 | def testAllRecordsUpdate(self): |
---|
| 88 | """ Test is all records in catalog updated with utility |
---|
| 89 | """ |
---|
[1758] | 90 | cu = queryUtility(ICatalogUpdater, name="catalog_updater") |
---|
| 91 | cu.updateMetadata4All(self.catalog, 'test_column') |
---|
[1753] | 92 | |
---|
[1758] | 93 | num_recs = len(self.catalog._catalog.data) |
---|
| 94 | allcat = self.catalog.unrestrictedSearchResults(path='/') |
---|
| 95 | num_updated = sum([1 for b in allcat if b.test_column==b.id]) |
---|
[1757] | 96 | |
---|
[1758] | 97 | self.assertTrue(num_updated == num_recs, "Only %d records updated, " \ |
---|
| 98 | "must be - %d" % (num_updated, num_recs)) |
---|
[1757] | 99 | |
---|
| 100 | |
---|
[1765] | 101 | def testTransaction(self): |
---|
| 102 | """ Test is commited subtransactions |
---|
| 103 | """ |
---|
| 104 | # savepoint patch |
---|
| 105 | global sp_commits |
---|
| 106 | sp_commits = 1 # Starts from 1 to count last commit |
---|
| 107 | orig_trsp = transaction.savepoint |
---|
| 108 | def dummy_savepoint(*args, **kwargs): |
---|
| 109 | global sp_commits |
---|
| 110 | sp_commits += 1 |
---|
| 111 | orig_trsp(*args, **kwargs) |
---|
| 112 | transaction.savepoint = dummy_savepoint |
---|
| 113 | |
---|
| 114 | # set threshold for catalog |
---|
| 115 | num_recs = len(self.catalog.unrestrictedSearchResults(path='/')) |
---|
| 116 | num_subcommits = 3 |
---|
| 117 | self.catalog.threshold = num_recs/num_subcommits |
---|
| 118 | |
---|
| 119 | cu = queryUtility(ICatalogUpdater, name="catalog_updater") |
---|
| 120 | cu.updateMetadata4All(self.catalog, 'test_column') |
---|
| 121 | |
---|
| 122 | self.assertTrue(sp_commits == num_subcommits, |
---|
| 123 | "Wrong number of transaction subcommits: actual:%d, must be: %d" % ( |
---|
| 124 | sp_commits, num_subcommits)) |
---|
| 125 | |
---|
| 126 | transaction.savepoint = orig_trsp |
---|
| 127 | |
---|
| 128 | |
---|
| 129 | |
---|
[1753] | 130 | def test_suite(): |
---|
| 131 | return unittest.TestSuite([ |
---|
| 132 | unittest.makeSuite(TestUtility), |
---|
[1739] | 133 | ]) |
---|
| 134 | |
---|
| 135 | if __name__ == '__main__': |
---|
| 136 | unittest.main(defaultTest='test_suite') |
---|