source: products/quintagroup.plonegooglesitemaps/trunk/quintagroup/plonegooglesitemaps/tests/testqPloneGoogleSitemaps.py @ 2409

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

#131: Added tests for registration/ungregistration news-sitemap related ISchemaExtender adapter for 'News Items' portal type

  • Property svn:eol-style set to native
File size: 16.9 KB
Line 
1#
2# Tests for quintagroup.plonegooglesitemaps
3#
4
5from base import *
6from zope.component import getSiteManager
7from archetypes.schemaextender.interfaces import ISchemaExtender
8from Products.CMFPlone.utils import _createObjectByType
9
10class TestGoogleSitemapsInstallation(TestCase):
11
12    def testType(self):
13        pt = self.portal.portal_types
14        self.assert_('Sitemap' in pt.objectIds(), 
15            'No "Sitemap" type after installation')
16        #Test views
17        views = pt.getTypeInfo('Sitemap').view_methods
18        self.assert_('sitemap.xml' in views, 
19            'No "sitemap.xml" view for Sitemap type')
20        self.assert_('mobile-sitemap.xml' in views, 
21            'No "mobile-sitemap.xml" view for Sitemap type')
22        self.assert_('news-sitemap.xml' in views, 
23            'No "news-sitemap.xml" view for Sitemap type')
24
25    def testGSMProperties(self):
26        pp = self.portal.portal_properties
27
28        # Test types_not_searched
29        self.assert_("Sitemap" in pp['site_properties'].getProperty('types_not_searched'), 
30            'No "Sitemap" added to types not searched on installation')
31        # Test metaTypesNotToList
32        self.assert_("Sitemap" in pp['navtree_properties'].getProperty('metaTypesNotToList'), 
33            'No "Sitemap" added to types not to list on installation')
34
35        # Test 'googlesitemap_properties'
36        self.assert_('googlesitemap_properties' in pp.objectIds(), 
37            'No "googlesitemap_properties" after installation')
38        qsmprops = pp['googlesitemap_properties']
39        self.assert_(qsmprops.hasProperty('verification_filenames'),
40            'No "verification_filenames" property added on installation')
41
42    def testSkins(self):
43        ps = self.portal.portal_skins
44        self.assert_('plonegooglesitemaps' in ps.objectIds(), 
45            'No "plonegooglesitemaps" skin layer in portal_skins')
46        self.assert_('plonegooglesitemaps' in ps.getSkinPath(ps.getDefaultSkin()),
47            'No "plonegooglesitemaps" skin layer in default skin')
48
49    def testConfiglet(self):
50        cp = self.portal.portal_controlpanel
51        self.assert_([1 for ai in cp.listActionInfos() if ai['id']=='GoogleSitemaps'], 
52            'No "GoogleSitemaps" configlet added to plone control panel')
53
54    def testNewsSchemaExtenderRegistered(self):
55        lsm = getSiteManager(self.portal)
56        news = self.portal.invokeFactory("News Item", id="test_news")
57        news = getattr(self.portal, "test_news")
58        self.assertNotEqual(lsm.queryAdapter(news, interface=ISchemaExtender), None)
59
60
61class TestGoogleSitemapsUninstallation(TestCase):
62
63    def afterSetUp(self):
64        self.loginAsPortalOwner()
65        qi = self.portal.portal_quickinstaller
66        qi.uninstallProducts(products=['quintagroup.plonegooglesitemaps',])
67        self._refreshSkinData()
68
69    def testNewsSchemaExtenderUnregistered(self):
70        lsm = getSiteManager(self.portal)
71        news = self.portal.invokeFactory("News Item", id="test_news")
72        news = getattr(self.portal, "test_news")
73        self.assertEqual(lsm.queryAdapter(news, interface=ISchemaExtender), None)
74
75
76class TestSitemapType(FunctionalTestCase):
77
78    def afterSetUp(self):
79        super(TestSitemapType, self).afterSetUp()
80        self.auth = 'admin:admin'
81        self.contentSM = _createObjectByType('Sitemap', self.portal, id='google-sitemaps')
82        self.portal.portal_membership.addMember('admin', 'admin', ('Manager',), [])
83
84    def testFields(self):
85        field_ids = map(lambda x:x.getName(), self.contentSM.Schema().fields())
86        # test old Sitemap settings fields
87        self.assert_('id' in field_ids)
88        self.assert_('portalTypes' in field_ids)
89        self.assert_('states' in field_ids)
90        self.assert_('blackout_list' in field_ids)
91        self.assert_('urls' in field_ids)
92        self.assert_('pingTransitions' in field_ids)
93        # test new sitemap type field
94        self.assert_('sitemapType' in field_ids)
95
96    def testSitemapTypes(self):
97        sitemap_types = self.contentSM.getField('sitemapType').Vocabulary().keys()
98        self.assert_('content' in sitemap_types)
99        self.assert_('mobile' in sitemap_types)
100        self.assert_('news' in sitemap_types)
101
102    def testAutoSetLayout(self):
103        response = self.publish('/%s/createObject?type_name=Sitemap' % \
104                                self.portal.absolute_url(1), basic=self.auth)
105        location = response.getHeader('location')
106        newurl = location[location.find('/'+self.portal.absolute_url(1)):]
107
108        msm_id = 'mobile_sitemap'
109        form = {'id': msm_id,
110                'sitemapType':'mobile',
111                'portalTypes':['Document',],
112                'states':['published'],
113                'form_submit':'Save',
114                'form.submitted':1,
115                }
116        post_data = StringIO(urlencode(form))
117        response = self.publish(newurl, request_method='POST', stdin=post_data, basic=self.auth)
118        msitemap = getattr(self.portal, msm_id)
119
120        self.assertEqual(msitemap.defaultView(), 'mobile-sitemap.xml')
121
122    def txestPingSetting(self):
123        pwf = self.portal.portal_workflow['plone_workflow']
124        self.assertEqual(self.contentSM.getPingTransitions(), ())
125
126        self.contentSM.setPingTransitions(('plone_workflow#publish',))
127        self.assertEqual(self.contentSM.getPingTransitions(), ('plone_workflow#publish',))
128        self.assert_(ping_googlesitemap in pwf.scripts.keys(),"Not add wf script")
129
130
131class TestGoogleSitemaps(FunctionalTestCase):
132
133    def afterSetUp(self):
134        super(TestGoogleSitemaps, self).afterSetUp()
135
136        self.workflow = self.portal.portal_workflow
137        self.auth = 'admin:admin'
138        _createObjectByType('Sitemap', self.portal, id='google-sitemaps')
139        self.sitemapUrl = '/'+self.portal.absolute_url(1) + '/google-sitemaps'
140        self.portal.portal_membership.addMember('admin', 'admin', ('Manager',), [])
141        self.gsm_props = self.portal.portal_properties['googlesitemap_properties']
142
143        # Add testing document to portal
144        my_doc = self.portal.invokeFactory('Document', id='my_doc')
145        self.my_doc = self.portal['my_doc']
146        self.my_doc.edit(text_format='plain', text='hello world')
147
148
149    def testSitemap(self):
150        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
151        parsed_sitemap = parse(sitemap)
152        start = parsed_sitemap['start']
153        data = parsed_sitemap['data']
154        self.assert_('urlset' in start.keys())
155        self.assertFalse(self.my_doc.absolute_url(0) in data,
156                         'Wrong content present in the sitemap')
157
158        self.workflow.doActionFor(self.my_doc, 'publish')
159
160        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
161        parsed_sitemap = parse(sitemap)
162        start = parsed_sitemap['start']
163        data = parsed_sitemap['data']
164        self.assertEqual(len(start.keys()), 4)
165        self.assert_('urlset' in start.keys())
166        self.assert_('url' in start.keys())
167        self.assert_('loc' in start.keys())
168        self.assert_('lastmod' in start.keys())
169
170        self.assertTrue(self.my_doc.absolute_url(0) in data, 'Incorect url')
171
172    def testVerificationFileCreation(self):
173        self.portal.gsm_create_verify_file('verif_file')
174
175        vf_created = hasattr(self.portal, 'verif_file')
176        self.assert_(vf_created, 'Verification file not created')
177
178    def testVerificationForm(self):
179        verifyConfigUrl = '/'+self.portal.absolute_url(1) + '/prefs_gsm_verification'
180        verif_config = self.publish(verifyConfigUrl, self.auth).getBody()
181        rexp_input_acitve = re.compile('<input\s+name="verify_filename"\s+([^>]*)>', re.I|re.S)
182        rexp_button_acitve = re.compile('<input\s+name="form.button.CreateFile"\s+([^>]*)>', re.I|re.S)
183        rexp_delete_button = re.compile('<input\s+name="form.button.DeleteFile"\s+[^>]*>', re.I|re.S)
184
185        input_acitve = rexp_input_acitve.search(verif_config)
186        button_acitve = rexp_button_acitve.search(verif_config)
187        delete_button = rexp_delete_button.match(verif_config)
188
189        self.assert_(input_acitve and not 'disabled' in input_acitve.groups(1))
190        self.assert_(button_acitve and not 'disabled' in button_acitve.groups(1))
191        self.assert_(not delete_button)
192
193        self.portal.gsm_create_verify_file('verif_file')
194
195        input_acitve = rexp_input_acitve.search(verif_config)
196        button_acitve = rexp_button_acitve.search(verif_config)
197        delete_button = rexp_delete_button.match(verif_config)
198
199        verif_config = self.publish(verifyConfigUrl, self.auth).getBody()
200        self.assert_(input_acitve and not 'disabled' in input_acitve.groups(1))
201        self.assert_(not delete_button)
202
203    def testMultiplyVerificationFiles(self):
204        verifyConfigUrl = '/'+self.portal.absolute_url(1) + '/prefs_gsm_verification'
205
206        form = {'verify_filename':'verif_file_1',
207                'form.button.CreateFile': 'Create verification file',
208                'form.submitted':1}
209        post_data = StringIO(urlencode(form))
210        response = self.publish(verifyConfigUrl, request_method='POST',
211                                stdin=post_data, basic=self.auth)
212        self.assertEqual(response.getStatus(), 200)
213        self.assert_('verif_file_1' in self.gsm_props.getProperty('verification_filenames',[]),
214                     self.gsm_props.getProperty('verification_filenames',[]))
215
216        form = {'verify_filename':'verif_file_2',
217                'form.button.CreateFile': 'Create verification file',
218                'form.submitted':1}
219        post_data = StringIO(urlencode(form))
220        response = self.publish(verifyConfigUrl, request_method='POST',
221                                stdin=post_data, basic=self.auth)
222        self.assertEqual(response.getStatus(), 200)
223        self.assert_([1 for vf in ['verif_file','verif_file_2'] \
224                      if vf in self.gsm_props.getProperty('verification_filenames',[])],
225                     self.gsm_props.getProperty('verification_filenames',[]))
226
227
228class TestSettings(FunctionalTestCase):
229
230    def afterSetUp(self):
231        super(TestSettings, self).afterSetUp()
232
233        self.workflow = self.portal.portal_workflow
234        self.gsm_props = self.portal.portal_properties['googlesitemap_properties']
235        self.auth = 'admin:admin'
236        self.contentSM = _createObjectByType('Sitemap', self.portal, id='google-sitemaps')
237
238        self.sitemapUrl = '/'+self.portal.absolute_url(1) + '/google-sitemaps'
239
240        self.portal.portal_membership.addMember('admin', 'admin', ('Manager',), [])
241
242        # Add testing document to portal
243        my_doc = self.portal.invokeFactory('Document', id='my_doc')
244        self.my_doc = self.portal['my_doc']
245        self.my_doc.edit(text_format='plain', text='hello world')
246        self.my_doc_url = self.my_doc.absolute_url()
247
248    def testMetaTypeToDig(self):
249        self.workflow.doActionFor(self.my_doc, 'publish')
250        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
251        self.assert_(hasURL(sitemap, self.my_doc_url))
252
253        self.contentSM.setPortalTypes([])
254
255        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
256        self.assert_(not hasURL(sitemap, self.my_doc_url))
257
258        self.contentSM.setPortalTypes(['Document'])
259
260        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
261        self.assert_(hasURL(sitemap, self.my_doc_url))
262
263    def testStates(self):
264        self.workflow.doActionFor(self.my_doc, 'publish')
265        self.contentSM.setStates(['visible'])
266
267        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
268        self.assert_(not hasURL(sitemap, self.my_doc_url))
269
270        self.contentSM.setStates(['published'])
271
272        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
273        self.assert_(hasURL(sitemap, self.my_doc_url))
274
275    def test_blackout_entries(self):
276        self.workflow.doActionFor(self.my_doc, 'publish')
277        self.contentSM.setBlackout_list((self.my_doc.getId(),))
278
279        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
280        self.assert_(not hasURL(sitemap, self.my_doc_url))
281
282        self.contentSM.setBlackout_list([])
283        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
284        self.assert_(hasURL(sitemap, self.my_doc_url))
285
286    def test_regexp(self):
287        self.workflow.doActionFor(self.my_doc, 'publish')
288        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
289        self.assert_(not hasURL(sitemap, self.portal.absolute_url()))
290
291        regexp = "s/\/%s//"%self.my_doc.getId()
292        self.contentSM.setReg_exp([regexp])
293
294        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
295        self.assert_(hasURL(sitemap, self.portal.absolute_url()))
296
297    def test_add_urls(self):
298        self.contentSM.setUrls(['http://w1', 'w2', '/w3'])
299        w1_url = 'http://w1'
300        w2_url = self.portal.absolute_url() + '/w2'
301        w3_url = self.portal.getPhysicalRoot().absolute_url() + '/w3'
302        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
303
304        self.assert_(hasURL(sitemap, w1_url))
305        self.assert_(hasURL(sitemap, w2_url))
306        self.assert_(hasURL(sitemap, w3_url))
307
308
309class TestPinging(FunctionalTestCase):
310
311    def afterSetUp(self):
312        super(TestPinging, self).afterSetUp()
313
314        self.workflow = self.portal.portal_workflow
315        self.workflow.setChainForPortalTypes(pt_names=('News Item','Document'),
316                                             chain="simple_publication_workflow")
317        self.gsm_props = self.portal.portal_properties['googlesitemap_properties']
318        self.auth = 'admin:admin'
319        self.portal.portal_membership.addMember('admin', 'admin', ('Manager',), [])
320        # Add sitemaps
321        self.contentSM = _createObjectByType('Sitemap', self.portal, id='google-sitemaps')
322        self.contentSM.setPingTransitions(('simple_publication_workflow#publish',))
323        self.newsSM = _createObjectByType('Sitemap', self.portal, id='news-sitemaps')
324        self.newsSM.setPortalTypes(('News Item','Document'))
325        self.newsSM.setPingTransitions(('simple_publication_workflow#publish',))
326        self.sitemapUrl = '/'+self.portal.absolute_url(1) + '/google-sitemaps'
327        # Add testing document to portal
328        my_doc = self.portal.invokeFactory('Document', id='my_doc')
329        self.my_doc = self.portal['my_doc']
330        my_news = self.portal.invokeFactory('News Item', id='my_news')
331        self.my_news = self.portal['my_news']
332
333    def testAutomatePinging(self):
334        # 1. Check for pinging both sitemaps
335        back_out, myout = sys.stdout, StringIO()
336        sys.stdout = myout
337        try:
338            self.workflow.doActionFor(self.my_doc, 'publish')
339            myout.seek(0)
340            data = myout.read()
341        finally:
342            sys.stdout = back_out
343
344        self.assert_('Pinged %s sitemap to Google' % self.contentSM.absolute_url() in data,
345                     "Not pinged %s: '%s'" % (self.contentSM.id, data))
346        self.assert_('Pinged %s sitemap to Google' % self.newsSM.absolute_url() in data,
347                     "Not pinged %s: '%s'" % (self.newsSM.id, data))
348
349        # 2. Check for pinging only news-sitemap sitemaps
350        back_out, myout = sys.stdout, StringIO()
351        sys.stdout = myout
352        try:
353            self.workflow.doActionFor(self.my_news, 'publish')
354            myout.seek(0)
355            data = myout.read()
356        finally:
357            sys.stdout = back_out
358
359        self.assert_('Pinged %s sitemap to Google' % self.newsSM.absolute_url() in data,
360                     "Not pinged %s: '%s'" % (self.newsSM.id, data))
361        self.assert_(not 'Pinged %s sitemap to Google' % self.contentSM.absolute_url() in data,
362                     "Pinged %s on news: '%s'" % (self.contentSM.id, data))
363
364    def testPingingWithSetupForm(self):
365        # Ping news and content sitemaps
366        formUrl = '/'+self.portal.absolute_url(1) + '/prefs_gsm_settings'
367        qs = 'smselected:list=%s&smselected:list=%s&form.button.Ping=1&form.submitted=1' % \
368             (self.contentSM.id, self.newsSM.id)
369
370        back_out, myout = sys.stdout, StringIO()
371        sys.stdout = myout
372        try:
373            response = self.publish("%s?%s" % (formUrl, qs), basic=self.auth)
374            myout.seek(0)
375            data = myout.read()
376        finally:
377            sys.stdout = back_out
378
379        self.assert_('Pinged %s sitemap to Google' % self.contentSM.absolute_url() in data,
380                     "Not pinged %s: '%s'" % (self.contentSM.id, data))
381        self.assert_('Pinged %s sitemap to Google' % self.newsSM.absolute_url() in data,
382                     "Not pinged %s: '%s'" % (self.newsSM.id, data))
383
384
385
386def test_suite():
387    from unittest import TestSuite, makeSuite
388    suite = TestSuite()
389    suite.addTest(makeSuite(TestGoogleSitemapsInstallation))
390    suite.addTest(makeSuite(TestGoogleSitemapsUninstallation))
391    suite.addTest(makeSuite(TestSitemapType))
392    suite.addTest(makeSuite(TestGoogleSitemaps))
393    suite.addTest(makeSuite(TestSettings))
394    suite.addTest(makeSuite(TestPinging))
395    return suite
396
397if __name__ == '__main__':
398    unittest.main(defaultTest='test_suite')
399#    framework()
Note: See TracBrowser for help on using the repository browser.