- Полный набор тестов для всех модулей API - test_auth.py: аутентификация и JWT токены - test_members.py: CRUD участников, агенты, токены - test_projects.py: CRUD проектов, участники проектов - test_tasks.py: CRUD задач, этапы, назначения, зависимости - test_chat.py: сообщения, комментарии, mentions - test_files.py: upload/download файлов проектов - test_labels.py: CRUD лейблов, привязка к задачам - test_websocket.py: WebSocket подключения и события - test_streaming.py: агентный стриминг через WebSocket - conftest.py: фикстуры для подключения к API - requirements.txt: зависимости pytest, httpx, websockets - pytest.ini: настройки asyncio для pytest
117 lines
4.0 KiB
Python
117 lines
4.0 KiB
Python
"""
|
|
Тесты аутентификации - логин и проверка JWT токена
|
|
"""
|
|
import pytest
|
|
import httpx
|
|
from conftest import assert_uuid
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_login_success(base_url: str):
|
|
"""Test successful admin login and JWT token validation"""
|
|
async with httpx.AsyncClient() as client:
|
|
response = await client.post(f"{base_url}/auth/login", json={
|
|
"login": "admin",
|
|
"password": "teamboard"
|
|
})
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
|
|
# Проверяем структуру ответа
|
|
assert "token" in data
|
|
assert "member_id" in data
|
|
assert "slug" in data
|
|
assert "role" in data
|
|
|
|
# Проверяем валидность данных
|
|
assert_uuid(data["member_id"])
|
|
assert data["slug"] == "admin"
|
|
assert data["role"] == "owner"
|
|
assert isinstance(data["token"], str)
|
|
assert len(data["token"]) > 10 # JWT должен быть длинным
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_login_with_slug(base_url: str):
|
|
"""Test login using slug instead of name"""
|
|
async with httpx.AsyncClient() as client:
|
|
response = await client.post(f"{base_url}/auth/login", json={
|
|
"login": "admin", # используем slug
|
|
"password": "teamboard"
|
|
})
|
|
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["slug"] == "admin"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_login_invalid_credentials(base_url: str):
|
|
"""Test login with invalid credentials returns 401"""
|
|
async with httpx.AsyncClient() as client:
|
|
response = await client.post(f"{base_url}/auth/login", json={
|
|
"login": "admin",
|
|
"password": "wrong_password"
|
|
})
|
|
|
|
assert response.status_code == 401
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_login_missing_fields(base_url: str):
|
|
"""Test login with missing required fields"""
|
|
async with httpx.AsyncClient() as client:
|
|
# Без пароля
|
|
response = await client.post(f"{base_url}/auth/login", json={
|
|
"login": "admin"
|
|
})
|
|
assert response.status_code == 422
|
|
|
|
# Без логина
|
|
response = await client.post(f"{base_url}/auth/login", json={
|
|
"password": "teamboard"
|
|
})
|
|
assert response.status_code == 422
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_protected_endpoint_without_auth(base_url: str):
|
|
"""Test that protected endpoints require authentication"""
|
|
async with httpx.AsyncClient() as client:
|
|
response = await client.get(f"{base_url}/members")
|
|
assert response.status_code == 401
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_protected_endpoint_with_invalid_token(base_url: str):
|
|
"""Test protected endpoint with invalid JWT token"""
|
|
headers = {"Authorization": "Bearer invalid_token"}
|
|
async with httpx.AsyncClient() as client:
|
|
response = await client.get(f"{base_url}/members", headers=headers)
|
|
assert response.status_code == 401
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_protected_endpoint_with_valid_token(http_client: httpx.AsyncClient):
|
|
"""Test that valid JWT token allows access to protected endpoints"""
|
|
response = await http_client.get("/members")
|
|
assert response.status_code == 200
|
|
assert isinstance(response.json(), list)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_agent_token_authentication(agent_client: httpx.AsyncClient):
|
|
"""Test that agent token works for API access"""
|
|
response = await agent_client.get("/members")
|
|
assert response.status_code == 200
|
|
assert isinstance(response.json(), list)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_token_query_parameter(base_url: str, admin_token: str):
|
|
"""Test authentication using token query parameter"""
|
|
async with httpx.AsyncClient() as client:
|
|
response = await client.get(f"{base_url}/members?token={admin_token}")
|
|
assert response.status_code == 200
|
|
assert isinstance(response.json(), list) |