[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