fix: skip intermediate 'starting' notifications, only notify on failed/successful attempts
- lifecycle_hooks.publish_lifecycle_event now skips notification creation when event_type='instance.started' and status='starting' - Users only see notifications for terminal states: - Failed: instance.error - Successful: instance.health_changed with status='running' - Updated integration tests to verify new behavior: - test_lifecycle_started_intermediate_skips_notification - test_lifecycle_running_creates_notification Quality gates: pytest 42 passed, ruff clean
This commit is contained in:
@@ -88,12 +88,12 @@ async def test_instance(db_session: AsyncSession) -> ToolInstance:
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.integration
|
||||
async def test_lifecycle_event_creates_notification(
|
||||
async def test_lifecycle_started_intermediate_skips_notification(
|
||||
db_session: AsyncSession,
|
||||
event_bus: InstanceEventBus,
|
||||
test_instance: ToolInstance,
|
||||
) -> None:
|
||||
"""Triggering a lifecycle event creates a notification for the instance owner."""
|
||||
"""Intermediate 'starting' state does NOT create a notification."""
|
||||
received: list[InstanceEventPayload] = []
|
||||
|
||||
def subscriber(payload: InstanceEventPayload) -> None:
|
||||
@@ -109,13 +109,39 @@ async def test_lifecycle_event_creates_notification(
|
||||
instance=test_instance,
|
||||
event_type="instance.started",
|
||||
status="starting",
|
||||
message="Container started",
|
||||
message="Container starting...",
|
||||
)
|
||||
|
||||
# Event still published
|
||||
assert len(received) == 1
|
||||
|
||||
# Notification created
|
||||
# No notification created for intermediate state
|
||||
result = await db_session.execute(
|
||||
select(Notification).where(Notification.user_id == test_instance.owner_id)
|
||||
)
|
||||
notifications = list(result.scalars().all())
|
||||
assert len(notifications) == 0
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
@pytest.mark.integration
|
||||
async def test_lifecycle_running_creates_notification(
|
||||
db_session: AsyncSession,
|
||||
event_bus: InstanceEventBus,
|
||||
test_instance: ToolInstance,
|
||||
) -> None:
|
||||
"""Successful terminal state (running) creates a notification."""
|
||||
from src.services.lifecycle_hooks import publish_lifecycle_event
|
||||
|
||||
await publish_lifecycle_event(
|
||||
event_bus=event_bus,
|
||||
session=db_session,
|
||||
instance=test_instance,
|
||||
event_type="instance.health_changed",
|
||||
status="running",
|
||||
message="Container running",
|
||||
)
|
||||
|
||||
result = await db_session.execute(
|
||||
select(Notification).where(Notification.user_id == test_instance.owner_id)
|
||||
)
|
||||
@@ -124,10 +150,9 @@ async def test_lifecycle_event_creates_notification(
|
||||
n = notifications[0]
|
||||
assert n.category == "instance"
|
||||
assert n.severity == "info"
|
||||
assert n.title == "Container started"
|
||||
assert n.title == "Health Changed"
|
||||
assert n.source_type == "tool_instances"
|
||||
assert n.source_id == test_instance.id
|
||||
assert n.message == "Container started"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
|
||||
Reference in New Issue
Block a user