source: products/quintagroup.plonegooglesitemaps/branches/test_refactoring/quintagroup/plonegooglesitemaps/tests/testGoogleSitemaps.py @ 2529

Last change on this file since 2529 was 2527, checked in by mylan, 14 years ago

#206: Split single testqPloneGoogleSitemaps module into several specific one

  • Property svn:eol-style set to native
File size: 12.5 KB
Line 
1#
2# Tests for quintagroup.plonegooglesitemaps
3#
4
5from base import *
6from cgi import FieldStorage
7from tempfile import TemporaryFile, NamedTemporaryFile
8
9from OFS.Image import cookId
10from Products.CMFPlone.utils import _createObjectByType
11from ZPublisher.HTTPRequest import FileUpload
12
13
14def prepareUploadFile(prefix=""):
15    """ Helper function for prerare file to uploading """
16    fp = NamedTemporaryFile(mode='w+', prefix=prefix)
17    fp.write("google-site-verification: " + fp.name)
18    fp.seek(0,2)
19    fsize = fp.tell()
20    fp.seek(0)
21
22    env = {'REQUEST_METHOD':'PUT'}
23    headers = {'content-type':'text/plain',
24               'content-length': fsize,
25               'content-disposition':'attachment; filename=%s' % fp.name}
26    fs = FieldStorage(fp=fp, environ=env, headers=headers)
27    return FileUpload(fs), fp
28
29
30class TestGoogleSitemaps(FunctionalTestCase):
31
32    def afterSetUp(self):
33        super(TestGoogleSitemaps, self).afterSetUp()
34
35        self.workflow = self.portal.portal_workflow
36        self.auth = 'admin:admin'
37        _createObjectByType('Sitemap', self.portal, id='google-sitemaps')
38        self.sitemapUrl = '/'+self.portal.absolute_url(1) + '/google-sitemaps'
39        self.portal.portal_membership.addMember('admin', 'admin', ('Manager',), [])
40        self.gsm_props = self.portal.portal_properties['googlesitemap_properties']
41
42        # Add testing document to portal
43        my_doc = self.portal.invokeFactory('Document', id='my_doc')
44        self.my_doc = self.portal['my_doc']
45        self.my_doc.edit(text_format='plain', text='hello world')
46
47
48    def testSitemap(self):
49        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
50        parsed_sitemap = parse(sitemap)
51        start = parsed_sitemap['start']
52        data = parsed_sitemap['data']
53        self.assert_('urlset' in start.keys())
54        self.assertFalse(self.my_doc.absolute_url(0) in data,
55                         'Wrong content present in the sitemap')
56
57        self.workflow.doActionFor(self.my_doc, 'publish')
58
59        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
60        parsed_sitemap = parse(sitemap)
61        start = parsed_sitemap['start']
62        data = parsed_sitemap['data']
63        self.assertEqual(len(start.keys()), 4)
64        self.assert_('urlset' in start.keys())
65        self.assert_('url' in start.keys())
66        self.assert_('loc' in start.keys())
67        self.assert_('lastmod' in start.keys())
68
69        self.assertTrue(self.my_doc.absolute_url(0) in data, 'Incorect url')
70
71    def testVerificationFileCreation(self):
72        fp, fname = None, None
73        try:
74            fupload, fp = prepareUploadFile()
75            fname, ftitle = cookId('', '', fupload)
76            self.portal.REQUEST.form['verification_file'] = fupload
77            self.portal.gsm_create_verify_file()
78        finally:
79            if fp: fp.close()
80        vf_created = hasattr(self.portal, fname)
81        self.assert_(vf_created, 'Verification file not created')
82
83    def testVerificationForm(self):
84        verifyConfigUrl = '/'+self.portal.absolute_url(1) + '/prefs_gsm_verification'
85        verif_config = self.publish(verifyConfigUrl, self.auth).getBody()
86        rexp_input_acitve = re.compile('<input\s+name="verification_file"\s+([^>]*)>', re.I|re.S)
87        rexp_button_acitve = re.compile('<input\s+name="form.button.CreateFile"\s+([^>]*)>', re.I|re.S)
88        rexp_delete_button = re.compile('<input\s+name="form.button.DeleteFile"\s+[^>]*>', re.I|re.S)
89
90        input_acitve = rexp_input_acitve.search(verif_config)
91        button_acitve = rexp_button_acitve.search(verif_config)
92        delete_button = rexp_delete_button.match(verif_config)
93
94        self.assert_(input_acitve and not 'disabled' in input_acitve.groups(1))
95        self.assert_(button_acitve and not 'disabled' in button_acitve.groups(1))
96        self.assert_(not delete_button)
97
98        fp, fname = None, None
99        try:
100            fupload, fp = prepareUploadFile()
101            fname, ftitle = cookId('', '', fupload)
102            self.portal.REQUEST.form['verification_file'] = fupload
103            self.portal.gsm_create_verify_file()
104        finally:
105            if fp: fp.close()
106
107        input_acitve = rexp_input_acitve.search(verif_config)
108        button_acitve = rexp_button_acitve.search(verif_config)
109        delete_button = rexp_delete_button.match(verif_config)
110
111        verif_config = self.publish(verifyConfigUrl, self.auth).getBody()
112        self.assert_(input_acitve and not 'disabled' in input_acitve.groups(1))
113        self.assert_(not delete_button)
114
115    def testMultiplyVerificationFiles(self):
116        verifyConfigUrl = '/'+self.portal.absolute_url(1) + '/prefs_gsm_verification'
117        fnames = []
118        for i in [1,2]:
119            fp, fname, response = None, None, None
120            try:
121                fupload, fp = prepareUploadFile(prefix=str(i))
122                fname, ftitle = cookId('', '', fupload)
123                form = {'form.button.CreateFile': 'Create verification file',
124                        'form.submitted': 1}
125                extra_update = {'verification_file': fupload}
126                response = self.publish(verifyConfigUrl, request_method='POST',
127                                        stdin=StringIO(urlencode(form)),
128                                        basic=self.auth, extra=extra_update)
129            finally:
130                if fp: fp.close()
131           
132            self.assertEqual(response.getStatus(), 200)
133            self.assert_(fname in self.gsm_props.getProperty('verification_filenames',[]),
134                             self.gsm_props.getProperty('verification_filenames',[]))
135            fnames.append(fname)
136
137        self.assertEqual(len([1 for vf in fnames \
138            if vf in self.gsm_props.getProperty('verification_filenames',[])]), 2,
139            self.gsm_props.getProperty('verification_filenames',[]))
140
141
142class TestSettings(FunctionalTestCase):
143
144    def afterSetUp(self):
145        super(TestSettings, self).afterSetUp()
146
147        self.workflow = self.portal.portal_workflow
148        self.gsm_props = self.portal.portal_properties['googlesitemap_properties']
149        self.auth = 'admin:admin'
150        self.contentSM = _createObjectByType('Sitemap', self.portal, id='google-sitemaps')
151
152        self.sitemapUrl = '/'+self.portal.absolute_url(1) + '/google-sitemaps'
153
154        self.portal.portal_membership.addMember('admin', 'admin', ('Manager',), [])
155
156        # Add testing document to portal
157        my_doc = self.portal.invokeFactory('Document', id='my_doc')
158        self.my_doc = self.portal['my_doc']
159        self.my_doc.edit(text_format='plain', text='hello world')
160        self.my_doc_url = self.my_doc.absolute_url()
161
162    def testMetaTypeToDig(self):
163        self.workflow.doActionFor(self.my_doc, 'publish')
164        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
165        self.assert_(hasURL(sitemap, self.my_doc_url))
166
167        self.contentSM.setPortalTypes([])
168
169        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
170        self.assert_(not hasURL(sitemap, self.my_doc_url))
171
172        self.contentSM.setPortalTypes(['Document'])
173
174        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
175        self.assert_(hasURL(sitemap, self.my_doc_url))
176
177    def testStates(self):
178        self.workflow.doActionFor(self.my_doc, 'publish')
179        self.contentSM.setStates(['visible'])
180
181        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
182        self.assert_(not hasURL(sitemap, self.my_doc_url))
183
184        self.contentSM.setStates(['published'])
185
186        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
187        self.assert_(hasURL(sitemap, self.my_doc_url))
188
189    def test_blackout_entries(self):
190        self.workflow.doActionFor(self.my_doc, 'publish')
191        self.contentSM.setBlackout_list((self.my_doc.getId(),))
192
193        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
194        self.assert_(not hasURL(sitemap, self.my_doc_url))
195
196        self.contentSM.setBlackout_list([])
197        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
198        self.assert_(hasURL(sitemap, self.my_doc_url))
199
200    def test_regexp(self):
201        self.workflow.doActionFor(self.my_doc, 'publish')
202        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
203        self.assert_(not hasURL(sitemap, self.portal.absolute_url()))
204
205        regexp = "s/\/%s//"%self.my_doc.getId()
206        self.contentSM.setReg_exp([regexp])
207
208        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
209        self.assert_(hasURL(sitemap, self.portal.absolute_url()))
210
211    def test_add_urls(self):
212        self.contentSM.setUrls(['http://w1', 'w2', '/w3'])
213        w1_url = 'http://w1'
214        w2_url = self.portal.absolute_url() + '/w2'
215        w3_url = self.portal.getPhysicalRoot().absolute_url() + '/w3'
216        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
217
218        self.assert_(hasURL(sitemap, w1_url))
219        self.assert_(hasURL(sitemap, w2_url))
220        self.assert_(hasURL(sitemap, w3_url))
221
222
223class TestPinging(FunctionalTestCase):
224
225    def afterSetUp(self):
226        super(TestPinging, self).afterSetUp()
227
228        self.workflow = self.portal.portal_workflow
229        self.workflow.setChainForPortalTypes(pt_names=('News Item','Document'),
230                                             chain="simple_publication_workflow")
231        self.gsm_props = self.portal.portal_properties['googlesitemap_properties']
232        self.auth = 'admin:admin'
233        self.portal.portal_membership.addMember('admin', 'admin', ('Manager',), [])
234        # Add sitemaps
235        self.contentSM = _createObjectByType('Sitemap', self.portal, id='google-sitemaps')
236        self.contentSM.setPingTransitions(('simple_publication_workflow#publish',))
237        self.newsSM = _createObjectByType('Sitemap', self.portal, id='news-sitemaps')
238        self.newsSM.setPortalTypes(('News Item','Document'))
239        self.newsSM.setPingTransitions(('simple_publication_workflow#publish',))
240        self.sitemapUrl = '/'+self.portal.absolute_url(1) + '/google-sitemaps'
241        # Add testing document to portal
242        my_doc = self.portal.invokeFactory('Document', id='my_doc')
243        self.my_doc = self.portal['my_doc']
244        my_news = self.portal.invokeFactory('News Item', id='my_news')
245        self.my_news = self.portal['my_news']
246
247    def testAutomatePinging(self):
248        # 1. Check for pinging both sitemaps
249        back_out, myout = sys.stdout, StringIO()
250        sys.stdout = myout
251        try:
252            self.workflow.doActionFor(self.my_doc, 'publish')
253            myout.seek(0)
254            data = myout.read()
255        finally:
256            sys.stdout = back_out
257
258        self.assert_('Pinged %s sitemap to Google' % self.contentSM.absolute_url() in data,
259                     "Not pinged %s: '%s'" % (self.contentSM.id, data))
260        self.assert_('Pinged %s sitemap to Google' % self.newsSM.absolute_url() in data,
261                     "Not pinged %s: '%s'" % (self.newsSM.id, data))
262
263        # 2. Check for pinging only news-sitemap sitemaps
264        back_out, myout = sys.stdout, StringIO()
265        sys.stdout = myout
266        try:
267            self.workflow.doActionFor(self.my_news, 'publish')
268            myout.seek(0)
269            data = myout.read()
270        finally:
271            sys.stdout = back_out
272
273        self.assert_('Pinged %s sitemap to Google' % self.newsSM.absolute_url() in data,
274                     "Not pinged %s: '%s'" % (self.newsSM.id, data))
275        self.assert_(not 'Pinged %s sitemap to Google' % self.contentSM.absolute_url() in data,
276                     "Pinged %s on news: '%s'" % (self.contentSM.id, data))
277
278    def testPingingWithSetupForm(self):
279        # Ping news and content sitemaps
280        formUrl = '/'+self.portal.absolute_url(1) + '/prefs_gsm_settings'
281        qs = 'smselected:list=%s&smselected:list=%s&form.button.Ping=1&form.submitted=1' % \
282             (self.contentSM.id, self.newsSM.id)
283
284        back_out, myout = sys.stdout, StringIO()
285        sys.stdout = myout
286        try:
287            response = self.publish("%s?%s" % (formUrl, qs), basic=self.auth)
288            myout.seek(0)
289            data = myout.read()
290        finally:
291            sys.stdout = back_out
292
293        self.assert_('Pinged %s sitemap to Google' % self.contentSM.absolute_url() in data,
294                     "Not pinged %s: '%s'" % (self.contentSM.id, data))
295        self.assert_('Pinged %s sitemap to Google' % self.newsSM.absolute_url() in data,
296                     "Not pinged %s: '%s'" % (self.newsSM.id, data))
297
298
299
300def test_suite():
301    from unittest import TestSuite, makeSuite
302    suite = TestSuite()
303    suite.addTest(makeSuite(TestGoogleSitemaps))
304    return suite
305
306if __name__ == '__main__':
307    unittest.main(defaultTest='test_suite')
308#    framework()
Note: See TracBrowser for help on using the repository browser.