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()