[Checkins] SVN: zc.testbrowser/trunk/src/zc/testbrowser/ - Improved test handler for HTTP to handle simple forms and multipart

Stephan Richter srichter at cosmos.phy.tufts.edu
Tue Apr 29 02:37:47 EDT 2008


Log message for revision 85844:
  - Improved test handler for HTTP to handle simple forms and multipart 
    forms.
  
  - Improved test of file upload element; now the passed in file contents 
    will be submitted and the submission is tested.
  
  - Correctly implemented the ``add_file()`` method of the control 
    object for the real testbrowser implementation.
  

Changed:
  U   zc.testbrowser/trunk/src/zc/testbrowser/README.txt
  U   zc.testbrowser/trunk/src/zc/testbrowser/ftests/controls.html
  U   zc.testbrowser/trunk/src/zc/testbrowser/real.py
  U   zc.testbrowser/trunk/src/zc/testbrowser/tests.py

-=-
Modified: zc.testbrowser/trunk/src/zc/testbrowser/README.txt
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/README.txt	2008-04-29 06:35:35 UTC (rev 85843)
+++ zc.testbrowser/trunk/src/zc/testbrowser/README.txt	2008-04-29 06:37:13 UTC (rev 85844)
@@ -931,6 +931,18 @@
 #    >>> browser.contents
 #    "...'image-value.x': ['50']...'image-value.y': ['25']..."
 
+Another interesting aspect of submitting a form is the correct submission of
+the file data.
+
+    >>> browser.open('controls.html')
+    >>> ctrl = browser.getControl('File Control')
+    >>> import cStringIO
+    >>> ctrl.add_file(cStringIO.StringIO('File contents'),
+    ...               'text/plain', 'test.txt')
+    >>> browser.getControl('Submit This').click()
+    >>> browser.contents
+    "...'file-value': ['File contents'],..."
+
 Forms
 -----
 

Modified: zc.testbrowser/trunk/src/zc/testbrowser/ftests/controls.html
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/ftests/controls.html	2008-04-29 06:35:35 UTC (rev 85843)
+++ zc.testbrowser/trunk/src/zc/testbrowser/ftests/controls.html	2008-04-29 06:37:13 UTC (rev 85844)
@@ -3,13 +3,13 @@
 
     <h1>Controls Tests</h1>
 
-    <form action="controls.html" method="post">
+    <form action="controls.html" method="post" enctype="multipart/form-data">
 
       <div>
         <label for="text-value">Text Control</label>
         <em tal:condition="request/text-value|nothing"
             tal:content="request/text-value"></em>
-        <input type="text" name="text-value" id="text-value" 
+        <input type="text" name="text-value" id="text-value"
                value="Some Text" />
       </div>
 
@@ -72,7 +72,7 @@
       <div>
         <em tal:condition="request/single-unvalued-checkbox-value|nothing"
             tal:content="request/single-unvalued-checkbox-value"></em>
-        <input type="checkbox" name="single-unvalued-checkbox-value" 
+        <input type="checkbox" name="single-unvalued-checkbox-value"
                id="single-unvalued-checkbox" checked="checked" />
         <label for="single-unvalued-checkbox">Single Unvalued Checkbox</label>
       </div>
@@ -81,7 +81,7 @@
         <em tal:condition="
             request/single-disabled-unvalued-checkbox-value|nothing"
             tal:content="request/single-disabled-unvalued-checkbox-value"></em>
-        <input type="checkbox" name="single-disabled-unvalued-checkbox-value" 
+        <input type="checkbox" name="single-disabled-unvalued-checkbox-value"
                id="single-disabled-unvalued-checkbox" checked="checked"
                disabled="disabled" />
         <label for="single-disabled-unvalued-checkbox">
@@ -92,7 +92,7 @@
       <div>
         <em tal:condition="request/single-valued-checkbox-value|nothing"
             tal:content="request/single-valued-checkbox-value"></em>
-        <label><input type="checkbox" name="single-valued-checkbox-value" 
+        <label><input type="checkbox" name="single-valued-checkbox-value"
                       value="1" checked="checked" />Single Valued Checkbox
         </label>
       </div>
@@ -101,12 +101,12 @@
         (Multi checkbox: options have the labels)
         <em tal:condition="request/multi-checkbox-value|nothing"
             tal:content="request/multi-checkbox-value"></em>
-        <label><input type="checkbox" name="multi-checkbox-value" value="1" 
+        <label><input type="checkbox" name="multi-checkbox-value" value="1"
                       checked="checked" /> One</label>
-        <input type="checkbox" name="multi-checkbox-value" value="2" 
+        <input type="checkbox" name="multi-checkbox-value" value="2"
                id="multi-checkbox-value-2" />
         <label for="multi-checkbox-value-2">Two</label>
-        <label><input type="checkbox" name="multi-checkbox-value" value="3" 
+        <label><input type="checkbox" name="multi-checkbox-value" value="3"
                       id="multi-checkbox-value-3" checked="checked" />Three
         </label>
         <label for="multi-checkbox-value-3">Third</label>

Modified: zc.testbrowser/trunk/src/zc/testbrowser/real.py
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/real.py	2008-04-29 06:35:35 UTC (rev 85843)
+++ zc.testbrowser/trunk/src/zc/testbrowser/real.py	2008-04-29 06:37:13 UTC (rev 85844)
@@ -3,6 +3,7 @@
 import simplejson
 import socket
 import telnetlib
+import tempfile
 import time
 import urlparse
 import zc.testbrowser.browser
@@ -404,6 +405,21 @@
                             % self.type)
         if isinstance(file, str):
             file = StringIO(file)
+        # Instead of honoring the filename, we are storing the data in a
+        # temporary file and reference it:
+        fn = os.path.join(tempfile.mkdtemp(), os.path.split(filename)[1])
+        dataFile = open(fn, 'w')
+        dataFile.write(file.read())
+        dataFile.close()
+        file.seek(0)
+        # Due to a security feature for user-generated Javascript code,
+        # browsers do not allow the file upload field's value attribute to be
+        # set. But, if we execute the Javascript directly via MozRepl, then
+        # this security restriction does not exist.
+        id = self.browser.execute('tb_tokens[%s].id' % self.token)
+        self.browser.execute(
+            'content.document.getElementById("%s").value = %s' % (
+            id, simplejson.dumps(fn)))
         # HTML only supports ever setting one file for one input control
         self._file = (file, content_type, filename)
 

Modified: zc.testbrowser/trunk/src/zc/testbrowser/tests.py
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/tests.py	2008-04-29 06:35:35 UTC (rev 85843)
+++ zc.testbrowser/trunk/src/zc/testbrowser/tests.py	2008-04-29 06:37:13 UTC (rev 85844)
@@ -76,8 +76,11 @@
 
     def do_POST(self):
         body = self.rfile.read(int(self.headers['content-length']))
-        values = cgi.parse_qs(body)
-        self.wfile
+        type, params = cgi.parse_header(self.headers['content-type'])
+        if type == 'multipart/form-data':
+            values = cgi.parse_multipart(StringIO(body), params)
+        else:
+            values = cgi.parse_qs(body)
         self.send_response(200)
         self.send_header('Content-type', 'text/plain')
         self.end_headers()



More information about the Checkins mailing list