test(hub): промежуточные ассерты сквозного прогона (T10.1–T10.4)
Проверяются: одна команда в полёте (второй claim пуст), зеркало не пишется до /agent/state, заметка переезжает с new:60 на A-90, статус пакета running с remaining_seconds > 0 между командами и done с 0 в конце, связь проверяется по полям source_key/target_key/link_type. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Typ5sXWNMFirr2va2uL8o
This commit is contained in:
parent
181dd65958
commit
e221a18b46
@ -3,7 +3,7 @@ import threading
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from jira_hub import api, settings
|
from jira_hub import api, settings
|
||||||
from jira_hub.client import HubClient
|
from jira_hub.client import HubClient, HubError
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
@ -33,27 +33,47 @@ def test_create_link_sprint_flow(live):
|
|||||||
{"type": "ensure_sprint", "params": {"key": "new:60", "sprint": "Спринт 2"}},
|
{"type": "ensure_sprint", "params": {"key": "new:60", "sprint": "Спринт 2"}},
|
||||||
]})
|
]})
|
||||||
assert b["count"] == 4
|
assert b["count"] == 4
|
||||||
|
bid = b["id"]
|
||||||
|
assert client.get(f"/batches/{bid}")["status"] == "queued"
|
||||||
seen = []
|
seen = []
|
||||||
while True:
|
while True:
|
||||||
cmd = agent.post("/agent/claim", {"agent_version": 1, "settings_version": 1})["command"]
|
cmd = agent.post("/agent/claim", {"agent_version": 1, "settings_version": 1})["command"]
|
||||||
if cmd is None:
|
if cmd is None:
|
||||||
break
|
break
|
||||||
seen.append((cmd["type"], cmd["params"]))
|
seen.append((cmd["type"], cmd["params"]))
|
||||||
|
view = client.get(f"/batches/{bid}")
|
||||||
|
assert view["status"] == "running" and view["remaining_seconds"] > 0
|
||||||
if cmd["type"] == "ensure_issue":
|
if cmd["type"] == "ensure_issue":
|
||||||
|
# одна команда в полёте: зависимая ensure_link не выдаётся до done ensure_issue
|
||||||
|
assert agent.post("/agent/claim", {"agent_version": 1, "settings_version": 1})["command"] is None
|
||||||
agent.post(f"/agent/commands/{cmd['id']}/result", {"status": "done", "result": {"key": "A-90"}, "jira_calls": 2})
|
agent.post(f"/agent/commands/{cmd['id']}/result", {"status": "done", "result": {"key": "A-90"}, "jira_calls": 2})
|
||||||
|
# done ensure_issue не пишет в зеркало; заметка переехала с new:60 на A-90
|
||||||
|
with pytest.raises(HubError) as e:
|
||||||
|
client.get("/issues/A-90")
|
||||||
|
assert e.value.status == 404
|
||||||
|
with pytest.raises(HubError) as e:
|
||||||
|
client.get("/issues/new:60")
|
||||||
|
assert e.value.status == 404
|
||||||
|
view = client.get(f"/batches/{bid}")
|
||||||
|
assert view["status"] == "running" and view["remaining_seconds"] > 0
|
||||||
elif cmd["type"] == "refresh":
|
elif cmd["type"] == "refresh":
|
||||||
agent.post("/agent/state", {"command_id": cmd["id"], "issues": [
|
agent.post("/agent/state", {"command_id": cmd["id"], "issues": [
|
||||||
{"key": "A-90", "summary": "Новая", "duedate": "2026-10-23", "sprint": "Спринт 2", "labels": [],
|
{"key": "A-90", "summary": "Новая", "duedate": "2026-10-23", "sprint": "Спринт 2", "labels": [],
|
||||||
"created": "2026-10-11T10:00:00.000+0300"},
|
"created": "2026-10-11T10:00:00.000+0300"},
|
||||||
{"key": "A-1", "summary": "Старая", "labels": []}],
|
{"key": "A-1", "summary": "Старая", "labels": []}],
|
||||||
"links": [{"source_key": "A-90", "target_key": "A-1", "link_type": "ASUPR_Связанные"}]})
|
"links": [{"source_key": "A-90", "target_key": "A-1", "link_type": "ASUPR_Связанные"}]})
|
||||||
|
assert client.get("/issues/A-90")["summary"] == "Новая"
|
||||||
agent.post(f"/agent/commands/{cmd['id']}/result", {"status": "done", "jira_calls": 1})
|
agent.post(f"/agent/commands/{cmd['id']}/result", {"status": "done", "jira_calls": 1})
|
||||||
else:
|
else:
|
||||||
agent.post(f"/agent/commands/{cmd['id']}/result", {"status": "done", "jira_calls": 1})
|
agent.post(f"/agent/commands/{cmd['id']}/result", {"status": "done", "jira_calls": 1})
|
||||||
assert [t for t, _ in seen] == ["ensure_issue", "ensure_link", "ensure_sprint", "refresh"]
|
assert [t for t, _ in seen] == ["ensure_issue", "ensure_link", "ensure_sprint", "refresh"]
|
||||||
assert seen[1][1]["source"] == "A-90" and seen[2][1]["key"] == "A-90" and seen[3][1]["keys"] == ["A-90", "A-1"]
|
assert seen[1][1]["source"] == "A-90" and seen[2][1]["key"] == "A-90" and seen[3][1]["keys"] == ["A-90", "A-1"]
|
||||||
view = client.get(f"/batches/{b['id']}")
|
view = client.get(f"/batches/{bid}")
|
||||||
assert view["status"] == "done" and all(c["status"] == "done" for c in view["commands"])
|
assert view["status"] == "done" and view["remaining_seconds"] == 0
|
||||||
|
assert all(c["status"] == "done" for c in view["commands"])
|
||||||
issue = client.get("/issues/A-90")
|
issue = client.get("/issues/A-90")
|
||||||
assert issue["note"]["work_kind"] == "разработка" and issue["links_out"][0]["target_key"] == "A-1"
|
assert issue["note"]["work_kind"] == "разработка"
|
||||||
|
assert len(issue["links_out"]) == 1
|
||||||
|
assert issue["links_out"][0]["target_key"] == "A-1" and issue["links_out"][0]["link_type"] == "ASUPR_Связанные"
|
||||||
|
assert client.get("/issues/A-1")["links_in"] == [{"source_key": "A-90", "link_type": "ASUPR_Связанные"}]
|
||||||
assert client.get("/sync-runs")["runs"][0]["issues_count"] == 2
|
assert client.get("/sync-runs")["runs"][0]["issues_count"] == 2
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user