Announce an acknowledged node failure on the bus
Docs / docs (push) Successful in 21s
Playwright Tests / test-playwright (1, 2) (push) Failing after 2m38s
Playwright Tests / test-playwright (2, 2) (push) Failing after 1m38s
pre-commit / pre-commit (push) Failing after 2m46s
Test Backend / test-backend (push) Successful in 2m17s
Compose Smoke Test / test-compose (push) Successful in 31s
Playwright Tests / merge-reports (push) Failing after 1m2s

Clearing a node's last error on the engine published nothing, so a second
browser kept the marker until its next snapshot. One event carries the
qualified node; the receiving client drops the marker without refetching.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Gf7WaExcJ9bs3kfJXB3nK
This commit is contained in:
2026-08-25 22:33:09 +02:00
co-authored by Claude Opus 5
parent 5ba379490a
commit dd7db026e1
4 changed files with 49 additions and 0 deletions
+30
View File
@@ -1,10 +1,12 @@
from datetime import UTC, datetime
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import func
from sqlmodel import Session, select
from fluksio.core.config import settings
from fluksio.flow.events import event_bus
from fluksio.models import Run, RunArtifact, RunMetric, RunNode
PREFIX = f"{settings.API_V1_STR}/flows"
@@ -422,6 +424,34 @@ def test_a_node_that_raises_answers_with_its_error(
client.delete(f"{PREFIX}/failing", headers=superuser_token_headers)
def test_acknowledging_a_failure_is_announced_on_the_bus(
client: TestClient,
superuser_token_headers: dict[str, str],
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Another browser holds the same marker; the event is what clears it."""
saved = client.put(
f"{PREFIX}/acked", headers=superuser_token_headers, json=a_flow("acked")
).json()
client.post(
f"{PREFIX}/acked/publish",
headers=superuser_token_headers,
json={"version": saved["definition"]["version"]},
)
published: list[dict] = []
monkeypatch.setattr(event_bus, "publish", published.append)
response = client.post(
f"{PREFIX}/acked/nodes/sensor/acknowledge", headers=superuser_token_headers
)
assert response.status_code == 200
event = next(e for e in published if e["type"] == "node_error_acknowledged")
assert event["node"] == "acked.sensor"
client.delete(f"{PREFIX}/acked", headers=superuser_token_headers)
def test_renaming_a_flow_leaves_nothing_under_the_old_name(
client: TestClient, superuser_token_headers: dict[str, str]
) -> None: