DispelEvilBot/tests/test_admin_titles.py

106 lines
3.3 KiB
Python

"""Тесты справочника званий."""
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