changeset 463:452835f4429f

Fixing #225; for some reason MySQL finds the user 'John' when searching for 'John ' (note trailing space). This doesn't happen on SQLite. This causes a NoReverseMatch when searching for 'John ' in the member search. The solution is to call strip() on the form field contents in the clean_username() method of the search form.
author Brian Neal <bgneal@gmail.com>
date Sat, 09 Jul 2011 02:00:48 +0000
parents 53fdaf0da539
children bba1782992eb
files gpp/bio/forms.py gpp/bio/tests/__init__.py gpp/bio/tests/view_tests.py
diffstat 3 files changed, 80 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/gpp/bio/forms.py	Tue Jul 05 21:40:56 2011 +0000
+++ b/gpp/bio/forms.py	Sat Jul 09 02:00:48 2011 +0000
@@ -116,7 +116,7 @@
         js = settings.GPP_THIRD_PARTY_JS['jquery-ui']
 
     def clean_username(self):
-      username = self.cleaned_data['username']
+      username = self.cleaned_data['username'].strip()
       try:
          User.objects.get(username=username, is_active=True)
       except User.DoesNotExist:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/bio/tests/__init__.py	Sat Jul 09 02:00:48 2011 +0000
@@ -0,0 +1,1 @@
+from view_tests import *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/bio/tests/view_tests.py	Sat Jul 09 02:00:48 2011 +0000
@@ -0,0 +1,78 @@
+"""
+View tests for the bio application.
+
+"""
+import datetime
+
+from django.contrib.auth.models import User
+from django.test import TestCase
+from django.core.urlresolvers import reverse, NoReverseMatch
+
+
+class MemberSearchTest(TestCase):
+
+    USERNAME = u'John'
+
+    def setUp(self):
+        user = User.objects.create_user(self.USERNAME, '', 'password')
+        user.save()
+
+        self.username = 'test_user'
+        self.pw = 'password'
+        self.user = User.objects.create_user(self.username, '', self.pw)
+        self.user.save()
+        self.assertTrue(self.client.login(username=self.username,
+            password=self.pw))
+
+    def tearDown(self):
+        self.client.logout()
+
+    def testValidName(self):
+        """
+        Test a valid username.
+        """
+
+        response = self.client.post(reverse('bio-member_search'),
+                            {'username': self.USERNAME},
+                            follow=True)
+
+        self.assertEqual(len(response.redirect_chain), 1)
+        if response.redirect_chain:
+            self.assertEqual(response.redirect_chain[0][0],
+                    'http://testserver' + reverse('bio-view_profile',
+                        kwargs={'username': self.USERNAME}))
+            self.assertEqual(response.redirect_chain[0][1], 302)
+
+        self.assertEqual(response.status_code, 200)
+
+    def testInvalidName(self):
+        """
+        Test a invalid username.
+        """
+
+        response = self.client.post(reverse('bio-member_search'),
+                            {'username': self.USERNAME + '!'})
+
+        self.assertEqual(response.status_code, 200)
+        self.assertContains(response, "That username does not exist.")
+
+    def testTrailingSpace(self):
+        """
+        Test a username with a trailing space.
+        """
+
+        try:
+            response = self.client.post(reverse('bio-member_search'),
+                                {'username': self.USERNAME + ' '},
+                                follow=True)
+        except NoReverseMatch:
+            self.fail('bit by a MySQL bug?')
+
+        self.assertEqual(len(response.redirect_chain), 1)
+        if response.redirect_chain:
+            self.assertEqual(response.redirect_chain[0][0],
+                    'http://testserver' + reverse('bio-view_profile',
+                        kwargs={'username': self.USERNAME}))
+            self.assertEqual(response.redirect_chain[0][1], 302)
+
+        self.assertEqual(response.status_code, 200)