"""Every page below a top-level section shows its trail back up (rule 134). The breadcrumb block is empty by default, so a nested page that forgets it ships with no way back up and nothing says so. Every full page (one that extends base.html) must fill the block, unless it is a section's own top page, a logged-out page or an error page: those are named below, so adding one is a decision someone makes in this file. """ import re from tests._templates import REPO, template_files TOP_LEVEL = { "steward/templates/dashboard/index.html", "steward/templates/hosts/list.html", "steward/templates/monitors/index.html", "steward/templates/alerts/list.html", "steward/templates/ansible/index.html", "steward/templates/audit/list.html", "steward/templates/ai_access/index.html", "plugins/docker/templates/docker/index.html", "plugins/snmp/templates/snmp/index.html", "plugins/traefik/templates/traefik/index.html", "plugins/unifi/templates/unifi/index.html", # Logged out, or no page to go back up from. "steward/templates/auth/login.html", "steward/templates/auth/setup.html", "steward/templates/errors/404.html", "steward/templates/errors/500.html", "steward/templates/errors/database_unavailable.html", } _EXTENDS_BASE = re.compile(r"""\{%-?\s*extends\s+["']base\.html["']""") _BLOCK = re.compile(r"\{%-?\s*block\s+breadcrumb\s*-?%\}(.*?)\{%-?\s*endblock", re.S) def needs_crumbs_and_lacks_them(text: str) -> bool: block = _BLOCK.search(text) return bool(_EXTENDS_BASE.search(text)) and not (block and "crumbs(" in block.group(1)) def test_the_guard_can_fail(): assert needs_crumbs_and_lacks_them('{% extends "base.html" %}{% block content %}x{% endblock %}') assert needs_crumbs_and_lacks_them('{% extends "base.html" %}{% block breadcrumb %}{% endblock %}') assert not needs_crumbs_and_lacks_them( '{% extends "base.html" %}{% block breadcrumb %}{{ crumbs([("Hosts", "/hosts/"), ("x", "")]) }}{% endblock %}') assert not needs_crumbs_and_lacks_them("