source: products/quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/tests/testBugs.py @ 2958

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

Merged 3.0.5 to 3.0.7 changes from trunk into plone-4 branch version.

Merged revisions 3942-3945,3966-3976,3982-3983,3994 via svnmerge from
http://svn.quintagroup.com/products/quintagroup.seoptimizer/trunk

........

r3942 | mylan | 2010-10-20 17:06:46 +0300 (Wed, 20 Oct 2010) | 1 line


#233: Bump version to 3.0.7, updated history

........

r3943 | olha | 2010-10-20 17:14:52 +0300 (Wed, 20 Oct 2010) | 1 line


HISTORY.txt checked

........

r3944 | olha | 2010-10-20 17:20:15 +0300 (Wed, 20 Oct 2010) | 1 line


internal README file updated

........

r3945 | mylan | 2010-10-20 18:16:14 +0300 (Wed, 20 Oct 2010) | 1 line


#233: Updated list of supported version in README.txt to 3.1+

........

r3966 | mylan | 2010-10-26 17:33:27 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Reduce catch exceptions to URLError and HTTPError, log error to error_log, return link to error_log

........

r3967 | mylan | 2010-10-26 17:34:03 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Update tests for catching errors on keywords calculation

........

r3968 | mylan | 2010-10-26 17:55:15 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Make code more readable

........

r3969 | mylan | 2010-10-26 18:08:15 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Force to get portal_transforms as utility

........

r3970 | mylan | 2010-10-26 18:14:46 +0300 (Tue, 26 Oct 2010) | 1 line


#233: little cleanup

........

r3971 | mylan | 2010-10-26 20:35:28 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Force logging keywords calculation to nearest to context error_log object. Other minor fixes

........

r3972 | mylan | 2010-10-26 21:08:06 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Return getting error_log with getToolByName as more flexible and accurate

........

r3973 | mylan | 2010-10-27 18:09:31 +0300 (Wed, 27 Oct 2010) | 1 line


#233: Correct HISTORY information

........

r3974 | mylan | 2010-10-27 18:16:40 +0300 (Wed, 27 Oct 2010) | 1 line


#233: Added plone.browserlayer to requirements for Plone-3.0 support

........

r3975 | mylan | 2010-10-27 18:18:13 +0300 (Wed, 27 Oct 2010) | 1 line


#233: Fixed testcases to emulate proper test environment for plone-3.0

........

r3976 | mylan | 2010-10-27 18:21:55 +0300 (Wed, 27 Oct 2010) | 1 line


#233: Described steps for use the package with plone-3.0.

........

r3982 | olha | 2010-10-29 13:16:55 +0300 (Fri, 29 Oct 2010) | 1 line


doc files corrected a bit

........

r3983 | olha | 2010-10-29 13:20:45 +0300 (Fri, 29 Oct 2010) | 1 line


wrong line spacing corrected

........

r3994 | mylan | 2010-11-01 16:59:34 +0200 (Mon, 01 Nov 2010) | 1 line


Removed devloper settings of the package configuration

........

File size: 9.1 KB
Line 
1import urllib
2from cStringIO import StringIO
3
4from OFS.interfaces import ITraversable
5
6from zope.component import providedBy
7from zope.component import getGlobalSiteManager
8from zope.component import queryAdapter, getMultiAdapter
9from zope.interface import directlyProvides, alsoProvides
10from zope.viewlet.interfaces import IViewlet, IViewletManager
11from zope.publisher.browser import TestRequest
12
13from quintagroup.seoptimizer.browser.interfaces import IPloneSEOLayer
14from quintagroup.seoptimizer.browser.views import PROP_CUSTOM_PREFIX
15from quintagroup.seoptimizer.browser.seo_configlet import ISEOConfigletSchema
16from quintagroup.canonicalpath.interfaces import ICanonicalLink
17from quintagroup.canonicalpath.adapters import DefaultCanonicalLinkAdapter
18from base import *
19
20
21class TestBugs(FunctionalTestCase):
22
23    def afterSetUp(self):
24        self.basic_auth = ':'.join((portal_owner,default_password))
25        self.loginAsPortalOwner()
26        # prepare test document
27        my_doc = self.portal.invokeFactory('Document', id='my_doc')
28        self.my_doc = self.portal['my_doc']
29        self.mydoc_path = "/%s" % self.my_doc.absolute_url(1)
30
31    def test_modification_date(self):
32        """ Modification date changing on SEO properties edit """
33        form_data = {'seo_title': 'New Title',
34                     'seo_title_override:int': 1,
35                     'form.submitted:int': 1}
36
37        md_before = self.my_doc.modification_date
38        self.publish(path=self.mydoc_path+'/@@seo-context-properties',
39                     basic=self.basic_auth, request_method='POST',
40                     stdin=StringIO(urllib.urlencode(form_data)))
41        md_after = self.my_doc.modification_date
42
43        self.assertNotEqual(md_before, md_after)
44
45    def test_bug_20_at_plone_org(self):
46        portal = self.portal
47        fp = portal['front-page']
48        request = portal.REQUEST
49        view = portal.restrictedTraverse('@@plone')
50
51        manager = getMultiAdapter((fp, request, view), IViewletManager,
52                        name=u'plone.htmlhead')
53        viewlet = getMultiAdapter((fp, request, view, manager), IViewlet,
54                        name=u'plone.htmlhead.title')
55        viewlet.update()
56        old_title = viewlet.render()
57
58        # add IPloneSEOLayer
59        directlyProvides(request, IPloneSEOLayer)
60
61        viewlet = getMultiAdapter((fp, request, view, manager), IViewlet,
62                        name=u'plone.htmlhead.title')
63        viewlet.update()
64        new_title = viewlet.render()
65
66        self.assertEqual(old_title, new_title)
67
68    def test_bug_22_at_plone_org(self):
69        """If ICanonicalLink adapter is not found for the context object
70           - page rendering should not break, but only canonical link
71           should disappear.
72        """
73        curl = re.compile('<link\srel\s*=\s*"canonical"\s+' \
74                         '[^>]*href\s*=\s*\"([^\"]*)\"[^>]*>', re.S|re.M)
75        # When adapter registered for the object - canoncal link present on the page
76        self.assertNotEqual( queryAdapter(self.my_doc, ICanonicalLink), None)
77
78        res = self.publish(path=self.mydoc_path, basic=self.basic_auth)
79        self.assertNotEqual(curl.search(res.getBody()), None)
80
81        # Now remove adapter from the registry -> this should :
82        #     - not break page on rendering;
83        #     - canonical link will be absent on the page
84        gsm = getGlobalSiteManager()
85        gsm.unregisterAdapter(DefaultCanonicalLinkAdapter, [ITraversable,],
86                              ICanonicalLink)
87        self.assertEqual( queryAdapter(self.my_doc, ICanonicalLink), None)
88
89        res = self.publish(path=self.mydoc_path, basic=self.basic_auth)
90        self.assertEqual(curl.search(res.getBody()), None)
91
92        # register adapter back in the global site manager
93        gsm.registerAdapter(DefaultCanonicalLinkAdapter, [ITraversable,],
94                            ICanonicalLink)
95
96    def test_bug_19_23_at_plone_org(self):
97        """overrides.zcml should present in the root of the package"""
98        import quintagroup.seoptimizer
99        try:
100            zcml.load_config('overrides.zcml', quintagroup.seoptimizer)
101        except IOError:
102            self.fail("overrides.zcml removed from the package root")
103
104    def test_bug_custom_metatags_update(self):
105        # Prepare a page for the test
106        page = self.portal["front-page"]
107        request = self.portal.REQUEST
108        directlyProvides(request, IPloneSEOLayer)
109        seo_context_props = getMultiAdapter((page, request), name="seo-context-properties")
110        # Set default custom meta tag without default value (tag name only)
111        self.gseo = queryAdapter(self.portal, ISEOConfigletSchema)
112        self.gseo.default_custom_metatags = ["test_tag",]
113        try:
114            # Breakage on updating custom metatag with seo-context-properties view
115            seo_context_props.updateSEOCustomMetaTagsProperties([])
116        except IndexError:
117            self.fail("Error in calculating of default tag value, when only tag name set "\
118                      "in default_custom_metatags property of the configlet.")
119
120
121class TestBug24AtPloneOrg(FunctionalTestCase):
122
123    def afterSetUp(self):
124        super(TestBug24AtPloneOrg, self).afterSetUp()
125        self.loginAsPortalOwner()
126        self.portal.error_log.setProperties(20)
127        # Add test users: member, editor
128        member_id = 'test_member'
129        editor_id = 'test_editor'
130        test_pswd = 'pswd'
131        uf = self.portal.acl_users
132        uf.userFolderAddUser(member_id, test_pswd,
133                        ['Member'], [])
134        uf.userFolderAddUser(editor_id, test_pswd,
135                        ['Member','Editor'], [])
136
137        self.member_auth = '%s:%s'%(member_id, test_pswd)
138        self.editor_auth = '%s:%s'%(editor_id, test_pswd)
139
140        self.portal_url = '/'.join(self.portal.getPhysicalPath())
141        #alsoProvides(self.app.REQUEST, IPloneSEOLayer)
142        # add IPloneSEOLayer
143        directlyProvides(self.portal.REQUEST, IPloneSEOLayer)
144
145
146
147    def test_not_break(self):
148        """Default portal page should not breaks for any user"""
149        # Anonymous
150        resp = self.publish(path=self.portal_url)
151        file("/tmp/b24.0.1.html","wb").write(resp.getBody())
152        #self.assertEqual(resp.getStatus(), 200)
153        # Member
154        resp = self.publish(path=self.portal_url, basic=self.member_auth)
155        file("/tmp/b24.0.2.html","wb").write(resp.getBody())
156        #self.assertEqual(resp.getStatus(), 200)
157        # Editor: this fails, althought must pass
158        resp = self.publish(path=self.portal_url, basic=self.editor_auth)
159        file("/tmp/b24.0.3.html","wb").write(resp.getBody())
160
161        self.assertEqual(resp.getStatus(), 200)
162
163    def test_tab_visibility(self):
164        """Only Editor can view seo tab"""
165        rexp = re.compile('<a\s+[^>]*' \
166               'href="[a-zA-Z0-9\:\/_-]*/@@seo-context-properties"[^>]*>'\
167               '\s*SEO Properties\s*</a>', re.I|re.S)
168        # Anonymous: NO SEO Properties link
169        res = self.publish(path=self.portal_url).getBody()
170        file("/tmp/b24.1.1.html","wb").write(res)
171
172        # self.assertEqual(rexp.search(res), None)
173        # Member: NO 'SEO Properties' link
174        res = self.publish(path=self.portal_url, basic=self.member_auth).getBody()
175        file("/tmp/b24.1.2.html","wb").write(res)
176        # self.assertEqual(rexp.search(res), None)
177        # Editor: PRESENT 'SEO Properties' link
178        res = self.publish(path=self.portal_url, basic=self.editor_auth).getBody()
179        file("/tmp/b24.1.3.html","wb").write(res)
180        # self.assertNotEqual(rexp.search(res), None)
181
182    def test_tab_access(self):
183        """Only Editor can access 'SEO Properties' tab"""
184        test_url = self.portal_url + '/front-page/@@seo-context-properties'
185        # Anonymous: can NOT ACCESS
186        headers = self.publish(path=test_url).headers
187        # self.assertEqual( headers.get('bobo-exception-type',""), 'Unauthorized',
188        #    "No 'Unauthorized' exception rised for Anonymous on '@@seo-context-properties' view")
189        # Member: can NOT ACCESS
190        status = self.publish(path=test_url, basic=self.member_auth).headers
191        # self.assertEqual( headers.get('bobo-exception-type',""), 'Unauthorized',
192        #    "No 'Unauthorized' exception rised for Member on '@@seo-context-properties' view")
193        # Editor: CAN Access
194        res = self.publish(path=test_url, basic=self.editor_auth)
195        file("/tmp/b24.2.1.html","wb").write(res.getBody())
196
197        # self.assertEqual(res.status, 200)
198
199
200    def test_tab_edit(self):
201        """Editor can change SEO Properties"""
202        test_url = self.portal_url + '/front-page/@@seo-context-properties'
203        form_data = {'seo_title': 'New Title',
204                     'seo_title_override:int': 1,
205                     'form.submitted:int': 1}
206        res = self.publish(path=test_url, basic=self.editor_auth,
207                  request_method='POST', stdin=StringIO(urllib.urlencode(form_data)))
208        file("/tmp/b24.3.1.html","wb").write(res.getBody())
209
210        # self.assertNotEqual(res.status, 200)
211
212
213def test_suite():
214    from unittest import TestSuite, makeSuite
215    suite = TestSuite()
216    suite.addTest(makeSuite(TestBugs))
217    suite.addTest(makeSuite(TestBug24AtPloneOrg))
218    return suite
219
Note: See TracBrowser for help on using the repository browser.