source: products/qTopic/trunk/tests/test_topictool.py @ 1

Last change on this file since 1 was 1, checked in by myroslav, 18 years ago

Building directory structure

  • Property svn:eol-style set to native
File size: 14.8 KB
Line 
1"""
2    Tests for patched 'portal_atct'
3"""
4
5__docformat__ = 'restructuredtext'
6
7import os, sys
8if __name__ == '__main__':
9    execfile(os.path.join(sys.path[0], 'framework.py'))
10
11
12
13from Testing import ZopeTestCase
14ZopeTestCase.installProduct('qTopic')
15from Products.ATContentTypes.tests import atcttestcase
16
17
18from Products.CMFCore.utils import getToolByName
19from Products.CMFPlone.CatalogTool import CatalogTool
20from Products.ATContentTypes.config import TOOLNAME
21from Products.ATContentTypes.interfaces import IATCTTopicsTool
22from Interface.Verify import verifyObject
23from Products.ATContentTypes.configuration import zconf
24from Products.ATContentTypes.interfaces import IATCTTool
25from Products.ZCatalog.ZCatalog import manage_addZCatalog
26
27# z3 imports
28try:
29    from Products.ATContentTypes.interface import IATCTTopicsTool as Z3IATCTTopicsTool
30    from zope.interface.verify import verifyObject as Z3verifyObject
31    z3_support = True
32except ImportError:
33    z3_support = False
34
35tool_config = zconf.atct_tool.topic_tool
36
37
38tests = []
39index_def = {'index'        : 'end',
40             'friendlyName' : 'End Date For Test',
41             'description'  : 'This is an end Date',
42             'criteria'     : ['ATDateCriteria','ATDateRangeCriteria']
43            }
44meta_def =  {'metadata'     : 'ModificationDate',
45             'friendlyName' : 'Modification Date For Test',
46             'description'  : ''
47            }
48
49conf_index_def = [i for i in tool_config.indexes if i.name == index_def['index']][0]
50conf_meta_def = [m for m in tool_config.metadata if m.name == meta_def['metadata']][0]
51CATALOG_NAME = 'test_catalog'
52class TestTool(atcttestcase.ATCTSiteTestCase):
53
54    def afterSetUp(self):
55        self.tool = self.portal.portal_atct
56        manage_addZCatalog(self.portal, id = CATALOG_NAME, title = 'Test catalog')
57        self.cat = self.portal[CATALOG_NAME]
58        self.cat.addIndex('end', 'DateIndex')
59        self.cat.manage_addColumn(meta_def['metadata'])
60
61    def test_interface(self):
62        self.failUnless(IATCTTopicsTool.isImplementedBy(self.tool))
63        self.failUnless(verifyObject(IATCTTopicsTool, self.tool))
64   
65 
66    #Index tests
67    def test_add_index(self):
68        t = self.tool
69
70        t.addIndex(enabled = True, catalog_name=CATALOG_NAME, **index_def)
71        index = t.getIndex(index_def['index'], catalog_name=CATALOG_NAME)
72        self.failUnlessEqual(index.index, index_def['index'])
73        self.failUnlessEqual(index.friendlyName, index_def['friendlyName'])
74        self.failUnlessEqual(index.description, index_def['description'])
75        #Only need to test truth not actual value
76        self.failUnless(index.enabled)
77        self.failUnlessEqual(index.criteria, tuple(index_def['criteria']))
78
79        self.failUnless(index in t.getEnabledIndexes(catalog_name=CATALOG_NAME))
80        self.failUnless(index_def['index'] in [a[0] for a in t.getEnabledFields(catalog_name=CATALOG_NAME)])
81        self.failUnless(index_def['index'] in t.getIndexDisplay(True, catalog_name=CATALOG_NAME).keys())
82        self.failUnless(index_def['friendlyName'] in t.getIndexDisplay(True, catalog_name=CATALOG_NAME).values())
83        self.failUnless(index_def['index'] in t.getIndexes(1))
84
85    def test_disable_index(self):
86        t = self.tool
87        t.addIndex(enabled = False, catalog_name=CATALOG_NAME, **index_def)
88        index = t.getIndex(index_def['index'], catalog_name=CATALOG_NAME)
89        self.failUnlessEqual(index.index, index_def['index'])
90        self.failUnlessEqual(index.friendlyName, index_def['friendlyName'])
91        self.failUnlessEqual(index.description, index_def['description'])
92        #Only need to test truth not actual value
93        self.failIf(index.enabled)
94        self.failUnlessEqual(index.criteria, tuple(index_def['criteria']))
95
96        self.failIf(index in t.getEnabledIndexes(catalog_name=CATALOG_NAME))
97        self.failIf(index_def['index'] in [a[0] for a in t.getEnabledFields(catalog_name=CATALOG_NAME)])
98        self.failIf(index_def['index'] in t.getIndexes(1,catalog_name=CATALOG_NAME))
99        self.failIf(index_def['index'] in t.getIndexDisplay(True, catalog_name=CATALOG_NAME).keys())
100        self.failUnless(index_def['friendlyName'] not in t.getIndexDisplay(True, catalog_name=CATALOG_NAME).values())
101        #Make sure it's still in the un-limited list
102        self.failUnless(index_def['index'] in t.getIndexDisplay(False, catalog_name=CATALOG_NAME).keys())
103        self.failUnless(index_def['friendlyName'] in t.getIndexDisplay(False, catalog_name=CATALOG_NAME).values())
104        self.failUnless(index_def['index'] in t.getIndexes(catalog_name=CATALOG_NAME))
105
106    def test_add_bogus_index(self):
107        """An metdatum that's not in the catalog should be deleted automatically
108           on any call to one of the index list methods."""
109        t = self.tool
110        t.addIndex('bogosity', enabled = True, catalog_name=CATALOG_NAME)
111        error = False
112        #The methods getEnabledFields, getEnabledIndexes, getIndexes,
113        #getIndexDisplay, and getIndex all automatically restore fields
114        #from the catalog
115
116        try:
117            t.getIndex('bogosity', catalog_name=CATALOG_NAME)
118        except AttributeError:
119            error = True
120        self.failUnless(error)
121
122        #Add
123        t.addIndex('bogosity', enabled = True, catalog_name=CATALOG_NAME)
124        self.failIf('bogosity' in [a[0] for a in t.getEnabledFields(catalog_name=CATALOG_NAME)])
125        #Add
126        t.addIndex('bogosity', enabled = True, catalog_name=CATALOG_NAME)
127        self.failIf('bogosity' in t.getIndexDisplay(True, catalog_name=CATALOG_NAME).keys())
128        #Add
129        t.addIndex('bogosity', enabled = True, catalog_name=CATALOG_NAME)
130        self.failIf('bogosity' in t.getIndexes(1, catalog_name=CATALOG_NAME))
131        #Add
132        t.addIndex('bogosity', enabled = True, catalog_name=CATALOG_NAME)
133        self.failIf('bogosity' in [i.index for i in t.getEnabledIndexes(catalog_name=CATALOG_NAME)])
134
135    def test_remove_index(self):
136        t = self.tool
137        t.addIndex(catalog_name=CATALOG_NAME, **index_def)
138        t.removeIndex(index_def['index'], catalog_name=CATALOG_NAME)
139        error = None
140        try:
141            index = t.topic_indexes[CATALOG_NAME][index_def['index']]
142        except KeyError:
143            error = True
144        self.failUnless(error)
145        #Should be restored automatically by getIndex and friends
146        error = None
147        try:
148            index = t.getIndex(index_def['index'], catalog_name=CATALOG_NAME)
149        except AttributeError:
150            error = True
151        self.failIf(error)
152        #Make sure the FriendlyName is reset to default
153        self.failUnlessEqual(index.friendlyName, getattr(conf_index_def,'friendlyName'))
154
155    def test_update_index(self):
156        """An index with no criteria set should set all available criteria,
157           also changes made using updateIndex should not reset already set
158           values"""
159        t = self.tool
160        t.addIndex(enabled = True, catalog_name=CATALOG_NAME, **index_def)
161        t.updateIndex(index_def['index'], criteria = None,
162                      description = 'New Description', catalog_name=CATALOG_NAME)
163        index = t.getIndex(index_def['index'], catalog_name=CATALOG_NAME)
164        self.failUnless(index.criteria)
165        self.failUnless(index.criteria != index_def['criteria'])
166        self.failUnless(index.description == 'New Description')
167        self.failUnless(index.friendlyName == index_def['friendlyName'])
168        self.failUnless(index.enabled)
169
170    def test_all_indexes(self):
171        """Ensure that the tool includes all indexes in the catalog"""
172        t = self.tool
173        cat = getToolByName(self.tool, CATALOG_NAME)
174        indexes = [field for field in cat.indexes()]
175        init_indexes = list(t.getIndexes(catalog_name=CATALOG_NAME))
176        unique_indexes = [i for i in indexes if i not in init_indexes]
177        unique_indexes = unique_indexes + [i for i in init_indexes if i not in indexes]
178        self.failIf(unique_indexes)
179
180    def test_change_catalog_index(self):
181        """Make sure tool updates when indexes are added to or deleted from
182           the catalog"""
183        t = self.tool
184        cat = getToolByName(self.tool, CATALOG_NAME)
185        #add
186        error = False
187        cat.manage_addIndex('nonsense', 'FieldIndex')
188        try:
189            t.getIndex('nonsense', catalog_name=CATALOG_NAME)
190        except AttributeError:
191            error = True
192        self.failIf(error)
193        #remove
194        error = False
195        cat.delIndex('nonsense')
196        try:
197            t.getIndex('nonsense', catalog_name=CATALOG_NAME)
198        except AttributeError:
199            error = True
200        self.failUnless(error)
201
202
203    #Metadata tests
204    def test_add_metadata(self):
205        t = self.tool
206        t.addMetadata(enabled = True, catalog_name=CATALOG_NAME,**meta_def)
207        meta = t.getMetadata(meta_def['metadata'], catalog_name=CATALOG_NAME)
208        self.failUnlessEqual(meta.index, meta_def['metadata'])
209        self.failUnlessEqual(meta.friendlyName, meta_def['friendlyName'])
210        self.failUnlessEqual(meta.description, meta_def['description'])
211        #Only need to test truth not actual value
212        self.failUnless(meta.enabled)
213
214        self.failUnless(meta in t.getEnabledMetadata(catalog_name=CATALOG_NAME))
215        self.failUnless(meta_def['metadata'] in t.getMetadataDisplay(True, catalog_name=CATALOG_NAME).keys())
216        self.failUnless(meta_def['friendlyName'] in t.getMetadataDisplay(True, catalog_name=CATALOG_NAME).values())
217        self.failUnless(meta_def['metadata'] in t.getAllMetadata(1, catalog_name=CATALOG_NAME))
218
219    def test_disable_metadata(self):
220        t = self.tool
221        t.addMetadata(enabled = False, catalog_name=CATALOG_NAME, **meta_def)
222        meta = t.getMetadata(meta_def['metadata'], catalog_name=CATALOG_NAME)
223        self.failUnlessEqual(meta.index, meta_def['metadata'])
224        self.failUnlessEqual(meta.friendlyName, meta_def['friendlyName'])
225        self.failUnlessEqual(meta.description, meta_def['description'])
226        #Only need to test truth not actual value
227        self.failIf(meta.enabled)
228
229        self.failUnless(meta not in t.getEnabledMetadata(catalog_name=CATALOG_NAME))
230        self.failIf(meta_def['metadata'] in t.getAllMetadata(1, catalog_name=CATALOG_NAME))
231        self.failIf(meta_def['metadata'] in t.getMetadataDisplay(True, catalog_name=CATALOG_NAME).keys())
232        self.failIf(meta_def['friendlyName'] in t.getMetadataDisplay(True, catalog_name=CATALOG_NAME).values())
233        #Make sure it's still in the un-limited list
234        self.failUnless(meta_def['metadata'] in t.getMetadataDisplay(False, catalog_name=CATALOG_NAME).keys())
235        self.failUnless(meta_def['friendlyName'] in t.getMetadataDisplay(False, catalog_name=CATALOG_NAME).values())
236        self.failUnless(meta_def['metadata'] in t.getAllMetadata(catalog_name=CATALOG_NAME))
237
238    def test_add_bogus_metadata(self):
239        """An metdatum that's not in the catalog should be deleted automatically
240           on any call to one of the index list methods"""
241        t = self.tool
242        t.addMetadata('bogosity', enabled = True, catalog_name=CATALOG_NAME)
243
244        error = False
245        #The methods getEnabledMetadata, getAllMetadata, getMetadataDisplay,
246        #and getMetadata all automatically restore fields from the catalog
247        try:
248            t.getMetadata('bogosity', catalog_name=CATALOG_NAME)
249        except AttributeError:
250            error = True
251        self.assert_(error)
252
253        #Add
254        t.addMetadata('bogosity', enabled = True, catalog_name=CATALOG_NAME)
255        self.failIf('bogosity' in t.getMetadataDisplay(True, catalog_name=CATALOG_NAME).keys())
256        #Add
257        t.addMetadata('bogosity', enabled = True, catalog_name=CATALOG_NAME)
258        self.failIf('bogosity' in t.getAllMetadata(1, catalog_name=CATALOG_NAME))
259        #Add
260        t.addMetadata('bogosity', enabled = True, catalog_name=CATALOG_NAME)
261        self.failIf('bogosity' in [i.index for i in t.getEnabledMetadata(catalog_name=CATALOG_NAME)])
262
263    def test_remove_metadata(self):
264        t = self.tool
265        t.addMetadata(catalog_name=CATALOG_NAME, **meta_def)
266        t.removeMetadata(meta_def['metadata'], catalog_name=CATALOG_NAME)
267        error = None
268        try:
269            meta = t.topic_metadata[CATALOG_NAME][meta_def['metadata']]
270        except KeyError:
271            error = True
272        self.failUnless(error)
273        #Should be restored automatically by getMetadata and friends
274        error = None
275        try:
276            meta = t.getMetadata(meta_def['metadata'], catalog_name=CATALOG_NAME)
277        except AttributeError:
278            error = True
279        self.failIf(error)
280        #Make sure the FriendlyName is reset to default
281        self.failUnlessEqual(meta.friendlyName, getattr(conf_meta_def,'friendlyName'))
282
283    def test_update_metadata(self):
284        """Changes made using updateMetadata should not reset already set
285           values"""
286        t = self.tool
287        t.addMetadata(enabled = True, catalog_name=CATALOG_NAME, **meta_def)
288        t.updateMetadata(meta_def['metadata'], friendlyName = 'New Name', catalog_name=CATALOG_NAME)
289        meta = t.getMetadata(meta_def['metadata'], catalog_name=CATALOG_NAME)
290        self.failUnless(meta.friendlyName == 'New Name')
291        self.failUnless(meta.enabled)
292
293    def test_all_metadata(self):
294        """Ensure that the tool includes all metadata in the catalog"""
295        t = self.tool
296        cat = getToolByName(self.tool, CATALOG_NAME)
297        metadata = [field for field in cat.schema()]
298        init_metadata = list(t.getAllMetadata(catalog_name=CATALOG_NAME))
299        unique_metadata = [i for i in metadata if i not in init_metadata]
300        unique_metadata = unique_metadata + [i for i in init_metadata if i not in metadata]
301        self.failIf(unique_metadata)
302
303    def test_change_catalog_schema(self):
304        """Make sure tool updates when columns are added to or deleted from
305           the catalog"""
306        t = self.tool
307        cat = getToolByName(self.tool, CATALOG_NAME)
308        #add
309        error = False
310        cat.manage_addColumn('nonsense')
311        try:
312            t.getMetadata('nonsense', catalog_name=CATALOG_NAME)
313        except AttributeError:
314            error = True
315        self.failIf(error)
316        #remove
317        error = False
318        cat.delColumn('nonsense')
319        try:
320            t.getMetadata('nonsense',catalog_name=CATALOG_NAME)
321        except AttributeError:
322            error = True
323        self.assert_(error)
324   
325    if z3_support:
326        def test_Z3interface(self):
327            iface = Z3IATCTTopicsTool
328            self.failUnless(Z3verifyObject(iface,self.tool))
329
330tests.append(TestTool)
331
332if __name__ == '__main__':
333    framework()
334else:
335    # While framework.py provides its own test_suite()
336    # method the testrunner utility does not.
337    import unittest
338    def test_suite():
339        suite = unittest.TestSuite()
340        for test in tests:
341            suite.addTest(unittest.makeSuite(test))
342        return suite
Note: See TracBrowser for help on using the repository browser.