Files
backend/core/apps/accounts/tests/test_auth.py

161 lines
5.6 KiB
Python

from unittest.mock import patch
import pytest
from core.apps.accounts.models import ResetToken
from core.services import SmsService
from django.contrib.auth import get_user_model
from django.urls import reverse
from django_core.models import SmsConfirm
from pydantic import BaseModel
from rest_framework import status
from rest_framework.test import APIClient
from django.utils import timezone
class TokenModel(BaseModel):
access: str
refresh: str
@pytest.fixture
def api_client():
return APIClient()
@pytest.fixture
def test_user(db):
phone = "998999999999"
password = "password"
user = get_user_model().objects.create_user(phone=phone, first_name="John", last_name="Doe", password=password)
user.validated_at = timezone.now()
user.save()
return user
@pytest.fixture
def sms_code(test_user):
code = "1111"
SmsConfirm.objects.create(phone=test_user.phone, code=code)
return code
@pytest.mark.django_db
def test_reg_view(api_client):
data = {
"phone": "998999999991",
}
with patch.object(SmsService, "send_confirm", return_value=True):
response = api_client.post(reverse("auth-register"), data=data)
assert response.status_code == status.HTTP_202_ACCEPTED
assert response.data["data"]["detail"] == f"Sms {data['phone']} raqamiga yuborildi"
@pytest.mark.django_db
def test_confirm_view(api_client, test_user, sms_code):
data = {"phone": test_user.phone, "code": sms_code}
response = api_client.post(reverse("auth-confirm"), data=data)
assert response.status_code == status.HTTP_202_ACCEPTED
@pytest.mark.django_db
def test_invalid_confirm_view(api_client, test_user):
data = {"phone": test_user.phone, "code": "1112"}
response = api_client.post(reverse("auth-confirm"), data=data)
assert response.status_code == status.HTTP_403_FORBIDDEN
@pytest.mark.django_db
def test_reset_confirmation_code_view(api_client, test_user, sms_code):
data = {"phone": test_user.phone, "code": sms_code}
response = api_client.post(reverse("auth-confirm"), data=data)
assert response.status_code == status.HTTP_202_ACCEPTED
assert "token" in response.data["data"]
@pytest.mark.django_db
def test_reset_confirmation_code_view_invalid_code(api_client, test_user):
data = {"phone": test_user.phone, "code": "123456"}
response = api_client.post(reverse("auth-confirm"), data=data)
assert response.status_code == status.HTTP_400_BAD_REQUEST
@pytest.mark.django_db
def test_reset_set_password_view(api_client, test_user):
token = ResetToken.objects.create(user=test_user, token="token")
data = {"token": token.token, "password": "new_password"}
response = api_client.post(reverse("reset-password-reset-password-set"), data=data)
assert response.status_code == status.HTTP_200_OK
@pytest.mark.django_db
def test_reset_set_password_view_invalid_token(api_client):
token = "test_token"
data = {"token": token, "password": "new_password"}
with patch.object(get_user_model().objects, "filter", return_value=get_user_model().objects.none()):
response = api_client.post(reverse("reset-password-reset-password-set"), data=data)
assert response.status_code == status.HTTP_403_FORBIDDEN
assert response.data["data"]["detail"] == "Invalid token"
@pytest.mark.django_db
def test_resend_view(api_client, test_user):
data = {"phone": test_user.phone}
response = api_client.post(reverse("auth-resend"), data=data)
assert response.status_code == status.HTTP_200_OK
@pytest.mark.django_db
def test_reset_password_view(api_client, test_user):
data = {"phone": test_user.phone}
response = api_client.post(reverse("reset-password-reset-password"), data=data)
assert response.status_code == status.HTTP_200_OK
@pytest.mark.django_db
def test_me_view(api_client, test_user):
api_client.force_authenticate(user=test_user)
response = api_client.get(reverse("me-me"))
assert response.status_code == status.HTTP_200_OK
@pytest.mark.django_db
def test_me_update_view(api_client, test_user):
api_client.force_authenticate(user=test_user)
data = {"first_name": "Updated"}
response = api_client.patch(reverse("me-user-update"), data=data)
assert response.status_code == status.HTTP_200_OK
@pytest.mark.django_db
def test_login_send_code(api_client, test_user):
data = {"phone": test_user.phone}
with patch.object(SmsService, "send_confirm", return_value=True):
response = api_client.post(reverse("login-send-code"), data=data)
assert response.status_code == status.HTTP_202_ACCEPTED
assert response.data["data"]["detail"] == f"Sms {test_user.phone} raqamiga yuborildi"
@pytest.mark.django_db
def test_login_send_code_invalid_phone(api_client, test_user):
phone = f"{test_user.phone}1"
data = {"phone": phone}
with patch.object(SmsService, "send_confirm", return_value=True):
response = api_client.post(reverse("login-send-code"), data=data)
assert response.status_code == status.HTTP_400_BAD_REQUEST
assert response.data["data"]["phone"][0] == f"Phone Not Found"
@pytest.mark.django_db
def test_login_code_confirm_view(api_client, test_user, sms_code):
data = {"phone": test_user.phone, "code": sms_code}
response = api_client.post(reverse("login-send-confirm"), data=data)
assert response.status_code == status.HTTP_202_ACCEPTED
@pytest.mark.django_db
def test_login_code_confirm_invalid_code(api_client, test_user):
data = {"phone": test_user.phone, "code": "123456"}
response = api_client.post(reverse("login-send-confirm"), data=data)
assert response.status_code == status.HTTP_400_BAD_REQUEST