demoprep / tests /test_dataset_quality.py
mike boone
fix: tighten dataset quality and TS import retries
889a00d
Raw
History Blame Contribute Delete
9.08 kB
from demoprep_app.dataset.contracts import DatasetBundle, DatasetColumn, DatasetTable
from demoprep_app.dataset.generators.template_generator import TemplateDatasetGenerator
from demoprep_app.dataset.quality import validate_dataset_quality
from demoprep_app.scenario.contract import DimensionSpec, ScenarioContract
def test_dataset_quality_blocks_numbered_placeholder_dimension_values():
dataset = DatasetBundle(
scenario=_scenario(),
tables=[
DatasetTable(
"SALES_REPS",
"one row per sales rep",
[
DatasetColumn("SALES_REP_KEY", "dimension_key", "NUMBER", nullable=False),
DatasetColumn("SALES_REP_NAME", "sales_rep", "VARCHAR(255)", nullable=False),
],
[{"SALES_REP_KEY": 1, "SALES_REP_NAME": "Alex Chen Sales Rep 07"}],
)
],
)
report = validate_dataset_quality(dataset)
assert not report.ok
assert "Numbered placeholder" in report.summary()
def test_dataset_quality_blocks_generic_numeric_suffix_dimension_values():
dataset = DatasetBundle(
scenario=_scenario(),
tables=[
DatasetTable(
"STORES",
"one row per store",
[
DatasetColumn("STORE_KEY", "dimension_key", "NUMBER", nullable=False),
DatasetColumn("STORE_NAME", "store", "VARCHAR(255)", nullable=False),
],
[{"STORE_KEY": 1, "STORE_NAME": "Nike Northeast Metro 01"}],
)
],
)
report = validate_dataset_quality(dataset)
assert not report.ok
assert "Generic numeric-suffix placeholder" in report.summary()
def test_template_generator_records_fallback_dimension_events():
scenario = _scenario(
dimensions=[
DimensionSpec(name="ACCOUNTS", semantic_role="account", values=["Strategic Shipper"]),
]
)
dataset = TemplateDatasetGenerator().generate(scenario, row_count=25)
fallback_events = dataset.scenario.metadata.get("data_fallback_events", [])
assert fallback_events
assert fallback_events[0]["dimension"] == "ACCOUNTS"
assert fallback_events[0]["semantic_family"] == "organization"
assert fallback_events[0]["source"] == "table_padding"
assert "Strategic Shipper" in {row["ACCOUNT_NAME"] for row in dataset.table_map()["ACCOUNTS"].rows}
def test_template_generator_records_internal_semantic_expansion_events():
scenario = ScenarioContract(
company_name="Generic Consulting",
company_url="https://example.com",
use_case="Operations",
scenario_type="professional_services_engagements",
fact_grain="client-service-line-sector-month",
demo_audience="Practice leaders",
business_problem="Understand engagement performance.",
metric_formulas={},
dashboard_questions=[],
seasonality=[],
metadata={"seed": 123},
)
dataset = TemplateDatasetGenerator().generate(scenario, row_count=25)
fallback_events = dataset.scenario.metadata.get("data_fallback_events", [])
assert any(event["dimension"] in {"SERVICE_LINES", "SECTORS", "CONSULTANTS"} for event in fallback_events)
assert all(event.get("semantic_family") for event in fallback_events)
assert all(event.get("source") in {"semantic_family_pool", "generated_semantic_family_pool"} for event in fallback_events)
def test_dataset_quality_blocks_semantic_contamination():
dataset = DatasetBundle(
scenario=_scenario(),
tables=[
DatasetTable(
"CONSULTANTS",
"one row per consultant",
[
DatasetColumn("CONSULTANT_KEY", "dimension_key", "NUMBER", nullable=False),
DatasetColumn("CONSULTANT_NAME", "consultant", "VARCHAR(255)", nullable=False),
],
[{"CONSULTANT_KEY": 1, "CONSULTANT_NAME": "APAC"}],
)
],
)
report = validate_dataset_quality(dataset)
assert not report.ok
assert "person dimension" in report.summary()
def test_dataset_quality_blocks_duplicate_unrelated_dimension_sets():
shared = ["Enterprise", "Commercial", "Digital", "Public Sector", "Strategic"]
dataset = DatasetBundle(
scenario=_scenario(),
tables=[
DatasetTable(
"CLIENTS",
"one row per client",
[
DatasetColumn("CLIENT_KEY", "dimension_key", "NUMBER", nullable=False),
DatasetColumn("CLIENT_NAME", "client", "VARCHAR(255)", nullable=False),
],
[{"CLIENT_KEY": idx, "CLIENT_NAME": value} for idx, value in enumerate(shared, start=1)],
),
DatasetTable(
"SERVICE_LINES",
"one row per service line",
[
DatasetColumn("SERVICE_LINE_KEY", "dimension_key", "NUMBER", nullable=False),
DatasetColumn("SERVICE_LINE_NAME", "service_line", "VARCHAR(255)", nullable=False),
],
[{"SERVICE_LINE_KEY": idx, "SERVICE_LINE_NAME": value} for idx, value in enumerate(shared, start=1)],
),
],
)
report = validate_dataset_quality(dataset)
assert not report.ok
assert any("Unrelated dimensions share nearly identical value sets" in issue.message for issue in report.issues)
def test_dataset_quality_blocks_mdf_story_without_mdf_measures():
dataset = DatasetBundle(
scenario=ScenarioContract(
company_name="Wells Fargo",
company_url="https://wellsfargo.com",
use_case="Banking Marketing MDF",
scenario_type="marketing_funnel",
fact_grain="campaign-segment-month",
business_problem="Track MDF spend and co-marketing partner performance.",
metadata={"seed": 123},
),
tables=[
DatasetTable(
"MARKETING_FUNNEL",
"campaign-segment-month",
[
DatasetColumn("MONTH_KEY", "month_key", "NUMBER", nullable=False),
DatasetColumn("SPEND_USD", "spend", "NUMBER(12,2)", nullable=False),
DatasetColumn("CONVERSIONS", "conversions", "NUMBER", nullable=False),
],
[{"MONTH_KEY": 1, "SPEND_USD": 1000.0, "CONVERSIONS": 25}],
is_fact=True,
)
],
)
report = validate_dataset_quality(dataset)
assert not report.ok
assert "MDF-specific measures" in report.summary()
def test_slack_notification_called_when_fallback_events_exist(monkeypatch):
import slack_notifier
calls = []
monkeypatch.setattr(slack_notifier, "notify_deployment_event", lambda *args, **kwargs: calls.append((args, kwargs)) or (True, "sent"))
ok, message = slack_notifier.notify_data_fallback_event(
company="Echo Global",
use_case="Shipping Sales",
scenario_type="shipping_sales",
fallback_events=[{"dimension": "ACCOUNTS", "fallback_values": ["Blue Ridge Retail Group"]}],
)
assert ok is True
assert message == "sent"
assert calls
assert calls[0][0][0] == "DemoPrep data fallback used"
assert calls[0][0][1] == "Warning"
def test_dataset_quality_failure_notification(monkeypatch):
import slack_notifier
calls = []
monkeypatch.setattr(slack_notifier, "notify_deployment_event", lambda *args, **kwargs: calls.append((args, kwargs)) or (True, "sent"))
ok, message = slack_notifier.notify_dataset_quality_failure(
company="Deloitte",
use_case="Professional Services",
scenario_type="professional_services_engagements",
summary="BLOCKER: bad data",
)
assert ok is True
assert message == "sent"
assert calls[0][0][0] == "DemoPrep dataset quality gate blocked deploy"
assert calls[0][0][1] == "Failed"
def test_dataset_preflight_renders_matrix_report():
from demoprep_app.dataset.preflight import render_preflight_markdown, run_dataset_preflight
results = run_dataset_preflight(scenario_types=["professional_services_engagements"], row_count_guidance=25)
markdown = render_preflight_markdown(results)
assert len(results) == 1
assert results[0].scenario_type == "professional_services_engagements"
assert results[0].ok
assert "DemoPrep Dataset Preflight" in markdown
def _scenario(dimensions=None):
return ScenarioContract(
company_name="Echo Global",
company_url="https://echo.com",
use_case="Shipping Sales",
scenario_type="shipping_sales",
fact_grain="account-service-lane-month",
demo_audience="Sales leaders",
business_problem="Understand shipping revenue and margin.",
metric_formulas={},
dashboard_questions=[],
seasonality=[],
dimensions=dimensions or [],
metadata={"seed": 123},
)