monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x1203095e0> def test_reason_live_level_events_debounces_already_posted(monkeypatch): # a committing event already BROADCAST (discord_posted) is not re-reasoned/re-posted (idempotent) monkeypatch.setattr(TR.settings, "TIDE_REASONING_LIVE_LEVEL_EVENTS_ENABLED", True, raising=False) monkeypatch.setattr(TR, "_live_enabled", lambda: True) ev = {"kind": "liquidation_below_poc", "et": "10:40:36", "direction": "up", "level": "intraday_poc", "level_value": 0.062, "breadth": -0.276} monkeypatch.setattr("rtrader.services.tide_level_events.committing_level_events", lambda *a, **k: [ev]) monkeypatch.setattr("rtrader.services.tide_wave_dashboard.tide_series", lambda *a, **k: {"points": []}) monkeypatch.setattr("rtrader.services.tide_wave_dashboard.prev_day_tide_levels", lambda *a, **k: {}) monkeypatch.setattr("rtrader.services.tide_wave_dashboard.premarket_tide_read", lambda *a, **k: None) monkeypatch.setattr(TR, "load_reasoning", lambda *a, **k: [{"event_et": "10:40:36", "kind": "liquidation_below_poc", "discord_posted": True}]) llm = {"n": 0} monkeypatch.setattr(TR, "call_llm", lambda *a, **k: llm.__setitem__("n", llm["n"] + 1) or "") posts = [] monkeypatch.setattr(TR, "_send_discord", lambda m: posts.append(m)) out = TR.reason_live_level_events("2026-07-10", now=datetime(2026, 7, 10, 14, 0, tzinfo=TR.ET)) > assert out == {"asked": 0, "reasoned": 0} and llm["n"] == 0 and posts == [] E AssertionError: assert ({'asked': 0, ...'reasoned': 0} == {'asked': 0, 'reasoned': 0} E E Omitting 2 identical items, use -vv to show E Left contains 1 more item: E {'labeled_skipped': 0} E E Full diff: E {... E E ...Full output truncated (4 lines hidden), use '-vv' to show) tests/services/test_tide_etf_reasoning.py:1002: AssertionError