source: products/vendor/Products.CacheSetup/current/Products/CacheSetup/tests/test_content_rule.py @ 3296

Last change on this file since 3296 was 3296, checked in by fenix, 12 years ago

Load Products.CacheSetup?-1.2.1 into vendor/Products.CacheSetup?/current.

  • Property svn:eol-style set to native
File size: 11.2 KB
Line 
1import unittest
2import sets
3
4from base import CacheFuTestCase
5
6from Products.CMFCore.utils  import getToolByName
7import Products.CacheSetup.config as config
8
9# util for making content in a container
10def makeContent(container, id, portal_type, title=None):
11    container.invokeFactory(id=id, type_name=portal_type)
12    o = getattr(container, id)
13    if title is not None:
14        o.setTitle(title)
15    return o
16
17
18# This is the test case. You will have to add test_<methods> to your
19# class inorder to assert things about your Product.
20class TestContentRule(CacheFuTestCase):
21    USER1 = 'user1'
22   
23    def afterSetUp(self):
24        CacheFuTestCase.afterSetUp(self)
25       
26        # Add a couple of users
27        self.portal.acl_users._doAddUser('manager', 'secret', ['Manager'], [])
28        self.portal.acl_users._doAddUser(self.USER1, 'secret', ['Member'], [])
29        self.login('manager')
30
31        self.portal.portal_quickinstaller.installProducts(['CacheSetup'])
32
33        # We have added a skin so we need to rebuild the skin object
34        # (since the object is cached in the current request)
35        self._refreshSkinData()
36
37        pcs = self.portal.portal_cache_settings
38        pcs.setEnabled(True)
39
40        headers = pcs.getHeaderSets()
41        headers.manage_delObjects(headers.objectIds())
42        headers.invokeFactory(id='hs1', type_name='HeaderSet')
43        headers.invokeFactory(id='hs2', type_name='HeaderSet')
44        rules = pcs.getRules()
45        rules.manage_delObjects(rules.objectIds())
46
47    def test_content_do_cache(self):
48        pcs = self.portal.portal_cache_settings
49        h = getattr(pcs.getHeaderSets(), 'hs1')
50        h2 = getattr(pcs.getHeaderSets(), 'hs2')
51        rules = pcs.getRules()
52        rules.invokeFactory(id='my_rule', type_name='ContentCacheRule')
53        rule = getattr(pcs.getRules(), 'my_rule')
54
55        rule.setTitle('My rule')
56        self.assertEqual(rule.Title(), 'My rule')
57        rule.setContentTypes(['Document'])
58        self.assertEqual(rule.getContentTypes(),('Document',))
59        rule.setDefaultView(True)
60        self.assertEqual(rule.getDefaultView(), True)
61        rule.setTemplates(('foo','bar'))
62        self.assertEqual(rule.getTemplates(), ('foo','bar'))
63        rule.setCacheStop(['portal_status_message',
64                           'statusmessages'])
65        self.assertEqual(rule.getCacheStop(),
66                         ('portal_status_message',
67                          'statusmessages',))
68
69        rule.setHeaderSetIdAnon('hs1')
70        self.assertEqual(rule.getHeaderSetIdAnon(), 'hs1')
71        rule.setHeaderSetIdAuth('hs2')
72        self.assertEqual(rule.getHeaderSetIdAuth(), 'hs2')
73
74        rule.setEtagComponents(['member','last_modified'])
75        rule.setEtagRequestValues([])
76        rule.setEtagTimeout(3600)
77        rule.reindexObject()
78
79        member = self.portal.portal_membership.getAuthenticatedMember()
80        d = makeContent(self.folder, 'doc', 'Document', 'My document')
81        e = makeContent(self.folder, 'event', 'Event', 'My event')
82        pcs = self.portal.portal_cache_settings
83
84        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None).getId(), 'hs1')
85        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', member).getId(), 'hs2')
86
87        # make sure the wrong type fails
88        self.assertEqual(rule.getHeaderSet(e.REQUEST, e, 'document_view', member), None)
89        self.assertEqual(rule.getHeaderSet(e.REQUEST, e, 'event_view', member), None)
90
91        # make sure cached templates work
92        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'foo', member).getId(), 'hs2')
93        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'bar', member).getId(), 'hs2')
94
95        # make sure a non-view, non-cached template fails
96        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'foobar', member), None)
97
98        # make sure stop words stop
99        self.assertEqual(rule.getHeaderSet({}, d, 'document_view', member).getId(), 'hs2')
100        self.assertEqual(rule.getHeaderSet({'portal_status_message':'foo'}, d, 'document_view', member), None)
101
102        # make sure predicate works
103        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None).getId(), 'hs1')
104        rule.setPredicateExpression('python:0')
105        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None), None)
106        rule.setPredicateExpression('python:1')
107        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None).getId(), 'hs1')
108        rule.setPredicateExpression(None)
109        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None).getId(), 'hs1')
110
111        rule.setHeaderSetIdAnon('None')
112        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None), None)
113        rule.setHeaderSetIdAuth('None')
114        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', member), None)
115        # reset
116        rule.setHeaderSetIdAnon('hs1')
117        rule.setHeaderSetIdAuth('hs2')
118        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None).getId(), 'hs1')
119        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', member).getId(), 'hs2')
120
121        # make sure we can disable with the header id
122        rule.setHeaderSetIdAnon('None')
123        rule.setHeaderSetIdAuth('None')
124        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None), None)
125        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', member), None)
126        # reset
127        rule.setHeaderSetIdAnon('hs1')
128        rule.setHeaderSetIdAuth('hs2')
129        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', None).getId(), 'hs1')
130        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', member).getId(), 'hs2')
131
132        # make sure disabling views works
133        rule.setDefaultView(False)
134        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', member), None)
135        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'foo', member).getId(), 'hs2')
136
137        # make sure delegation to script works
138        self.portal.manage_addProduct['PythonScripts'].manage_addPythonScript('test_script')
139        self.portal.test_script.ZPythonScript_edit('view', 'return view==\'foobar\' and \'hs1\' or \'hs2\'')
140        rule.setHeaderSetIdExpression('python:object.test_script(view)')
141        rule.setHeaderSetIdAnon('expression')
142        rule.setHeaderSetIdAuth('expression')
143        rule.setDefaultView(True)
144        rule.setTemplates(['foo', 'foobar'])
145        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'document_view', member).getId(), 'hs2')
146        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'foo', member).getId(), 'hs2')
147        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'foobar', member).getId(), 'hs1')
148
149        # make sure we can associate templates with PageCacheManager
150        self.portal.manage_addProduct['PageTemplates'].manage_addPageTemplate('template', 'Title', '<html></html>')
151        rule.setTemplates(['template'])
152        h2.setPageCache(False)
153        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'template', member).getId(), 'hs2')
154        self.assertEqual(self.portal.template.ZCacheable_getManagerId(), None)
155        h2.setPageCache(True)
156        self.assertEqual(rule.getHeaderSet(d.REQUEST, d, 'template', member).getId(), 'hs2')
157        self.assertEqual(self.portal.template.ZCacheable_getManagerId(), config.PAGE_CACHE_MANAGER_ID)
158
159    def test_content_purge_with_fields(self):
160        pcs = self.portal.portal_cache_settings
161        h = getattr(pcs.getHeaderSets(), 'hs1')
162        rules = pcs.getRules()
163        rules.invokeFactory(id='my_rule', type_name='ContentCacheRule')
164        rule = getattr(pcs.getRules(), 'my_rule')
165
166        url_tool = getToolByName(self.portal, 'portal_url')
167
168        rule.setTitle('My rule')
169        rule.setContentTypes(['News Item'])
170        rule.setDefaultView(True)
171        rule.setTemplates(('foo','bar'))
172        rule.setCacheStop(['portal_status_message'])
173        rule.setHeaderSetIdAnon('hs1')
174        rule.setHeaderSetIdAuth('hs2')
175        rule.setEtagComponents(['member','last_modified'])
176        rule.setEtagRequestValues([])
177        rule.setEtagTimeout(3600)
178        rule.reindexObject()
179
180        # test basic purge for a content object
181        d = makeContent(self.folder, 'doc', 'News Item', 'My news')
182        doc_url = url_tool.getRelativeUrl(d)
183        purged_urls = sets.Set()
184        purged_urls.update([doc_url + url
185            for url in ['','/','/view','/newsitem_view',
186                '/image', '/image_tile', '/image_thumb',
187                '/image_large', '/image_preview', '/image_mini',
188                '/image_icon', '/image_listing',
189                '/foo','/bar']])
190
191        urls = sets.Set()
192        rule.getRelativeUrlsToPurge(d, urls)
193        self.assertEqual(urls, purged_urls)
194
195    def test_content_purge(self):
196        pcs = self.portal.portal_cache_settings
197        h = getattr(pcs.getHeaderSets(), 'hs1')
198        rules = pcs.getRules()
199        rules.invokeFactory(id='my_rule', type_name='ContentCacheRule')
200        rule = getattr(pcs.getRules(), 'my_rule')
201
202        url_tool = getToolByName(self.portal, 'portal_url')
203
204        rule.setTitle('My rule')
205        rule.setContentTypes(['Document'])
206        rule.setDefaultView(True)
207        rule.setTemplates(('foo','bar'))
208        rule.setCacheStop(['portal_status_message',
209                           'statusmessages'])
210        rule.setHeaderSetIdAnon('hs1')
211        rule.setHeaderSetIdAuth('hs2')
212        rule.setEtagComponents(['member','last_modified'])
213        rule.setEtagRequestValues([])
214        rule.setEtagTimeout(3600)
215        rule.reindexObject()
216
217        # test basic purge for a content object
218        d = makeContent(self.folder, 'doc', 'Document', 'My document')
219        doc_url = url_tool.getRelativeUrl(d)
220        purged_urls = sets.Set()
221        purged_urls.update([doc_url + url for url in ['','/','/view','/document_view','/foo','/bar']])
222
223        urls = sets.Set()
224        rule.getRelativeUrlsToPurge(d, urls)
225        self.assertEqual(urls, purged_urls)
226
227        # test purge for a folder view
228        d = makeContent(self.folder, 'index_html', 'Document', 'My document')
229        doc_url = url_tool.getRelativeUrl(d)
230        purged_urls = sets.Set()
231        purged_urls.update([doc_url + url for url in ['','/','/view','/document_view','/foo','/bar']])
232        parent_url = url_tool.getRelativeUrl(d.getParentNode())
233        purged_urls.update([parent_url + url for url in ['','/','/view']])
234        urls = sets.Set()
235        rule.getRelativeUrlsToPurge(d, urls)
236        self.assertEqual(purged_urls, urls)
237
238        # test purge with a purge script
239        d = self.folder.doc
240        doc_url = url_tool.getRelativeUrl(d)
241        self.portal.manage_addProduct['PythonScripts'].manage_addPythonScript('test_script')
242        self.portal.test_script.ZPythonScript_edit('', 'return [context.portal_url.getRelativeUrl(context)+\'/foobar\']')
243        rule.setPurgeExpression('python:object.test_script()')
244        purged_urls = sets.Set()
245        purged_urls.update([doc_url + url for url in ['','/','/view','/document_view','/foo','/bar', '/foobar']])
246        urls = sets.Set()
247        rule.getRelativeUrlsToPurge(d, urls)
248        self.assertEqual(purged_urls, urls)
249
250def test_suite():
251    suite = unittest.TestSuite()
252    suite.addTest(unittest.makeSuite(TestContentRule))
253    return suite
Note: See TracBrowser for help on using the repository browser.