Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Typ5sXWNMFirr2va2uL8o
79 lines
3.0 KiB
Python
79 lines
3.0 KiB
Python
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()
|