source: products/quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/tests/testUsageKeywords.py @ 3134

Last change on this file since 3134 was 3134, checked in by zidane, 13 years ago

fixes pep8

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