source: products/quintagroup.plonetabs/trunk/quintagroup/plonetabs/tests/test_controlpanel.py @ 818

Last change on this file since 818 was 801, checked in by crchemist, 17 years ago

Added compatibility with plone-2.1

File size: 19.3 KB
Line 
1import unittest
2
3from zope.interface import Interface
4from zope.interface.verify import verifyClass
5from zope.component import getMultiAdapter, provideAdapter
6
7from Products.CMFCore.utils import getToolByName
8from Products.CMFCore.ActionInformation import Action, ActionCategory
9
10from quintagroup.plonetabs.browser.interfaces import IPloneTabsControlPanel
11from quintagroup.plonetabs.browser.plonetabs import PloneTabsControlPanel as ptp
12from quintagroup.plonetabs.tests.base import PloneTabsTestCase
13from quintagroup.plonetabs.tests.data import PORTAL_ACTIONS
14
15
16class TestControlPanelHelperMethods(PloneTabsTestCase):
17    """Test here configlet helper methods"""
18   
19    def afterSetUp(self):
20        self.loginAsPortalOwner()
21        # TODO: investigate why I can't work with it but
22        # have to traverse my view
23        #self.panel = getMultiAdapter((self.portal, self.portal.REQUEST),
24            #name='plonetabs-controlpanel')
25        self.panel = self.portal.restrictedTraverse('plonetabs-controlpanel')
26        self.tool = getToolByName(self.portal, 'portal_actions')
27   
28    def test_redirect(self):
29        response = self.portal.REQUEST.RESPONSE
30        method = self.panel.redirect
31        portal_url =  getMultiAdapter((self.portal, self.portal.REQUEST),
32                                      name=u"plone_portal_state").portal_url()
33        url = '%s/%s' % (portal_url, "@@plonetabs-controlpanel")
34        method()
35        self.assertEquals(response.headers.get('location', ''), url,
36            'Redirect method is not working properly.')
37       
38        # check query string and anchor hash
39        method('http://quintagroup.com', 'q=test', 'hash_code')
40        self.assertEquals(response.headers.get('location', ''),
41            'http://quintagroup.com?q=test#hash_code',
42            'Redirect method is not working properly.')
43   
44    def test_fixExpression(self):
45        method = self.panel.fixExpression
46        self.assertEquals(method('/slash'), 'string:${portal_url}/slash')
47        self.assertEquals(method('https://test.com'), 'string:https://test.com')
48        self.assertEquals(method('python:True'), 'python:True')
49        self.assertEquals(method('hello'), 'string:${object_url}/hello')
50   
51    def test_copyAction(self):
52        data = PORTAL_ACTIONS[0][1]['children'][0][1]
53        action = Action('act1', **data)
54        info = self.panel.copyAction(action)
55        self.assertEquals(len(info.keys()), 6)
56        self.assertEquals(info['description'], 'The most important place')
57   
58    def test_validateActionFields(self):
59        method = self.panel.validateActionFields
60        good_data = PORTAL_ACTIONS[0][1]['children'][0][1].copy()
61        good_data['id'] = 'new_one'
62        errors = method('new_category', good_data)
63        self.assertEquals(errors, {},
64            'There should be no errors for valid data.')
65       
66        bad_data = {'id':'',
67                    'title': ' ',
68                    'available_expr': 'bad_type:test',
69                    'url_expr': 'bad_type:test'}
70       
71        # Revert PloneTestCase's optimization
72        # because this breaks our test
73        def __init__(self, text):
74            self.text = text
75            if text.strip():
76                self._v_compiled = getEngine().compile(text)
77        from Products.CMFCore.Expression import Expression
78        optimized__init__ = Expression.__init__
79        Expression.__init__ = __init__
80        errors = method('new_category', bad_data)
81        # rollback our patch
82        Expression.__init__ = optimized__init__
83       
84        self.assertEquals(len(errors.keys()), 4,
85            'validateActionFields method is not working properly.')
86   
87    def test_processErrors(self):
88        method = self.panel.processErrors
89        errors = {'error':'error message'}
90        self.assertEquals(method(errors), errors,
91            'processErrors method is not working properly.')
92        self.assertEquals(method(errors, 'pre_', '_post'),
93            {'pre_error_post': 'error message'},
94            'processErrors method is not working properly.')
95   
96    def test_parseEditForm(self):
97        method = self.panel.parseEditForm
98        form = {'orig_id': 'id1',
99                'category': 'cat1',
100                'visible_id1': True,
101                'id_id1': 'id_new',
102                'title_id1': 'title1',
103                'url_expr_id1': 'expr1',
104                'available_expr_id1': 'expr2'}
105        self.assertEquals(method(form),
106            ('id1', 'cat1', {'id': 'id_new',
107                             'title': 'title1',
108                             'url_expr': 'expr1',
109                             'available_expr': 'expr2',
110                             'visible': True}),
111            'parseEditForm method is not working properly.')
112       
113        del form['orig_id']
114        self.failUnlessRaises(KeyError, method, form)
115   
116    def test_parseAddForm(self):
117        method = self.panel.parseAddForm
118        form = {'id': 'id1',
119                'category': 'cat1',
120                'visible': True,
121                'title': 'title1',
122                'url_expr': 'string:expr1',
123                'available_expr': 'expr2'}
124        self.assertEquals(method(form),
125            ('id1', 'cat1', {'id': 'id1',
126                             'visible': True,
127                             'title': 'title1',
128                             'url_expr': 'string:expr1',
129                             'available_expr': 'expr2'}),
130            'parseAddForm method is not working properly.')
131       
132        del form['id']
133        self.failUnlessRaises(KeyError, method, form)
134   
135    def test_getActionCategory(self):
136        method = self.panel.getActionCategory
137        self.purgeActions()
138        self.failUnlessRaises(KeyError, method, 'portal_tabs')
139       
140        self.setupActions(self.tool)
141        self.assertEquals(method('portal_tabs').id, 'portal_tabs',
142            'getActionCategory is not working properly.')
143   
144    def test_getOrCreateCategory(self):
145        method = self.panel.getOrCreateCategory
146        self.purgeActions()
147        self.assertEquals(method('portal_tabs').id, 'portal_tabs',
148            'getOrCreateCategory is not working properly.')
149   
150    def test_setSiteProperties(self):
151        self.panel.setSiteProperties(title='Test Title')
152        sp = getToolByName(self.portal, 'portal_properties').site_properties
153        self.assertEquals(sp.getProperty('title'), 'Test Title',
154            'setSiteProperties method is not working properly.')
155   
156    def test_renderViewlet(self):
157        # register test viewlet and it's manager
158        from zope.viewlet.interfaces import IViewlet, IViewletManager
159        from zope.viewlet.viewlet import ViewletBase
160        from zope.viewlet.manager import ViewletManagerBase
161        from zope.publisher.interfaces.browser import IDefaultBrowserLayer
162        from zope.publisher.interfaces.browser import IBrowserView
163        class TestViewlet(ViewletBase):
164            def __of__(self, obj):
165                return self
166            def render(self):
167                return 'test viewlet'
168        provideAdapter(
169            TestViewlet,
170            (Interface, IDefaultBrowserLayer, IBrowserView, IViewletManager),
171            IViewlet,
172            name=u'test_viewlet')
173        provideAdapter(
174            ViewletManagerBase,
175            (Interface, IDefaultBrowserLayer, IBrowserView),
176            IViewletManager,
177            name=u'test_manager')
178       
179        self.assertEquals(
180            self.panel.renderViewlet('test_manager', 'test_viewlet'),
181            'test viewlet',
182            'renderViewlet method is not workig properly')
183   
184    def test_addAction(self):
185        self.purgeActions()
186        self.panel.addAction('new_category', {'id':'id1', 'title':'Test'})
187        self.failUnless('id1' in self.tool.new_category.objectIds(),
188            'addAction method is not workig properly')
189   
190    def test_updateAction(self):
191        method = self.panel.updateAction
192       
193        self.purgeActions()
194        self.failUnlessRaises(KeyError, method, 'id1', 'cat1', {'id':'new'})
195       
196        self.setupActions(self.tool)
197        # we need to commit transaction because
198        # we are going to rename just added action now
199        import transaction
200        transaction.savepoint()
201        method('home', 'portal_tabs', {'id':'new_home'})
202        self.failUnless('new_home' in self.tool.portal_tabs.objectIds(),
203            'updateAction method is not workig properly')
204   
205    def test_deleteAction(self):
206        self.purgeActions()
207        self.setupActions(self.tool)
208        self.panel.deleteAction('home', 'portal_tabs')
209        self.failIf('home' in self.tool.portal_tabs.objectIds(),
210             'deleteAction method is not workig properly')
211   
212    def test_moveAction(self):
213        self.purgeActions()
214        self.setupActions(self.tool)
215        pos = self.tool.portal_tabs.getObjectPosition
216        self.assertEquals(pos('home'), 0,
217            'moveAction method is not workig properly')
218        self.panel.moveAction('home', 'portal_tabs', -1)
219        self.assertEquals(pos('home'), 1,
220             'moveAction method is not workig properly')
221
222
223class TestControlPanelAPI(PloneTabsTestCase):
224    """Test here interface methods of control panel class"""
225   
226    def afterSetUp(self):
227        self.loginAsPortalOwner()
228        self.panel = self.portal.restrictedTraverse('plonetabs-controlpanel')
229        self.tool = getToolByName(self.portal, 'portal_actions')
230   
231    def test_interface(self):
232        self.failUnless(IPloneTabsControlPanel.implementedBy(ptp),
233            'PloneTabs control panel does not implement required interface.')
234        self.failUnless(verifyClass(IPloneTabsControlPanel, ptp),
235            'PloneTabs control panel does not implement required interface.')
236   
237    def test_getPageTitle(self):
238        self.assertEquals(self.panel.getPageTitle(),
239            'Portal Tabs Configuration',
240            'getPageTitle method is broken')
241        self.assertEquals(self.panel.getPageTitle(category='notexists'),
242            "Plone '%s' Configuration" % 'notexists',
243            'getPageTitle method is broken')
244   
245    def test_hasActions(self):
246        method = self.panel.hasActions
247        # purge any default portal actions
248        self.purgeActions()
249        self.failIf(method(),
250            'There should be no portal_tab actions in portal')
251       
252        # setup our own actions
253        self.setupActions(self.tool)
254        self.failUnless(method(),
255            'There should be portal_tab actions in portal')
256   
257    def test_getPortalActions(self):
258        method = self.panel.getPortalActions
259        # purge any default portal actions
260        self.purgeActions()
261        self.assertEquals(len(method()), 0,
262            'There should be no actions in portal_tabs category.')
263       
264        # setup our own actions
265        self.setupActions(self.tool)
266        self.assertEquals(len(method()), 2,
267            'There should be 2 actions in portal_tabs category.')
268       
269        # marginal arguments
270        self.assertEquals(len(method('notexistent_category')), 0,
271            'There should be no actions for not existed category.')
272   
273    def test_isGeneratedTabs(self):
274        method = self.panel.isGeneratedTabs
275        # prepare value
276        sp = getToolByName(self.portal, 'portal_properties').site_properties
277        sp.manage_changeProperties(disable_folder_sections=True)
278        self.failIf(method(), 'But folder sections are disabled...')
279   
280    def test_isNotFoldersGenerated(self):
281        method = self.panel.isNotFoldersGenerated
282        # prepare value
283        sp = getToolByName(self.portal, 'portal_properties').site_properties
284        sp.manage_changeProperties(disable_nonfolderish_sections=True)
285        self.failIf(method(), 'But non folderish sections are disabled...')
286   
287    def test_getActionsList(self):
288        method = self.panel.getActionsList
289        # purge any default portal actions
290        self.purgeActions()
291        self.failIf('class="editform"' in method(),
292            'There should no be actions in actions list template.')
293        self.setupActions(self.tool)
294        self.failUnless('class="editform"' in method(),
295            'There are no actions in actions list template.')
296   
297    def test_getAutoGenereatedSection(self):
298        method = self.panel.getAutoGenereatedSection
299        self.failIf('<form' in method('user'),
300            'There should be no form in autogenerated tabs template '
301            'for category other than portal_tabs.')
302        self.failUnless('<form' in method('portal_tabs'),
303            'There should be form in autogenerated tabs template '
304            'for portal_tabs category.')
305   
306    def test_getGeneratedTabs(self):
307        self.panel.getGeneratedTabs()
308        # check expiration header set by generated tabs template
309        self.assertEquals(
310            self.portal.REQUEST.RESPONSE.headers.get('expires', ''),
311            'Mon, 26 Jul 1996 05:00:00 GMT',
312            'Expiration header is not set properly.')
313   
314    def test_getRootTabs(self):
315        method = self.panel.getRootTabs
316        # make sure we don't depend on external settings
317        self.purgeContent()
318        self.assertEquals(len(method()), 0,
319            'There should be no root elements for navigation.')
320       
321        # now add some testing content
322        self.setupContent(self.portal)
323        self.assertEquals(len(method()), 2,
324            'There should be 2 elements in portal root for navigation.')
325       
326        # now switch off autogeneration
327        sp = getToolByName(self.portal, 'portal_properties').site_properties
328        sp.manage_changeProperties(disable_folder_sections=True)
329        self.assertEquals(len(method()), 0,
330            'There should be no root elements for navigation when '
331            'tabs autogeneration is switched off.')
332   
333    def test_getCategories(self):
334        method = self.panel.getCategories
335        # purge any default portal actions
336        self.purgeActions()
337        self.assertEquals(len(method()), 0,
338            'There should be no categories in portal_actions tool.')
339       
340        # now setup actions
341        self.setupActions(self.tool)
342        self.assertEquals(method(), ['portal_tabs', 'new_category'],
343            'There should be exactly 2 categories in portal_actions tool.')
344   
345    def test_portal_tabs(self):
346        method = self.panel.portal_tabs
347        self.purgeContent()
348        self.purgeActions()
349        self.assertEquals(len(method()), 0,
350            'There should be no portal tabs.')
351       
352        # cleanup memoize cache
353        # cause actions method of portal context state is caching it's
354        # results in request and we have the same request for every call
355        self.purgeCache(self.portal.REQUEST)
356       
357        # add actions
358        self.setupActions(self.tool)
359        self.assertEquals(len(method()), 2,
360            'There should be 2 portal tabs.')
361       
362        # add content
363        self.setupContent(self.portal)
364        self.assertEquals(len(method()), 4,
365            'There should be 4 portal tabs.')
366   
367    def test_selected_portal_tab(self):
368        self.assertEquals(self.panel.selected_portal_tab(), 'index_html',
369            'index_html is not selected tab while being on configlet.')
370
371    def test_test(self):
372        self.assertEquals(self.panel.test(True, 'true', 'false'), 'true',
373            'Test function does not work properly.')
374
375
376class TestControlPanelManageMethods(PloneTabsTestCase):
377    """Test here management methods of control panel class"""
378   
379    def afterSetUp(self):
380        self.loginAsPortalOwner()
381        self.panel = self.portal.restrictedTraverse('plonetabs-controlpanel')
382        self.tool = getToolByName(self.portal, 'portal_actions')
383       
384        # purge standard set of actions and set our own testing ones
385        self.purgeActions()
386        self.setupActions(self.tool)
387   
388    def test_manage_setAutogeneration(self):
389        self.setupContent(self.portal)
390        form = {'generated_tabs': '1',
391                'nonfolderish_tabs': '0',
392                'folder1': '0'}
393        self.panel.manage_setAutogeneration(form, {})
394        self.failUnless(self.portal.folder1.exclude_from_nav())
395        sp = getToolByName(self.portal, 'portal_properties').site_properties
396        self.failIf(sp.disable_folder_sections)
397        self.failUnless(sp.disable_nonfolderish_sections)
398   
399    def test_manage_addAction(self):
400        self.purgeActions()
401        form = {'id': 'id1',
402                'category': 'cat1',
403                'visible': True,
404                'title': 'title1',
405                'url_expr': 'string:expr1',
406                'available_expr': 'expr2'}
407        postback = self.panel.manage_addAction(form, {})
408        self.failUnless('id1' in self.tool.cat1.objectIds())
409        self.failIf(postback,
410            'There should be redirect after successfull adding.')
411   
412    def test_manage_editAction(self):
413        method = self.panel.manage_editAction
414        self.purgeActions()
415        self.setupActions(self.tool)
416        form = {'orig_id': 'home',
417                'category': 'portal_tabs',
418                'visible_home': True,
419                'id_home': 'id_new',
420                'title_home': 'title1',
421                'url_expr_home': 'expr1',
422                'available_expr_home': 'expr2'}
423        import transaction
424        transaction.savepoint()
425       
426        postback = method(form, {})
427        self.failUnless('id_new' in self.tool.portal_tabs.objectIds())
428        self.failIf(postback,
429            'There should be redirect after successfull edition.')
430       
431        form['category'] = 'non_existent'
432        self.failUnlessRaises(KeyError, method, form, {})
433   
434    def test_manage_deleteAction(self):
435        self.purgeActions()
436        self.setupActions(self.tool)
437        form = {'orig_id': 'home',
438                'category': 'portal_tabs',
439                'visible_home': True,
440                'id_home': 'id_new',
441                'title_home': 'title1',
442                'url_expr_home': 'expr1',
443                'available_expr_home': 'expr2'}
444        self.panel.manage_deleteAction(form, {})
445        self.failIf('home' in self.tool.portal_tabs.objectIds())
446   
447    def test_manage_moveUpAction(self):
448        self.purgeActions()
449        self.setupActions(self.tool)
450        form = {'orig_id': 'quintagroup',
451                'category': 'portal_tabs',
452                'visible_quintagroup': True,
453                'id_quintagroup': 'quintagroup',
454                'title_quintagroup': 'title1',
455                'url_expr_quintagroup': 'expr1',
456                'available_expr_quintagroup': 'expr2'}
457        self.panel.manage_moveUpAction(form, {})
458        self.assertEquals(
459            self.tool.portal_tabs.getObjectPosition('quintagroup'), 0)
460   
461    def test_manage_moveDownAction(self):
462        self.purgeActions()
463        self.setupActions(self.tool)
464        form = {'orig_id': 'home',
465                'category': 'portal_tabs',
466                'visible_home': True,
467                'id_home': 'home',
468                'title_home': 'title1',
469                'url_expr_home': 'expr1',
470                'available_expr_home': 'expr2'}
471        self.panel.manage_moveDownAction(form, {})
472        self.assertEquals(self.tool.portal_tabs.getObjectPosition('home'), 1)
473
474
475def test_suite():
476    suite = unittest.TestSuite()
477    suite.addTest(unittest.makeSuite(TestControlPanelHelperMethods))
478    suite.addTest(unittest.makeSuite(TestControlPanelAPI))
479    suite.addTest(unittest.makeSuite(TestControlPanelManageMethods))
480    #suite.addTest(unittest.makeSuite(TestControlPanelKSSMethods))
481    return suite
Note: See TracBrowser for help on using the repository browser.