Поиск дубля в ensure_issue до создания (автор = currentUser(), точная тема). ensure_fields пишет только отличающиеся поля, описание сравнивается точно, даты — по первым 10 символам. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Typ5sXWNMFirr2va2uL8o
110 lines
6.0 KiB
Python
110 lines
6.0 KiB
Python
import unittest
|
|
|
|
from _common import SETTINGS, agent, jira_cfg, no_sleep
|
|
from fake_jira import FakeJira
|
|
|
|
|
|
class ExecutorFieldsTest(unittest.TestCase):
|
|
def setUp(self):
|
|
self.fake = FakeJira()
|
|
self.jira = agent.JiraClient(jira_cfg(self.fake))
|
|
self.jira.sleep = no_sleep
|
|
self.ex = agent.Executor(self.jira, dict(SETTINGS))
|
|
self.ex.sleep = no_sleep
|
|
|
|
def tearDown(self):
|
|
self.fake.stop()
|
|
|
|
def run_cmd(self, ctype, **params):
|
|
return self.ex.run({"id": 1, "type": ctype, "params": params})
|
|
|
|
def test_ensure_issue_creates_then_finds(self):
|
|
out = self.run_cmd("ensure_issue", temp_key="new:1", issue_type="task", summary="Новая задача", description="h3. Контекст",
|
|
priority="Высокий", duedate="2026-10-23", planned_start="2026-10-20", labels=["AWPCA", "kind-dev"],
|
|
epic_key="AURORA-1350", assignee="ivanov")
|
|
self.assertEqual(out["status"], "done")
|
|
key = out["result"]["key"]
|
|
self.assertTrue(out["result"]["created"])
|
|
f = self.fake.issues[key]
|
|
self.assertEqual(f["priority"], "Высокий")
|
|
self.assertEqual(f["customfield_10801"], "2026-10-20")
|
|
self.assertEqual(f["customfield_15302"], "AURORA-1350")
|
|
self.assertEqual(f["labels"], ["AWPCA", "kind-dev"])
|
|
self.assertEqual(out["jira_calls"], 2)
|
|
again = self.run_cmd("ensure_issue", temp_key="new:1", issue_type="task", summary="Новая задача")
|
|
self.assertEqual(again["status"], "done")
|
|
self.assertEqual(again["result"], {"key": key, "existed": True})
|
|
self.assertEqual(len(self.fake.issues), 1)
|
|
self.assertEqual(again["jira_calls"], 1)
|
|
|
|
def test_ensure_issue_epic_sets_epic_name(self):
|
|
out = self.run_cmd("ensure_issue", temp_key="new:2", issue_type="epic", summary="Приёмка")
|
|
f = self.fake.issues[out["result"]["key"]]
|
|
self.assertEqual(f["issuetype"], "Фича")
|
|
self.assertEqual(f["customfield_15304"], "Приёмка")
|
|
|
|
def test_ensure_issue_priority_mapped(self):
|
|
out = self.run_cmd("ensure_issue", temp_key="new:3", issue_type="task", summary="x", priority="Наивысший")
|
|
self.assertEqual(self.fake.issues[out["result"]["key"]]["priority"], "Критичный")
|
|
|
|
def test_ensure_fields_writes_only_diff(self):
|
|
self.fake.add("AURORA-1", duedate="2026-10-20", labels=["AWPCA", "fact-open"], priority="Средний")
|
|
out = self.run_cmd("ensure_fields", key="AURORA-1", duedate="2026-10-23", priority="Средний",
|
|
labels_add=["kind-dev", "AWPCA"], labels_remove=["fact-open"], assignee="ivanov",
|
|
planned_end="2026-10-23", epic_key="AURORA-1350")
|
|
self.assertEqual(out["status"], "done")
|
|
self.assertEqual(out["result"]["changed"], ["duedate", "planned_end", "epic_key", "assignee", "labels"])
|
|
f = self.fake.issues["AURORA-1"]
|
|
self.assertEqual(f["labels"], ["AWPCA", "kind-dev"])
|
|
self.assertEqual(f["assignee"], "ivanov")
|
|
self.assertEqual(f["customfield_10802"], "2026-10-23")
|
|
self.assertEqual(len(self.fake.writes()), 1)
|
|
again = self.run_cmd("ensure_fields", key="AURORA-1", duedate="2026-10-23", labels_add=["kind-dev"], assignee="ivanov")
|
|
self.assertEqual(again["result"], {"changed": []})
|
|
self.assertEqual(len(self.fake.writes()), 1)
|
|
|
|
def test_fields_description_exact_compare(self):
|
|
text = "h3. Контекст\n* пункт *жирный*\n\nh3. Что сделать"
|
|
self.fake.add("AURORA-1", description=text)
|
|
out = self.run_cmd("ensure_fields", key="AURORA-1", description=text)
|
|
self.assertEqual(out["result"]["changed"], [])
|
|
out = self.run_cmd("ensure_fields", key="AURORA-1", description=text + "\n")
|
|
self.assertEqual(out["result"]["changed"], ["description"])
|
|
|
|
def test_fields_date_with_time_from_jira(self):
|
|
self.fake.add("AURORA-1", customfield_10802="2026-10-23T00:00:00.000+0300")
|
|
out = self.run_cmd("ensure_fields", key="AURORA-1", planned_end="2026-10-23")
|
|
self.assertEqual(out["result"]["changed"], [])
|
|
|
|
def test_fields_clear_assignee_and_epic(self):
|
|
self.fake.add("AURORA-1", assignee="ivanov", customfield_15302="AURORA-1350")
|
|
out = self.run_cmd("ensure_fields", key="AURORA-1", assignee=None, epic_key=None)
|
|
self.assertEqual(out["result"]["changed"], ["epic_key", "assignee"])
|
|
self.assertIsNone(self.fake.issues["AURORA-1"]["assignee"])
|
|
self.assertIsNone(self.fake.issues["AURORA-1"]["customfield_15302"])
|
|
|
|
def test_fields_missing_issue_is_failed(self):
|
|
out = self.run_cmd("ensure_fields", key="AURORA-404", duedate="2026-10-23")
|
|
self.assertEqual(out["status"], "failed")
|
|
self.assertIn("HTTP 404", out["error"])
|
|
|
|
def test_ensure_comment_upsert(self):
|
|
self.fake.add("AURORA-1")
|
|
out = self.run_cmd("ensure_comment", key="AURORA-1", marker="Актуализация 10.10.2026", body="Сделано: список")
|
|
self.assertEqual(out["status"], "done")
|
|
self.assertTrue(out["result"]["created"])
|
|
self.assertEqual(self.fake.comments["AURORA-1"][0]["body"], "*Актуализация 10.10.2026.* Сделано: список")
|
|
same = self.run_cmd("ensure_comment", key="AURORA-1", marker="Актуализация 10.10.2026", body="Сделано: список")
|
|
self.assertEqual(same["result"]["changed"], False)
|
|
upd = self.run_cmd("ensure_comment", key="AURORA-1", marker="Актуализация 10.10.2026", body="Сделано: всё")
|
|
self.assertEqual(upd["result"]["changed"], True)
|
|
self.assertEqual(len(self.fake.comments["AURORA-1"]), 1)
|
|
self.assertEqual(self.fake.comments["AURORA-1"][0]["body"], "*Актуализация 10.10.2026.* Сделано: всё")
|
|
|
|
def test_unknown_type(self):
|
|
self.assertEqual(self.run_cmd("ensure_magic", key="x")["status"], "failed")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|