145 lines
4.9 KiB
Python
145 lines
4.9 KiB
Python
import pytest
|
|
import uuid #для генерации рандомного uuid
|
|
from httpx import AsyncClient, ASGITransport
|
|
from fastapi import status
|
|
from server.backend import JWT # твой JWT модуль
|
|
from server.backend.endpoints import api
|
|
from server.testing.conftest import client
|
|
from server.database import db
|
|
|
|
@pytest.fixture(scope="session")
|
|
def global_email():
|
|
"""Один и тот же email для всех тестов в сессии"""
|
|
return f"user_{uuid.uuid4().hex[:8]}@d.d"
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize("email,password,expected_status", [
|
|
("valid", "123qwe!@#", 200),
|
|
("invalidemail.com", "123qwe!@#", 422),
|
|
("invalidpassword", "1234", 422),
|
|
("invalidall", "1234", 422)
|
|
])
|
|
async def test_create_user(client, email, password, expected_status, global_email):
|
|
'''Проверка: Создание пользователя'''
|
|
|
|
|
|
if email == "valid":
|
|
email = global_email #Подставка глобальной фикстуры под конкретный вариант
|
|
|
|
user_data = {
|
|
"email": email,
|
|
"description": "test_user",
|
|
"activated": "True",
|
|
"password": password
|
|
}
|
|
response = await client.post(f"/user_create", json=user_data)
|
|
assert response.status_code == expected_status
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize("is_admin,expected_status", [
|
|
(False, 403),
|
|
(True, 200)
|
|
])
|
|
async def test_is_admin(client, monkeypatch, global_email, is_admin, expected_status):
|
|
"""Проверка: Прав пользователя"""
|
|
|
|
|
|
class FakePerm:
|
|
def __init__(self, is_admin): #Подменяем права пользователя
|
|
self.is_admin = is_admin
|
|
self.can_edit = False
|
|
self.can_delete = False
|
|
self.can_view = False
|
|
class FakeUser:
|
|
def __init__(self, is_admin):
|
|
self.email = global_email
|
|
self.permissions = [FakePerm(is_admin)]
|
|
self.description = "test_user"
|
|
self.activated = True
|
|
self.password = "123qwe!@#"
|
|
|
|
async def fake_get_user_by_email(email): #Подмена функции get_user_by_email
|
|
return FakeUser(is_admin)
|
|
monkeypatch.setattr(db, "get_user_by_email", fake_get_user_by_email)
|
|
|
|
async def fake_current_user():
|
|
return global_email
|
|
|
|
api.dependency_overrides[JWT.current_user] = fake_current_user
|
|
|
|
response = await client.put(
|
|
f"/user_update/{global_email}",
|
|
headers={"Authorization": "Bearer faketoken"},
|
|
json={"can_edit": True},
|
|
)
|
|
|
|
assert response.status_code == expected_status
|
|
api.dependency_overrides.clear()
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize("email,password,expected_status", [
|
|
("valid", "123qwe!@#", 200),
|
|
("invalidemail.com", "123qwe!@#", 422),
|
|
("invalidpassword", "1234", 422),
|
|
("invalidall", "1234", 422)
|
|
])
|
|
async def test_login_user(client, email, password, expected_status, global_email):
|
|
'''Проверка: Логин пользователя'''
|
|
|
|
|
|
if email == "valid":
|
|
email = global_email #Подставка глобальной фикстуры под конкретный вариант
|
|
|
|
user_data = {
|
|
"username": email,
|
|
"password": password
|
|
}
|
|
response = await client.post(f"/login", data=user_data)
|
|
assert response.status_code == expected_status
|
|
|
|
|
|
@pytest.mark.parametrize("is_admin, can_delete,expected_status", [
|
|
(False,True,200),
|
|
(True,True,200),
|
|
(True,False,200),
|
|
(False, False,403)
|
|
])
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_delete_user(client, global_email, monkeypatch, is_admin, expected_status, can_delete):
|
|
"""Проверка: Удаление пользователя"""
|
|
|
|
|
|
class FakePerm:
|
|
def __init__(self, is_admin):
|
|
self.is_admin = is_admin
|
|
self.can_edit = False
|
|
self.can_delete = can_delete
|
|
self.can_view = False
|
|
class FakeUser:
|
|
def __init__(self, is_admin):
|
|
self.email = global_email
|
|
self.permissions = [FakePerm(is_admin)]
|
|
self.description = "test_user"
|
|
self.activated = True
|
|
self.password = "123qwe!@#"
|
|
# добавляем обязательные поля из модели UserOut
|
|
self.created_at = "2025-10-12T00:00:00Z"
|
|
self.updated_at = "2025-10-12T00:00:00Z"
|
|
self.last_login = None
|
|
|
|
async def fake_get_user_by_email(email):
|
|
return FakeUser(is_admin)
|
|
monkeypatch.setattr(db, "get_user_by_email", fake_get_user_by_email)
|
|
|
|
async def fake_current_user():
|
|
return global_email
|
|
api.dependency_overrides[JWT.current_user] = fake_current_user
|
|
response = await client.delete(
|
|
f"/user_delete/{global_email}",
|
|
headers={"Authorization": "Bearer faketoken"}
|
|
)
|
|
|
|
assert response.status_code == expected_status
|
|
api.dependency_overrides.clear() |