source: products/quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/tests/testBugs.py @ 2252

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

#204: Extended testBugs for 24 issue from plone.org - added test for possiblitiy to access, view and edit seo-context-property form by anonymous, editor, member

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