fix(tests): убрать директивы noqa на неактивное правило
All checks were successful
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m8s
CI / backend-tests (pull_request) Successful in 17m35s

`SLF001` (обращение к приватному члену) в конфиге ruff не включён, поэтому
`# noqa: SLF001` — подавление того, что и так не проверяется. Ruff ловит это
правилом RUF100 и валит проверку.

Тест намеренно лезет в приватные `_tg`, `_PENDING`, `_send_alert`: подмена
единственного шва до сети — и есть смысл этих тестов. Пояснение, которое
стояло после директивы, сохранено обычным комментарием.
This commit is contained in:
bot-backend 2026-08-27 14:32:34 +03:00
parent 053a5fb75c
commit 4e8daff675

View file

@ -68,25 +68,25 @@ def app(monkeypatch: pytest.MonkeyPatch) -> ModuleType:
sent.append((method, payload))
return {"ok": True, "result": {"message_id": 1000 + len(sent)}}
mod._tg = fake_tg # noqa: SLF001 — единственный шов, ради него тест и существует
mod._tg = fake_tg # единственный шов, ради него тест и существует
mod.sent = sent
mod._PENDING.clear() # noqa: SLF001
mod._PENDING.clear()
return mod
def test_gorjaschiy_incident_uhodit_s_knopkoy(app: ModuleType) -> None:
"""У горящего инцидента есть кнопка со ссылкой и живой токен."""
app._send_alert(FIRING) # noqa: SLF001
app._send_alert(FIRING)
method, payload = app.sent[0]
assert method == "sendMessage"
assert "reply_markup" in payload, "кнопка не прицеплена"
assert "/ack/" in payload["reply_markup"], "в кнопке нет ссылки подтверждения"
assert len(app._PENDING) == 1, "токен не сохранён — нажатие будет некуда деть" # noqa: SLF001
assert len(app._PENDING) == 1, "токен не сохранён — нажатие будет некуда деть"
def test_soobschenie_adresovano_v_temu_i_zovyot_dezhurnogo(app: ModuleType) -> None:
"""Тема форума и упоминание — обе вещи, которые молча теряются."""
app._send_alert(FIRING) # noqa: SLF001
app._send_alert(FIRING)
_, payload = app.sent[0]
assert payload.get("message_thread_id") == "158", "уйдёт в общую тему форума"
assert "@leks361" in payload["text"], "дежурного не позвали"
@ -95,10 +95,10 @@ def test_soobschenie_adresovano_v_temu_i_zovyot_dezhurnogo(app: ModuleType) -> N
def test_vosstanovlenie_bez_knopki(app: ModuleType) -> None:
"""У «восстановлено» подтверждать нечего — кнопки быть не должно."""
app._send_alert(RESOLVED) # noqa: SLF001
app._send_alert(RESOLVED)
_, payload = app.sent[0]
assert "reply_markup" not in payload
assert not app._PENDING, "токен выдан там, где кнопки нет" # noqa: SLF001
assert not app._PENDING, "токен выдан там, где кнопки нет"
def test_esli_knopka_ne_prikrepilas_soobschenie_vsyo_ravno_uhodit(
@ -117,7 +117,7 @@ def test_esli_knopka_ne_prikrepilas_soobschenie_vsyo_ravno_uhodit(
return None if "reply_markup" in payload else {"ok": True, "result": {"message_id": 7}}
monkeypatch.setattr(app, "_tg", flaky)
app._send_alert(FIRING) # noqa: SLF001
app._send_alert(FIRING)
assert len(calls) == 2, "не было повтора без кнопки — алерт потерян"
assert "reply_markup" not in calls[1]
assert calls[1]["text"] == calls[0]["text"], "во второй попытке потерялся текст"
@ -125,8 +125,8 @@ def test_esli_knopka_ne_prikrepilas_soobschenie_vsyo_ravno_uhodit(
def test_nazhatie_otvechaet_v_temu_i_snimaet_knopku(app: ModuleType) -> None:
"""Нажатие: ответ в тему + снятие клавиатуры у исходного сообщения."""
app._send_alert(FIRING) # noqa: SLF001
token = next(iter(app._PENDING)) # noqa: SLF001
app._send_alert(FIRING)
token = next(iter(app._PENDING))
app.sent.clear()
code, page = app.do_ack(token)
@ -143,8 +143,8 @@ def test_nazhatie_otvechaet_v_temu_i_snimaet_knopku(app: ModuleType) -> None:
def test_povtornoe_nazhatie_ne_shlyot_vtoroy_raz(app: ModuleType) -> None:
"""Идемпотентность: ссылка живёт сутки, по ней кликнут дважды."""
app._send_alert(FIRING) # noqa: SLF001
token = next(iter(app._PENDING)) # noqa: SLF001
app._send_alert(FIRING)
token = next(iter(app._PENDING))
app.do_ack(token)
app.sent.clear()
@ -164,16 +164,16 @@ def test_neizvestnyy_token_nichego_ne_rasskazyvaet(app: ModuleType) -> None:
def test_token_dostatochno_dlinnyy(app: ModuleType) -> None:
"""Ссылка защищена только неугадываемостью — длина токена и есть защита."""
app._send_alert(FIRING) # noqa: SLF001
token = next(iter(app._PENDING)) # noqa: SLF001
app._send_alert(FIRING)
token = next(iter(app._PENDING))
assert len(token) >= 20, f"слишком короткий токен: {len(token)} символов"
def test_protuhshiy_token_ne_prinimaetsya(app: ModuleType, monkeypatch: pytest.MonkeyPatch) -> None:
"""По истечении срока ссылка мертва — иначе она копится вечно."""
app._send_alert(FIRING) # noqa: SLF001
token = next(iter(app._PENDING)) # noqa: SLF001
app._PENDING[token]["created"] -= app.TTL_SEC + 1 # noqa: SLF001
app._send_alert(FIRING)
token = next(iter(app._PENDING))
app._PENDING[token]["created"] -= app.TTL_SEC + 1
app.sent.clear()
code, _ = app.do_ack(token)