fix: resolve pylint/pyright issues in new test files
- test_contrib_gitea_client: remove unused Any import, fix _mock_response to use return_value instead of lambda (unknown lambda type), narrow HTTPError hdrs type, add type annotations to fake_urlopen helpers, suppress protected-access for _request tests - test_bootstrap: annotate **kw as **kw: object, use dict literal, unpack server_address via index to avoid tuple type mismatch - test_main: remove unused MagicMock import - test_watchdog: guard store.get() result before accessing .status Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -35,12 +35,12 @@ def _config(tmp: str) -> Config:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def _record(**kw) -> RunRecord:
|
def _record(**kw: object) -> RunRecord:
|
||||||
defaults: dict[str, object] = dict(
|
defaults: dict[str, object] = {
|
||||||
owner="o", repo="r", issue_number=1, slug="s1", agent_name="a",
|
"owner": "o", "repo": "r", "issue_number": 1, "slug": "s1", "agent_name": "a",
|
||||||
bottle_names=["claude"], backend_name="docker", agent_git_user="bot",
|
"bottle_names": ["claude"], "backend_name": "docker", "agent_git_user": "bot",
|
||||||
pr_number=5, status="running", last_checkin_at="2026-01-01T00:00:00+00:00",
|
"pr_number": 5, "status": "running", "last_checkin_at": "2026-01-01T00:00:00+00:00",
|
||||||
)
|
}
|
||||||
defaults.update(kw)
|
defaults.update(kw)
|
||||||
return RunRecord(**defaults) # type: ignore[arg-type]
|
return RunRecord(**defaults) # type: ignore[arg-type]
|
||||||
|
|
||||||
@@ -169,10 +169,10 @@ class BuildTest(unittest.TestCase):
|
|||||||
config = _config(tmp)
|
config = _config(tmp)
|
||||||
with patch.dict(os.environ, {"GITEA_TOKEN": "tok"}):
|
with patch.dict(os.environ, {"GITEA_TOKEN": "tok"}):
|
||||||
server, _, _ = build(config)
|
server, _, _ = build(config)
|
||||||
host, port = server.server_address
|
addr = server.server_address
|
||||||
server.server_close()
|
server.server_close()
|
||||||
self.assertEqual("127.0.0.1", host)
|
self.assertEqual("127.0.0.1", addr[0])
|
||||||
self.assertGreater(port, 0)
|
self.assertGreater(addr[1], 0)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import io
|
import io
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from bot_bottle.orchestrator.__main__ import main
|
from bot_bottle.orchestrator.__main__ import main
|
||||||
from bot_bottle.orchestrator.config import Config
|
from bot_bottle.orchestrator.config import Config
|
||||||
|
|||||||
@@ -71,7 +71,9 @@ class WatchdogSweepTest(unittest.TestCase):
|
|||||||
self.wd.start()
|
self.wd.start()
|
||||||
time.sleep(0.05) # enough for several iterations at 0.01s tick
|
time.sleep(0.05) # enough for several iterations at 0.01s tick
|
||||||
self.wd.stop()
|
self.wd.stop()
|
||||||
self.assertEqual(STATUS_FROZEN, self.store.get("o", "r", 5).status)
|
rec = self.store.get("o", "r", 5)
|
||||||
|
assert rec is not None
|
||||||
|
self.assertEqual(STATUS_FROZEN, rec.status)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -17,12 +17,13 @@ def _client() -> GiteaClient:
|
|||||||
def _mock_response(body: bytes) -> MagicMock:
|
def _mock_response(body: bytes) -> MagicMock:
|
||||||
resp = MagicMock()
|
resp = MagicMock()
|
||||||
resp.read.return_value = body
|
resp.read.return_value = body
|
||||||
resp.__enter__ = lambda s: s
|
resp.__enter__.return_value = resp
|
||||||
resp.__exit__ = MagicMock(return_value=False)
|
resp.__exit__.return_value = False
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|
||||||
class GiteaClientTest(unittest.TestCase):
|
class GiteaClientTest(unittest.TestCase):
|
||||||
|
# pylint: disable=protected-access
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.client = _client()
|
self.client = _client()
|
||||||
|
|
||||||
@@ -46,10 +47,8 @@ class GiteaClientTest(unittest.TestCase):
|
|||||||
self.assertTrue(self.client.is_org_member("myorg", "alice"))
|
self.assertTrue(self.client.is_org_member("myorg", "alice"))
|
||||||
|
|
||||||
def test_is_org_member_false_on_http_error(self):
|
def test_is_org_member_false_on_http_error(self):
|
||||||
with patch(
|
err = urllib.error.HTTPError("url", 404, "Not Found", None, None) # type: ignore[arg-type]
|
||||||
"urllib.request.urlopen",
|
with patch("urllib.request.urlopen", side_effect=err):
|
||||||
side_effect=urllib.error.HTTPError("url", 404, "Not Found", {}, None),
|
|
||||||
):
|
|
||||||
self.assertFalse(self.client.is_org_member("myorg", "nobody"))
|
self.assertFalse(self.client.is_org_member("myorg", "nobody"))
|
||||||
|
|
||||||
def test_get_issue(self):
|
def test_get_issue(self):
|
||||||
@@ -84,34 +83,30 @@ class GiteaClientTest(unittest.TestCase):
|
|||||||
mock_open.assert_called_once()
|
mock_open.assert_called_once()
|
||||||
|
|
||||||
def test_request_builds_correct_url(self):
|
def test_request_builds_correct_url(self):
|
||||||
captured: list[object] = []
|
import urllib.request as ureq
|
||||||
|
captured: list[ureq.Request] = []
|
||||||
|
|
||||||
def fake_urlopen(req, timeout):
|
def fake_urlopen(req: ureq.Request, timeout: float) -> MagicMock: # pylint: disable=unused-argument
|
||||||
captured.append(req)
|
captured.append(req)
|
||||||
return _mock_response(b"{}")
|
return _mock_response(b"{}")
|
||||||
|
|
||||||
with patch("urllib.request.urlopen", side_effect=fake_urlopen):
|
with patch("urllib.request.urlopen", side_effect=fake_urlopen):
|
||||||
self.client.get_issue(5)
|
self.client.get_issue(5)
|
||||||
|
|
||||||
import urllib.request as ureq
|
self.assertIn("/issues/5", captured[0].full_url)
|
||||||
req = captured[0]
|
|
||||||
assert isinstance(req, ureq.Request)
|
|
||||||
self.assertIn("/issues/5", req.full_url)
|
|
||||||
|
|
||||||
def test_request_sends_auth_header(self):
|
def test_request_sends_auth_header(self):
|
||||||
captured: list[object] = []
|
import urllib.request as ureq
|
||||||
|
captured: list[ureq.Request] = []
|
||||||
|
|
||||||
def fake_urlopen(req, timeout):
|
def fake_urlopen(req: ureq.Request, timeout: float) -> MagicMock: # pylint: disable=unused-argument
|
||||||
captured.append(req)
|
captured.append(req)
|
||||||
return _mock_response(b"{}")
|
return _mock_response(b"{}")
|
||||||
|
|
||||||
with patch("urllib.request.urlopen", side_effect=fake_urlopen):
|
with patch("urllib.request.urlopen", side_effect=fake_urlopen):
|
||||||
self.client.get_issue(1)
|
self.client.get_issue(1)
|
||||||
|
|
||||||
import urllib.request as ureq
|
self.assertEqual("token tok", captured[0].get_header("Authorization"))
|
||||||
req = captured[0]
|
|
||||||
assert isinstance(req, ureq.Request)
|
|
||||||
self.assertEqual("token tok", req.get_header("Authorization"))
|
|
||||||
|
|
||||||
|
|
||||||
class GiteaForgeTest(unittest.TestCase):
|
class GiteaForgeTest(unittest.TestCase):
|
||||||
|
|||||||
Reference in New Issue
Block a user