From 4e8daff675d19701d14405699034295d4a97dac8 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 27 Aug 2026 14:32:34 +0300 Subject: [PATCH] =?UTF-8?q?fix(tests):=20=D1=83=D0=B1=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=B8=D0=B2=D1=8B?= =?UTF-8?q?=20noqa=20=D0=BD=D0=B0=20=D0=BD=D0=B5=D0=B0=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D0=B2=D0=BD=D0=BE=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `SLF001` (обращение к приватному члену) в конфиге ruff не включён, поэтому `# noqa: SLF001` — подавление того, что и так не проверяется. Ruff ловит это правилом RUF100 и валит проверку. Тест намеренно лезет в приватные `_tg`, `_PENDING`, `_send_alert`: подмена единственного шва до сети — и есть смысл этих тестов. Пояснение, которое стояло после директивы, сохранено обычным комментарием. --- backend/tests/ops/test_3078_alert_ack.py | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/backend/tests/ops/test_3078_alert_ack.py b/backend/tests/ops/test_3078_alert_ack.py index 70568523..58f3d471 100644 --- a/backend/tests/ops/test_3078_alert_ack.py +++ b/backend/tests/ops/test_3078_alert_ack.py @@ -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)