Files
sqlalchemy-fastapi-pydentic…/server/testing/tests/endpoints_test.py
2025-10-12 18:30:20 +03:00

120 lines
4.1 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.parametrize("is_admin,expected_status", [
(False, 403),
(True, 200)
])
@pytest.mark.asyncio
async def test_delete_user(client, global_email, monkeypatch, 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!@#"
# добавляем обязательные поля из модели 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()