source: products/quintagroup.plonegooglesitemaps/trunk/quintagroup/plonegooglesitemaps/tests/testGoogleSitemaps.py @ 3510

Last change on this file since 3510 was 3510, checked in by potar, 8 years ago

Merged sitemap_date branch into trunk

  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1#
2# Tests for quintagroup.plonegooglesitemaps
3#
4
5from quintagroup.plonegooglesitemaps.tests.base import FunctionalTestCase
6from quintagroup.plonegooglesitemaps.tests.XMLParser import parse
7from StringIO import StringIO
8from urllib import urlencode
9import re
10import unittest
11
12from cgi import FieldStorage
13from tempfile import NamedTemporaryFile
14
15from OFS.Image import cookId
16from Products.CMFPlone.utils import _createObjectByType
17from ZPublisher.HTTPRequest import FileUpload
18
19
20def prepareUploadFile(prefix=""):
21    """ Helper function for prerare file to uploading """
22    fp = NamedTemporaryFile(mode='w+', prefix=prefix)
23    fp.write("google-site-verification: " + fp.name)
24    fp.seek(0, 2)
25    fsize = fp.tell()
26    fp.seek(0)
27
28    env = {'REQUEST_METHOD': 'PUT'}
29    headers = {'content-type': 'text/plain',
30               'content-length': fsize,
31               'content-disposition': 'attachment; filename=%s' % fp.name}
32    fs = FieldStorage(fp=fp, environ=env, headers=headers)
33    return FileUpload(fs), fp
34
35
36class TestGoogleSitemaps(FunctionalTestCase):
37
38    def afterSetUp(self):
39        super(TestGoogleSitemaps, self).afterSetUp()
40
41        _createObjectByType('Sitemap', self.portal, id='google-sitemaps')
42        self.sitemapUrl = '/' + self.portal.absolute_url(1) + \
43                          '/google-sitemaps'
44        gsm_properties = 'googlesitemap_properties'
45        self.gsm_props = self.portal.portal_properties[gsm_properties]
46
47        # Add testing document to portal
48        self.my_doc = _createObjectByType('Document', self.portal, id='my_doc')
49        self.my_doc.edit(text_format='plain', text='hello world')
50
51    def testSitemap(self):
52        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
53        parsed_sitemap = parse(sitemap)
54        start = parsed_sitemap['start']
55        data = parsed_sitemap['data']
56        self.assert_('urlset' in start.keys())
57        self.assertFalse(self.my_doc.absolute_url(0) in data,
58                         'Wrong content present in the sitemap')
59
60        self.workflow.doActionFor(self.my_doc, 'publish')
61
62        sitemap = self.publish(self.sitemapUrl, self.auth).getBody()
63        parsed_sitemap = parse(sitemap)
64        start = parsed_sitemap['start']
65        data = parsed_sitemap['data']
66        self.assertEqual(len(start.keys()), 4)
67        self.assert_('urlset' in start.keys())
68        self.assert_('url' in start.keys())
69        self.assert_('loc' in start.keys())
70        self.assert_('lastmod' in start.keys())
71
72        self.assertTrue(self.my_doc.absolute_url(0) in data, 'Incorect url')
73
74    def testVerificationFileCreation(self):
75        fp, fname = None, None
76        try:
77            fupload, fp = prepareUploadFile()
78            fname, ftitle = cookId('', '', fupload)
79            self.portal.REQUEST.form['verification_file'] = fupload
80            self.portal.gsm_create_verify_file()
81        finally:
82            if fp:
83                fp.close()
84        vf_created = hasattr(self.portal, fname)
85        self.assert_(vf_created, 'Verification file not created')
86
87    def testVerificationForm(self):
88        verifyConfigUrl = '/' + self.portal.absolute_url(1) + \
89                          '/prefs_gsm_verification'
90        verif_config = self.publish(verifyConfigUrl, self.auth).getBody()
91        rexp_input_acitve = re.compile('<input\s+name="verification_file"'
92                                       '\s+([^>]*)>', re.I | re.S)
93        rexp_button_acitve = re.compile(
94            '<input\s+name="form.button.CreateFile"\s+([^>]*)>', re.I | re.S)
95        rexp_delete_button = re.compile(
96            '<input\s+name="form.button.DeleteFile"\s+[^>]*>', re.I | re.S)
97
98        input_acitve = rexp_input_acitve.search(verif_config)
99        button_acitve = rexp_button_acitve.search(verif_config)
100        delete_button = rexp_delete_button.match(verif_config)
101
102        self.assert_(input_acitve and not 'disabled' in input_acitve.groups(1))
103        self.assert_(button_acitve and not 'disabled' in
104                     button_acitve.groups(1))
105        self.assert_(not delete_button)
106
107        fp, fname = None, None
108        try:
109            fupload, fp = prepareUploadFile()
110            fname, ftitle = cookId('', '', fupload)
111            self.portal.REQUEST.form['verification_file'] = fupload
112            self.portal.gsm_create_verify_file()
113        finally:
114            if fp:
115                fp.close()
116
117        input_acitve = rexp_input_acitve.search(verif_config)
118        button_acitve = rexp_button_acitve.search(verif_config)
119        delete_button = rexp_delete_button.match(verif_config)
120
121        verif_config = self.publish(verifyConfigUrl, self.auth).getBody()
122        self.assert_(input_acitve and not 'disabled' in input_acitve.groups(1))
123        self.assert_(not delete_button)
124
125    def testMultiplyVerificationFiles(self):
126        verifyConfigUrl = '/' + self.portal.absolute_url(1) + \
127                          '/prefs_gsm_verification'
128        fnames = []
129        for i in [1, 2]:
130            fp, fname, response = None, None, None
131            try:
132                fupload, fp = prepareUploadFile(prefix=str(i))
133                fname, ftitle = cookId('', '', fupload)
134                form = {'form.button.CreateFile': 'Create verification file',
135                        'form.submitted': 1}
136                extra_update = {'verification_file': fupload}
137                response = self.publish(verifyConfigUrl, request_method='POST',
138                                        stdin=StringIO(urlencode(form)),
139                                        basic=self.auth, extra=extra_update)
140            finally:
141                if fp:
142                    fp.close()
143
144            self.assertEqual(response.getStatus(), 200)
145            self.assert_(fname in
146                         self.gsm_props.getProperty('verification_filenames',
147                                                    []),
148                         self.gsm_props.getProperty('verification_filenames',
149                                                    []))
150            fnames.append(fname)
151
152        self.assertEqual(len([1 for vf in fnames
153                         if
154                         vf
155                         in
156                         self.gsm_props.getProperty('verification_filenames',
157                                                    [])]), 2,
158                         self.gsm_props.getProperty('verification_filenames',
159                                                    []))
160
161
162def test_suite():
163    suite = unittest.TestSuite()
164    suite.addTest(unittest.makeSuite(TestGoogleSitemaps))
165    return suite
166
167if __name__ == '__main__':
168    unittest.main(defaultTest='test_suite')
169#    framework()
Note: See TracBrowser for help on using the repository browser.