From 98e6309256b278bbb7b20a110419ccc24e58eaa2 Mon Sep 17 00:00:00 2001 From: klemek Date: Sat, 18 Apr 2026 16:13:27 +0200 Subject: [PATCH] tests(registry): add registry tests --- src/page.py | 7 +- src/registry.py | 11 +-- tests/test_registry.py | 152 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+), 10 deletions(-) create mode 100644 tests/test_registry.py diff --git a/src/page.py b/src/page.py index 060b7c5..7bc397e 100644 --- a/src/page.py +++ b/src/page.py @@ -4,15 +4,12 @@ import dataclasses @dataclasses.dataclass class Page: path: str - with_index: bool + with_index: bool = False host: str | None = None token_hash: str | None = None - def get_url_path(self) -> str: - return f"/{self.path}/" - def __repr__(self) -> str: - out = self.get_url_path() + out = f"/{self.path}/" if self.host is not None: out += f" [{self.host}]" if not self.with_index: diff --git a/src/registry.py b/src/registry.py index 0e8f0b5..b49a8c0 100644 --- a/src/registry.py +++ b/src/registry.py @@ -34,21 +34,22 @@ class Registry: self.logger.info("Updated %s", self.pages[path]) def set_host(self, path: str, host: str) -> None: - if self.pages[path].host != host: + if path in self.pages and self.pages[path].host != host: self.data_dir.set_file(path, self.HOST_FILE, host) self.pages[path].host = host self.logger.debug("Updated %s", self.pages[path]) def set_token_hash(self, path: str, token_hash: str) -> None: - if self.pages[path].token_hash != token_hash: + if path in self.pages and self.pages[path].token_hash != token_hash: self.data_dir.set_file(path, self.TOKEN_FILE, token_hash, 0o600) self.pages[path].token_hash = token_hash self.logger.debug("Updated %s", self.pages[path]) def remove(self, path: str) -> None: - page = self.pages[path] - del self.pages[path] - self.logger.info("Removed %s", page) + if path in self.pages: + page = self.pages[path] + del self.pages[path] + self.logger.info("Removed %s", page) def get_from_path(self, path: str) -> page.Page | None: if path in self.pages: diff --git a/tests/test_registry.py b/tests/test_registry.py new file mode 100644 index 0000000..5a5ab90 --- /dev/null +++ b/tests/test_registry.py @@ -0,0 +1,152 @@ +import logging +import typing +import unittest +import unittest.mock + +from src.data_dir import DataDir +from src.page import Page +from src.params import Parameters +from src.registry import Registry + +from . import BaseTestCase + + +class TestRegistry(BaseTestCase): + @typing.override + def setUp(self) -> None: + self.registry = Registry(Parameters()) + self.registry.logger = unittest.mock.Mock(logging.Logger) + self.data_dir = self.registry.data_dir = self.mock(DataDir) + super().setUp() + + def test_load_pages(self) -> None: + with ( + self.mock_call(self.data_dir.list_paths, [], ["test_1", "test_2"]), + self.mock_calls( + self.data_dir.has_index, [["test_1"], ["test_2"]], [True, False] + ), + self.mock_calls( + self.data_dir.get_file, + [ + ["test_1", Registry.HOST_FILE], + ["test_1", Registry.TOKEN_FILE], + ["test_2", Registry.HOST_FILE], + ["test_2", Registry.TOKEN_FILE], + ], + [ + "test_1_host", + "test_1_token", + None, + "test_2_token", + ], + ), + self.seal_mocks(), + ): + self.registry.load_pages() + self.assertEqual(len(self.registry.pages), 2) + self.assertEqual(list(self.registry.pages.keys()), ["test_1", "test_2"]) + self.assertEqual( + self.registry.pages["test_1"], + Page( + "test_1", + True, # noqa: FBT003 + "test_1_host", + "test_1_token", + ), + ) + self.assertEqual( + self.registry.pages["test_2"], + Page( + "test_2", + False, # noqa: FBT003 + None, + "test_2_token", + ), + ) + + def test_get_hosts(self) -> None: + self.registry.pages["test_1"] = Page( + "test_1", + host="test_1_host", + ) + self.registry.pages["test_2"] = Page( + "test_2", + host="test_2_host", + ) + self.registry.pages["test_3"] = Page( + "test_3", + host=None, + ) + self.seal_mocks() + self.assertEqual(self.registry.get_hosts(), ["test_1_host", "test_2_host"]) + + def test_set_host(self) -> None: + self.registry.pages["test_1"] = Page( + "test_1", + host="test_1_host", + ) + with ( + self.mock_call( + self.data_dir.set_file, ["test_1", Registry.HOST_FILE, "new_value"] + ), + self.seal_mocks(), + ): + self.registry.set_host("test_1", "new_value") + self.assertEqual(self.registry.pages["test_1"].host, "new_value") + + def test_set_token_hash(self) -> None: + self.registry.pages["test_1"] = Page( + "test_1", + token_hash=None, + ) + with ( + self.mock_call( + self.data_dir.set_file, + ["test_1", Registry.TOKEN_FILE, "new_value", 0o600], + ), + self.seal_mocks(), + ): + self.registry.set_token_hash("test_1", "new_value") + self.assertEqual(self.registry.pages["test_1"].token_hash, "new_value") + + def test_remove(self) -> None: + self.registry.pages["test_1"] = Page( + "test_1", + ) + self.seal_mocks() + self.registry.remove("test_1") + self.assertNotIn("test_1", self.registry.pages) + + def test_get_from_path(self) -> None: + self.registry.pages["test_1"] = ( + target := Page( + "test_1", + ) + ) + self.registry.pages["test_2"] = Page( + "test_2", + ) + self.seal_mocks() + self.assertEqual(self.registry.get_from_path("test_1"), target) + + def test_get_from_path_not_found(self) -> None: + self.registry.pages["test_1"] = Page( + "test_1", + ) + self.registry.pages["test_2"] = Page( + "test_2", + ) + self.seal_mocks() + self.assertIsNone(self.registry.get_from_path("test_3")) + + def test_get_from_host(self) -> None: + self.registry.pages["test_1"] = (target := Page("test_1", host="host_1")) + self.registry.pages["test_2"] = Page("test_2", host="host_2") + self.seal_mocks() + self.assertEqual(self.registry.get_from_host("host_1"), target) + + def test_get_from_host_not_found(self) -> None: + self.registry.pages["test_1"] = Page("test_1", host="host_1") + self.registry.pages["test_2"] = Page("test_2", host="host_2") + self.seal_mocks() + self.assertIsNone(self.registry.get_from_host("host_3"))