Skip to content

Commit

Permalink
fix: use case-insensitive string comparison for fast-track approvals (#…
Browse files Browse the repository at this point in the history
…658)

I noticed today that a PR that had sufficient fast-track approvals was
being rejected as needing one more approval. This is because one of the
approvers' had a GitHub handle where the case in the README
(`linkgoron`) did not match the case returned by GitHub (`Linkgoron`).
Since GitHub handles are case-insensitive, this change makes the
comparison case-insensitive.

One might be tempted to think that we need to do the same for the list
of TSC members, but handles are never compared there so it is not
necessary.
  • Loading branch information
Trott authored Nov 8, 2022
1 parent beda17c commit 8ad4b37
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lib/pr_checker.js
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,11 @@ export default class PRChecker {
}
const [, requester] = comment.bodyText.match(FAST_TRACK_RE);
const collaborators = Array.from(this.data.collaborators.values(),
(c) => c.login);
(c) => c.login.toLowerCase());
const approvals = comment.reactions.nodes.filter((r) =>
r.user.login !== requester &&
r.user.login !== pr.author.login &&
collaborators.includes(r.user.login)).length;
collaborators.includes(r.user.login.toLowerCase())).length;

if (requester === pr.author.login && approvals < 2) {
cli.error('The fast-track request requires' +
Expand Down
16 changes: 16 additions & 0 deletions test/fixtures/comments_with_two_fast_track_different_case.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[
{
"publishedAt": "2017-10-22T05:16:36.458Z",
"bodyText": "Fast-track has been requested by @bar. Please 👍 to approve.",
"author": {
"login": "github-actions"
},
"reactions": {
"nodes": [
{ "user": { "login": "Bar" } },
{ "user": { "login": "Foo" } },
{ "user": { "login": "BAZ" } }
]
}
}
]
2 changes: 2 additions & 0 deletions test/fixtures/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ export const requestingChangesReviews =
export const commentsWithFastTrack = readJSON('comments_with_fast_track.json');
export const commentsWithTwoFastTrack =
readJSON('comments_with_two_fast_track.json');
export const commentsWithTwoFastTrackDifferentCase =
readJSON('comments_with_two_fast_track_different_case.json');
export const commentsWithFastTrackInsuffientApprovals =
readJSON('comments_with_fast_track_insufficient_approvals.json');
export const commentsWithCI = readJSON('comments_with_ci.json');
Expand Down
48 changes: 48 additions & 0 deletions test/unit/pr_checker.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
noReviewers,
commentsWithFastTrack,
commentsWithTwoFastTrack,
commentsWithTwoFastTrackDifferentCase,
commentsWithFastTrackInsuffientApprovals,
commentsWithCI,
commentsWithFailedCI,
Expand Down Expand Up @@ -582,6 +583,53 @@ describe('PRChecker', () => {
cli.assertCalledWith(expectedLogs);
});

it('should compare collaborator handles as case-insensitive', () => {
const cli = new TestCLI();

const expectedLogs = {
ok:
[['Approvals: 4'],
['- Foo User (@foo): https://github.com/nodejs/node/pull/16438#pullrequestreview-71480624'],
['- Quux User (@Quux): LGTM'],
['- Baz User (@Baz): https://github.com/nodejs/node/pull/16438#pullrequestreview-71488236'],
['- Bar User (@bar) (TSC): lgtm']],
info:
[['This PR was created on Fri, 30 Nov 2018 17:50:44 GMT'],
['This PR is being fast-tracked']]
};

const pr = Object.assign({}, firstTimerPR, {
author: {
login: 'bar'
},
createdAt: LT_48H,
labels: {
nodes: [
{ name: 'fast-track' }
]
}
});

const data = {
pr,
reviewers: allGreenReviewers,
comments: commentsWithTwoFastTrackDifferentCase,
reviews: approvingReviews,
commits: [],
collaborators,
authorIsNew: () => true,
getThread() {
return PRData.prototype.getThread.call(this);
}
};
const checker = new PRChecker(cli, data, {}, argv);

cli.clearCalls();
const status = checker.checkReviewsAndWait(new Date(NOW));
assert(status);
cli.assertCalledWith(expectedLogs);
});

it('should error with 1 fast-track approval from the pr author', () => {
const cli = new TestCLI();

Expand Down

0 comments on commit 8ad4b37

Please sign in to comment.