- Окно обрыва «на 16 КБ» задано один раз (diagnostics/limits.py, 12–36 КБ) вместо трёх разных: проверка сайтов, проба объёма и подбор стратегий судят по нему. Подбор больше не считает рабочей стратегию, после которой сайт замирает на 24–36 КБ, и читает ответ дальше верхней границы окна. - diagnostics/levels.py: «сайт открывается» и порядок важности уровней — одно правило для движка, истории, сравнения, итога и прошлых проверок. - Строка итога несёт site (ключ сайта) и section (раздел отчёта): экран открывает нужную карточку по ним, а не по первому слову русской фразы. Подмена DNS ведёт на «Подмену DNS», дата-центры Telegram — на карточку Telegram; кнопку «Telegram Proxy» ставит движок. - Отчёт получил report_version; diagnostics/report_upgrade.py — единственное место, которое знает старый вид и переводит отчёты из файла и истории. Убрано дублирующее поле dns_poisoning_detected. - Движок: шаги хода проверки задаёт services.progress_steps (одно место для движка, текста и экрана), пинг и «адрес как у браузера» — в net_access, шапка отчёта и сборка строк итога вынесены из run_blockcheck. Тест слоёв ловит любой импорт сокетов, TLS, HTTP и пинга в слое выводов. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
33 lines
1.3 KiB
Python
33 lines
1.3 KiB
Python
"""Одно правило уровней: «открывается», порядок важности и худший уровень."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from diagnostics import levels
|
|
from diagnostics.verdict import Level
|
|
|
|
|
|
class LevelsTests(unittest.TestCase):
|
|
def test_open_means_ok_or_warn(self) -> None:
|
|
self.assertTrue(levels.is_open("ok"))
|
|
self.assertTrue(levels.is_open(Level.WARN))
|
|
self.assertFalse(levels.is_open("fail"))
|
|
self.assertFalse(levels.is_open("unknown"))
|
|
|
|
def test_rank_puts_broken_first_and_strangers_last(self) -> None:
|
|
ranked = sorted(["ok", "что-то", "unknown", "fail", Level.WARN], key=levels.level_rank)
|
|
self.assertEqual(ranked, ["fail", Level.WARN, "unknown", "ok", "что-то"])
|
|
|
|
def test_worst(self) -> None:
|
|
self.assertEqual(levels.worst(["ok", "warn", "unknown"]), "warn")
|
|
self.assertEqual(levels.worst([]), "ok")
|
|
self.assertEqual(levels.worst(["мусор"]), "ok")
|
|
|
|
def test_engine_levels_match_report_strings(self) -> None:
|
|
# Уровни отчёта — значения Level движка, и других быть не должно.
|
|
self.assertEqual(set(levels.LEVELS), {level.value for level in Level})
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|