test_concern_cleanup.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from __future__ import annotations
  2. import sqlite3
  3. from uuid import uuid4
  4. from hermes_mcp.store import (
  5. DB_PATH,
  6. delete_concern,
  7. init_db,
  8. upsert_concern,
  9. upsert_cycle,
  10. upsert_decision,
  11. upsert_narrative,
  12. upsert_observation,
  13. upsert_regime_sample,
  14. upsert_state,
  15. )
  16. def _count(table: str, value: str, column: str = "concern_id") -> int:
  17. with sqlite3.connect(DB_PATH) as conn:
  18. conn.row_factory = sqlite3.Row
  19. row = conn.execute(f"select count(*) as n from {table} where {column} = ?", (value,)).fetchone()
  20. return int(row["n"] if row else 0)
  21. def test_delete_concern_purges_related_rows():
  22. init_db()
  23. concern_id = f"test:{uuid4().hex}"
  24. cycle_id = f"cycle:{uuid4().hex}"
  25. decision_id = f"decision:{uuid4().hex}"
  26. action_id = f"action:{uuid4().hex}"
  27. upsert_concern(
  28. id=concern_id,
  29. account_id="acct-1",
  30. market_symbol="xrpusd",
  31. base_currency="XRP",
  32. quote_currency="USD",
  33. strategy_id="trend-1",
  34. source="test",
  35. status="active",
  36. notes="cleanup target",
  37. )
  38. upsert_cycle(id=cycle_id, started_at="2026-04-19T00:00:00+00:00", finished_at=None, status="ok", trigger="test")
  39. upsert_observation(id=f"obs:{uuid4().hex}", cycle_id=cycle_id, concern_id=concern_id, source="test", kind="snapshot", payload_json="{}")
  40. upsert_state(
  41. id=f"state:{uuid4().hex}",
  42. cycle_id=cycle_id,
  43. concern_id=concern_id,
  44. market_regime="bull",
  45. volatility_state="normal",
  46. liquidity_state="good",
  47. sentiment_pressure="neutral",
  48. event_risk="low",
  49. execution_quality="good",
  50. confidence=0.9,
  51. payload_json="{}",
  52. )
  53. upsert_narrative(
  54. id=f"narr:{uuid4().hex}",
  55. cycle_id=cycle_id,
  56. concern_id=concern_id,
  57. summary="cleanup target",
  58. key_drivers_json="[]",
  59. risk_flags_json="[]",
  60. uncertainties_json="[]",
  61. confidence=0.8,
  62. )
  63. upsert_decision(
  64. id=decision_id,
  65. cycle_id=cycle_id,
  66. concern_id=concern_id,
  67. action="replace_with_grid",
  68. target_strategy="grid-1",
  69. target_policy_json="{}",
  70. reason_summary="cleanup target",
  71. confidence=0.7,
  72. requires_action=True,
  73. )
  74. upsert_regime_sample(id=f"regime:{uuid4().hex}", cycle_id=cycle_id, concern_id=concern_id, timeframe="1h", regime_json="{}", captured_at="2026-04-19T00:00:00+00:00")
  75. with sqlite3.connect(DB_PATH) as conn:
  76. conn.execute(
  77. "insert into actions(id, decision_id, target, command, request_json, response_json, status, executed_at) values(?, ?, ?, ?, ?, ?, ?, ?)",
  78. (action_id, decision_id, "trader", "switch", "{}", None, "pending", None),
  79. )
  80. conn.commit()
  81. deleted = delete_concern(concern_id=concern_id)
  82. assert deleted["concerns"] == 1
  83. assert deleted["decisions"] == 1
  84. assert deleted["actions"] == 1
  85. assert deleted["observations"] == 1
  86. assert deleted["states"] == 1
  87. assert deleted["narratives"] == 1
  88. assert deleted["regime_samples"] == 1
  89. assert _count("concerns", concern_id, "id") == 0
  90. for table in ("observations", "states", "narratives", "decisions", "coverage_gaps", "regime_samples"):
  91. assert _count(table, concern_id) == 0
  92. assert _count("actions", decision_id, "decision_id") == 0