"""Тесты справочника званий.""" from __future__ import annotations from typing import Any import pytest from fastapi.testclient import TestClient from common.repositories import titles_repo TITLE: dict[str, Any] = { "id_title": 1, "title": "Ветеран", "price": 500, "visible": True, "used": 2, } @pytest.fixture def fake_titles(monkeypatch: pytest.MonkeyPatch) -> dict[str, Any]: state: dict[str, Any] = {"used": 2} async def list_titles() -> list[dict[str, Any]]: return [TITLE] async def create_title(title: str, price: int, visible: bool) -> int: state["created"] = (title, price, visible) return 2 async def update_title(title_id: int, title: str, price: int, visible: bool) -> bool: state["updated"] = (title_id, title, price, visible) return True async def delete_title(title_id: int) -> bool: state["deleted"] = title_id return True async def usage_count(title_id: int) -> int: return state["used"] monkeypatch.setattr(titles_repo, "list_titles", list_titles) monkeypatch.setattr(titles_repo, "create_title", create_title) monkeypatch.setattr(titles_repo, "update_title", update_title) monkeypatch.setattr(titles_repo, "delete_title", delete_title) monkeypatch.setattr(titles_repo, "usage_count", usage_count) return state def _client(client_factory) -> TestClient: return client_factory(follow_redirects=False) def test_titles_list(fake_titles: dict[str, Any], client_factory) -> None: response = _client(client_factory).get("/titles") assert response.status_code == 200 assert "Ветеран" in response.text assert "используется: 2" in response.text def test_create_title(fake_titles: dict[str, Any], client_factory, csrf_token) -> None: client = _client(client_factory) token = csrf_token(client.get("/titles").text) response = client.post("/titles", data={"title": "Новичок", "price": "100", "csrf_token": token}) assert response.status_code == 303 assert fake_titles["created"] == ("Новичок", 100, True) def test_update_title(fake_titles: dict[str, Any], client_factory, csrf_token) -> None: client = _client(client_factory) token = csrf_token(client.get("/titles").text) response = client.post( "/titles/1", data={"title": "Ветеран+", "price": "700", "visible": "on", "csrf_token": token}, ) assert response.status_code == 303 assert fake_titles["updated"] == (1, "Ветеран+", 700, True) def test_delete_used_title(fake_titles: dict[str, Any], client_factory, csrf_token) -> None: client = _client(client_factory) token = csrf_token(client.get("/titles").text) response = client.post("/titles/1/delete", data={"csrf_token": token}) assert response.status_code == 400 assert "используется 2 игроками" in response.text assert "deleted" not in fake_titles def test_delete_unused_title(fake_titles: dict[str, Any], client_factory, csrf_token) -> None: fake_titles["used"] = 0 client = _client(client_factory) token = csrf_token(client.get("/titles").text) response = client.post("/titles/1/delete", data={"csrf_token": token}) assert response.status_code == 303 assert fake_titles["deleted"] == 1