[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