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, "can_delete": True, "can_view": True, "description": "1112322" }, ) 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()