From f157bcefcac9b921658c6782d4a64c173a203f12 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Thu, 22 Mar 2007 10:23:52 +0000 Subject: [PATCH] Fixes #3212 -- Added code to test client to allow posting of multi-form values (e.g., MultipleChoiceFields). Thanks, Ben Dean Kawamura. git-svn-id: http://code.djangoproject.com/svn/django/trunk@4774 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/test/client.py | 8 ++++++ tests/modeltests/test_client/models.py | 38 +++++++++++++++++++++++++- tests/modeltests/test_client/urls.py | 1 + tests/modeltests/test_client/views.py | 34 +++++++++++++++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) diff --git a/django/test/client.py b/django/test/client.py index 682dd01261edb..95d3b8592287c 100644 --- a/django/test/client.py +++ b/django/test/client.py @@ -69,6 +69,14 @@ def encode_multipart(boundary, data): '', value.read() ]) + elif hasattr(value, '__iter__'): + for item in value: + lines.extend([ + '--' + boundary, + 'Content-Disposition: form-data; name="%s"' % key, + '', + str(item) + ]) else: lines.extend([ '--' + boundary, diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py index a3a9749162c94..75f3c4990856f 100644 --- a/tests/modeltests/test_client/models.py +++ b/tests/modeltests/test_client/models.py @@ -81,7 +81,43 @@ def test_redirect(self): # Check that the response was a 302 (redirect) self.assertEqual(response.status_code, 302) - + + def test_valid_form(self): + "POST valid data to a form" + post_data = { + 'text': 'Hello World', + 'email': 'foo@example.com', + 'value': 37, + 'single': 'b', + 'multi': ('b','c','e') + } + response = self.client.post('/test_client/form_view/', post_data) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.template.name, "Valid POST Template") + + def test_incomplete_data_form(self): + "POST incomplete data to a form" + post_data = { + 'text': 'Hello World', + 'value': 37 + } + response = self.client.post('/test_client/form_view/', post_data) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.template.name, "Invalid POST Template") + + def test_form_error(self): + "POST erroneous data to a form" + post_data = { + 'text': 'Hello World', + 'email': 'not an email address', + 'value': 37, + 'single': 'b', + 'multi': ('b','c','e') + } + response = self.client.post('/test_client/form_view/', post_data) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.template.name, "Invalid POST Template") + def test_unknown_page(self): "GET an invalid URL" response = self.client.get('/test_client/unknown_view/') diff --git a/tests/modeltests/test_client/urls.py b/tests/modeltests/test_client/urls.py index 0bef1e9b71f46..707ecc186d7d2 100644 --- a/tests/modeltests/test_client/urls.py +++ b/tests/modeltests/test_client/urls.py @@ -6,6 +6,7 @@ (r'^post_view/$', views.post_view), (r'^raw_post_view/$', views.raw_post_view), (r'^redirect_view/$', views.redirect_view), + (r'^form_view/$', views.form_view), (r'^login_protected_view/$', views.login_protected_view), (r'^session_view/$', views.session_view), (r'^broken_view/$', views.broken_view) diff --git a/tests/modeltests/test_client/views.py b/tests/modeltests/test_client/views.py index 653e9a10e992c..36ec144cf61b0 100644 --- a/tests/modeltests/test_client/views.py +++ b/tests/modeltests/test_client/views.py @@ -2,6 +2,8 @@ from django.template import Context, Template from django.http import HttpResponse, HttpResponseRedirect from django.contrib.auth.decorators import login_required +from django.newforms.forms import Form +from django.newforms import fields def get_view(request): "A simple view that expects a GET request, and returns a rendered template" @@ -45,7 +47,39 @@ def raw_post_view(request): def redirect_view(request): "A view that redirects all requests to the GET view" return HttpResponseRedirect('/test_client/get_view/') + +TestChoices = ( + ('a', 'First Choice'), + ('b', 'Second Choice'), + ('c', 'Third Choice'), + ('d', 'Fourth Choice'), + ('e', 'Fifth Choice') +) + +class TestForm(Form): + text = fields.CharField() + email = fields.EmailField() + value = fields.IntegerField() + single = fields.ChoiceField(choices=TestChoices) + multi = fields.MultipleChoiceField(choices=TestChoices) + +def form_view(request): + "A view that tests a simple form" + if request.method == 'POST': + form = TestForm(request.POST) + if form.is_valid(): + t = Template('Valid POST data.', name='Valid POST Template') + c = Context() + else: + t = Template('Invalid POST data. {{ form.errors }}', name='Invalid POST Template') + c = Context({'form': form}) + else: + form = TestForm() + t = Template('Viewing base form. {{ form }}.', name='Form GET Template') + c = Context({'form': form}) + return HttpResponse(t.render(c)) + def login_protected_view(request): "A simple view that is login protected." t = Template('This is a login protected test. Username is {{ user.username }}.', name='Login Template')