zapretgui/tests/test_settings_read_cost.py
loop-uh f88541fa6b Перестроить BlockCheck на единый планировщик проб
Проверки шли семью последовательными фазами, и один хост резолвился до пяти
раз: в preflight, в каждой TLS-пробе, в ISP-пробе и в ping-пробе. Теперь этапа
три — опорная точка с однократным резолвом, параллельная группа проб под общим
дедлайном и чистый анализ, — а массовый preflight убран: те же проверки делает
планировщик, и отдельная фаза означала только двойной коннект к каждому хосту.

Вместе с этим:

- вердикт вынесен в отдельный движок с сигнатурами, данные списков — в
  data_lists, подписи DPI для интерфейса — в ui/dpi_labels;
- удалён blockcheck2.py и файлы данных, которые он обслуживал;
- наблюдатель за зависаниями интерфейса ставится из entry.py, где живёт event
  loop, а не из post-startup задач;
- profile payload и background worker gate приведены к одному пути обновления.

Проверки: compileall, architecture_checks, 369 тестов затронутых областей.
Полный прогон — 4121 passed; падения в preset-UI (Qt/fluent на Linux),
preset_folder_actions (тест не знает про папку 1.10.0) и build_resource_layout
(состояние приватного репозитория) существовали и до этих правок.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 15:46:08 +03:00

74 lines
2.8 KiB
Python

from __future__ import annotations
import unittest
from tempfile import TemporaryDirectory
from unittest.mock import patch
from settings import store as settings_store
class SettingsReadCostTests(unittest.TestCase):
"""Чтение настроек не должно копировать весь документ ради одного значения."""
def setUp(self) -> None:
self._temp_dir = TemporaryDirectory()
self.addCleanup(self._temp_dir.cleanup)
patcher = patch.object(settings_store, "MAIN_DIRECTORY", self._temp_dir.name)
patcher.start()
self.addCleanup(patcher.stop)
settings_store.reset_settings()
def test_scalar_getter_does_not_copy_whole_document(self) -> None:
with patch.object(settings_store, "read_settings") as read_settings:
settings_store.get_dpi_autostart()
read_settings.assert_not_called()
def test_scalar_getter_returns_stored_value(self) -> None:
settings_store.set_dpi_autostart(False)
self.assertFalse(settings_store.get_dpi_autostart())
settings_store.set_dpi_autostart(True)
self.assertTrue(settings_store.get_dpi_autostart())
def test_container_value_is_detached_from_cache(self) -> None:
settings_store.set_hosts_selection({"youtube": "default"})
selection = settings_store.get_hosts_selection()
selection["youtube"] = "hacked"
selection["discord"] = "hacked"
self.assertEqual(settings_store.get_hosts_selection(), {"youtube": "default"})
def test_section_copy_is_detached_from_cache(self) -> None:
program = settings_store.get_program_settings()
program["dpi_autostart"] = "corrupted"
self.assertNotEqual(settings_store.get_program_settings().get("dpi_autostart"), "corrupted")
def test_custom_dns_servers_are_detached_from_cache(self) -> None:
stored = settings_store.set_custom_dns_servers([{"name": "One", "primary": "1.1.1.1"}])
servers = settings_store.get_custom_dns_servers()
servers.append({"name": "Hacked", "primary": "8.8.8.8"})
if servers and isinstance(servers[0], dict):
servers[0]["primary"] = "9.9.9.9"
self.assertEqual(settings_store.get_custom_dns_servers(), stored)
def test_read_settings_still_returns_detached_document(self) -> None:
data = settings_store.read_settings()
data["program"]["dpi_autostart"] = "corrupted"
self.assertNotEqual(
settings_store.read_settings()["program"]["dpi_autostart"],
"corrupted",
)
def test_write_is_visible_to_the_next_scalar_read(self) -> None:
settings_store.set_tray_close_mode("minimize_only")
self.assertEqual(settings_store.get_tray_close_mode(), "minimize_only")
if __name__ == "__main__":
unittest.main()