zapretgui/tests/test_dns_manual_mode.py
loop-uh 28292aba7c
All checks were successful
Zapret source guards / validate (push) Successful in 6s
Windows-сборка / Dev Dev 21.1.6.36 опубликован
DNS переписан на чистом WinAPI: только настоящие адаптеры, виртуалки и VPN не трогаются; добавлены AstraCat и GeoHide
- dns/winapi.py: GetAdaptersAddresses без GAA_FLAG_INCLUDE_ALL_INTERFACES
  (из-за него на странице были WFP/QoS/Npcap-фильтры, отладчик ядра и т.п.),
  признаки «аппаратный / фильтр / разъём» из GetIfEntry2, адаптер интернета
  через GetBestInterfaceEx, DNS читается GetInterfaceDnsSettings вместо
  реестра, пишется SetInterfaceDnsSettings (DoH на Windows 11), кэш —
  DnsFlushResolverCache.
- dns/adapters.py: показываются настоящие сетевые карты (в том числе внутри
  виртуалки) и адаптер, через который идёт интернет (Hyper-V vEthernet);
  внутренние сети Hyper-V/VMware/VirtualBox/WSL, VPN и Wi-Fi Direct не
  показываются и не меняются.
- Адаптер опознаётся по GUID; запись только адаптерам со страницы — Windows
  молча заводит ветку реестра под любой GUID.
- Страница: таблетки со значком Ethernet/Wi-Fi и пометками «интернет» /
  «не подключён», по умолчанию отмечены только подключённые, отметки
  сохраняются после применения; ошибки Windows видны во всплывашке.
- Шаблоны DoH берутся из списка серверов (один источник), IPv6 тоже с DoH.
- Новые DNS из профилей hosts: AstraCat и GeoHide (проверены с Windows).
- Удалены мёртвые dns_core, dns_force, dns_worker, «DNS при запуске»,
  ключи force_dns_enabled и dns_crash_count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 23:43:52 +03:00

55 lines
2.1 KiB
Python

from __future__ import annotations
import ast
import unittest
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
def _read(path: str) -> str:
return (ROOT / path).read_text(encoding="utf-8")
class DnsManualModeTests(unittest.TestCase):
def test_force_dns_settings_are_gone(self) -> None:
from settings import schema, store
self.assertEqual(schema.default_dns(), {"custom_servers": []})
for name in ("get_force_dns_enabled", "set_force_dns_enabled", "get_dns_crash_count", "increment_dns_crash_count"):
self.assertFalse(hasattr(store, name), name)
def test_program_does_not_touch_dns_on_startup(self) -> None:
post_startup = _read("src/main/post_startup.py")
self.assertNotIn("install_dns_startup", post_startup)
self.assertNotIn("apply_dns_on_startup", post_startup)
self.assertFalse((ROOT / "src/dns/dns_worker.py").exists())
def test_dns_page_has_no_forced_dns_mode(self) -> None:
page_source = _read("src/dns/ui/page.py")
self.assertNotIn("force_dns_action", page_source)
self.assertNotIn("POWER_BUTTON", page_source)
self.assertNotIn("create_force_dns_action_worker", _read("src/app/feature_facades/dns.py"))
def test_visible_dns_texts_do_not_offer_forced_dns_mode(self) -> None:
texts_source = _read("src/app/ui_texts.py")
self.assertNotIn("включить принудительный DNS", texts_source)
self.assertNotIn("Включить принудительный DNS", texts_source)
self.assertNotIn("Выключить принудительный DNS", texts_source)
self.assertNotIn("enable forced DNS", texts_source)
self.assertIn("Применить Quad9", texts_source)
def test_isp_warning_applies_recommended_dns_manually(self) -> None:
page_source = _read("src/dns/ui/page.py")
self.assertIn('RECOMMENDED_PROVIDER = ("Безопасные", "Quad9")', page_source)
self.assertIn("self._choose_provider(name)", page_source)
self.assertNotIn("on_force_dns_toggled", page_source)
if __name__ == "__main__":
unittest.main()