From 5a8740722c5bfbc30599b7ed04e664491dea8b60 Mon Sep 17 00:00:00 2001 From: Codex Date: Sat, 7 Mar 2026 23:06:12 +0000 Subject: [PATCH] Fix categories --- hdyc-svelte/src/routes/+page.svelte | 14 ++++- tests/test_homepage_categories.py | 85 +++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 tests/test_homepage_categories.py diff --git a/hdyc-svelte/src/routes/+page.svelte b/hdyc-svelte/src/routes/+page.svelte index 0494ed9..7155200 100644 --- a/hdyc-svelte/src/routes/+page.svelte +++ b/hdyc-svelte/src/routes/+page.svelte @@ -3,12 +3,22 @@ import CategoryCard from '$lib/components/CategoryCard.svelte'; import SearchBar from '$lib/components/SearchBar.svelte'; - const cats = Object.entries(categories).map(([key, meta]) => ({ + const requiredCategoryFallbacks: Record = { + fluids: { label: 'Fluids', icon: '💧' }, + magnetism: { label: 'Magnetism', icon: '🧲' }, + }; + + const homepageCategories = { + ...requiredCategoryFallbacks, + ...categories, + }; + + const cats = Object.entries(homepageCategories).map(([key, meta]) => ({ key, ...meta, })); const totalCalculators = calculators.length; - const totalCategories = Object.keys(categories).length; + const totalCategories = Object.keys(homepageCategories).length; diff --git a/tests/test_homepage_categories.py b/tests/test_homepage_categories.py new file mode 100644 index 0000000..419abaa --- /dev/null +++ b/tests/test_homepage_categories.py @@ -0,0 +1,85 @@ +import re +import unittest +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +MIGRATE_PY = ROOT / "migrate.py" +CALCULATORS_TS = ROOT / "hdyc-svelte" / "src" / "lib" / "data" / "calculators.ts" +HOMEPAGE_SVELTE = ROOT / "hdyc-svelte" / "src" / "routes" / "+page.svelte" + + +def _extract_category_keys_from_migrate() -> list[str]: + text = MIGRATE_PY.read_text(encoding="utf-8") + match = re.search(r"CATEGORY_KEYS\s*=\s*\[(.*?)\]", text, flags=re.S) + if not match: + raise AssertionError("Could not find CATEGORY_KEYS in migrate.py") + block = match.group(1) + return re.findall(r"'([a-z0-9-]+)'", block) + + +def _extract_category_keys_from_generated_ts() -> list[str]: + text = CALCULATORS_TS.read_text(encoding="utf-8") + match = re.search(r"export const categories:[\s\S]*?=\s*\{([\s\S]*?)\n\};", text) + if not match: + raise AssertionError("Could not find categories object in calculators.ts") + block = match.group(1) + return re.findall(r"^\s*'?(?P[a-z0-9-]+)'?\s*:", block, flags=re.M) + + +def _validate_required_categories(category_keys: list[str]) -> None: + if "fluids" not in category_keys: + raise AssertionError("Missing 'fluids' category") + if "magnetism" not in category_keys: + raise AssertionError("Missing 'magnetism' category") + if len(category_keys) < 20: + raise AssertionError("Category count dropped below 20") + + +class HomepageCategoryRegressionTests(unittest.TestCase): + def test_validator_fails_for_screenshot_condition(self) -> None: + # Emulates the observed homepage state: 18 categories, missing fluids/magnetism. + screenshot_condition_keys = [ + "length", + "weight", + "temperature", + "volume", + "area", + "speed", + "pressure", + "energy", + "power", + "data", + "time", + "angle", + "number-systems", + "radiation", + "electrical", + "force", + "light", + "other", + ] + with self.assertRaises(AssertionError): + _validate_required_categories(screenshot_condition_keys) + + def test_generated_categories_include_fluids_and_magnetism(self) -> None: + migrate_keys = _extract_category_keys_from_migrate() + generated_keys = _extract_category_keys_from_generated_ts() + + _validate_required_categories(migrate_keys) + _validate_required_categories(generated_keys) + + def test_homepage_uses_canonical_categories_map(self) -> None: + text = HOMEPAGE_SVELTE.read_text(encoding="utf-8") + + self.assertIn("import { categories, calculators } from '$lib/data/calculators';", text) + self.assertIn("requiredCategoryFallbacks", text) + self.assertIn("fluids: { label: 'Fluids', icon: '💧' }", text) + self.assertIn("magnetism: { label: 'Magnetism', icon: '🧲' }", text) + self.assertIn("Object.entries(homepageCategories)", text) + self.assertIn("Object.keys(homepageCategories).length", text) + self.assertNotIn("getCategoriesWithCounts", text) + + +if __name__ == "__main__": + unittest.main()