blob: 7cb459a4db65e87ac8346d90aeab2275ed9605fd [file] [edit]
# -*- coding: utf-8 -*-
from webob import Request
import webtest
from webtest.compat import to_bytes
from tests.compat import unittest
from tests.compat import u
def input_app(environ, start_response):
req = Request(environ)
status = "200 OK"
body = to_bytes(
"""
<html>
<head><title>form page</title></head>
<body>
<form method="POST" id="text_input_form">
<input name="foo" type="text" value="bar">
<input name="button" type="submit" value="text">
</form>
<form method="POST" id="radio_input_form">
<input name="foo" type="radio" value="bar">
<input name="foo" type="radio" value="baz" checked>
<input name="button" type="submit" value="radio">
</form>
<form method="POST" id="checkbox_input_form">
<input name="foo" type="checkbox" value="bar" checked>
<input name="button" type="submit" value="text">
</form>
<form method="POST" id="textarea_input_form">
<textarea name="textarea">&#39;&#x66;&#x6f;&#x6f;&amp;&#x62;&#x61;&#x72;&#39;</textarea>
</form>
</body>
</html>
""")
headers = [
('Content-Type', 'text/html'),
('Content-Length', str(len(body)))]
start_response(status, headers)
return [body]
def input_app_without_default(environ, start_response):
req = Request(environ)
status = "200 OK"
body = to_bytes(
"""
<html>
<head><title>form page</title></head>
<body>
<form method="POST" id="text_input_form">
<input name="foo" type="text">
<input name="button" type="submit" value="text">
</form>
<form method="POST" id="radio_input_form">
<input name="foo" type="radio" value="bar">
<input name="foo" type="radio" value="baz">
<input name="button" type="submit" value="radio">
</form>
<form method="POST" id="checkbox_input_form">
<input name="foo" type="checkbox" value="bar">
<input name="button" type="submit" value="text">
</form>
</body>
</html>
""")
headers = [
('Content-Type', 'text/html'),
('Content-Length', str(len(body)))]
start_response(status, headers)
return [body]
def input_unicode_app(environ, start_response):
req = Request(environ)
status = "200 OK"
body =\
u("""
<html>
<head><title>form page</title></head>
<body>
<form method="POST" id="text_input_form">
<input name="foo" type="text" value="Хармс">
<input name="button" type="submit" value="Сохранить">
</form>
<form method="POST" id="radio_input_form">
<input name="foo" type="radio" value="Хармс">
<input name="foo" type="radio" value="Блок" checked>
<input name="button" type="submit" value="Сохранить">
</form>
<form method="POST" id="checkbox_input_form">
<input name="foo" type="checkbox" value="Хармс" checked>
<input name="button" type="submit" value="Ура">
</form>
</body>
</html>
""").encode('utf8')
headers = [
('Content-Type', 'text/html; charset=utf-8'),
('Content-Length', str(len(body)))]
start_response(status, headers)
return [body]
class TestInput(unittest.TestCase):
def test_input(self):
app = webtest.TestApp(input_app)
res = app.get('/')
self.assertEqual(res.status_int, 200)
self.assertEqual(res.headers['content-type'], 'text/html')
self.assertEqual(res.content_type, 'text/html')
form = res.forms['text_input_form']
self.assertEqual(form['foo'].value, 'bar')
self.assertEqual(form.submit_fields(), [('foo', 'bar')])
form = res.forms['radio_input_form']
self.assertEqual(form['foo'].value, 'baz')
self.assertEqual(form.submit_fields(), [('foo', 'baz')])
form = res.forms['checkbox_input_form']
self.assertEqual(form['foo'].value, 'bar')
self.assertEqual(form.submit_fields(), [('foo', 'bar')])
def test_input_unicode(self):
app = webtest.TestApp(input_unicode_app)
res = app.get('/')
self.assertEqual(res.status_int, 200)
self.assertEqual(res.content_type, 'text/html')
self.assertEqual(res.charset, 'utf-8')
form = res.forms['text_input_form']
self.assertEqual(form['foo'].value, u('Хармс'))
self.assertEqual(form.submit_fields(), [('foo', u('Хармс'))])
form = res.forms['radio_input_form']
self.assertEqual(form['foo'].value, u('Блок'))
self.assertEqual(form.submit_fields(), [('foo', u('Блок'))])
form = res.forms['checkbox_input_form']
self.assertEqual(form['foo'].value, u('Хармс'))
self.assertEqual(form.submit_fields(), [('foo', u('Хармс'))])
def test_input_no_default(self):
app = webtest.TestApp(input_app_without_default)
res = app.get('/')
self.assertEqual(res.status_int, 200)
self.assertEqual(res.headers['content-type'], 'text/html')
self.assertEqual(res.content_type, 'text/html')
form = res.forms['text_input_form']
self.assertEqual(form['foo'].value, '')
self.assertEqual(form.submit_fields(), [('foo', '')])
form = res.forms['radio_input_form']
self.assertTrue(form['foo'].value is None)
self.assertEqual(form.submit_fields(), [])
form = res.forms['checkbox_input_form']
self.assertTrue(form['foo'].value is None)
self.assertEqual(form.submit_fields(), [])
def test_textarea_entities(self):
app = webtest.TestApp(input_app)
res = app.get('/')
form = res.forms.get("textarea_input_form")
self.assertEqual(form.get("textarea").value, "'foo&bar'")
self.assertEqual(form.submit_fields(), [('textarea', "'foo&bar'")])
class TestFormLint(unittest.TestCase):
def test_form_lint(self):
form = webtest.Form(None, '''<form>
<input type="text" name="field"/>
</form>''')
self.assertRaises(AttributeError, form.lint)
form = webtest.Form(None, '''<form>
<input type="text" id="myfield" name="field"/>
</form>''')
self.assertRaises(AttributeError, form.lint)
form = webtest.Form(None, '''<form>
<label for="myfield">my field</label>
<input type="text" id="myfield" name="field"/>
</form>''')
form.lint()
form = webtest.Form(None, '''<form>
<label class="field" for="myfield" role="r">my field</label>
<input type="text" id="myfield" name="field"/>
</form>''')
form.lint()