zapretgui/tests/test_dns_provider_icons.py
loop-uh 90f2e10cfc
Some checks failed
Zapret source guards / validate (push) Has been cancelled
Zapret DNS: свой сервер проекта — плитка в «Настройке DNS» и профиль в «Редакторе hosts» (каталог 2026.10.09.2)
Сервер в Финляндии отдаёт имена сервисов с гео-ограничением (ChatGPT,
Claude, Gemini, Spotify и другие из каталога) со своим адресом и сам
пересылает соединение на настоящий сайт; остальные имена — настоящий ответ,
без фильтров, подписи DNSSEC проверяются.

- «Настройка DNS»: плитка «Zapret DNS» первой в группе «Для ИИ»;
- «Редактор hosts»: профиль Zapret DNS у 88 сервисов, стоит первым.

Проверено с Windows и из сетей Ростелекома, МТС, Дом.ру и Билайна: DNS
отвечает по UDP и TCP, через сервер открываются ChatGPT, Claude, Spotify,
Gemini, Notion, DeepL, Grok, Cursor, JetBrains, Crunchyroll. Шифрованный DNS
появится вместе с именем dns.zapret.moe.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:51:56 +03:00

120 lines
4.6 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.

from __future__ import annotations
import os
import unittest
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from PyQt6.QtWidgets import QApplication
from dns.dns_providers import DNS_PROVIDERS
from dns.ui.now_panel import DnsBadge
from dns.ui.provider_grid import DnsProviderGrid, DnsTile
from hosts.ui.profile_icons import profile_icon
from profile.ui import profile_icon as profile_icon_module
from profile.ui.own_icons import OWN_ICON_SVGS
from profile.ui.simple_icons_bundle import SIMPLE_ICON_SVGS
# Сервер со страницы «Настройка DNS» -> его DNS-профиль в «Редакторе hosts».
_SAME_SERVER_IN_HOSTS = {
"Zapret DNS": "zapret_dns",
"Comss DNS": "comss_dns",
"AstraCat": "astracat",
"GeoHide": "geohide",
"DNS-AI": "dns_ai",
}
def _providers() -> dict[str, dict]:
return {name: data for providers in DNS_PROVIDERS.values() for name, data in providers.items()}
class DnsProviderIconTests(unittest.TestCase):
"""Значки серверов на странице «Настройка DNS»."""
@classmethod
def setUpClass(cls) -> None:
cls._app = QApplication.instance() or QApplication([])
def setUp(self) -> None:
profile_icon_module._PROFILE_PIXMAP_CACHE.clear()
def test_every_logo_of_the_list_can_be_drawn(self) -> None:
"""После правки значков: PYTHONPATH=src python tools/generate_profile_icon_bundle.py"""
for name, data in _providers().items():
icon = str(data["icon"])
with self.subTest(provider=name):
slug = icon.partition(":")[2].partition(":")[0]
if icon.startswith("simple:"):
self.assertIn(slug, SIMPLE_ICON_SVGS)
elif icon.startswith("own:"):
self.assertIn(slug, OWN_ICON_SVGS)
else:
self.assertRegex(icon, r"^fa5[sb]\.[a-z0-9-]+$")
def test_known_services_show_their_own_logo(self) -> None:
providers = _providers()
self.assertEqual(providers["Cloudflare"]["icon"], "simple:cloudflare:CF")
self.assertEqual(providers["Quad9"]["icon"], "simple:quad9:Q9")
self.assertEqual(providers["AdGuard"]["icon"], "simple:adguard:AG")
self.assertEqual(providers["OpenDNS"]["icon"], "own:opendns:OD")
self.assertEqual(providers["Google DNS"]["icon"], "simple:google:G")
self.assertEqual(providers["Gcore"]["icon"], "simple:gcore:GC")
self.assertEqual(providers["DNS4EU"]["icon"], "simple:europeanunion:EU")
self.assertEqual(providers["Яндекс DNS"]["icon"], "fa5b.yandex")
def test_no_two_servers_look_the_same(self) -> None:
looks = [(data["icon"], str(data["color"]).lower()) for data in _providers().values()]
self.assertEqual(len(looks), len(set(looks)))
def test_server_has_the_same_icon_as_its_hosts_profile(self) -> None:
providers = _providers()
for position, (name, profile_id) in enumerate(_SAME_SERVER_IN_HOSTS.items()):
with self.subTest(provider=name):
icon_name, color = profile_icon(profile_id, position)
self.assertEqual(providers[name]["icon"], icon_name)
self.assertEqual(str(providers[name]["color"]).lower(), color.lower())
def test_tile_draws_the_logo_and_not_a_letter_stub(self) -> None:
grid = DnsProviderGrid()
self.addCleanup(grid.deleteLater)
grid.resize(560, 100)
grid.set_tiles(
[
DnsTile(
kind="provider",
key="Cloudflare",
title="Cloudflare",
address="1.1.1.1",
icon_name="simple:cloudflare:CF",
color="#f48120",
)
]
)
self.assertFalse(grid.grab().isNull())
kinds = {key[0] for key in profile_icon_module._PROFILE_PIXMAP_CACHE}
self.assertIn("simple", kinds)
self.assertNotIn("initials", kinds)
def test_now_badge_draws_the_logo_and_not_a_letter_stub(self) -> None:
# Значок не показан на экране, поэтому «переворота монетки» нет:
# сразу рисуется новый значок.
badge = DnsBadge()
self.addCleanup(badge.deleteLater)
badge.set_icon("own:opendns:OD", "#fe7702")
self.assertFalse(badge.grab().isNull())
kinds = {key[0] for key in profile_icon_module._PROFILE_PIXMAP_CACHE}
self.assertIn("own", kinds)
self.assertNotIn("initials", kinds)
if __name__ == "__main__":
unittest.main()