53 lines
2.2 KiB
Python
53 lines
2.2 KiB
Python
"""Confidence bands: thresholds, the worst-word rule and the blank-mandatory flag (spec: Banding)."""
|
||
import importlib.util
|
||
import re
|
||
from pathlib import Path
|
||
|
||
BANDS = Path(__file__).resolve().parents[1] / "rpa-dashboard-ai" / "templates" / "web" / "bands.py"
|
||
spec = importlib.util.spec_from_file_location("bands", BANDS)
|
||
bands = importlib.util.module_from_spec(spec)
|
||
spec.loader.exec_module(bands)
|
||
|
||
|
||
def test_thresholds():
|
||
assert bands.band_of(1.0) == "green"
|
||
assert bands.band_of(0.95) == "green"
|
||
assert bands.band_of(0.9499) == "amber"
|
||
assert bands.band_of(0.90) == "amber"
|
||
assert bands.band_of(0.8999) == "red"
|
||
assert bands.band_of(0.0) == "red"
|
||
|
||
|
||
def test_field_takes_its_worst_word():
|
||
assert bands.field_band([0.99, 0.97, 0.98], "ACME Office Supply") == "green"
|
||
assert bands.field_band([0.99, 0.93, 0.98], "ACME Office Supply") == "amber"
|
||
assert bands.field_band([0.99, 0.97, 0.62], "ACME Office Supply") == "red"
|
||
|
||
|
||
def test_blank_mandatory_field_is_always_flagged():
|
||
assert bands.field_band([1.0], "", mandatory=True) == "blank"
|
||
assert bands.field_band([], " ", mandatory=True) == "blank"
|
||
assert bands.field_band(None, None, mandatory=True) == "blank"
|
||
assert bands.needs_review("blank")
|
||
# An optional blank is graded like any other field.
|
||
assert bands.field_band([1.0], "", mandatory=False) == "green"
|
||
|
||
|
||
def test_no_scores_means_unscored():
|
||
assert bands.field_band([], "INV-1001") == "unscored"
|
||
|
||
|
||
def test_only_green_skips_review():
|
||
assert not bands.needs_review("green")
|
||
assert all(bands.needs_review(b) for b in ["amber", "red", "blank", "unscored"])
|
||
|
||
|
||
def test_page_legends_use_the_bands_py_cut_points():
|
||
"""The legend labels are hard-coded in the pages; they must say what bands.py decides."""
|
||
green, floor = bands.GREEN_THRESHOLD, bands.CONFIDENCE_THRESHOLD
|
||
for page in [BANDS.parents[1] / "web" / "src" / "ai.ts", BANDS.parents[1] / "desktop" / "ai_sections.html"]:
|
||
m = re.search(r"Clean ≥([\d.]+).*?Check ([\d.]+)–([\d.]+).*?Review <([\d.]+)",
|
||
page.read_text(encoding="utf-8"), re.S)
|
||
assert m, f"{page.name}: band legend labels not found"
|
||
assert tuple(map(float, m.groups())) == (green, floor, green, floor), page.name
|