Merge pull request 'Переименование фракции в админке откатывается при каждом перезапуске приложения (#72)' (#94) from issue-72-faction-rename into dev
Reviewed-on: #94
This commit was merged in pull request #94.
This commit is contained in:
@@ -33,7 +33,13 @@ FACTIONS: list[tuple[str, str, str, int]] = [
|
|||||||
|
|
||||||
|
|
||||||
def seed_reference_data(session: Session) -> None:
|
def seed_reference_data(session: Session) -> None:
|
||||||
"""Создаёт/обновляет дополнения и фракции. Безопасно вызывать многократно."""
|
"""Создаёт/обновляет дополнения и фракции. Безопасно вызывать многократно.
|
||||||
|
|
||||||
|
Идёт при каждом старте (entrypoint.sh, lifespan dev), поэтому не перетирает то, что
|
||||||
|
правят руками: имя существующей фракции меняет админка (admin_service.rename_faction),
|
||||||
|
и после создания записи источник правды для него — БД (#72). Имя из кода получает
|
||||||
|
только новая фракция; поправить имя существующей — админкой или миграцией.
|
||||||
|
Служебные поля (дополнение, порядок) и всё у дополнений синхронизируются с кодом."""
|
||||||
code_to_expansion: dict[str, Expansion] = {}
|
code_to_expansion: dict[str, Expansion] = {}
|
||||||
|
|
||||||
for code, name_ru, is_base, order in EXPANSIONS:
|
for code, name_ru, is_base, order in EXPANSIONS:
|
||||||
@@ -61,7 +67,6 @@ def seed_reference_data(session: Session) -> None:
|
|||||||
)
|
)
|
||||||
session.add(fac)
|
session.add(fac)
|
||||||
else:
|
else:
|
||||||
fac.name_ru = name_ru
|
|
||||||
fac.expansion_id = expansion.id # type: ignore[assignment]
|
fac.expansion_id = expansion.id # type: ignore[assignment]
|
||||||
fac.sort_order = order
|
fac.sort_order = order
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,11 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from fastapi.testclient import TestClient
|
from fastapi.testclient import TestClient
|
||||||
|
from sqlalchemy.pool import StaticPool
|
||||||
|
from sqlmodel import Session, SQLModel, create_engine, select
|
||||||
|
|
||||||
|
from app.models import Faction
|
||||||
|
from app.seed.reference_data import FACTIONS, seed_reference_data
|
||||||
from tests.conftest import add_group_member, create_finished_match, csrf_headers, login, start_match
|
from tests.conftest import add_group_member, create_finished_match, csrf_headers, login, start_match
|
||||||
|
|
||||||
|
|
||||||
@@ -205,6 +209,37 @@ def test_admin_rename_faction_system_wide(client: TestClient, make_admin, engine
|
|||||||
assert ap["faction_name"] == "Орки WAAAGH"
|
assert ap["faction_name"] == "Орки WAAAGH"
|
||||||
|
|
||||||
|
|
||||||
|
def test_faction_rename_survives_restart_seeding(client: TestClient, make_admin, engine):
|
||||||
|
"""Сидинг идёт при каждом старте (entrypoint.sh, lifespan) и не должен откатывать
|
||||||
|
имя, заданное админом (#72)."""
|
||||||
|
login(client, "Кто-то")
|
||||||
|
orks = next(f for f in client.get("/api/factions").json() if f["code"] == "orks")
|
||||||
|
_admin_login(client, make_admin)
|
||||||
|
r = client.patch(
|
||||||
|
f"/api/admin/factions/{orks['id']}",
|
||||||
|
json={"name_ru": "Орки WAAAGH"},
|
||||||
|
headers=csrf_headers(client),
|
||||||
|
)
|
||||||
|
assert r.status_code == 200, r.text
|
||||||
|
|
||||||
|
with Session(engine) as s:
|
||||||
|
seed_reference_data(s) # то же, что делает рестарт
|
||||||
|
assert s.get(Faction, orks["id"]).name_ru == "Орки WAAAGH"
|
||||||
|
|
||||||
|
|
||||||
|
def test_seeding_is_complete_and_idempotent():
|
||||||
|
"""Пустая БД: фракции из кода создаются со своими именами, повтор ничего не ломает."""
|
||||||
|
engine = create_engine(
|
||||||
|
"sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool
|
||||||
|
)
|
||||||
|
SQLModel.metadata.create_all(engine)
|
||||||
|
with Session(engine) as s:
|
||||||
|
seed_reference_data(s)
|
||||||
|
seed_reference_data(s)
|
||||||
|
names = {f.code: f.name_ru for f in s.exec(select(Faction)).all()}
|
||||||
|
assert names == {code: name for code, name, _exp, _order in FACTIONS}
|
||||||
|
|
||||||
|
|
||||||
def test_admin_delete_group_with_matches_is_conflict(client: TestClient, make_admin, engine):
|
def test_admin_delete_group_with_matches_is_conflict(client: TestClient, make_admin, engine):
|
||||||
"""Группу с партиями удалять нельзя — но ответ должен быть внятным 409.
|
"""Группу с партиями удалять нельзя — но ответ должен быть внятным 409.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user