All checks were successful
Zapret source guards / validate (push) Successful in 3s
Apex googlevideo.com — не видеосервер, его прямая проверка всегда падает.
Сканер стратегий теперь при старте подставляет свежий rr*-хост через
существующий discovery (при неудаче — понятная ошибка вместо ложных FAIL),
а в пользовательские домены BlockCheck голый googlevideo.com не добавляется:
InfoBar объясняет, что актуальный видеосервер проверяется автоматически.
Сохранённый ранее apex пропускается при сборке целей.
Попутно починены импорты удалённого targets._normalize_domain (f88541fa):
добавление пользовательского домена падало с ImportError, а нормализация
цели сканера не срезала схему https://. Оба места переведены на hosts.host_of.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
104 lines
3.8 KiB
Python
104 lines
3.8 KiB
Python
"""Запрет голого googlevideo.com в пользовательских доменах BlockCheck."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
from unittest.mock import Mock, patch
|
|
|
|
|
|
PROJECT_SRC = Path(__file__).resolve().parents[1] / "src"
|
|
if str(PROJECT_SRC) not in sys.path:
|
|
sys.path.insert(0, str(PROJECT_SRC))
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
|
|
import blockcheck.page_runtime as page_runtime # noqa: E402
|
|
import blockcheck.targets as targets # noqa: E402
|
|
|
|
|
|
class TargetsAddUserDomainTests(unittest.TestCase):
|
|
def test_rejects_bare_googlevideo_without_saving(self) -> None:
|
|
with patch.object(targets, "save_user_domains") as save, patch.object(
|
|
targets, "load_user_domains", return_value=[]
|
|
):
|
|
self.assertFalse(targets.add_user_domain("https://googlevideo.com"))
|
|
save.assert_not_called()
|
|
|
|
def test_accepts_regular_domain(self) -> None:
|
|
with patch.object(targets, "save_user_domains") as save, patch.object(
|
|
targets, "load_user_domains", return_value=[]
|
|
):
|
|
self.assertTrue(targets.add_user_domain("example.com"))
|
|
save.assert_called_once_with(["example.com"])
|
|
|
|
|
|
class PageRuntimeAddUserDomainTests(unittest.TestCase):
|
|
def test_returns_rejection_object_for_bare_googlevideo(self) -> None:
|
|
with patch("blockcheck.targets.add_user_domain") as add:
|
|
result = page_runtime.add_user_domain("https://googlevideo.com/")
|
|
|
|
add.assert_not_called()
|
|
self.assertIsInstance(result, page_runtime.UserDomainRejection)
|
|
self.assertEqual(result.domain, "googlevideo.com")
|
|
|
|
def test_returns_normalized_domain_and_none_for_duplicate(self) -> None:
|
|
with patch("blockcheck.targets.add_user_domain", return_value=True):
|
|
self.assertEqual(
|
|
page_runtime.add_user_domain("https://Example.COM/path"),
|
|
"example.com",
|
|
)
|
|
with patch("blockcheck.targets.add_user_domain", return_value=False):
|
|
self.assertIsNone(page_runtime.add_user_domain("example.com"))
|
|
|
|
|
|
class PageShowsExplanationTests(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
from PyQt6.QtWidgets import QApplication
|
|
|
|
cls._app = QApplication.instance() or QApplication([])
|
|
|
|
def test_rejection_shows_infobar_and_adds_no_chip(self) -> None:
|
|
from blockcheck.ui.page import BlockcheckPage
|
|
|
|
page = BlockcheckPage.__new__(BlockcheckPage)
|
|
page._user_domain_action_runtime = SimpleNamespace(
|
|
is_current=Mock(return_value=True)
|
|
)
|
|
page._cleanup_in_progress = False
|
|
page._add_chip = Mock()
|
|
page._domain_input = Mock()
|
|
page._has_pending_user_domain_action = Mock(return_value=False)
|
|
page.window = Mock(return_value=None)
|
|
|
|
rejection = page_runtime.UserDomainRejection(domain="googlevideo.com")
|
|
with patch("blockcheck.ui.page.InfoBarHelper") as info_bar:
|
|
BlockcheckPage._on_user_domain_action_finished(
|
|
page, 5, "add", rejection, {"domain": "googlevideo.com"}
|
|
)
|
|
|
|
info_bar.warning.assert_called_once()
|
|
page._add_chip.assert_not_called()
|
|
page._domain_input.clear.assert_called_once()
|
|
|
|
|
|
class BuildTargetsMigrationTests(unittest.TestCase):
|
|
def test_skips_stored_bare_googlevideo_but_keeps_other_domains(self) -> None:
|
|
with patch.object(
|
|
targets,
|
|
"load_user_domains",
|
|
return_value=["googlevideo.com", "example.com"],
|
|
):
|
|
built = targets.build_targets_with_user_domains()
|
|
|
|
values = [t["value"] for t in built]
|
|
self.assertNotIn("https://googlevideo.com", values)
|
|
self.assertIn("https://example.com", values)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|