Просмотр исходного кода

Tests harness for validation API

Rafał Pitoń 11 лет назад
Родитель
Сommit
0aac803073
3 измененных файлов с 121 добавлено и 5 удалено
  1. 106 0
      misago/users/tests/test_api_views.py
  2. 2 0
      misago/users/urls.py
  3. 13 5
      misago/users/views/api.py

+ 106 - 0
misago/users/tests/test_api_views.py

@@ -0,0 +1,106 @@
+import json
+
+from django.contrib.auth import get_user_model
+from django.core.urlresolvers import reverse
+from django.test import TestCase
+
+
+class ValidationAPITests(TestCase):
+    ajax_header = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
+
+    def test_validate_username(self):
+        """test API for validating username"""
+        response = self.client.get(reverse('misago:api_validate_username'))
+        self.assertEqual(response.status_code, 405)
+
+        response = self.client.post(reverse('misago:api_validate_username'),
+                                    data={'username': 'Bob'},
+                                    **self.ajax_header)
+
+        self.assertEqual(response.status_code, 200)
+        data = json.loads(response.content)
+        self.assertEqual(data['has_error'], 0)
+        self.assertIn('username', data['message'])
+
+        User = get_user_model()
+        user = User.objects.create_user("Bob", "bob@bob.com", "pass123")
+
+        response = self.client.post(reverse('misago:api_validate_username'),
+                                    data={'username': 'Bob'},
+                                    **self.ajax_header)
+
+        self.assertEqual(response.status_code, 200)
+        data = json.loads(response.content)
+        self.assertEqual(data['has_error'], 1)
+        self.assertIn('not available', data['message'])
+
+        test_url = reverse('misago:api_validate_username',
+                           kwargs={'user_id': user.pk})
+
+        response = self.client.post(
+            test_url, data={'username': 'Bob'}, **self.ajax_header)
+
+        self.assertEqual(response.status_code, 200)
+        data = json.loads(response.content)
+        self.assertEqual(data['has_error'], 0)
+        self.assertIn('username', data['message'])
+
+    def test_validate_email(self):
+        """test API for validating email"""
+        response = self.client.get(reverse('misago:api_validate_email'))
+        self.assertEqual(response.status_code, 405)
+
+        response = self.client.post(reverse('misago:api_validate_email'),
+                                    data={'email': 'bob@bob.com'},
+                                    **self.ajax_header)
+
+        self.assertEqual(response.status_code, 200)
+        data = json.loads(response.content)
+        self.assertEqual(data['has_error'], 0)
+        self.assertIn('e-mail', data['message'])
+
+        User = get_user_model()
+        user = User.objects.create_user("Bob", "bob@bob.com", "pass123")
+
+        response = self.client.post(reverse('misago:api_validate_email'),
+                                    data={'email': 'bob@bob.com'},
+                                    **self.ajax_header)
+
+        self.assertEqual(response.status_code, 200)
+        data = json.loads(response.content)
+        self.assertEqual(data['has_error'], 1)
+        self.assertIn('not available', data['message'])
+
+        test_url = reverse('misago:api_validate_email',
+                           kwargs={'user_id': user.pk})
+
+        response = self.client.post(
+            test_url, data={'email': 'bob@bob.com'}, **self.ajax_header)
+
+        self.assertEqual(response.status_code, 200)
+        data = json.loads(response.content)
+        self.assertEqual(data['has_error'], 0)
+        self.assertIn('e-mail', data['message'])
+
+    def test_validate_password(self):
+        """test API for validating password"""
+        response = self.client.get(reverse('misago:api_validate_password'))
+        self.assertEqual(response.status_code, 405)
+
+        response = self.client.post(reverse('misago:api_validate_password'),
+                                    data={'password': 'pass123'},
+                                    **self.ajax_header)
+
+        self.assertEqual(response.status_code, 200)
+        data = json.loads(response.content)
+        self.assertEqual(data['has_error'], 0)
+        self.assertIn('password', data['message'])
+
+        response = self.client.post(reverse('misago:api_validate_password'),
+                                    data={'password': 'p'},
+                                    **self.ajax_header)
+
+        self.assertEqual(response.status_code, 200)
+        data = json.loads(response.content)
+        self.assertEqual(data['has_error'], 1)
+        self.assertIn('characters long', data['message'])

+ 2 - 0
misago/users/urls.py

@@ -15,6 +15,8 @@ urlpatterns += patterns('misago.users.views.register',
 
 urlpatterns += patterns('misago.users.views.api',
     url(r'^api/validate/username/$', 'validate_username', name='api_validate_username'),
+    url(r'^api/validate/username/(?P<user_id>\d+)/$', 'validate_username', name='api_validate_username'),
     url(r'^api/validate/email/$', 'validate_email', name='api_validate_email'),
+    url(r'^api/validate/email/(?P<user_id>\d+)/$', 'validate_email', name='api_validate_email'),
     url(r'^api/validate/password/$', 'validate_password', name='api_validate_password'),
 )

+ 13 - 5
misago/users/views/api.py

@@ -1,5 +1,7 @@
+from django.contrib.auth import get_user_model
 from django.core.exceptions import ValidationError
 from django.http import JsonResponse
+from django.shortcuts import get_object_or_404
 from django.utils.translation import ugettext as _
 from django.views.decorators.debug import sensitive_post_parameters
 
@@ -13,6 +15,10 @@ def api(f):
     @ajax_only
     @require_POST
     def decorator(request, *args, **kwargs):
+        if kwargs.get('user_id'):
+            User = get_user_model()
+            kwargs['user'] = get_object_or_404(User, pk=kwargs.pop('user_id'))
+
         try:
             return JsonResponse({
                 'has_error': 0,
@@ -27,25 +33,27 @@ def api(f):
 
 
 @api
-def validate_username(request, exclude=None):
+def validate_username(request, user=None):
     try:
-        validators.validate_username(request.POST['username'])
+        validators.validate_username(request.POST['username'],
+                                     exclude=user)
         return _("Entered username is valid.")
     except KeyError:
         raise ValidationError(_('Enter username.'))
 
 
 @api
-def validate_email(request, exclude=None):
+def validate_email(request, user=None):
     try:
-        validators.validate_email(request.POST['email'])
+        validators.validate_email(request.POST['email'],
+                                  exclude=user)
         return _("Entered e-mail is valid.")
     except KeyError:
         raise ValidationError(_('Enter e-mail address.'))
 
 
 @api
-def validate_password(request, exclude=None):
+def validate_password(request):
     try:
         validators.validate_password(request.POST['password'])
         return _("Entered password is valid.")