0

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.

0 Answers0