Тест представления Sign Up не проходит [Django REST]
Я пытаюсь протестировать представление регистрации в Django, используя REST Framework, но получаю ошибку assertio AssertionError: 201 != 400
при определении self.assertEqual(status.HTTP_201_CREATED, response.status_code)
. Я не совсем понимаю, откуда берется эта ошибка, поэтому прошу помощи.
Вот что у меня есть:
accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import ugettext_lazy as _
class CustomUser(AbstractUser):
username = models.CharField(max_length=20, unique=True)
email = models.EmailField(_('email address'), unique=True)
def __str__(self):
return self.email
accounts/serializers.py
from django.contrib.auth import get_user_model
from django.core.validators import EmailValidator
from rest_framework import serializers
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
import re
def company_email_validation(email):
pattern = r'(@gmail|@hotmail|@googlemail|@yahoo|@gmx|@ymail|@outlook|@bluewin|@protonmail|@online|@web|@online|@aol|@live)'
return bool(re.search(pattern, email))
class UserSerializer(serializers.ModelSerializer):
password1 = serializers.CharField(write_only=True)
password2 = serializers.CharField(write_only=True)
def validate(self, data):
email_validator = EmailValidator()
email_validator(data['email'])
if (company_email_validation(data['email'])):
raise serializers.ValidationError('You must use a company email')
if data['password1'] != data['password2']:
raise serializers.ValidationError('Passwords must match.')
return data
def create(self, validated_data):
data = {
key: value for key, value in validated_data.items()
if key not in ('password1', 'password2')
}
data['password'] = validated_data['password1']
data['email'] = validated_data['email']
return self.Meta.model.objects.create_user(**data)
class Meta:
model = get_user_model()
fields = (
'id', 'username', 'email', 'password1', 'password2',
)
read_only_fields = ('id',)
accounts/views.py
from django.contrib.auth import get_user_model
from rest_framework import generics
from rest_framework_simplejwt.views import TokenObtainPairView
from .serializers import UserSerializer, LogInSerializer
class SignUpView(generics.CreateAPIView):
queryset = get_user_model().objects.all()
serializer_class = UserSerializer
accounts/urls.py
from django.contrib import admin
from django.urls import path
from rest_framework_simplejwt.views import TokenRefreshView
from accounts.views import SignUpView, LogInView
urlpatterns = [
path('api/sign_up/', SignUpView.as_view(), name='sign_up'),
path('api/log_in/', LogInView.as_view(), name='log_in'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
tests/test_sign_up.py
import base64
import json
from django.contrib.auth import get_user_model
from rest_framework import status
from rest_framework.reverse import reverse
from rest_framework.test import APITestCase
PASSWORD = 'pAssw0rd!'
def create_user(username='exampleusername', password=PASSWORD):
return get_user_model().objects.create_user(
username=username,
password=password
)
class AuthenticationTest(APITestCase):
def test_user_can_sign_up(self):
response = self.client.post(reverse('sign_up'), data={
'username': 'exampleusername',
'password1': PASSWORD,
'password2': PASSWORD,
})
user = get_user_model().objects.last()
self.assertEqual(status.HTTP_201_CREATED, response.status_code)
self.assertEqual(response.data['id'], user.id)
self.assertEqual(response.data['username'], user.username)