zapretgui/tests/test_dns_line_check.py
loop-uh 2dc5fab433
All checks were successful
Zapret source guards / validate (push) Successful in 9s
Настройки DNS: плитки серверов учитывают свою проверку на линии
Отметка «блокируется» в каталоге общая для России, а блокировки у каждого
провайдера свои. Если в BlockCheck → «DNS-серверы» проверка была не дольше
двух недель назад, плитка берёт вывод из неё:

- dns/line_check.py: последняя сохранённая проверка → LineCheck
  (время и по серверу вывод CARD_* с замечанием), без Qt;
- runtime.load_page_state = load_state + line_check; страница и заготовка
  при запуске грузят его, внутренние вызовы apply_dns — нет;
- «Блокируется по дороге» и «Не отвечает» ставят отметку blocked,
  «Работает» снимает отметку каталога; в подсказке строка
  «Проверка 12.10 21:05 на вашей линии: …»; предупреждение после
  применения смотрит на ту же отметку;
- старый внешний load_state (public/commands) удалён — им никто не пользовался.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 01:59:39 +03:00

73 lines
2.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Прошлая проверка «DNS-серверов» для плиток «Настройки DNS»: какая берётся и какая нет."""
from __future__ import annotations
import unittest
from datetime import datetime
from types import SimpleNamespace
from unittest.mock import patch
from dns import line_check
from dns.server_check_plans import CARD_NETWORK, CARD_OK, CARD_UNKNOWN
from dns.state import LineCheck
NOW = datetime(2026, 10, 13, 12, 0)
REPORT = object()
CARDS = (
SimpleNamespace(server="Quad9", status=CARD_NETWORK, note="подменяет обычные ответы"),
SimpleNamespace(server="Google DNS", status=CARD_OK, note=""),
# До сервера проверка не дошла — о нём ничего не известно.
SimpleNamespace(server="AdGuard", status=CARD_UNKNOWN, note=""),
)
def _settings(*runs: dict) -> dict:
return {"blockcheck": {"servers_history": list(runs)}}
class LineCheckTests(unittest.TestCase):
def _load(self, settings: dict, report=REPORT):
with (
patch("settings.store.read_settings", return_value=settings),
patch("dns.commands.load_past_server_check_report", return_value=report) as loader,
patch("dns.server_check_plans.build_cards", return_value=CARDS),
):
return line_check.load_line_check(now=NOW), loader
def test_last_saved_check_gives_card_per_known_server(self) -> None:
old = {"time": "2026-10-10T10:00:00", "log_file": "old.json"}
last = {"time": "2026-10-12T21:05:00", "log_file": "last.json"}
found, loader = self._load(_settings(old, last))
loader.assert_called_once_with("last.json")
self.assertEqual(found.time, "2026-10-12T21:05:00")
self.assertEqual(
found.cards, (("Quad9", CARD_NETWORK, "подменяет обычные ответы"), ("Google DNS", CARD_OK, ""))
)
def test_old_check_is_not_shown(self) -> None:
found, loader = self._load(_settings({"time": "2026-09-20T10:00:00", "log_file": "x.json"}))
self.assertIsNone(found)
loader.assert_not_called()
def test_no_history_unreadable_time_or_lost_file_give_nothing(self) -> None:
for settings, report in (
({}, REPORT),
(_settings({"time": "2026-10-12T21:05:00"}), REPORT),
(_settings({"time": "вчера", "log_file": "x.json"}), REPORT),
(_settings({"time": "2026-10-12T21:05:00", "log_file": "x.json"}), None),
):
with self.subTest(settings=settings, report=report is not None):
self.assertIsNone(self._load(settings, report)[0])
def test_card_lookup_by_server_name(self) -> None:
check = LineCheck(time="2026-10-12T21:05:00", cards=(("Quad9", CARD_OK, ""),))
self.assertEqual(check.card("Quad9"), (CARD_OK, ""))
self.assertIsNone(check.card("Google DNS"))
if __name__ == "__main__":
unittest.main()