This commit is contained in:
+58
-72
@@ -22,7 +22,7 @@ class FakeRepository:
|
||||
return {2}
|
||||
|
||||
|
||||
class FakePullRequestGitea:
|
||||
class PopulatedPullRequestGitea:
|
||||
async def pull_request(self, *_args):
|
||||
return PullRequestInfo(
|
||||
number=3,
|
||||
@@ -38,29 +38,61 @@ class FakePullRequestGitea:
|
||||
)
|
||||
|
||||
async def issue_comments(self, *_args):
|
||||
return [CommentInfo(3, "bob", "Please add a test.", "2026-01-03")]
|
||||
return [
|
||||
CommentInfo(
|
||||
1,
|
||||
"alice",
|
||||
"First timeline comment: Please add a test.",
|
||||
"2026-01-01",
|
||||
),
|
||||
CommentInfo(2, "bob", "Second timeline comment", "2026-01-02"),
|
||||
]
|
||||
|
||||
async def pull_reviews(self, *_args):
|
||||
return [
|
||||
{
|
||||
"id": 4,
|
||||
"id": 10,
|
||||
"user": {"login": "carol"},
|
||||
"state": "REQUEST_CHANGES",
|
||||
"body": "One issue remains.",
|
||||
}
|
||||
"body": "First formal review: One issue remains.",
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"user": {"login": "dave"},
|
||||
"state": "APPROVED",
|
||||
"body": "Second formal review",
|
||||
},
|
||||
]
|
||||
|
||||
async def review_comments(self, *_args):
|
||||
review_id = _args[-1]
|
||||
if review_id == 10:
|
||||
return [
|
||||
{
|
||||
"path": "src/old.py",
|
||||
"new_position": None,
|
||||
"old_position": 21,
|
||||
"body": "Old-side position",
|
||||
}
|
||||
]
|
||||
return [
|
||||
{
|
||||
"path": "src/new.py",
|
||||
"new_position": 34,
|
||||
"body": "New-side position",
|
||||
},
|
||||
{
|
||||
"path": "src/widget.py",
|
||||
"new_position": 12,
|
||||
"body": "Handle the empty value.",
|
||||
}
|
||||
},
|
||||
]
|
||||
|
||||
async def pull_commits(self, *_args):
|
||||
return [{"sha": "abcdef1234567890", "commit": {"message": "Fix widget"}}]
|
||||
return [
|
||||
{"sha": "111111111111aaaa", "commit": {"message": "First commit"}},
|
||||
{"sha": "222222222222bbbb", "commit": {"message": "Second commit"}},
|
||||
]
|
||||
|
||||
|
||||
class EmptyIssueGitea:
|
||||
@@ -104,55 +136,6 @@ class EmptyPullRequestGitea:
|
||||
raise AssertionError("review comments should not be requested without reviews")
|
||||
|
||||
|
||||
class OrderedPullRequestGitea(FakePullRequestGitea):
|
||||
async def issue_comments(self, *_args):
|
||||
return [
|
||||
CommentInfo(1, "alice", "First timeline comment", "2026-01-01"),
|
||||
CommentInfo(2, "bob", "Second timeline comment", "2026-01-02"),
|
||||
]
|
||||
|
||||
async def pull_reviews(self, *_args):
|
||||
return [
|
||||
{
|
||||
"id": 10,
|
||||
"user": {"login": "carol"},
|
||||
"state": "REQUEST_CHANGES",
|
||||
"body": "First formal review",
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"user": {"login": "dave"},
|
||||
"state": "APPROVED",
|
||||
"body": "Second formal review",
|
||||
},
|
||||
]
|
||||
|
||||
async def review_comments(self, *_args):
|
||||
review_id = _args[-1]
|
||||
if review_id == 10:
|
||||
return [
|
||||
{
|
||||
"path": "src/old.py",
|
||||
"new_position": None,
|
||||
"old_position": 21,
|
||||
"body": "Old-side position",
|
||||
}
|
||||
]
|
||||
return [
|
||||
{
|
||||
"path": "src/new.py",
|
||||
"new_position": 34,
|
||||
"body": "New-side position",
|
||||
}
|
||||
]
|
||||
|
||||
async def pull_commits(self, *_args):
|
||||
return [
|
||||
{"sha": "111111111111aaaa", "commit": {"message": "First commit"}},
|
||||
{"sha": "222222222222bbbb", "commit": {"message": "Second commit"}},
|
||||
]
|
||||
|
||||
|
||||
async def test_issue_context_excludes_operational_comments() -> None:
|
||||
context = await build_issue_context(
|
||||
cast(Gitea, FakeIssueGitea()),
|
||||
@@ -167,16 +150,31 @@ async def test_issue_context_excludes_operational_comments() -> None:
|
||||
assert "Agent job queued" not in context
|
||||
|
||||
|
||||
async def test_pull_request_context_includes_feedback_and_commits() -> None:
|
||||
async def test_pull_request_context_includes_ordered_feedback_reviews_and_commits() -> None:
|
||||
pull, context = await build_pull_request_context(
|
||||
cast(Gitea, FakePullRequestGitea()), "org", "repo", 3
|
||||
cast(Gitea, PopulatedPullRequestGitea()), "org", "repo", 3
|
||||
)
|
||||
|
||||
assert pull.number == 3
|
||||
assert pull == PullRequestInfo(
|
||||
number=3,
|
||||
title="Fix widget",
|
||||
body="Fixes the failure.",
|
||||
state="open",
|
||||
merged=False,
|
||||
base_branch="main",
|
||||
head_branch="fix-widget",
|
||||
head_sha="abcdef1234567890",
|
||||
head_owner="alice",
|
||||
head_repo="repo",
|
||||
)
|
||||
assert "Please add a test." in context
|
||||
assert "One issue remains." in context
|
||||
assert context.index("First timeline comment") < context.index("Second timeline comment")
|
||||
assert context.index("111111111111 First commit") < context.index("222222222222 Second commit")
|
||||
assert context.index("Review 10 by carol") < context.index("Review 11 by dave")
|
||||
assert "`src/old.py:21`: Old-side position" in context
|
||||
assert "`src/new.py:34`: New-side position" in context
|
||||
assert "`src/widget.py:12`: Handle the empty value." in context
|
||||
assert "abcdef123456 Fix widget" in context
|
||||
|
||||
|
||||
async def test_issue_context_labels_empty_body_and_discussion() -> None:
|
||||
@@ -201,15 +199,3 @@ async def test_pull_request_context_labels_empty_sections() -> None:
|
||||
assert "## Commits\n(none)" in context
|
||||
assert "## Timeline discussion\n(none)" in context
|
||||
assert "## Formal and inline reviews\n(none)" in context
|
||||
|
||||
|
||||
async def test_pull_request_context_preserves_source_order_and_positions() -> None:
|
||||
_, context = await build_pull_request_context(
|
||||
cast(Gitea, OrderedPullRequestGitea()), "org", "repo", 3
|
||||
)
|
||||
|
||||
assert context.index("First timeline comment") < context.index("Second timeline comment")
|
||||
assert context.index("111111111111 First commit") < context.index("222222222222 Second commit")
|
||||
assert context.index("Review 10 by carol") < context.index("Review 11 by dave")
|
||||
assert "`src/old.py:21`: Old-side position" in context
|
||||
assert "`src/new.py:34`: New-side position" in context
|
||||
|
||||
Reference in New Issue
Block a user