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

Last change on this file since 3012 was 3012, checked in by mylan, 13 years ago

#235: Corrected functional tests, which did not use Save button

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