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

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

#233: Removed debugging coded from testBugs module

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