Ignore:
Timestamp:
Oct 20, 2010 1:35:24 PM (14 years ago)
Author:
mylan
Message:

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

........

Location:
quintagroup.seoptimizer/branches/plone4
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.seoptimizer/branches/plone4

    • Property svn:mergeinfo
      •  

        old new  
        11/quintagroup.seoptimizer/branches/refactoring2.3.0:1776-2133 
        2 /quintagroup.seoptimizer/trunk:2435-2440 
         2/quintagroup.seoptimizer/trunk:2435-2440,2885-2901 
    • Property svnmerge-integrated changed from /quintagroup.seoptimizer/trunk:1-3473 /quintagroup.seoptimizer/branches/refactoring2.3.0:1-3174 to /quintagroup.seoptimizer/trunk:1-3478,3480-3513,3515-3631,3633-3940 /quintagroup.seoptimizer/branches/refactoring2.3.0:1-3174
  • quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/tests/testUsageKeywords.py

    r2139 r2902  
    11from 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 
    27 
    38KWSTMPL = '.*(<meta\s+(?:(?:name="keywords"\s*)|(?:content="%s"\s*)){2}/>)' 
     
    5964 
    6065 
     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 
    61154def test_suite(): 
    62155    from unittest import TestSuite, makeSuite 
    63156    suite = TestSuite() 
    64157    suite.addTest(makeSuite(TestUsageKeywords)) 
     158    suite.addTest(makeSuite(TestCalcKeywords)) 
    65159    return suite 
     160 
Note: See TracChangeset for help on using the changeset viewer.