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

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

#233: little cleanup testBugs code

File size: 8.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.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        # Add test users: member, editor
125        member_id = 'test_member'
126        editor_id = 'test_editor'
127        test_pswd = 'pswd'
128        uf = self.portal.acl_users
129        uf.userFolderAddUser(member_id, test_pswd,
130                        ['Member'], [])
131        uf.userFolderAddUser(editor_id, test_pswd,
132                        ['Member','Editor'], [])
133
134        self.member_auth = '%s:%s'%(member_id, test_pswd)
135        self.editor_auth = '%s:%s'%(editor_id, test_pswd)
136        self.portal_url = '/'.join(self.portal.getPhysicalPath())
137
138    def test_not_break(self):
139        """Default portal page should not breaks for any user"""
140        # Anonymous
141        resp = self.publish(path=self.portal_url)
142        self.assertEqual(resp.getStatus(), 200)
143        # Member
144        resp = self.publish(path=self.portal_url, basic=self.member_auth)
145        self.assertEqual(resp.getStatus(), 200)
146        # Editor: this fails, althought must pass
147        resp = self.publish(path=self.portal_url, basic=self.editor_auth)
148        self.assertEqual(resp.getStatus(), 200)
149
150    def test_tab_visibility(self):
151        """Only Editor can view seo tab"""
152        rexp = re.compile('<a\s+[^>]*' \
153               'href="[a-zA-Z0-9\:\/_-]*/@@seo-context-properties"[^>]*>'\
154               '\s*SEO Properties\s*</a>', re.I|re.S)
155        # Anonymous: NO SEO Properties link
156        res = self.publish(path=self.portal_url).getBody()
157        self.assertEqual(rexp.search(res), None)
158        # Member: NO 'SEO Properties' link
159        res = self.publish(path=self.portal_url, basic=self.member_auth).getBody()
160        self.assertEqual(rexp.search(res), None)
161        # Editor: PRESENT 'SEO Properties' link
162        res = self.publish(path=self.portal_url, basic=self.editor_auth).getBody()
163        self.assertNotEqual(rexp.search(res), None)
164
165    def test_tab_access(self):
166        """Only Editor can access 'SEO Properties' tab"""
167        test_url = self.portal_url + '/front-page/@@seo-context-properties'
168        # Anonymous: can NOT ACCESS
169        headers = self.publish(path=test_url).headers
170        self.assertEqual( headers.get('bobo-exception-type',""), 'Unauthorized',
171            "No 'Unauthorized' exception rised for Anonymous on '@@seo-context-properties' view")
172        # Member: can NOT ACCESS
173        status = self.publish(path=test_url, basic=self.member_auth).headers
174        self.assertEqual( headers.get('bobo-exception-type',""), 'Unauthorized',
175            "No 'Unauthorized' exception rised for Member on '@@seo-context-properties' view")
176        # Editor: CAN Access
177        res = self.publish(path=test_url, basic=self.editor_auth)
178        self.assertEqual(res.status, 200)
179
180
181    def test_tab_edit(self):
182        """Editor can change SEO Properties"""
183        test_url = self.portal_url + '/front-page/@@seo-context-properties'
184        form_data = {'seo_title': 'New Title',
185                     'seo_title_override:int': 1,
186                     'form.submitted:int': 1}
187        res = self.publish(path=test_url, basic=self.editor_auth,
188                  request_method='POST', stdin=StringIO(urllib.urlencode(form_data)))
189        self.assertNotEqual(res.status, 200)
190
191
192def test_suite():
193    from unittest import TestSuite, makeSuite
194    suite = TestSuite()
195    suite.addTest(makeSuite(TestBugs))
196    suite.addTest(makeSuite(TestBug24AtPloneOrg))
197    return suite
198
Note: See TracBrowser for help on using the repository browser.