Merge pull request 'fix(agent): ensure_sprint на задаче без спринта (#13)' (#14) from fix/13-ensure-sprint-without-sprint into main

Reviewed-on: #14
This commit is contained in:
aep 2026-10-13 22:46:44 +03:00
commit d7cd05044a
3 changed files with 15 additions and 1 deletions

View File

@ -739,7 +739,9 @@ class Executor:
def do_ensure_sprint(self, p: dict, cmd: dict) -> dict: def do_ensure_sprint(self, p: dict, cmd: dict) -> dict:
key, want = p["key"], p["sprint"] key, want = p["key"], p["sprint"]
cur = ((self.jira.get(AGILE + "/issue/%s" % key, fields="sprint")["fields"].get("sprint") or {}).get("name")) # у задачи без спринта Jira банка отвечает без ключа fields (#13)
issue = self.jira.get(AGILE + "/issue/%s" % key, fields="sprint")
cur = (((issue.get("fields") or {}).get("sprint")) or {}).get("name")
if want == "backlog": # в бэклог доска не нужна if want == "backlog": # в бэклог доска не нужна
if cur is None: if cur is None:
return self._out("done", {"sprint": None, "changed": False}) return self._out("done", {"sprint": None, "changed": False})

View File

@ -248,6 +248,8 @@ class FakeJira:
if m: if m:
name = self.issues[m.group(1)]["sprint"] name = self.issues[m.group(1)]["sprint"]
sp = next((s for s in self.sprints if s["name"] == name), None) sp = next((s for s in self.sprints if s["name"] == name), None)
if sp is None: # как Jira банка (13.10.2026): без спринта ключа fields в ответе нет
return 200, {"key": m.group(1)}
return 200, {"key": m.group(1), "fields": {"sprint": sp}} return 200, {"key": m.group(1), "fields": {"sprint": sp}}
return 404, {"errorMessages": ["нет маршрута %s %s" % (method, p)]} return 404, {"errorMessages": ["нет маршрута %s %s" % (method, p)]}

View File

@ -153,6 +153,16 @@ class ExecutorLinksTest(unittest.TestCase):
self.assertEqual(again["result"], {"sprint": "Спринт 2", "changed": False}) self.assertEqual(again["result"], {"sprint": "Спринт 2", "changed": False})
self.assertEqual(again["jira_calls"], 1) self.assertEqual(again["jira_calls"], 1)
def test_sprint_issue_without_sprint_has_no_fields(self):
"""#13: у задачи без спринта Jira банка отвечает без ключа fields — это «спринта нет», а не ошибка."""
self.assertIsNone(self.fake.issues["AURORA-1"]["sprint"])
backlog = self.run_cmd("ensure_sprint", key="AURORA-1", sprint="backlog")
self.assertEqual(backlog["status"], "done")
self.assertEqual(backlog["result"], {"sprint": None, "changed": False})
out = self.run_cmd("ensure_sprint", key="AURORA-1", sprint="Спринт 2")
self.assertEqual(out["status"], "done")
self.assertEqual(self.fake.issues["AURORA-1"]["sprint"], "Спринт 2")
def test_sprint_pagination(self): def test_sprint_pagination(self):
for i in range(3, 58): # 57 спринтов: доска отдаёт по 50, нужны две страницы for i in range(3, 58): # 57 спринтов: доска отдаёт по 50, нужны две страницы
self.fake.sprints.append({"id": i, "name": "Спринт %d" % i, "state": "future"}) self.fake.sprints.append({"id": i, "name": "Спринт %d" % i, "state": "future"})