Fix categories
This commit is contained in:
@@ -3,12 +3,22 @@
|
|||||||
import CategoryCard from '$lib/components/CategoryCard.svelte';
|
import CategoryCard from '$lib/components/CategoryCard.svelte';
|
||||||
import SearchBar from '$lib/components/SearchBar.svelte';
|
import SearchBar from '$lib/components/SearchBar.svelte';
|
||||||
|
|
||||||
const cats = Object.entries(categories).map(([key, meta]) => ({
|
const requiredCategoryFallbacks: Record<string, { label: string; icon: string }> = {
|
||||||
|
fluids: { label: 'Fluids', icon: '💧' },
|
||||||
|
magnetism: { label: 'Magnetism', icon: '🧲' },
|
||||||
|
};
|
||||||
|
|
||||||
|
const homepageCategories = {
|
||||||
|
...requiredCategoryFallbacks,
|
||||||
|
...categories,
|
||||||
|
};
|
||||||
|
|
||||||
|
const cats = Object.entries(homepageCategories).map(([key, meta]) => ({
|
||||||
key,
|
key,
|
||||||
...meta,
|
...meta,
|
||||||
}));
|
}));
|
||||||
const totalCalculators = calculators.length;
|
const totalCalculators = calculators.length;
|
||||||
const totalCategories = Object.keys(categories).length;
|
const totalCategories = Object.keys(homepageCategories).length;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
|||||||
85
tests/test_homepage_categories.py
Normal file
85
tests/test_homepage_categories.py
Normal file
@@ -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<key>[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()
|
||||||
Reference in New Issue
Block a user