[verified] Fix native review PR Issue counter projection

This commit is contained in:
2026-10-14 06:20:07 +00:00
parent 6cddc26bb7
commit f5ef03418e
3 changed files with 51 additions and 4 deletions
@@ -24,7 +24,8 @@ class SourceIssueReferenceProjectionTests(unittest.TestCase):
'pull_request': {'merged': False, 'html_url': url}}
before['pr_issue'] = pr_issue
after['pr_issue'] = copy.deepcopy(pr_issue)
after['pr_issue'].update(comments=3, updated_at=review['submitted_at'])
# Native top-level reviews change review_comments, not ordinary comments.
after['pr_issue'].update(updated_at=review['submitted_at'])
event = after['timeline'][0]
event['html_url'] = url + '#issuecomment-101'
event['issue_url'] = ''
@@ -57,6 +58,50 @@ class SourceIssueReferenceProjectionTests(unittest.TestCase):
with self.assertRaisesRegex(fixture.mod.ValidationError, 'timestamp projection mismatch'):
fixture.verify_fixture(before, after, review, result, paths, self.contract())
def test_pr_issue_comments_stay_unchanged_while_review_count_increments(self):
for count in (0, 2):
before, after, review, result, paths = self.snapshots()
before['pr_issue']['comments'] = after['pr_issue']['comments'] = count
after['issue_timeline'][-1]['ref_issue'] = copy.deepcopy(after['pr_issue'])
with self.subTest(count=count):
fixture.verify_fixture(before, after, review, result, paths, self.contract())
self.assertEqual(after['pr_issue']['comments'], before['pr_issue']['comments'])
self.assertEqual(after['pr']['review_comments'], before['pr']['review_comments'] + 1)
def test_pr_issue_comment_changes_and_invalid_counts_are_rejected(self):
baseline = self.snapshots()
fixture.verify_fixture(*baseline, self.contract())
# Reject both directions, including the old erroneous +1 projection.
for value in (1, 3, 4, -1, True, '2', None):
args = copy.deepcopy(baseline)
args[1]['pr_issue']['comments'] = value
args[1]['issue_timeline'][-1]['ref_issue'] = copy.deepcopy(args[1]['pr_issue'])
with self.subTest(after=value), self.assertRaisesRegex(
fixture.mod.ValidationError, 'PR Issue count projection mismatch'):
fixture.verify_fixture(*args, self.contract())
for value in (-1, True, '2', None):
args = copy.deepcopy(baseline)
args[0]['pr_issue']['comments'] = args[1]['pr_issue']['comments'] = value
args[1]['issue_timeline'][-1]['ref_issue'] = copy.deepcopy(args[1]['pr_issue'])
with self.subTest(both=value), self.assertRaisesRegex(
fixture.mod.ValidationError, 'PR Issue count projection mismatch'):
fixture.verify_fixture(*args, self.contract())
for side in (0, 1):
args = copy.deepcopy(baseline)
del args[side]['pr_issue']['comments']
with self.subTest(missing=side), self.assertRaises(fixture.mod.ValidationError):
fixture.verify_fixture(*args, self.contract())
def test_source_reference_does_not_relax_pr_review_comment_increment(self):
baseline = self.snapshots()
fixture.verify_fixture(*baseline, self.contract())
for value in (0, 2, -1, True, '1', None):
args = copy.deepcopy(baseline)
args[1]['pr']['review_comments'] = value
with self.subTest(after=value), self.assertRaisesRegex(
fixture.mod.ValidationError, 'review count projection mismatch'):
fixture.verify_fixture(*args, self.contract())
def test_wrong_reference_identity_payload_or_timestamp_is_rejected(self):
baseline = self.snapshots()
fixture.verify_fixture(*baseline, self.contract())