[Checkins] SVN: zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/ Preliminary support for a testbrowser that runs response output through

Ross Patterson me at rpatterson.net
Sat Feb 20 07:44:14 EST 2010


Log message for revision 109173:
  Preliminary support for a testbrowser that runs response output through
  a W3C validator

Changed:
  U   zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/browser.py
  A   zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/ftests/valid.html
  U   zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/tests.py
  A   zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.py
  A   zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.txt

-=-
Modified: zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/browser.py
===================================================================
--- zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/browser.py	2010-02-20 12:42:57 UTC (rev 109172)
+++ zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/browser.py	2010-02-20 12:44:14 UTC (rev 109173)
@@ -24,6 +24,7 @@
 import operator
 import re
 import sys
+import os
 import time
 import urllib2
 
@@ -32,6 +33,7 @@
 import zope.interface
 
 import zope.testbrowser.cookies
+import zope.testbrowser.validate
 import zope.testbrowser.interfaces
 
 
@@ -168,6 +170,11 @@
     def __init__(self, url=None, mech_browser=None):
         if mech_browser is None:
             mech_browser = mechanize.Browser()
+
+        if os.environ.get('ZOPE_TESTBROWSER_VALIDATE'):
+            mech_browser.add_handler(
+                zope.testbrowser.validate.ValidatingHandler())
+            
         self.mech_browser = mech_browser
         self.timer = PystoneTimer()
         self.raiseHttpErrors = True

Added: zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/ftests/valid.html
===================================================================
--- zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/ftests/valid.html	                        (rev 0)
+++ zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/ftests/valid.html	2010-02-20 12:44:14 UTC (rev 109173)
@@ -0,0 +1,9 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <title>Simple Page</title>
+  </head>
+  <body>
+    <h1>Simple Page</h1>
+  </body>
+</html>

Modified: zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/tests.py
===================================================================
--- zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/tests.py	2010-02-20 12:42:57 UTC (rev 109172)
+++ zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/tests.py	2010-02-20 12:44:14 UTC (rev 109173)
@@ -420,9 +420,14 @@
     wire.level = 2
     wire.layer = TestBrowserLayer
 
+    validate = FunctionalDocFileSuite('validate.txt', optionflags=flags)
+    validate.level = 2
+    validate.layer = TestBrowserLayer
+
     this_file = doctest.DocTestSuite(checker=checker)
 
-    return unittest.TestSuite((this_file, readme, fixed_bugs, wire, cookies))
+    return unittest.TestSuite(
+        (this_file, readme, fixed_bugs, wire, validate, cookies))
 
 if __name__ == '__main__':
     unittest.main(defaultTest='test_suite')

Added: zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.py
===================================================================
--- zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.py	                        (rev 0)
+++ zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.py	2010-02-20 12:44:14 UTC (rev 109173)
@@ -0,0 +1,23 @@
+import os
+
+import urllib
+import urllib2
+
+class ValidatingHandler(urllib2.BaseHandler):
+
+    def http_response(self, request, response):
+        check = urllib2.urlopen(
+            os.environ.get('ZOPE_TESTBROWSER_VALIDATE',
+                           'http://validator.w3.org/check'),
+            urllib.urlencode(dict(fragment=response.read())))
+        response.seek(0)
+
+        if check.info().get(
+            'X-W3C-Validator-Status').lower() != 'valid':
+            return self.parent.error(
+                'http', request, check, '500', 'Invalid HTML',
+                check.info())
+            return check
+
+        return response
+        

Added: zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.txt
===================================================================
--- zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.txt	                        (rev 0)
+++ zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.txt	2010-02-20 12:44:14 UTC (rev 109173)
@@ -0,0 +1,72 @@
+.. -*-doctest-*-
+
+===============
+Validating HTML
+===============
+
+If the ZOPE_TESTBROWSER_VALIDATE environment variable is set, the
+testbrowser will send the HTML response to a request through the the
+W3C validator at the URL in the environment variable.
+
+Set the environment variable to use the local version of he W3C
+validator.
+
+    >>> import os
+    >>> missing = object()
+    >>> orig_environ = os.environ.get(
+    ...     'ZOPE_TESTBROWSER_VALIDATE', missing)
+    >>> os.environ['ZOPE_TESTBROWSER_VALIDATE'
+    ...            ] = 'http://localhost/cgi-bin/check'
+
+Open a browser and visit a page with valid HTML.  The testbrowser
+behaves as it would without the environment variable.
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> browser = Browser()
+    >>> browser.open(
+    ...     'http://localhost/@@/testbrowser/valid.html')
+    >>> print browser.contents
+    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+    <html>
+      <head>
+        <title>Simple Page</title>
+      </head>
+      <body>
+        <h1>Simple Page</h1>
+      </body>
+    </html>
+
+If invalid HTML is returned to the test browser, the browser will
+raise an error and the browser contents will include the W3C validator
+report output.
+
+    >>> browser.open(
+    ...     'http://localhost/@@/testbrowser/simple.html')
+    Traceback (most recent call last):
+    ...
+    HTTPError: HTTP Error 500: Invalid HTML
+    >>> print browser.contents
+    <...
+        <h2 id="results" class="invalid">This page is <strong>not</strong> Valid (no Doctype found)!</h2>
+    ...
+
+When the environment variable is not in place, the browser does
+nothing with invalid HTML.
+
+    >>> if orig_environ is missing:
+    ...     del os.environ['ZOPE_TESTBROWSER_VALIDATE']
+    ... else:
+    ...     os.environ['ZOPE_TESTBROWSER_VALIDATE'] = orig_environ
+
+    >>> browser = Browser()
+    >>> browser.open(
+    ...     'http://localhost/@@/testbrowser/simple.html')
+    >>> print browser.contents
+    <html>
+      <head>
+        <title>Simple Page</title>
+      </head>
+      <body>
+        <h1>Simple Page</h1>
+      </body>
+    </html>


Property changes on: zope.testbrowser/branches/rossp-validator/src/zope/testbrowser/validate.txt
___________________________________________________________________
Added: svn:eol-style
   + native



More information about the checkins mailing list