All checks were successful
Zapret source guards / validate (push) Successful in 9s
live_services на каждом проверенном сайте пересобирал записи всех готовых сервисов — O(N²) сборок за прогон в потоках проверки. Теперь запись сервиса собирается один раз, когда готовы все его адреса, а на экран уходит список готовых записей в порядке проверки (под замком, чтобы ранний снимок не перебил более полный). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
42 lines
1.7 KiB
Python
42 lines
1.7 KiB
Python
"""Сервисы на экран по ходу проверки: готовый — сразу, и каждый собирается один раз."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import unittest
|
|
from types import SimpleNamespace
|
|
from unittest.mock import patch
|
|
|
|
from diagnostics import sections
|
|
|
|
|
|
def _service(targets: int) -> SimpleNamespace:
|
|
return SimpleNamespace(targets=tuple(range(targets)))
|
|
|
|
|
|
class LiveServicesTests(unittest.TestCase):
|
|
def test_ready_services_go_out_in_check_order_each_built_once(self) -> None:
|
|
services = {"youtube": _service(2), "discord": _service(1), "telegram": _service(1)}
|
|
published: list[list[str]] = []
|
|
built: list[str] = []
|
|
|
|
def services_report(chosen, _verdicts, collected):
|
|
(key,) = chosen
|
|
built.append(key)
|
|
return [{"key": key, "probes": len(collected[key])}]
|
|
|
|
with patch.object(sections.report_text, "services_report", side_effect=services_report):
|
|
on_probe = sections.live_services(
|
|
services, lambda _service, probes: probes, lambda items: published.append([item["key"] for item in items])
|
|
)
|
|
on_probe("youtube", "адрес 1")
|
|
on_probe("telegram", "адрес")
|
|
on_probe("youtube", "адрес 2")
|
|
on_probe("discord", "адрес")
|
|
|
|
# Половина адресов YouTube — ещё не готов; порядок — как в списке проверки.
|
|
self.assertEqual(published, [["telegram"], ["youtube", "telegram"], ["youtube", "discord", "telegram"]])
|
|
self.assertEqual(sorted(built), ["discord", "telegram", "youtube"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|