source: products/quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/tests/testUsageKeywords.py @ 2902

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

Fix for #28 issue (http://plone.org/products/plone-seo/issues/28) merged
into plone4 branch.

Merged revisions 3924,3927-3929,3933-3934,3939-3940 via svnmerge from
http://svn.quintagroup.com/products/quintagroup.seoptimizer/trunk

........

r3924 | mylan | 2010-10-19 15:09:28 +0300 (Tue, 19 Oct 2010) | 1 line


#233: Updated configlet tests for new external_configlet_test checkbox

........

r3927 | mylan | 2010-10-19 17:05:55 +0300 (Tue, 19 Oct 2010) | 1 line


#233: Fixed 'external_keywords_test' option tests in configlet, refs #233

........

r3928 | mylan | 2010-10-19 17:09:37 +0300 (Tue, 19 Oct 2010) | 1 line


Added 'external_keywords_test' option to configlet, refs #233

........

r3929 | mylan | 2010-10-19 17:12:18 +0300 (Tue, 19 Oct 2010) | 1 line


#233: removed some debugging code

........

r3933 | mylan | 2010-10-19 20:48:19 +0300 (Tue, 19 Oct 2010) | 1 line


#233: Added tests for calculation keywords

........

r3934 | mylan | 2010-10-19 20:52:01 +0300 (Tue, 19 Oct 2010) | 1 line


#233: Updated keywords calculation - replace lynx usage with portal_transforms, added optional external page retrieval

........

r3939 | mylan | 2010-10-20 16:10:45 +0300 (Wed, 20 Oct 2010) | 1 line


#233: Updated tests for correct errors handling in keyword check view

........

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


#233: Check SEO keywords: Added error handling, return reasonable info in case of error

........

File size: 6.7 KB
Line 
1from base import *
2import urllib2
3from StringIO import StringIO
4from zope.component import queryMultiAdapter
5from zope.interface import alsoProvides
6from quintagroup.seoptimizer.browser.interfaces import IPloneSEOLayer
7
8KWSTMPL = '.*(<meta\s+(?:(?:name="keywords"\s*)|(?:content="%s"\s*)){2}/>)'
9
10class TestUsageKeywords(FunctionalTestCase):
11
12    def afterSetUp(self):
13        self.sp = self.portal.portal_properties.seo_properties
14        self.pu = self.portal.plone_utils
15        self.basic_auth = ':'.join((portal_owner,default_password))
16        self.loginAsPortalOwner()
17        #Preparation for functional testing
18        self.my_doc = self.portal.invokeFactory('Document', id='my_doc')
19        self.my_doc = self.portal['my_doc']
20
21    def test_noDefaultKeywords(self):
22        """No keywords added for the content by default"""
23        metatags = self.pu.listMetaTags(self.my_doc)
24        self.assert_('keywords' not in metatags)
25
26    def testrender_SEOKeywords(self):
27        """ """
28        self.my_doc.setText('<p>foo bar</p>')
29        self.my_doc.manage_addProperty('qSEO_keywords', [], 'lines')
30
31        for seokws in [('foo',), ('foo', 'bar')]:
32            self.my_doc._updateProperty('qSEO_keywords', seokws)
33            html = str(self.publish(self.portal.id+'/my_doc', self.basic_auth))
34            expect = ',\s*'.join(seokws)
35            open('/tmp/testrender_SEOKeywords','w').write(html)
36            self.assert_(re.match(KWSTMPL % expect, html, re.S|re.M),
37                         "No '%s' keyword found" % str(seokws))
38
39    def testbehave_NoSEOKeywordsOnlySubject(self):
40        self.my_doc.setText('<p>local subject</p>')
41        self.my_doc.setSubject('subject')
42        html = str(self.publish(self.portal.id+'/my_doc', self.basic_auth))
43
44        expect = "subject"
45        self.assert_(re.match(KWSTMPL % expect, html, re.S|re.M),
46                     "No '%s' keyword find" % expect)
47
48    def testbehave_SEOKeywordsOverrideSubject(self):
49        SEOKWS = ('local',)
50        self.my_doc.setText('<p>local subject</p>')
51        self.my_doc.setSubject('subject')
52        self.my_doc.manage_addProperty('qSEO_keywords', SEOKWS, 'lines')
53        html = str(self.publish(self.portal.id+'/my_doc', self.basic_auth))
54
55        expect = ',\s*'.join(SEOKWS)
56        self.assert_(re.match(KWSTMPL % expect, html, re.S|re.M),
57                     "No '%s' keywords find" % SEOKWS)
58
59    def testbehave_noSEOKeywordsNoSubject(self):
60        """Nor seo keywords not subject added"""
61        html = str(self.publish(self.portal.id+'/my_doc', self.basic_auth))
62        self.assertFalse(re.match('.*(<meta\s[^\>]*name="keywords"[^\>]*>)',
63                                  html, re.S|re.M), "'keyword' meta tag found")
64
65
66class TestCalcKeywords(FunctionalTestCase):
67
68    def afterSetUp(self):
69        self.loginAsPortalOwner()
70        self.seo = self.portal.portal_properties.seo_properties
71        #Preparation for functional testing
72        self.key = "SEO_KEYWORD "
73        self.portal.invokeFactory('Document', id='my_doc')
74        self.my_doc = getattr(self.portal, 'my_doc')
75        self.my_doc.setText(self.key * 2)
76        # Emulate JS request
77        self.app.REQUEST.set("text", self.key)
78        # Mark request with IPloneSEOLayer browser layer interface
79        alsoProvides(self.app.REQUEST, IPloneSEOLayer)
80        # Get checkSEOKeywords view
81        self.chckView = queryMultiAdapter((self.my_doc, self.app.REQUEST),
82            name="checkSEOKeywords")
83       
84    def patchURLLib(self, fnc):
85        self.orig_urlopen = urllib2.urlopen
86        self.urlfd = StringIO()
87        urllib2.urlopen = fnc
88   
89    def unpatchURLLib(self):
90        urllib2.urlopen = self.orig_urlopen
91        self.urlfd.close()
92
93    def test_InternalPageRendering(self):
94        self.assertTrue(not self.seo.external_keywords_test)
95        # Only keywords from content must present in check view
96        self.assertTrue('2' in self.chckView())
97
98    def test_ExternalPageRendering(self):
99        def patch_urlopen(*args, **kwargs):
100            if args[0] == self.my_doc.absolute_url():
101                self.urlfd.write(unicode(self.my_doc() + self.key).encode("utf-8"))
102                self.urlfd.seek(0)
103                return self.urlfd
104            else:
105                return self.orig_urlopen(*args, **kwargs)
106        self.seo._updateProperty("external_keywords_test", True)
107        self.patchURLLib(fnc=patch_urlopen)
108        self.assertTrue(self.seo.external_keywords_test)
109        # 1. Extra keyword must present in check view
110        self.assertTrue('3' in self.chckView())
111        # 2. Opened urllib file descriptor must be closed
112        self.assertTrue(self.urlfd.closed, "Opened file descriptor was not closed.")
113        self.unpatchURLLib()
114       
115    def test_ExternalURLError(self):
116        def patch_urlopen(*args, **kwargs):
117            if args[0] == self.my_doc.absolute_url():
118                raise urllib2.URLError("Some URL Error occured")
119            else:
120                return self.orig_urlopen(*args, **kwargs)
121        self.seo._updateProperty("external_keywords_test", True)
122        self.patchURLLib(fnc=patch_urlopen)
123        self.assertTrue(self.seo.external_keywords_test)
124        # 1. Information about problem must present in check view
125        self.assertTrue("Problem with page retrieval" in self.chckView())
126        # 2. Opened urllib file descriptor should not be closed because
127        #    it even not returned to the view
128        self.assertFalse(self.urlfd.closed, "Opened file descriptor was closed.")
129        self.unpatchURLLib()
130   
131    def test_ExternalIOError(self):
132        def patch_urlopen(*args, **kwargs):
133            if args[0] == self.my_doc.absolute_url():
134                self.urlfd.write(unicode(self.my_doc() + self.key).encode("utf-8"))
135                self.urlfd.seek(0)
136                return self.urlfd
137            else:
138                return self.orig_urlopen(*args, **kwargs)
139        def patch_read(*args, **kwargs):
140            raise IOError()
141        # Patch urllib2.urlopen to emulate external url retrieval
142        self.patchURLLib(fnc=patch_urlopen)
143        # Patch opened by urllib2 file descriptor to emulate IOError during reading
144        self.urlfd.read = patch_read
145        self.seo._updateProperty("external_keywords_test", True)
146        self.assertTrue(self.seo.external_keywords_test)
147        # 1. Information about problem must present in check view
148        self.assertTrue("Problem with page retrieval" in self.chckView())
149        # 2. Opened urllib file descriptor must be closed
150        self.assertTrue(self.urlfd.closed, "Opened file descriptor was not closed.")
151        self.unpatchURLLib()
152       
153
154def test_suite():
155    from unittest import TestSuite, makeSuite
156    suite = TestSuite()
157    suite.addTest(makeSuite(TestUsageKeywords))
158    suite.addTest(makeSuite(TestCalcKeywords))
159    return suite
160
Note: See TracBrowser for help on using the repository browser.