source: products/vendor/Products.CacheSetup/current/Products/CacheSetup/tests/test_conditional_get.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: 8.6 KB
Line 
1import unittest
2
3from base import CacheFuFunctionalTestCase
4
5from App.Common import rfc1123_date
6from Products.PythonScripts.standard import url_quote
7from Products.CMFCore.utils  import getToolByName
8import Products.CacheSetup.config as config
9from DateTime import DateTime
10
11# util for making content in a container
12def makeContent(container, id, portal_type, title=None):
13    container.invokeFactory(id=id, type_name=portal_type)
14    o = getattr(container, id)
15    if title is not None:
16        o.setTitle(title)
17    return o
18
19
20# This is the test case. You will have to add test_<methods> to your
21# class inorder to assert things about your Product.
22class CacheManagerTest(CacheFuFunctionalTestCase):
23    USER1 = 'user1'
24   
25    def afterSetUp(self):
26        CacheFuFunctionalTestCase.afterSetUp(self)
27       
28        # Add a couple of users
29        self.portal.acl_users._doAddUser('manager', 'secret', ['Manager'], [])
30        self.portal.acl_users._doAddUser(self.USER1, 'secret', ['Member'], [])
31        self.login('manager')
32
33        self.portal.portal_quickinstaller.installProducts(['CacheSetup'])
34
35        # We have added a skin so we need to rebuild the skin object
36        # (since the object is cached in the current request)
37        self._refreshSkinData()
38
39        pcs = self.portal.portal_cache_settings
40        pcs.setEnabled(True)
41
42        headers = pcs.getHeaderSets()
43        headers.manage_delObjects(headers.objectIds())
44        headers.invokeFactory(id='header_set', type_name='HeaderSet')
45        h = headers.header_set
46        h.setEtag(True)
47        h.setEnable304s(True)
48
49        rules = pcs.getRules()
50        rules.manage_delObjects(rules.objectIds())
51        rules.invokeFactory(id='rule', type_name='ContentCacheRule')
52        rule = rules.rule
53        rule.setHeaderSetIdAnon('header_set')
54        rule.setHeaderSetIdAuth('header_set')
55        rule.setContentTypes(['Document'])
56        rule.setEtagComponents(['expression'])
57        rule.setEtagExpression('string:my_etag')
58        rule.setEtagRequestValues([])
59        rule.setEtagTimeout(None)
60
61        getattr(self.portal, config.PAGE_CACHE_MANAGER_ID).disable()
62
63
64    def test_pt_304s(self):
65        self.folder.invokeFactory(id='ptdoc304', type_name='Document')
66        doc = self.folder.ptdoc304
67        ob_path = doc.absolute_url_path()
68
69        pcs = self.portal.portal_cache_settings
70        h = pcs.getHeaderSets().header_set
71        h.setEnable304s(True)
72        h.setPageCache(False)
73        rule = pcs.getRules().rule
74
75        mod_time = doc.modified().timeTime()
76
77        #etag = '|my_etag'
78        ## good etag, expired mod time
79        #response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag, 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time-3600)})
80        #self.assertEqual(response.status, 200)
81
82        # straight request should give 200
83        response = self.publish(ob_path)
84        self.assertEqual(response.status, 200)
85
86        # good etag
87        etag = response.headers.get('ETag')
88        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag})
89        self.assertEqual(response.status, 304)
90                               
91        # good etag, current mod time
92        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag, 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
93        self.assertEqual(response.status, 304)
94
95        # bad etag
96        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': 'foo'})
97        self.assertEqual(response.status, 200)
98
99        # good etag, expired mod time
100        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag, 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time-3600)})
101        self.assertEqual(response.status, 200)
102
103        # bad etag, current mod time
104        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': 'foo', 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
105        self.assertEqual(response.status, 200)
106
107        # no etag, current mod time
108        response = self.publish(ob_path, env={'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
109        self.assertEqual(response.status, 200)
110
111        h.setEtag(False)
112
113        # current mod time, content etag not available
114        response = self.publish(ob_path, env={'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
115        self.assertEqual(response.status, 304)
116
117        # expired mod time, content etag not available
118        response = self.publish(ob_path, env={'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time-3600)})
119        self.assertEqual(response.status, 200)
120
121        # good etag, current mod time, content etag not available
122        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag, 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
123        self.assertEqual(response.status, 200)
124
125        # bad etag, current mod time, content etag not available
126        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': 'foo', 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
127        self.assertEqual(response.status, 200)
128
129        # good etag, expired  mod time, content etag not available
130        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag, 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time-3600)})
131        self.assertEqual(response.status, 200)
132
133        h.setEnable304s(False)
134        # 304s disabled
135        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag})
136        self.assertEqual(response.status, 200)
137
138        # 304s disabled
139        mod_time = doc.modified().timeTime()
140        response = self.publish(ob_path, env={'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
141        self.assertEqual(response.status, 200)
142       
143
144    def test_pagecache_304s(self):
145        getattr(self.portal, config.PAGE_CACHE_MANAGER_ID).enable()
146        self.folder.invokeFactory(id='pcdoc304', type_name='Document')
147        doc = self.folder.pcdoc304
148        mod_time = doc.modified().timeTime()
149        ob_path = doc.absolute_url_path()
150
151        pcs = self.portal.portal_cache_settings
152        h = pcs.getHeaderSets().header_set
153        h.setEnable304s(True)
154        h.setPageCache(True)
155        rule = pcs.getRules().rule
156       
157        # straight request should give 200
158        response = self.publish(ob_path)
159        response = self.publish(ob_path) # 2nd time so we are associated with the cache
160        self.assertEqual(response.status, 200)
161        self.assertEqual(response.getHeader('x-pagecache'), 'MISS')
162        response = self.publish(ob_path)
163        self.assertEqual(response.status, 200)
164        self.assertEqual(response.getHeader('x-pagecache'), 'HIT')
165
166        # correct etag - 304
167        etag = response.headers.get('ETag')
168        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag})
169        self.assertEqual(response.status, 304)
170        self.assertEqual(response.getHeader('x-pagecache'), None)
171                               
172        # bad etag - 200
173        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': 'foo'})
174        self.assertEqual(response.status, 200)
175        self.assertEqual(response.getHeader('x-pagecache'), 'HIT')
176
177        # correct etag, 304s disabled - 200
178        h.setEnable304s(False)
179        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag})
180        self.assertEqual(response.status, 200)
181        self.assertEqual(response.getHeader('x-pagecache'), 'HIT')
182
183        h.setEnable304s(True)
184
185        # correct etag, current mod time - 304
186        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag, 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
187        self.assertEqual(response.status, 304)
188
189        # bad etag
190        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': 'foo'})
191        self.assertEqual(response.status, 200)
192
193        # good etag, expired mod time
194        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': etag, 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time-3600)})
195        self.assertEqual(response.status, 200)
196
197        # bad etag, current mod time
198        response = self.publish(ob_path, env={'HTTP_IF_NONE_MATCH': 'foo', 'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
199        self.assertEqual(response.status, 200)
200
201        # no etag, current mod time
202        response = self.publish(ob_path, env={'HTTP_IF_MODIFIED_SINCE': rfc1123_date(mod_time+3600)})
203        self.assertEqual(response.status, 200)
204
205        getattr(self.portal, config.PAGE_CACHE_MANAGER_ID).disable()
206        # correct etag, cache disabled
207        response = self.publish(ob_path)
208        self.assertEqual(response.status, 200)
209        self.assertEqual(response.getHeader('x-pagecache'), 'OFF')
210
211def test_suite():
212    suite = unittest.TestSuite()
213    suite.addTest(unittest.makeSuite(CacheManagerTest))
214    return suite
Note: See TracBrowser for help on using the repository browser.