Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions tools/pr_overlap.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ def depends_on(body):

def open_prs(base):
query = urlencode({"state": "open", "base": base, "per_page": 100})
out = gh("api", "--paginate", f"repos/{REPO}/pulls?{query}")
out = gh("api", "--paginate", "--slurp", f"repos/{REPO}/pulls?{query}")
prs = {}
for pr in json.loads(out):
for pr in (pr for page in json.loads(out) for pr in page):
prs[pr["number"]] = {
"ref": f"refs/pr/{pr['number']}",
"sha": pr["head"]["sha"],
Expand Down
27 changes: 23 additions & 4 deletions tools/tests/test_pr_overlap.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,25 @@


class OpenPullRequestsTests(unittest.TestCase):
def test_real_paginated_cli_output_preserves_every_page(self):
pages = [
[{"number": number, "user": {"login": "author"}, "head": {"sha": str(number)}, "body": None}
for number in range(start, end)]
for start, end in ((1, 101), (101, 201), (201, 202))
]
pages[-1][0]["body"] = "Depends on: #7"

def response(*arguments):
if "--slurp" in arguments:
return json.dumps(pages)
return "\n".join(json.dumps(page) for page in pages)

with patch.object(pr_overlap, "REPO", "owner/project", create=True), patch.object(pr_overlap, "gh", side_effect=response):
found = pr_overlap.open_prs("main")
self.assertEqual(set(found), set(range(1, 202)))
self.assertEqual(found[201]["depends"], {7})
self.assertEqual(found[201]["sha"], "201")

def test_collects_pull_requests_beyond_the_previous_limit(self):
pull_requests = [
{"number": number, "user": {"login": f"author{number}"},
Expand All @@ -19,7 +38,7 @@ def test_collects_pull_requests_beyond_the_previous_limit(self):

def response(*args):
if args[0] == "api":
return json.dumps(pull_requests)
return json.dumps([pull_requests])
limit = int(args[args.index("-L") + 1])
return json.dumps([
{"number": pr["number"], "author": pr["user"], "headRefOid": pr["head"]["sha"],
Expand All @@ -37,18 +56,18 @@ def response(*args):

def test_base_branch_is_encoded_in_the_paginated_request(self):
with patch.object(pr_overlap, "REPO", "owner/project", create=True), \
patch.object(pr_overlap, "gh", return_value="[]") as gh:
patch.object(pr_overlap, "gh", return_value="[[]]") as gh:
self.assertEqual(pr_overlap.open_prs("topic/one&two"), {})
gh.assert_called_once_with(
"api", "--paginate",
"api", "--paginate", "--slurp",
"repos/owner/project/pulls?state=open&base=topic%2Fone%26two&per_page=100",
)

def test_single_page_preserves_author_head_and_dependencies(self):
pull_requests = [{"number": 7, "user": {"login": "contributor"}, "head": {"sha": "head-sha"},
"body": "Depends on: none\nUnrelated issue #42"}]
with patch.object(pr_overlap, "REPO", "owner/project", create=True), \
patch.object(pr_overlap, "gh", return_value=json.dumps(pull_requests)):
patch.object(pr_overlap, "gh", return_value=json.dumps([pull_requests])):
found = pr_overlap.open_prs("main")
self.assertEqual(found, {
7: {"ref": "refs/pr/7", "sha": "head-sha", "author": "contributor", "depends": set()},
Expand Down
2 changes: 1 addition & 1 deletion tools/tests/test_pr_overlap_dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def pull_requests(body):
response = [{"number": number, "user": {"login": "contributor"}, "head": {"sha": str(number) * 40},
"body": body if number == 1 else "Depends on: none"} for number in (1, 2)]
with patch.object(pr_overlap, "REPO", "owner/repo", create=True), \
patch.object(pr_overlap, "gh", return_value=json.dumps(response)):
patch.object(pr_overlap, "gh", return_value=json.dumps([response])):
return pr_overlap.open_prs("main")


Expand Down
Loading