diff --git a/lib/pr_checker.js b/lib/pr_checker.js index fff21f6..8128ef0 100644 --- a/lib/pr_checker.js +++ b/lib/pr_checker.js @@ -169,7 +169,7 @@ export default class PRChecker { } if (isFastTracked) { - const comment = this.comments.find((c) => + const comment = [...this.comments].reverse().find((c) => FAST_TRACK_RE.test(c.bodyText)); if (!comment) { cli.error('Unable to find the fast-track request comment.'); diff --git a/test/fixtures/comments_with_two_fast_track.json b/test/fixtures/comments_with_two_fast_track.json new file mode 100644 index 0000000..bb742e1 --- /dev/null +++ b/test/fixtures/comments_with_two_fast_track.json @@ -0,0 +1,36 @@ +[ + { + "publishedAt": "2017-10-22T04:16:36.458Z", + "bodyText": "Fast-track has been requested by @bar. Please 👍 to approve.", + "author": { + "login": "github-actions" + }, + "reactions": { + "nodes": [] + } + }, + { + "publishedAt": "2017-10-22T04:17:36.458Z", + "bodyText": "Oups.", + "author": { + "login": "bar" + }, + "reactions": { + "nodes": [] + } + }, + { + "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" } } + ] + } + } +] diff --git a/test/fixtures/data.js b/test/fixtures/data.js index f123a99..f53f518 100644 --- a/test/fixtures/data.js +++ b/test/fixtures/data.js @@ -35,6 +35,8 @@ export const requestingChangesReviews = readJSON('reviews_requesting_changes.json'); export const commentsWithFastTrack = readJSON('comments_with_fast_track.json'); +export const commentsWithTwoFastTrack = + readJSON('comments_with_two_fast_track.json'); export const commentsWithFastTrackInsuffientApprovals = readJSON('comments_with_fast_track_insufficient_approvals.json'); export const commentsWithCI = readJSON('comments_with_ci.json'); diff --git a/test/unit/pr_checker.test.js b/test/unit/pr_checker.test.js index 4235252..761bb83 100644 --- a/test/unit/pr_checker.test.js +++ b/test/unit/pr_checker.test.js @@ -17,6 +17,7 @@ import { requestingChangesReviews, noReviewers, commentsWithFastTrack, + commentsWithTwoFastTrack, commentsWithFastTrackInsuffientApprovals, commentsWithCI, commentsWithFailedCI, @@ -534,6 +535,53 @@ describe('PRChecker', () => { cli.assertCalledWith(expectedLogs); }); + it('should check the last fast-track request comment', () => { + 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: commentsWithTwoFastTrack, + 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();