99 lines
2.9 KiB
Python
99 lines
2.9 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import argparse
|
||
|
|
import json
|
||
|
|
|
||
|
|
from reuse_surface.reports import (
|
||
|
|
cohort_filters_from_args,
|
||
|
|
format_cohort_json,
|
||
|
|
format_cohort_markdown,
|
||
|
|
select_cohort,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
SAMPLE_INDEX = {
|
||
|
|
"capabilities": [
|
||
|
|
{
|
||
|
|
"id": "capability.planning.only",
|
||
|
|
"vector": "D5 / A0 / C2 / R1",
|
||
|
|
"domain": "helix_forge",
|
||
|
|
"consumption_modes": ["planning"],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"id": "capability.implementation.ready",
|
||
|
|
"vector": "D5 / A4 / C3 / R3",
|
||
|
|
"domain": "helix_forge",
|
||
|
|
"consumption_modes": ["cli", "service API"],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"id": "capability.other.domain",
|
||
|
|
"vector": "D4 / A3 / C2 / R2",
|
||
|
|
"domain": "other",
|
||
|
|
"consumption_modes": ["cli"],
|
||
|
|
},
|
||
|
|
]
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
def test_planning_min_filter():
|
||
|
|
filters = cohort_filters_from_args(
|
||
|
|
argparse.Namespace(
|
||
|
|
planning_min="D5",
|
||
|
|
implementation_min=None,
|
||
|
|
discovery_min=None,
|
||
|
|
availability_min=None,
|
||
|
|
availability_max=None,
|
||
|
|
domain=None,
|
||
|
|
)
|
||
|
|
)
|
||
|
|
matches = select_cohort(filters, SAMPLE_INDEX)
|
||
|
|
assert [item["id"] for item in matches] == ["capability.planning.only"]
|
||
|
|
|
||
|
|
|
||
|
|
def test_implementation_min_filter():
|
||
|
|
filters = cohort_filters_from_args(
|
||
|
|
argparse.Namespace(
|
||
|
|
planning_min=None,
|
||
|
|
implementation_min="A4",
|
||
|
|
discovery_min=None,
|
||
|
|
availability_min=None,
|
||
|
|
availability_max=None,
|
||
|
|
domain=None,
|
||
|
|
)
|
||
|
|
)
|
||
|
|
matches = select_cohort(filters, SAMPLE_INDEX)
|
||
|
|
assert [item["id"] for item in matches] == ["capability.implementation.ready"]
|
||
|
|
|
||
|
|
|
||
|
|
def test_domain_filter():
|
||
|
|
filters = {"discovery_min": None, "availability_min": None, "availability_max": None, "domain": "helix_forge"}
|
||
|
|
matches = select_cohort(filters, SAMPLE_INDEX)
|
||
|
|
assert len(matches) == 2
|
||
|
|
|
||
|
|
|
||
|
|
def test_format_cohort_markdown_includes_filters():
|
||
|
|
filters = {"discovery_min": "D5", "availability_min": None, "availability_max": "A1", "domain": None}
|
||
|
|
text = format_cohort_markdown([SAMPLE_INDEX["capabilities"][0]], filters)
|
||
|
|
assert "planning-min" not in text
|
||
|
|
assert "discovery_min" in text
|
||
|
|
assert "capability.planning.only" in text
|
||
|
|
|
||
|
|
|
||
|
|
def test_format_cohort_json_payload():
|
||
|
|
filters = {"discovery_min": "D5", "availability_min": None, "availability_max": "A1", "domain": None}
|
||
|
|
payload = json.loads(
|
||
|
|
format_cohort_json([SAMPLE_INDEX["capabilities"][0]], filters)
|
||
|
|
)
|
||
|
|
assert payload["count"] == 1
|
||
|
|
assert payload["filters"]["discovery_min"] == "D5"
|
||
|
|
|
||
|
|
|
||
|
|
def test_cmd_report_cohorts_markdown(monkeypatch):
|
||
|
|
from reuse_surface.cli import main
|
||
|
|
|
||
|
|
monkeypatch.setattr(
|
||
|
|
"reuse_surface.reports.load_index",
|
||
|
|
lambda: SAMPLE_INDEX,
|
||
|
|
)
|
||
|
|
exit_code = main(["report", "cohorts", "--planning-min", "D5"])
|
||
|
|
assert exit_code == 0
|