/
tsps
/
core
Обзор
Документация
Войти
/
tsps
/
core
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
tests/api/admin/test_courts.py
172 строки
7 KB
Василий Петров
Разделение ролей - защита delete
24 мар 2026, 17:43
24 мар 2026, 17:43
8523537
Код
Авторство
О чём код?
import pytest from tests.utils import clean_table from app.models import Court from fastapi.testclient import TestClient from app.main import app client = TestClient(app) @pytest.fixture(autouse=True) def clean_courts_table(): """Очищает таблицу court перед каждым тестом.""" clean_table(Court) def test_create_court(auth_headers): response = client.post("/api/admin/courts",json={"name": "Некий Суд РФ"}, headers=auth_headers) assert response.status_code == 201 data = response.json() assert data["name"] == "Некий Суд РФ" assert "id" in data def test_create_court_duplicate(auth_headers): # Первое создание client.post("/api/admin/courts", json={"name": "Арбитражный суд"}, headers=auth_headers) # Повтор response = client.post("/api/admin/courts", json={"name": "Арбитражный суд"}, headers=auth_headers) assert response.status_code == 409 assert response.json()["detail"] == "Суд с таким названием уже существует" def test_read_courts(auth_headers): client.post("/api/admin/courts", json={"name": "Суд 1"}, headers=auth_headers) client.post("/api/admin/courts", json={"name": "Суд 2"}, headers=auth_headers) response = client.get("/api/admin/courts", headers=auth_headers) assert response.status_code == 200 data = response.json() assert len(data['items']) == 2 names = {c["name"] for c in data['items']} assert names == {"Суд 1", "Суд 2"} def test_read_courts_filter_by_name(auth_headers): # Создаём несколько судов client.post("/api/admin/courts", json={"name": "Арбитражный суд Москвы"}, headers=auth_headers) client.post("/api/admin/courts", json={"name": "Мосгорсуд"}, headers=auth_headers) client.post("/api/admin/courts", json={"name": "Верховный Суд РФ"}, headers=auth_headers) # Фильтрация по подстроке (регистронезависимо) response = client.get("/api/admin/courts?name=мос", headers=auth_headers) assert response.status_code == 200 data = response.json() assert len(data['items']) == 2 names = {c["name"] for c in data['items']} assert names == {"Арбитражный суд Москвы", "Мосгорсуд"} # Точный регистр не важен response = client.get("/api/admin/courts?name=МОС", headers=auth_headers) assert response.status_code == 200 data = response.json() assert len(data['items']) == 2 # Нет совпадений response = client.get("/api/admin/courts?name=Казань", headers=auth_headers) assert response.status_code == 200 data = response.json() assert len(data['items']) == 0 def test_read_courts_pagination(auth_headers): # Создаём 5 судов for i in range(5): client.post("/api/admin/courts", json={"name": f"Суд {i + 1}"}, headers=auth_headers) # Запрашиваем первые 2 (skip=0, limit=2) response = client.get("/api/admin/courts?skip=0&limit=2", headers=auth_headers) assert response.status_code == 200 data = response.json() assert len(data['items']) == 2 names = {c["name"] for c in data['items']} assert names == {"Суд 1", "Суд 2"} # Запрашиваем следующие 2 (skip=2, limit=2) response = client.get("/api/admin/courts?skip=2&limit=2", headers=auth_headers) assert response.status_code == 200 data = response.json() assert len(data['items']) == 2 names = {c["name"] for c in data['items']} assert names == {"Суд 3", "Суд 4"} # Запрашиваем с пропуском за пределы данных response = client.get("/api/admin/courts?skip=10&limit=2", headers=auth_headers) assert response.status_code == 200 data = response.json() assert len(data['items']) == 0 def test_read_court(auth_headers): create_resp = client.post("/api/admin/courts", json={"name": "Мосгорсуд"}, headers=auth_headers) court_id = create_resp.json()["id"] response = client.get(f"/api/admin/courts/{court_id}", headers=auth_headers) assert response.status_code == 200 assert response.json()["name"] == "Мосгорсуд" def test_read_court_not_found(auth_headers): response = client.get("/api/admin/courts/999", headers=auth_headers) assert response.status_code == 404 assert response.json()["detail"] == "Суд не найден" def test_update_court(auth_headers): create_resp = client.post("/api/admin/courts", json={"name": "Старое название"}, headers=auth_headers) court_id = create_resp.json()["id"] response = client.patch( f"/api/admin/courts/{court_id}", json={"name": "Новое название"}, headers=auth_headers ) assert response.status_code == 200 assert response.json()["name"] == "Новое название" assert response.json()["id"] == court_id # ID не меняется def test_update_court_duplicate(auth_headers): client.post("/api/admin/courts", json={"name": "Суд А"}, headers=auth_headers) create_resp = client.post("/api/admin/courts", json={"name": "Суд Б"}, headers=auth_headers) court_id = create_resp.json()["id"] response = client.patch( f"/api/admin/courts/{court_id}", json={"name": "Суд А"}, headers=auth_headers ) assert response.status_code == 409 assert response.json()["detail"] == "Суд с таким названием уже существует" def test_delete_court(auth_headers): create_resp = client.post("/api/admin/courts", json={"name": "Удаляемый суд"}, headers=auth_headers) court_id = create_resp.json()["id"] response = client.delete(f"/api/admin/courts/{court_id}", headers=auth_headers) assert response.status_code == 204 # Проверяем, что удалён get_resp = client.get(f"/api/admin/courts/{court_id}", headers=auth_headers) assert get_resp.status_code == 404 def test_delete_court_auditor_forbidden(auth_headers, auditor_auth_headers): """Аудитор не может удалять суды — должен получить 403.""" # Подготовка: создаём суд через API (как супер-админ) create_resp = client.post( "/api/admin/courts", json={"name": "Суд-для-аудита"}, headers=auth_headers ) court_id = create_resp.json()["id"] # Попытка удалить с ролью auditor response = client.delete( f"/api/admin/courts/{court_id}", headers=auditor_auth_headers ) # Проверка ответа assert response.status_code == 403 assert response.json()["detail"] == "Требуется роль супер-администратора" # Убеждаемся, что суд не удалён get_resp = client.get(f"/api/admin/courts/{court_id}", headers=auth_headers) assert get_resp.status_code == 200 assert get_resp.json()["name"] == "Суд-для-аудита"