"""Tests for `demo_data.py` — pure-Python helpers, no gradio dependency.""" from __future__ import annotations import json import os import tempfile import pytest from demo_data import ( empty_state_message, format_alert_card, format_response_card, format_truth_card, load_demo_examples, ) def test_load_missing_file_returns_empty(): assert load_demo_examples("/nonexistent/path/demo.json") == [] def test_load_handles_wrapped_payload(): with tempfile.TemporaryDirectory() as td: p = os.path.join(td, "demo.json") with open(p, "w") as f: json.dump({"n": 1, "examples": [{"alert": {"alert_id": "A1"}, "events": []}]}, f) out = load_demo_examples(p) assert isinstance(out, list) assert out[0]["alert"]["alert_id"] == "A1" def test_load_handles_bare_list(): with tempfile.TemporaryDirectory() as td: p = os.path.join(td, "demo.json") with open(p, "w") as f: json.dump([{"alert": {"alert_id": "A1"}, "events": []}], f) out = load_demo_examples(p) assert len(out) == 1 def test_format_alert_card_includes_required_fields(): alert = { "alert_id": "A-1", "category": "auth", "severity": "high", "host": "h1", "user": "u1", "summary": "Lots of failed logins", } events = [ { "log_id": "L-1", "timestamp": "2026-04-25T12:00:00Z", "source": "auth", "event_type": "auth_failure", "fields": {"src_ip": "1.2.3.4", "user": "u1"}, } ] md = format_alert_card(alert, events) assert "A-1" in md assert "high" in md assert "L-1" in md assert "auth_failure" in md assert "1.2.3.4" in md def test_format_response_card_marks_correct_and_breakdown(): resp = { "action": "block_ip", "cited_log_id": "L-1", "rationale": "Brute force pattern observed.", "reward": 1.1, "correct": True, "reward_breakdown": {"correct_action": 1.0, "correct_citation_bonus": 0.1}, "raw_text": "Action: block_ip\nCitedLog: L-1\nRationale: Brute force pattern observed.", } md = format_response_card("OpenSOC", resp) assert "block_ip" in md assert "OK" in md # correct emoji/marker assert "+1.10" in md assert "correct_action" in md def test_format_response_card_marks_miss(): resp = { "action": "dismiss", "cited_log_id": "L-1", "rationale": "Looks fine.", "reward": -1.0, "correct": False, "reward_breakdown": {"missed_malicious": -1.0}, } md = format_response_card("Baseline", resp) assert "MISS" in md assert "-1.00" in md def test_format_truth_card_smoke(): md = format_truth_card({ "ground_truth": "block_ip", "triggering_log_id": "L-2", "stage": "stage2_multi", "seed": 91234, }) assert "block_ip" in md assert "L-2" in md assert "stage2_multi" in md def test_empty_state_message_mentions_bake_demo(): msg = empty_state_message() assert "bake_demo" in msg assert "placeholder" in msg