import unittest from _common import agent, jira_cfg, no_sleep from fake_jira import FakeJira class ClientsTest(unittest.TestCase): def setUp(self): self.fake = FakeJira() self.jira = agent.JiraClient(jira_cfg(self.fake)) self.jira.sleep = no_sleep def tearDown(self): self.fake.stop() def test_get_and_counters(self): self.fake.add("AURORA-1") data = self.jira.get("/rest/api/2/issue/AURORA-1", fields="summary") self.assertEqual(data["fields"]["summary"], "Тема AURORA-1") self.assertEqual(self.jira.calls, 1) self.assertIsNotNone(self.jira.last_call_at) self.assertEqual(self.fake.requests[-1], ("GET", "/rest/api/2/issue/AURORA-1")) def test_retry_on_429_with_retry_after(self): self.fake.add("AURORA-1") self.fake.fail_next.append((429, {"Retry-After": "0"})) self.fake.fail_next.append((503, {})) data = self.jira.get("/rest/api/2/issue/AURORA-1") self.assertEqual(data["key"], "AURORA-1") self.assertEqual(self.jira.rate_limited, 2) self.assertEqual(self.jira.calls, 1) def test_http_error_not_retried(self): with self.assertRaises(agent.HttpError) as cm: self.jira.get("/rest/api/2/issue/NOPE-1") self.assertEqual(cm.exception.code, 404) self.assertIn("Does Not Exist", cm.exception.text) def test_gives_up_after_five(self): self.fake.add("AURORA-1") self.fake.fail_next.extend([(429, {"Retry-After": "0"})] * 5) with self.assertRaises(agent.HttpError): self.jira.get("/rest/api/2/issue/AURORA-1") self.assertEqual(self.jira.rate_limited, 5) def test_basic_auth_header_and_no_secret_in_repr(self): self.assertTrue(self.jira.headers["Authorization"].startswith("Basic ")) self.assertNotIn("secret", repr(self.jira)) def test_load_config_requires_fields(self): import json import os import tempfile with tempfile.TemporaryDirectory() as d: path = os.path.join(d, "agent.json") with open(path, "w", encoding="utf-8") as f: json.dump({"hub_url": "http://x", "hub_token": "t"}, f) with self.assertRaises(SystemExit): agent.load_config(path) with open(path, "w", encoding="utf-8") as f: json.dump(jira_cfg(self.fake), f) cfg = agent.load_config(path) self.assertEqual(cfg["poll_seconds"], 0) def test_check_command(self): import json import os import tempfile with tempfile.TemporaryDirectory() as d: path = os.path.join(d, "agent.json") with open(path, "w", encoding="utf-8") as f: json.dump(jira_cfg(self.fake), f) # хаб недоступен (порт 1), Jira доступен — check печатает оба результата и возвращает 1 self.assertEqual(agent.main(["--config", path, "check"]), 1) if __name__ == "__main__": unittest.main()