import pytest from ._helpers import make_event, make_heartbeat @pytest.mark.asyncio async def test_incident_key_ownership_rejected(app_client, auth_headers): await app_client.post("/api/v1/heartbeat", json=make_heartbeat("agent-1"), headers=auth_headers) await app_client.post("/api/v1/heartbeat", json=make_heartbeat("agent-2"), headers=auth_headers) ev1 = make_event(status="critical", exit_code=2, incident_key="shared-key") r1 = await app_client.post( "/api/v1/events", json={"agent_id": "agent-1", "events": [ev1]}, headers=auth_headers ) assert r1.status_code == 202 ev2 = make_event(status="critical", exit_code=2, incident_key="shared-key") r2 = await app_client.post( "/api/v1/events", json={"agent_id": "agent-2", "events": [ev2]}, headers=auth_headers ) assert r2.status_code == 400 assert r2.json()["error"]["code"] == "validation" @pytest.mark.asyncio async def test_incident_key_too_long(app_client, auth_headers): await app_client.post("/api/v1/heartbeat", json=make_heartbeat(), headers=auth_headers) ev = make_event(status="critical", exit_code=2, incident_key="x" * 257) r = await app_client.post( "/api/v1/events", json={"agent_id": "agent-1", "events": [ev]}, headers=auth_headers ) assert r.status_code == 400 @pytest.mark.asyncio async def test_events_query_cursor_pagination(app_client, auth_headers): await app_client.post("/api/v1/heartbeat", json=make_heartbeat(), headers=auth_headers) evs = [make_event() for _ in range(5)] await app_client.post( "/api/v1/events", json={"agent_id": "agent-1", "events": evs}, headers=auth_headers ) r = await app_client.get("/api/v1/events/query?limit=2", headers=auth_headers) assert r.status_code == 200 page1 = r.json() assert len(page1["items"]) == 2 assert page1["next_cursor"] r2 = await app_client.get( f"/api/v1/events/query?limit=2&cursor={page1['next_cursor']}", headers=auth_headers ) page2 = r2.json() assert len(page2["items"]) == 2 ids1 = {i["event_id"] for i in page1["items"]} ids2 = {i["event_id"] for i in page2["items"]} assert ids1.isdisjoint(ids2)