diff --git a/README.md b/README.md index 88b41d3a..d62108d6 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue)](https://www.python.org/) [![Techniques](https://img.shields.io/badge/techniques-68-blueviolet)](references/technique_registry.json) -[![Covered](https://img.shields.io/badge/covered-58-green)](references/technique_registry.json) -[![Complete](https://img.shields.io/badge/complete-10-brightgreen)](references/technique_registry.json) +[![Covered](https://img.shields.io/badge/covered-59-green)](references/technique_registry.json) +[![Complete](https://img.shields.io/badge/complete-9-brightgreen)](references/technique_registry.json) [![Partial](https://img.shields.io/badge/partial-0-lightgrey)](references/technique_registry.json) --- diff --git a/tests/test_readme_badges.py b/tests/test_readme_badges.py new file mode 100644 index 00000000..0645c14e --- /dev/null +++ b/tests/test_readme_badges.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +"""Keep README capability badges aligned with the current registry.""" + +from __future__ import annotations + +import json +import re +from collections import Counter +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +README = ROOT / "README.md" +REGISTRY = ROOT / "references" / "technique_registry.json" + + +def _readme_badge_value(name: str) -> int: + text = README.read_text(encoding="utf-8") + match = re.search(rf"\[!\[{re.escape(name)}\]\(https://img\.shields\.io/badge/{name.lower()}-(\d+)-", text) + assert match, f"Missing README badge for {name}" + return int(match.group(1)) + + +def test_readme_badges_match_technique_registry_counts() -> None: + registry = json.loads(REGISTRY.read_text(encoding="utf-8")) + techniques = registry["techniques"].values() + counts = Counter(item["status"] for item in techniques) + total = len(registry["techniques"]) + + assert _readme_badge_value("Techniques") == total + assert _readme_badge_value("Covered") == counts["covered"] + assert _readme_badge_value("Complete") == counts["complete"] + assert _readme_badge_value("Partial") == counts["partial"]