53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
"""Export contracts — JSON round-trips, CSV shape pinned to the spec."""
|
|
|
|
from datetime import date
|
|
|
|
import pandas as pd
|
|
|
|
from diaglib import (
|
|
CSV_COLUMNS,
|
|
build_engagement,
|
|
load_engagement,
|
|
parse_participants,
|
|
scores_dataframe,
|
|
value_at_stake,
|
|
write_exports,
|
|
)
|
|
|
|
|
|
def _engagement(config, baseline, scores):
|
|
return build_engagement(
|
|
config=config, client_name="Acme Demo Co", facilitator="Robert Helewka",
|
|
workshop_date=date(2026, 7, 19),
|
|
participants=parse_participants(
|
|
"Jane Example | VP Customer Experience | cx; Sam Sample | Ops Director | ops"),
|
|
baseline=baseline, scores=scores,
|
|
computed_value=value_at_stake(config, baseline, scores))
|
|
|
|
|
|
def test_write_exports_and_reload(config, baseline, scores, tmp_path):
|
|
eng = _engagement(config, baseline, scores)
|
|
json_path, csv_path = write_exports(eng, config, tmp_path)
|
|
assert json_path.name == "acme_demo_co_2026-07-19.json"
|
|
assert csv_path.name == "acme_demo_co_2026-07-19.csv"
|
|
|
|
# JSON is the source-of-truth artifact — it must round-trip losslessly.
|
|
reloaded = load_engagement(json_path)
|
|
assert reloaded == eng
|
|
|
|
df = pd.read_csv(csv_path)
|
|
assert list(df.columns) == CSV_COLUMNS
|
|
assert len(df) == 12
|
|
|
|
|
|
def test_scores_dataframe_flags(config, baseline, scores):
|
|
df = scores_dataframe(_engagement(config, baseline, scores), config)
|
|
by_id = df.set_index("competency_id")
|
|
assert bool(by_id.loc["data_readiness", "is_foundational"])
|
|
assert bool(by_id.loc["data_readiness", "is_binding_constraint"])
|
|
assert bool(by_id.loc["process_discovery", "is_foundational"])
|
|
assert not bool(by_id.loc["process_discovery", "is_binding_constraint"])
|
|
assert not bool(by_id.loc["automation_ai_strategy", "is_foundational"])
|
|
assert (df["engagement_id"] == "acme_demo_co_2026-07-19").all()
|
|
assert (df["industry"] == "contact_center").all()
|