Skip to content

Commit

Permalink
Add custom validation to password change serializer (#359)
Browse files Browse the repository at this point in the history
Co-authored-by: Thomas Gamauf <thomas.gamauf@gkcs.eu>
  • Loading branch information
tgamauf and Thomas Gamauf committed Feb 6, 2022
1 parent 449c18b commit fa5f33d
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
4 changes: 4 additions & 0 deletions dj_rest_auth/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -345,11 +345,15 @@ def validate_old_password(self, value):
raise serializers.ValidationError(err_msg)
return value

def custom_validation(self, attrs):
pass

def validate(self, attrs):
self.set_password_form = self.set_password_form_class(
user=self.user, data=attrs,
)

self.custom_validation(attrs)
if not self.set_password_form.is_valid():
raise serializers.ValidationError(self.set_password_form.errors)
return attrs
Expand Down
44 changes: 43 additions & 1 deletion dj_rest_auth/tests/test_serializers.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.core.exceptions import ValidationError
from django.test import TestCase, modify_settings, override_settings
from rest_framework.exceptions import ErrorDetail
from rest_framework.test import APIRequestFactory, force_authenticate
from unittest.mock import MagicMock

from dj_rest_auth.serializers import UserDetailsSerializer
from dj_rest_auth.serializers import PasswordChangeSerializer, UserDetailsSerializer


User = get_user_model()
Expand Down Expand Up @@ -57,3 +60,42 @@ def test_validate_username_without_all_auth(self):
)
self.assertEqual(True, serializer.is_valid())
self.assertEqual(serializer.validated_data, {'username': 'TestUsername'})


class TestPasswordChangeSerializer(TestCase):
@classmethod
def setUpTestData(cls):
user = User.objects.create_user(
username='alice', email='alice@test.com', first_name='Alice',
)
request_data = {
'new_password1': 'Password',
'new_password2': 'Password'
}
request = APIRequestFactory().post(request_data, format='json')
force_authenticate(request, user)

cls.request_data = request_data
cls.request = request

def test_custom_validation(self):
# Test custom validation success
PasswordChangeSerializer.custom_validation = MagicMock(return_value=True)
serializer = PasswordChangeSerializer(
reverse("rest_password_change"),
data=self.request_data
)
serializer.validate(self.request_data)
PasswordChangeSerializer.custom_validation.assert_called_once_with(self.request_data)

# Test custom validation error
PasswordChangeSerializer.custom_validation = MagicMock(
side_effect=ValidationError("failed")
)
serializer = PasswordChangeSerializer(
reverse("rest_password_change"),
data=self.request_data
)
with self.assertRaisesMessage(ValidationError, "failed"):
serializer.validate(self.request_data)

0 comments on commit fa5f33d

Please sign in to comment.