Bug: Two get_by_cid methods existed in L1CacheManager. The second definition shadowed the first, breaking recipe lookup because the comprehensive method (using find_by_cid) was hidden. - Remove duplicate get_by_cid method (lines 470-494) - Add regression test to ensure only one get_by_cid exists - Add tests for template variables and recipe visibility Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
85 lines
3.4 KiB
Python
85 lines
3.4 KiB
Python
"""
|
|
Tests for run artifacts data structure and template variables.
|
|
|
|
Bug found 2026-01-12: runs/detail.html template expects artifact.cid
|
|
but the route provides artifact.hash, causing UndefinedError.
|
|
"""
|
|
|
|
import pytest
|
|
from pathlib import Path
|
|
|
|
|
|
class TestCacheNotFoundTemplate:
|
|
"""Tests for cache/not_found.html template."""
|
|
|
|
def test_template_uses_cid_not_content_hash(self) -> None:
|
|
"""
|
|
Regression test: not_found.html must use 'cid' variable.
|
|
|
|
Bug: Template used 'content_hash' but route passes 'cid'.
|
|
Fix: Changed template to use 'cid'.
|
|
"""
|
|
template_path = Path('/home/giles/art/art-celery/app/templates/cache/not_found.html')
|
|
content = template_path.read_text()
|
|
|
|
assert 'cid' in content, "Template should use 'cid' variable"
|
|
assert 'content_hash' not in content, \
|
|
"Template should not use 'content_hash' (route passes 'cid')"
|
|
|
|
def test_route_passes_cid_to_template(self) -> None:
|
|
"""Verify route passes 'cid' variable to not_found template."""
|
|
router_path = Path('/home/giles/art/art-celery/app/routers/cache.py')
|
|
content = router_path.read_text()
|
|
|
|
# Find the render call for not_found.html
|
|
assert 'cid=cid' in content, \
|
|
"Route should pass cid=cid to not_found.html template"
|
|
|
|
|
|
class TestArtifactDataStructure:
|
|
"""Tests for artifact dict keys matching template expectations."""
|
|
|
|
def test_template_expects_cid_key(self) -> None:
|
|
"""Template uses artifact.cid - verify this expectation."""
|
|
template_path = Path('/home/giles/art/art-celery/app/templates/runs/detail.html')
|
|
content = template_path.read_text()
|
|
|
|
# Template uses artifact.cid in multiple places
|
|
assert 'artifact.cid' in content, "Template should reference artifact.cid"
|
|
|
|
def test_run_service_artifacts_have_cid_key(self) -> None:
|
|
"""
|
|
Regression test: get_run_artifacts must return dicts with 'cid' key.
|
|
|
|
Bug: Service returned artifacts with 'hash' key but template expected 'cid'.
|
|
Fix: Changed service to use 'cid' key for consistency.
|
|
"""
|
|
# Read the run_service.py file and check it uses 'cid' not 'hash'
|
|
service_path = Path('/home/giles/art/art-celery/app/services/run_service.py')
|
|
content = service_path.read_text()
|
|
|
|
# Find the get_artifact_info function and check it returns 'cid'
|
|
# The function should have: "cid": cid, not "hash": cid
|
|
assert '"cid": cid' in content or "'cid': cid" in content, \
|
|
"get_run_artifacts should return artifacts with 'cid' key, not 'hash'"
|
|
|
|
def test_router_artifacts_have_cid_key(self) -> None:
|
|
"""
|
|
Regression test: inline artifact creation in router must use 'cid' key.
|
|
|
|
Bug: Router created artifacts with 'hash' key but template expected 'cid'.
|
|
"""
|
|
router_path = Path('/home/giles/art/art-celery/app/routers/runs.py')
|
|
content = router_path.read_text()
|
|
|
|
# Check that artifacts.append uses 'cid' key
|
|
# Should have: "cid": output_cid, not "hash": output_cid
|
|
# Count occurrences of the patterns
|
|
hash_pattern_count = content.count('"hash": output_cid')
|
|
cid_pattern_count = content.count('"cid": output_cid')
|
|
|
|
assert cid_pattern_count > 0, \
|
|
"Router should create artifacts with 'cid' key"
|
|
assert hash_pattern_count == 0, \
|
|
"Router should not use 'hash' key for artifacts (template expects 'cid')"
|