feat(bot): точка входа, конфиг, главное меню, доступ для ADMIN_IDS, healthcheck
- config: pydantic-settings по подсистемам, ADMIN_IDS через запятую - texts.yaml + валидация при старте (лишний/пропущенный ключ — ошибка сразу) - меню: reply-клавиатура разделов (Участники — только админам), инлайн «Назад»/«Отмена» с редактированием сообщения на месте, /start, /menu, /help - AccessMiddleware (outer) на сообщениях и кнопках: до #25 пускает только ADMIN_IDS, постороннему — одна фраза в сутки, устаревшие кнопки молча гасятся - heartbeat-файл + HEALTHCHECK в Dockerfile; JSON-логи - FSM пока в памяти (фабрика), хранилище в БД — в #5 - тесты на фейковой сессии aiogram через настоящий Dispatcher Refs #4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
|
||||
from app.config import AccessSettings
|
||||
from app.texts import load_texts
|
||||
|
||||
|
||||
def test_admin_ids_parsed_from_comma_separated_env(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
monkeypatch.setenv("ADMIN_IDS", "1, 2,3,")
|
||||
assert AccessSettings(_env_file=None).admin_ids == frozenset({1, 2, 3}) # type: ignore[call-arg]
|
||||
|
||||
|
||||
def test_admin_ids_default_empty(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
monkeypatch.delenv("ADMIN_IDS", raising=False)
|
||||
assert AccessSettings(_env_file=None).admin_ids == frozenset() # type: ignore[call-arg]
|
||||
|
||||
|
||||
def test_texts_with_missing_key_fail_fast(tmp_path: Path) -> None:
|
||||
(tmp_path / "texts.yaml").write_text("menu: {commit: x}\n", encoding="utf-8")
|
||||
with pytest.raises(ValidationError):
|
||||
load_texts(tmp_path)
|
||||
Reference in New Issue
Block a user