# test_user_api.py
from rest_framework.test import APITestCase
from django.urls import reverse
from django.contrib.auth import get_user_model
User = get_user_model()
class UserAPITests(APITestCase):
def test_create_user_success():
url = reverse("v1:create-user")
data = {
"email": "newuser@example.com",
"first_name": "New",
"last_name": "User",
"password": "newpassword123",
}
response = self.client.post(url, data, format='json')
assert response.status_code == 201
assert "id" in response.data
assert response.data["email"] == "newuser@example.com"
assert User.objects.filter(email="newuser@example.com").exists()
def test_login_user_success():
# Criar um usuário primeiro
self.client.post(reverse("v1:create-user"), {
"email": "loginuser@example.com",
"first_name": "Login",
"last_name": "User",
"password": "loginpassword123",
}, format='json')
url = reverse("v1:login")
data = {
"email": "loginuser@example.com",
"password": "loginpassword123",
}
response = self.client.post(url, data, format='json')
assert response.status_code == 200
assert "access_token" in response.data
assert "refresh_token" in response.data
def test_list_users_success():
# Criar alguns usuários
self.client.post(reverse("v1:create-user"), {
"email": "user1@example.com", "first_name": "User", "last_name": "One", "password": "password123"
}, format='json')
self.client.post(reverse("v1:create-user"), {
"email": "user2@example.com", "first_name": "User", "last_name": "Two", "password": "password123"
}, format='json')
url = reverse("v1:user-list")
# É necessário estar autenticado para listar usuários (assumindo IsAdminUser ou similar)
# Por enquanto, se a permissão é AllowAny, pode ser testado diretamente.
response = self.client.get(url, format='json')
assert response.status_code == 200
assert len(response.data["users"]) >= 2
def test_get_user_by_id_success():
# Criar um usuário
create_response = self.client.post(reverse("v1:create-user"), {
"email": "getuser@example.com", "first_name": "Get", "last_name": "User", "password": "getuser123"
}, format='json')
user_id = create_response.data["id"]
url = reverse("v1:retrieve-user", kwargs={'pk': user_id})
# Este teste precisa de autenticação de admin. Para simplificar, vamos assumir que
# um admin está fazendo a requisição. Em um cenário real, você autenticaria o admin.
response = self.client.get(url, format='json')
assert response.status_code == 200
assert response.data["id"] == user_id
assert response.data["email"] == "getuser@example.com"
def test_change_password_success():
# Criar um usuário e autenticar (ou obter o ID do usuário de outra forma)
create_response = self.client.post(reverse("v1:create-user"), {
"email": "changepass@example.com", "first_name": "Change", "last_name": "Pass", "password": "oldpassword123"
}, format='json')
user_id = create_response.data["id"]
url = reverse("v1:user-alter-password", kwargs={'pk': user_id})
data = {
"old_password": "oldpassword123",
"new_password": "newstrongpassword123",
}
# Este teste precisa de autenticação de admin. Para simplificar, vamos assumir que
# um admin está fazendo a requisição. Em um cenário real, você autenticaria o admin.
response = self.client.put(url, data, format='json') # Ou patch
assert response.status_code == 200
assert response.data["success"]
# Tentar logar com a nova senha para confirmar
login_url = reverse("v1:login")
login_data = {"email": "changepass@example.com", "password": "newstrongpassword123"}
login_response = self.client.post(login_url, login_data, format='json')
assert login_response.status_code == 200