from __future__ import annotations import json import tempfile import unittest from pathlib import Path import catalog_source_cache class CatalogSourceCacheTests(unittest.TestCase): def setUp(self) -> None: self.temporary = tempfile.TemporaryDirectory() self.root = Path(self.temporary.name) self.packages = self.root / "packages" self.packages.mkdir() self.package = self.packages / "game" self.package.mkdir() (self.package / "version.ini").write_text("20260820\n", encoding="utf-8") (self.package / "game.eti").write_bytes(b"eti") self.catalog_db = self.root / "game.db" self.catalog_db.write_bytes(b"catalog") self.unrar = self.root / "unrar" self.unrar.write_bytes(b"unrar") self.manifests = self.root / "manifests" self.manifests.mkdir() (self.manifests / "catalog-content-index-v1.jsonl").write_text( "{}\n", encoding="utf-8" ) self.stamp = self.root / "cache" / "catalog.json" def tearDown(self) -> None: self.temporary.cleanup() def test_record_then_check_and_source_change(self) -> None: self.assertFalse( catalog_source_cache.cache_is_current( self.stamp, self.packages, self.catalog_db, self.manifests, self.unrar, ) ) catalog_source_cache.record_cache( self.stamp, self.packages, self.catalog_db, self.manifests, self.unrar, ) self.assertTrue( catalog_source_cache.cache_is_current( self.stamp, self.packages, self.catalog_db, self.manifests, self.unrar, ) ) (self.package / "payload.bin").write_bytes(b"payload") self.assertFalse( catalog_source_cache.cache_is_current( self.stamp, self.packages, self.catalog_db, self.manifests, self.unrar, ) ) def test_missing_or_incomplete_output_never_hits(self) -> None: catalog_source_cache.record_cache( self.stamp, self.packages, self.catalog_db, self.manifests, self.unrar, ) (self.manifests / "catalog-content-index-v1.jsonl").unlink() self.assertFalse( catalog_source_cache.cache_is_current( self.stamp, self.packages, self.catalog_db, self.manifests, self.unrar, ) ) def test_stamp_is_structured_and_sorted(self) -> None: catalog_source_cache.record_cache( self.stamp, self.packages, self.catalog_db, self.manifests, self.unrar, ) stamp = json.loads(self.stamp.read_text(encoding="utf-8")) self.assertEqual(stamp["schema"], 1) self.assertEqual(stamp["catalog_db"]["size"], len(b"catalog")) self.assertEqual(stamp["unrar"]["size"], len(b"unrar")) self.assertEqual(stamp["packages_dir"], str(self.packages.absolute())) if __name__ == "__main__": unittest.main()