Up to index
diff --git a/deformdemo/test.py b/deformdemo/test.py
index f422aa08..01b84aa5 100644
--- a/deformdemo/test.py
+++ b/deformdemo/test.py
@@ -48,7 +48,7 @@ def test_render_default(self):
browser.open(self.url)
browser.wait_for_page_to_load("30000")
self.assertTrue(browser.is_text_present("Pepper"))
- self.assertFalse(browser.is_checked("deformField1-0"))
+ self.assertFalse(browser.is_checked("deformField1"))
self.assertFalse(browser.is_checked("deformField1-1"))
self.assertFalse(browser.is_checked("deformField1-2"))
self.assertEqual(browser.get_text('css=.req'), '*')
@@ -63,7 +63,7 @@ def test_submit_unchecked(self):
error_node = 'css=#error-deformField1'
self.assertEqual(browser.get_text(error_node),
'Shorter than minimum length 1')
- self.assertFalse(browser.is_checked("deformField1-0"))
+ self.assertFalse(browser.is_checked("deformField1"))
self.assertFalse(browser.is_checked("deformField1-1"))
self.assertFalse(browser.is_checked("deformField1-2"))
self.assertEqual(browser.get_text('css=#captured'), 'None')
@@ -71,11 +71,11 @@ def test_submit_unchecked(self):
def test_submit_one_checked(self):
browser.open(self.url)
browser.wait_for_page_to_load("30000")
- browser.click("deformField1-0")
+ browser.click("deformField1")
browser.click("submit")
browser.wait_for_page_to_load("30000")
self.assertFalse(browser.is_element_present('css=.errorMsgLbl'))
- self.assertTrue(browser.is_checked("deformField1-0"))
+ self.assertTrue(browser.is_checked("deformField1"))
captured = browser.get_text('css=#captured')
self.assertTrue(captured in (
"{'pepper': set([u'habanero'])}", # py2
@@ -85,13 +85,13 @@ def test_submit_one_checked(self):
def test_submit_three_checked(self):
browser.open(self.url)
browser.wait_for_page_to_load("30000")
- browser.click("deformField1-0")
+ browser.click("deformField1")
browser.click("deformField1-1")
browser.click("deformField1-2")
browser.click("submit")
browser.wait_for_page_to_load("30000")
self.assertFalse(browser.is_element_present('css=.errorMsgLbl'))
- self.assertTrue(browser.is_checked("deformField1-0"))
+ self.assertTrue(browser.is_checked("deformField1"))
self.assertTrue(browser.is_checked("deformField1-1"))
self.assertTrue(browser.is_checked("deformField1-2"))
captured = browser.get_text('css=#captured')
@@ -1166,7 +1166,7 @@ def test_render_default(self):
browser.open(self.url)
browser.wait_for_page_to_load("30000")
self.assertTrue(browser.is_text_present("Pepper"))
- self.assertFalse(browser.is_checked("deformField1-0"))
+ self.assertFalse(browser.is_checked("deformField1"))
self.assertFalse(browser.is_checked("deformField1-1"))
self.assertFalse(browser.is_checked("deformField1-2"))
self.assertEqual(browser.get_text('css=.req'), '*')
@@ -1180,7 +1180,7 @@ def test_submit_unchecked(self):
self.assertTrue(browser.get_text('css=.errorMsgLbl'))
error_node = 'css=#error-deformField1'
self.assertEqual(browser.get_text(error_node), 'Required')
- self.assertFalse(browser.is_checked("deformField1-0"))
+ self.assertFalse(browser.is_checked("deformField1"))
self.assertFalse(browser.is_checked("deformField1-1"))
self.assertFalse(browser.is_checked("deformField1-2"))
self.assertEqual(browser.get_text('css=#captured'), 'None')
@@ -1188,11 +1188,11 @@ def test_submit_unchecked(self):
def test_submit_one_checked(self):
browser.open(self.url)
browser.wait_for_page_to_load("30000")
- browser.click("deformField1-0")
+ browser.click("deformField1")
browser.click("submit")
browser.wait_for_page_to_load("30000")
self.assertFalse(browser.is_element_present('css=.errorMsgLbl'))
- self.assertTrue(browser.is_checked("deformField1-0"))
+ self.assertTrue(browser.is_checked("deformField1"))
self.assertSimilarRepr(
browser.get_text('css=#captured'),
"{'pepper': u'habanero'}")
@@ -1202,11 +1202,11 @@ class RadioChoiceWidgetIntTests(RadioChoiceWidgetTests):
def test_submit_one_checked(self):
browser.open(self.url)
browser.wait_for_page_to_load("30000")
- browser.click("deformField1-0")
+ browser.click("deformField1")
browser.click("submit")
browser.wait_for_page_to_load("30000")
self.assertFalse(browser.is_element_present('css=.errorMsgLbl'))
- self.assertTrue(browser.is_checked("deformField1-0"))
+ self.assertTrue(browser.is_checked("deformField1"))
self.assertSimilarRepr(
browser.get_text('css=#captured'),
"{'pepper': 0}")
@@ -2855,7 +2855,7 @@ def test_it(self):
browser.wait_for_page_to_load("30000")
self.assertTrue(browser.is_element_present('css=form > fieldset > ul > li.field.top_level_mapping_widget_custom_class'))
self.assertTrue(browser.is_element_present('css=[title=SequenceWidget] > .deformSeq > ul > li.sequenced_widget_custom_class'))
- self.assertTrue(browser.is_element_present('css=[title=MappingWidget] > fieldset > ul > li.mapped_widget_custom_class'))
+ self.assertTrue(browser.is_element_present('css=[title=MappingWidget] > fieldset > ul.mapping > li > ul > li.mapped_widget_custom_class'))
if __name__ == '__main__':
diff --git a/deformdemo/validation.py b/deformdemo/validation.py
index 3ec574ce..9ddd194d 100644
--- a/deformdemo/validation.py
+++ b/deformdemo/validation.py
@@ -1,6 +1,87 @@
-import unittest
from pyramid.paster import bootstrap
from deformdemo import DeformDemo
+import unittest
+import httplib
+import sys
+import re
+import urlparse
+import gzip
+import StringIO
+import json
+
+
+def validate(data):
+
+ extPat = re.compile(r'^.*\.([A-Za-z]+)$')
+ extDict = {
+ "html": "text/html",
+ "htm": "text/html",
+ "xhtml": "application/xhtml+xml",
+ "xht": "application/xhtml+xml",
+ "xml": "application/xml",
+ }
+
+
+ errorsOnly = 0
+ encoding = None
+ contentType = "text/html"
+ service = 'http://html5.validator.nu/'
+
+ buf = StringIO.StringIO()
+ gzipper = gzip.GzipFile(fileobj=buf, mode='wb')
+ gzipper.write(data)
+ gzipper.close()
+ gzippeddata = buf.getvalue()
+ buf.close()
+
+ connection = None
+ response = None
+ status = 302
+ redirectCount = 0
+
+ url = service + '?out=json'
+ url = service + '?out=text'
+ if errorsOnly:
+ url = url + '&level=error'
+
+ while (status == 302 or status == 301 or status == 307) and redirectCount < 10:
+ if redirectCount > 0:
+ url = response.getheader('Location')
+ parsed = urlparse.urlsplit(url)
+ if parsed[0] != 'http':
+ sys.stderr.write('URI scheme %s not supported.\n' % parsed[0])
+ sys.exit(7)
+ if redirectCount > 0:
+ connection.close() # previous connection
+ print 'Redirecting to %s' % url
+ print 'Please press enter to continue or type "stop" followed by enter to stop.'
+ if raw_input() != "":
+ sys.exit(0)
+ connection = httplib.HTTPConnection(parsed[1])
+ connection.connect()
+ connection.putrequest("POST", "%s?%s" % (parsed[2], parsed[3]), skip_accept_encoding=1)
+ connection.putheader("Accept-Encoding", 'gzip')
+ connection.putheader("Content-Type", contentType)
+ connection.putheader("Content-Encoding", 'gzip')
+ connection.putheader("Content-Length", len(gzippeddata))
+ connection.endheaders()
+ connection.send(gzippeddata)
+ response = connection.getresponse()
+ status = response.status
+ redirectCount += 1
+
+ if status != 200:
+ sys.stderr.write('%s %s\n' % (status, response.reason))
+ sys.exit(5)
+
+ if response.getheader('Content-Encoding', 'identity').lower() == 'gzip':
+ response = gzip.GzipFile(fileobj=StringIO.StringIO(response.read()))
+
+ connection.close()
+ return response.read()
+ result = json.loads(response.read())
+ return result
+
class FunctionalTests(unittest.TestCase):
@@ -13,11 +94,21 @@ def setUp(self):
self.demos = DeformDemo(self.request)
def test_valid_html(self):
+ errors = []
demos_urls = self.demos.get_demos()
for demo in demos_urls:
res = self.testapp.get(demo[1], status=200)
- import pdb; pdb.set_trace() # NOQA
- #self.failUnless('Pyramid' in res.body)
+ check = validate(res.body)
+ #import pdb; pdb.set_trace() # NOQA
+ try:
+ self.assertFalse(check)
+ print demo[0], "."
+ except AssertionError, e:
+ errors.append((demo[0], check))
+ print demo[0], "E"
+ print check
+ print
+ #self.assertFalse(errors)
if __name__ == '__main__':
unittest.main()
diff --git a/deformdemo/validation.txt b/deformdemo/validation.txt
new file mode 100644
index 00000000..06da5171
--- /dev/null
+++ b/deformdemo/validation.txt
@@ -0,0 +1,8 @@
+HTML Template Validation Known Issues
+=====================================
+
+Much work was done to make these tempaltes validate, but due to current limitations of HTML and form controls some things just aren't as nice as they should be. Here is the current list of things that just won't validate for now.
+
+* Extended Attribute usage on HTML elements to pack data into the form
+* There is a workaround for mapping items which sets the label of the mapping item for the first item of subfields but this cannot work with sequences which may initially render empty.
+* The validator runner is naive and currently reports all feedback from the validation service. This will improve when we switch to JSON reporting and gracefully handle errors that we know we cannot fix.