source: products/quintagroup.portlet.collection/trunk/quintagroup/portlet/collection/tests/test_portlet.py @ 3554

Last change on this file since 3554 was 3554, checked in by vmaksymiv, 12 years ago

removed previously disabled test

  • Property svn:eol-style set to native
File size: 10.7 KB
Line 
1from zope.component import getUtility, getMultiAdapter
2
3from plone.portlets.interfaces import IPortletType
4from plone.portlets.interfaces import IPortletManager
5from plone.portlets.interfaces import IPortletAssignment
6from plone.portlets.interfaces import IPortletDataProvider
7from plone.portlets.interfaces import IPortletRenderer
8
9from plone.app.portlets.storage import PortletAssignmentMapping
10
11from quintagroup.portlet.collection import collection
12
13from quintagroup.portlet.collection.tests.base import TestCase
14
15
16from Products.CMFCore.utils import getToolByName
17
18class TestQPortletCollection(TestCase):
19    def afterSetUp(self):
20        self.setRoles(('Manager',))
21
22    def testPortletTypeRegistered(self):
23        portlet = getUtility(IPortletType, name='quintagroup.portlet.collection.Collection')
24        self.assertEquals(portlet.addview, 'quintagroup.portlet.collection.Collection')
25
26    def testInterfaces(self):
27        portlet = collection.Assignment(header=u"title")
28        self.failUnless(IPortletAssignment.providedBy(portlet))
29        self.failUnless(IPortletDataProvider.providedBy(portlet.data))
30
31    def testInvokeAddview(self):
32        portlet = getUtility(IPortletType, name='quintagroup.portlet.collection.Collection')
33        mapping = self.portal.restrictedTraverse('++contextportlets++plone.leftcolumn')
34        for m in mapping.keys():
35            del mapping[m]
36        addview = mapping.restrictedTraverse('+/' + portlet.addview)
37
38        addview.createAndAdd(data={'header' : u"test title"})
39
40        self.assertEquals(len(mapping), 1)
41        self.failUnless(isinstance(mapping.values()[0], collection.Assignment))
42
43    def testInvokeEditView(self):
44        mapping = PortletAssignmentMapping()
45        request = self.folder.REQUEST
46
47        mapping['foo'] = collection.Assignment(header=u"title")
48        editview = getMultiAdapter((mapping['foo'], request), name='edit')
49        self.failUnless(isinstance(editview, collection.EditForm))
50
51    def testRenderer(self):
52        context = self.folder
53        request = self.folder.REQUEST
54        view = self.folder.restrictedTraverse('@@plone')
55        manager = getUtility(IPortletManager, name='plone.rightcolumn', context=self.portal)
56        assignment = collection.Assignment(header=u"title")
57
58        renderer = getMultiAdapter((context, request, view, manager, assignment), IPortletRenderer)
59        self.failUnless(isinstance(renderer, collection.Renderer))
60
61class TestQPortletCollectionRenderer(TestCase):
62
63    def afterSetUp(self):
64        self.setRoles(('Manager',))
65        self.pages = self._createType(self.folder, 'Topic', 'pages')
66        crit = self.folder.pages.addCriterion('portal_type', 'ATSimpleStringCriterion')
67        crit.setValue('Document')
68
69    def renderer(self, context=None, request=None, view=None, manager=None, assignment=None):
70        context = context or self.folder
71        request = request or self.folder.REQUEST
72        view = view or self.folder.restrictedTraverse('@@plone')
73        manager = manager or getUtility(IPortletManager, name='plone.rightcolumn', context=self.portal)
74        assignment = assignment or collection.Assignment(header=u"title")
75
76        return getMultiAdapter((context, request, view, manager, assignment), IPortletRenderer)
77
78    def _createType(self, context, portal_type, id, **kwargs):
79        """Helper method to create a new type
80        """
81        ttool = getToolByName(context, 'portal_types')
82        cat = self.portal.portal_catalog
83
84        fti = ttool.getTypeInfo(portal_type)
85        fti.constructInstance(context, id, **kwargs)
86        obj = getattr(context.aq_inner.aq_explicit, id)
87        cat.indexObject(obj)
88        return obj
89
90    def test_collection_path_unicode(self):
91        """
92        Cover problem in #9184
93        """
94        r = self.renderer(context=self.portal,
95                          assignment=collection.Assignment(header=u"title",
96                                                           target_collection=u"/events"))
97        r  = r.__of__(self.folder)
98        self.assertEqual(r.collection().id, 'events')
99
100    def test_portletStyle(self):
101        renderer = self.renderer(context=self.portal,
102                                 assignment=collection.Assignment(header=u"title",
103                                                                  styling="TestClass"))
104        renderer = renderer.__of__(self.folder)
105        renderer.update()
106
107        self.failUnless('TestClass' in renderer.render())
108
109    def test_attributes(self):
110        page = self._createType(self.folder, 'Document', 'page')
111        page.update(title="Test Page", description="Test description")
112        renderer = self.renderer(context=self.portal,
113                                 assignment=collection.Assignment(header=u"title",
114                                                                  item_attributes=[u'Title'],
115                                                                  target_collection='/Members/test_user_1_/pages'))
116        renderer = renderer.__of__(self.folder)
117        renderer.update()
118        self.failUnless('Test Page' in renderer.render())
119        self.failUnless('Test description' not in renderer.render())
120
121class TestQPortletCollectionQuery(TestCase):
122
123    def afterSetUp(self):
124        self.setRoles(('Manager',))
125        #make a collection
126        self.collection = self._createType(self.folder, 'Topic', 'collection')
127
128    def _createType(self, context, portal_type, id, **kwargs):
129        """Helper method to create a new type
130        """
131        ttool = getToolByName(context, 'portal_types')
132        cat = self.portal.portal_catalog
133
134        fti = ttool.getTypeInfo(portal_type)
135        fti.constructInstance(context, id, **kwargs)
136        obj = getattr(context.aq_inner.aq_explicit, id)
137        cat.indexObject(obj)
138        return obj
139
140
141    def renderer(self, context=None, request=None, view=None, manager=None, assignment=None):
142        context = context or self.folder
143        request = request or self.folder.REQUEST
144        view = view or self.folder.restrictedTraverse('@@plone')
145        manager = manager or getUtility(IPortletManager, name='plone.leftcolumn', context=self.portal)
146        assignment = assignment
147        return getMultiAdapter((context, request, view, manager, assignment), IPortletRenderer)
148
149    def testSimpleQuery(self):
150        # set up our collection to search for Folders
151        crit = self.folder.collection.addCriterion('portal_type', 'ATSimpleStringCriterion')
152        crit.setValue('Folder')
153
154        # add a few folders
155        for i in range(6):
156            self.folder.invokeFactory('Folder', 'folder_%s'%i)
157            getattr(self.folder, 'folder_%s'%i).reindexObject()
158
159        # the folders are returned by the topic
160        collection_num_items = len(self.folder.collection.queryCatalog())
161        # We better have some folders
162        self.failUnless(collection_num_items >= 6)
163
164        mapping = PortletAssignmentMapping()
165        request = self.folder.REQUEST
166        mapping['foo'] = collection.Assignment(header=u"title", target_collection='/Members/test_user_1_/collection')
167        collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo'])
168
169        # we want the portlet to return us the same results as the collection
170        self.assertEquals(collection_num_items, len(collectionrenderer.results()))
171
172    def testRandomQuery(self):
173        # we're being perhaps a bit too clever in random mode with the internals of the
174        # LazyMap returned by the collection query, so let's try a bunch of scenarios
175        # to make sure they work
176
177        def reset_memoize(inst):
178            # Decorator memoize adds attribute ('_memojito_') to class instance.
179            # It has cached function and their values so it should be deleted
180            # for testing.
181            # Extra info: http://codereview.corp.quintagroup.com/171241/show
182            if hasattr(inst, '_memojito_'):
183                delattr(inst, '_memojito_')
184
185        # set up our portlet renderer
186        mapping = PortletAssignmentMapping()
187        request = self.folder.REQUEST
188        mapping['foo'] = collection.Assignment(header=u"title",
189                                               random=True,
190                                               target_collection='/Members/test_user_1_/collection')
191        collectionrenderer = self.renderer(context=None, request=None, view=None, manager=None, assignment=mapping['foo'])
192
193        # add some folders
194        for i in range(6):
195            self.folder.invokeFactory('Folder', 'folder_%s'%i)
196            getattr(self.folder, 'folder_%s'%i).reindexObject()
197
198        # collection with no criteria -- should return empty list, without error
199        self.assertEqual(len(collectionrenderer.results()), 0)
200        reset_memoize(collectionrenderer)
201
202        # let's make sure the results aren't being memoized
203        old_func = self.folder.collection.queryCatalog
204        global collection_was_called
205        collection_was_called = False
206        def mark_collection_called(**kw):
207            global collection_was_called
208            collection_was_called = True
209        self.folder.collection.queryCatalog = mark_collection_called
210        collectionrenderer.results()
211        reset_memoize(collectionrenderer)
212        self.folder.collection.queryCatalog = old_func
213        self.failUnless(collection_was_called)
214
215        # collection with simple criterion -- should return 1 (random) folder
216        crit = self.folder.collection.addCriterion('portal_type', 'ATSimpleStringCriterion')
217        crit.setValue('Folder')
218        self.assertEqual(len(collectionrenderer.results()), 1)
219        reset_memoize(collectionrenderer)
220
221        # collection with multiple criteria -- should behave similarly
222        crit = self.folder.collection.addCriterion('Creator', 'ATSimpleStringCriterion')
223        crit.setValue('test_user_1_')
224        collectionrenderer.results()
225
226        # collection with sorting -- should behave similarly (sort is ignored internally)
227        self.folder.collection.setSortCriterion('modified', False)
228        self.assertEqual(len(collectionrenderer.results()), 1)
229        reset_memoize(collectionrenderer)
230
231        # same criteria, now with limit set to 2 -- should return 2 (random) folders
232        collectionrenderer.data.limit = 2
233        self.assertEqual(len(collectionrenderer.results()), 2)
234        reset_memoize(collectionrenderer)
235
236        # make sure there's no error if the limit is greater than the # of results found
237        collectionrenderer.data.limit = 10
238        self.failUnless(len(collectionrenderer.results()) >= 6)
239        reset_memoize(collectionrenderer)
240
241
242def test_suite():
243    from unittest import TestSuite, makeSuite
244    suite = TestSuite()
245    suite.addTest(makeSuite(TestQPortletCollection))
246    suite.addTest(makeSuite(TestQPortletCollectionRenderer))
247    suite.addTest(makeSuite(TestQPortletCollectionQuery))
248    return suite
Note: See TracBrowser for help on using the repository browser.