314dc03b0d
Moves the orchestrator into bot_bottle/orchestrator/ so one install gets everything. Entry point is now `python -m bot_bottle.orchestrator run`. - Add bot_bottle/orchestrator/ with all 14 modules (verbatim move; internal imports were already relative, so no changes inside orchestrator modules) - Rewrite bootstrap.py: remove the lazy bot_bottle import guard, use direct relative imports from ..contrib.* - Add bot_bottle/contrib/forge/base.py: ScopedForge (read-anywhere / write-scoped) - Add bot_bottle/contrib/gitea/client.py: GiteaClient + GiteaForge (urllib.request only) - Add bot_bottle/contrib/gitea/forge_state.py: ForgeState + SqliteForgeStateStore - Add tests/unit/orchestrator/ (82 tests: 63 migrated + 19 new for contrib modules) Closes #321
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
"""Unit: webhook payload parsing."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from bot_bottle.orchestrator.events import parse_event
|
|
from bot_bottle.orchestrator.model import CommentCreated, IssueAssigned, PullRequestClosed
|
|
|
|
_REPO = {"repository": {"name": "bot-bottle", "owner": {"login": "didericis"}}}
|
|
|
|
|
|
class ParseEventTest(unittest.TestCase):
|
|
def test_issue_assigned(self):
|
|
payload = {
|
|
**_REPO,
|
|
"action": "assigned",
|
|
"issue": {
|
|
"number": 17,
|
|
"title": "Fix it",
|
|
"body": "please",
|
|
"assignees": [{"login": "agent-bot"}],
|
|
"labels": [{"name": "bot-bottle:implementer"}],
|
|
},
|
|
}
|
|
ev = parse_event("issues", payload)
|
|
self.assertIsInstance(ev, IssueAssigned)
|
|
assert isinstance(ev, IssueAssigned)
|
|
self.assertEqual(("didericis", "bot-bottle", 17), (ev.owner, ev.repo, ev.issue_number))
|
|
self.assertEqual(("agent-bot",), ev.assignees)
|
|
self.assertEqual(("bot-bottle:implementer",), ev.labels)
|
|
|
|
def test_issue_non_assigned_ignored(self):
|
|
self.assertIsNone(parse_event("issues", {**_REPO, "action": "opened", "issue": {}}))
|
|
|
|
def test_comment_created(self):
|
|
payload = {
|
|
**_REPO,
|
|
"action": "created",
|
|
"issue": {"number": 42, "pull_request": {"x": 1}},
|
|
"comment": {"id": 5, "user": {"login": "reviewer"}, "body": "redo"},
|
|
}
|
|
ev = parse_event("issue_comment", payload)
|
|
assert isinstance(ev, CommentCreated)
|
|
self.assertEqual(42, ev.issue_number)
|
|
self.assertEqual("reviewer", ev.author)
|
|
self.assertTrue(ev.is_pull)
|
|
|
|
def test_pull_request_closed(self):
|
|
payload = {**_REPO, "action": "closed", "pull_request": {"number": 8, "merged": True}}
|
|
ev = parse_event("pull_request", payload)
|
|
assert isinstance(ev, PullRequestClosed)
|
|
self.assertEqual(8, ev.pr_number)
|
|
self.assertTrue(ev.merged)
|
|
|
|
def test_pull_request_non_closed_ignored(self):
|
|
self.assertIsNone(parse_event("pull_request", {**_REPO, "action": "opened"}))
|
|
|
|
def test_unknown_kind_ignored(self):
|
|
self.assertIsNone(parse_event("push", {**_REPO}))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|