55
55
except StandardError, err:
56
56
return ComparableException(err)
58
# A list of test cases. Each test case is a a two-tuple that contains
59
# a string with the query and a dictionary with the expected result.
61
parse_qsl_test_cases = [
70
("&a=b", [('a', 'b')]),
71
("a=a+b&b=b+c", [('a', 'a b'), ('b', 'b c')]),
72
("a=1&a=2", [('a', '1'), ('a', '2')]),
75
58
parse_strict_test_cases = [
76
59
("", ValueError("bad query field: ''")),
77
60
("&", ValueError("bad query field: ''")),
130
113
def first_second_elts(list):
131
114
return map(lambda p:(p[0], p[1][0]), list)
116
def gen_result(data, environ):
117
fake_stdin = StringIO(data)
119
form = cgi.FieldStorage(fp=fake_stdin, environ=environ)
122
for k, v in dict(form).items():
123
result[k] = type(v) is list and form.getlist(k) or v.value
133
127
class CgiTests(unittest.TestCase):
136
for orig, expect in parse_qsl_test_cases:
137
result = cgi.parse_qsl(orig, keep_blank_values=True)
138
self.assertEqual(result, expect, "Error parsing %s" % repr(orig))
140
129
def test_strict(self):
141
130
for orig, expect in parse_strict_test_cases:
142
131
# Test basic parsing
278
267
got = getattr(fs.list[x], k)
279
268
self.assertEquals(got, exp)
272
'key2': ['value2x', 'value2y'],
276
def testQSAndUrlEncode(self):
277
data = "key2=value2x&key3=value3&key4=value4"
279
'CONTENT_LENGTH': str(len(data)),
280
'CONTENT_TYPE': 'application/x-www-form-urlencoded',
281
'QUERY_STRING': 'key1=value1&key2=value2y',
282
'REQUEST_METHOD': 'POST',
284
v = gen_result(data, environ)
285
self.assertEqual(self._qs_result, v)
287
def testQSAndFormData(self):
290
Content-Disposition: form-data; name="key2"
294
Content-Disposition: form-data; name="key3"
298
Content-Disposition: form-data; name="key4"
304
'CONTENT_LENGTH': str(len(data)),
305
'CONTENT_TYPE': 'multipart/form-data; boundary=-123',
306
'QUERY_STRING': 'key1=value1&key2=value2x',
307
'REQUEST_METHOD': 'POST',
309
v = gen_result(data, environ)
310
self.assertEqual(self._qs_result, v)
312
def testQSAndFormDataFile(self):
315
Content-Disposition: form-data; name="key2"
319
Content-Disposition: form-data; name="key3"
323
Content-Disposition: form-data; name="key4"
327
Content-Disposition: form-data; name="upload"; filename="fake.txt"
328
Content-Type: text/plain
330
this is the content of the fake file
335
'CONTENT_LENGTH': str(len(data)),
336
'CONTENT_TYPE': 'multipart/form-data; boundary=-123',
337
'QUERY_STRING': 'key1=value1&key2=value2x',
338
'REQUEST_METHOD': 'POST',
340
result = self._qs_result.copy()
342
'upload': 'this is the content of the fake file\n'
344
v = gen_result(data, environ)
345
self.assertEqual(result, v)
347
def test_deprecated_parse_qs(self):
348
# this func is moved to urlparse, this is just a sanity check
349
self.assertEqual({'a': ['A1'], 'B': ['B3'], 'b': ['B2']},
350
cgi.parse_qs('a=A1&b=B2&B=B3'))
352
def test_deprecated_parse_qsl(self):
353
# this func is moved to urlparse, this is just a sanity check
354
self.assertEqual([('a', 'A1'), ('b', 'B2'), ('B', 'B3')],
355
cgi.parse_qsl('a=A1&b=B2&B=B3'))
282
359
run_unittest(CgiTests)