diff --git a/app/comments.js b/app/comments.js index c597c6d..63a5d19 100644 --- a/app/comments.js +++ b/app/comments.js @@ -94,11 +94,15 @@ export async function postFindingsReview(findings, deps = {}) { summaryFindings = findings, commentFindings = findings, } = deps; - const sortedComments = [...commentFindings].sort(bySeverity); - const comments = sortedComments.map(toReviewComment).filter(Boolean); + const commentItems = commentFindings + .map(finding => ({ finding, comment: toReviewComment(finding) })) + .filter(item => item.comment); + const comments = commentItems + .sort((a, b) => bySeverity(a.finding, b.finding)) + .map(item => item.comment); const body = buildReviewSummary(summaryFindings); await postReview({ body, comments }); - ok(`review 發布: summary=${summaryFindings.length} total=${sortedComments.length} commentable=${comments.length}`); + ok(`review 發布: summary=${summaryFindings.length} total=${commentFindings.length} commentable=${comments.length}`); } /** diff --git a/app/comments.test.js b/app/comments.test.js index f413765..8dabaa3 100644 --- a/app/comments.test.js +++ b/app/comments.test.js @@ -238,6 +238,22 @@ describe('postFindingsReview', () => { assert.equal(reviewCalls[0].comments[0].path, 'app/b.js'); }); + it('sorts the final review comment payload after filtering non-commentable findings', async () => { + const reviewCalls = []; + await postFindingsReview([ + { level: 'info', role: 'Maya', location: 'app/c.js:30', suggestion: 'I' }, + { level: 'critical', role: 'Rex', location: 'app/a.js', suggestion: 'missing line' }, + { level: 'warning', role: 'Leo', location: 'app/b.js:20', suggestion: 'W' }, + ], { + postReview: async (args) => { reviewCalls.push(args); }, + }); + + assert.deepEqual( + reviewCalls[0].comments.map(c => c.body.match(/嚴重等級\*\*:(.+)/)?.[1]), + ['🟡 警告', '🔵 建議'], + ); + }); + it('uses an explicit problem field when present', async () => { const reviewCalls = []; await postFindingsReview([