106 lines
3.3 KiB
Python
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
|