mirror of
https://github.com/zvx-echo6/meshai.git
synced 2026-06-11 01:14:45 +02:00
61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
|
|
"""Phase 2.16.1 grouper tests: immediate bypass + periodic flush of routine."""
|
||
|
|
|
||
|
|
from meshai.notifications.pipeline.grouper import Grouper
|
||
|
|
from meshai.notifications.events import make_event
|
||
|
|
|
||
|
|
|
||
|
|
class Recorder:
|
||
|
|
def __init__(self):
|
||
|
|
self.received = []
|
||
|
|
|
||
|
|
def handle(self, event):
|
||
|
|
self.received.append(event)
|
||
|
|
|
||
|
|
|
||
|
|
def _ev(severity, group_key="gk1"):
|
||
|
|
return make_event(
|
||
|
|
source="usgs_quake",
|
||
|
|
category="earthquake_event",
|
||
|
|
severity=severity,
|
||
|
|
title=f"test {severity}",
|
||
|
|
lat=42.6,
|
||
|
|
lon=-114.5,
|
||
|
|
group_key=group_key,
|
||
|
|
inhibit_keys=[group_key],
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_immediate_severity_bypasses_grouper():
|
||
|
|
"""An immediate event with a group_key is delivered at once, not buffered."""
|
||
|
|
rec = Recorder()
|
||
|
|
g = Grouper(next_handler=rec.handle, window_seconds=60.0)
|
||
|
|
g.handle(_ev("immediate"))
|
||
|
|
# Delivered immediately, nothing held.
|
||
|
|
assert len(rec.received) == 1
|
||
|
|
assert rec.received[0].severity == "immediate"
|
||
|
|
assert g.held_count() == 0
|
||
|
|
|
||
|
|
|
||
|
|
def test_periodic_flush_drains_routine():
|
||
|
|
"""A routine event is held, then released by tick() once its window passes."""
|
||
|
|
rec = Recorder()
|
||
|
|
g = Grouper(next_handler=rec.handle, window_seconds=0.0) # 0s window -> tick drains now
|
||
|
|
g.handle(_ev("routine"))
|
||
|
|
# Held on arrival, not yet delivered.
|
||
|
|
assert g.held_count() == 1
|
||
|
|
assert rec.received == []
|
||
|
|
# The periodic flush task calls tick(); simulate one tick.
|
||
|
|
drained = g.tick()
|
||
|
|
assert drained == 1
|
||
|
|
assert len(rec.received) == 1
|
||
|
|
assert rec.received[0].severity == "routine"
|
||
|
|
assert g.held_count() == 0
|
||
|
|
|
||
|
|
|
||
|
|
def test_priority_is_also_coalesced_not_bypassed():
|
||
|
|
"""Priority events still buffer (only immediate bypasses)."""
|
||
|
|
rec = Recorder()
|
||
|
|
g = Grouper(next_handler=rec.handle, window_seconds=60.0)
|
||
|
|
g.handle(_ev("priority"))
|
||
|
|
assert rec.received == []
|
||
|
|
assert g.held_count() == 1
|