i write a test for my login view in django rest framework. it's the test:
class LoginViewTests(APITestCase):
def setUp(self):
self.user = User.objects.create_user(
phone_number='09012345678',
password='Test_1_Password'
)
def test_login(self):
url = reverse('login')
data = {
'phone_number': '09012345678',
'password': 'Test_1_Password'
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_login_user_does_not_exist(self):
url = reverse('login')
data = {'phone_number': '09123456789', 'password': 'Test_1_Password'}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
this is relevant view:
class LoginView(generics.GenericAPIView):
serializer_class = LoginSerializer
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
return Response(serializer.data, status=status.HTTP_200_OK)
and serializer:
class LoginSerializer(serializers.Serializer):
phone_number = serializers.CharField(max_length=13, required=True)
password = serializers.CharField(max_length=50, required=True, write_only=True)
tokens = serializers.SerializerMethodField(read_only=True)
def get_tokens(self, obj):
user = User.objects.get(phone_number=obj['phone_number'])
return {
'refresh': user.tokens()['refresh'],
'access': user.tokens()['access']
}
class Meta:
model = User
fields = ['phone_number', 'password', 'tokens']
def validate(self, attrs):
phone_number = attrs.get('phone_number', '')
password = attrs.get('password', '')
user = auth.authenticate(phone_number=phone_number, password=password)
if not user:
raise AuthenticationFailed('Invalid credentials')
if not user.is_active:
raise AuthenticationFailed('Account disabled, contact admin')
if not user.is_verified:
raise AuthenticationFailed('phone number is not verified')
return {
'phone_number': user.phone_number,
'tokens': user.tokens
}
when i test it by postman or swagger, login successful, but when i run the test, i get error 401 unauthorized. you can see, i didn't use IsAuthenticated permission
i check everything in view and serializer could make the problem, but everything look good, also i set permission AllowAny for view but result was same.