zapretgui/tests/test_dns_check_reference_note.py
loop-uh 5d541b833e
All checks were successful
Zapret source guards / validate (push) Successful in 9s
DNS подмена: чужой сертификат проверяется контролем на настоящем адресе, итог один для панели, строки состояния и истории
- Чужой сертификат по адресу из DNS теперь перепроверяется тем же запросом к
  настоящему адресу сайта (как контроль у OONI). Если и там чужой — HTTPS
  подменяет антивирус, прокси или сеть, а не DNS: это «не узнали», а не
  «подмена». Без эталона чужой сертификат тоже ничего не доказывает.
- Сводка итога вынесена из виджетов в dns_check_plans; строка состояния
  строится из неё: при сбое и остановке больше нет зелёного «Проверка
  завершена», «Сохранить» доступно, только когда есть что сохранять.
- Все адреса заданы на компьютере или в сети (hosts, VPN fake-ip, домашний
  фильтр) — не «Ваш DNS честный», а «адреса берутся не у провайдера»; такой
  домен подписан «Адрес не от провайдера», а не «Адрес из файла hosts».
- Проверка, где не удалось проверить ни один адрес, пишется в историю как
  «не узнали», а не предупреждение.
- Удалены неиспользуемые create_dns_check_worker (к тому же сломанный) и
  create_dns_check_save_worker в dns/commands.py, план очистки потока.

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

42 lines
1.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 подмена»: о недоступном эталонном сервере сказано в итоге."""
from __future__ import annotations
import unittest
from dns.dns_check_plans import summarize_dns_results
HONEST = {"discord.com": {"state": "ok"}}
UP = {"label": "Cloudflare", "address": "1.1.1.1", "ok": True, "reason": ""}
DOWN = {"label": "Google", "address": "8.8.8.8", "ok": False, "reason": "сервер молчит"}
class ReferenceNoteTests(unittest.TestCase):
def test_all_references_answering_adds_nothing(self) -> None:
summary = summarize_dns_results({"domains": HONEST, "reference": [UP]})
self.assertEqual(summary["kind"], "ok")
self.assertNotIn("эталон", summary["detail"].replace("совпадают с эталоном", ""))
def test_silent_reference_is_named_with_its_reason(self) -> None:
summary = summarize_dns_results({"domains": HONEST, "reference": [UP, DOWN]})
self.assertEqual(summary["kind"], "ok")
self.assertIn("Google (8.8.8.8) — сервер молчит", summary["detail"])
self.assertIn("по остальным", summary["detail"])
def test_without_any_reference_dns_is_not_called_honest(self) -> None:
summary = summarize_dns_results({"domains": HONEST, "reference": [DOWN]})
self.assertEqual((summary["kind"], summary["title"]), ("partial", "Проверить DNS не удалось"))
self.assertIn("сравнивать ответы было не с чем", summary["detail"])
def test_spoofing_keeps_its_verdict_and_gets_the_note(self) -> None:
summary = summarize_dns_results({"domains": {"x.com": {"state": "spoofed"}}, "reference": [UP, DOWN]})
self.assertEqual(summary["kind"], "spoofed")
self.assertIn("Google (8.8.8.8)", summary["detail"])
if __name__ == "__main__":
unittest.main()