test(comments review): 驗證 Review comments 依嚴重度排序 #33

Merged
jiantw83 merged 2 commits from ai-review-resolve/20260622-153600 into develop 2026-06-22 15:39:49 +00:00
Member

變更摘要

  • 補強 postFindingsReview 測試,直接驗證 Step6 產生的 Review comments 依嚴重等級排序。
  • 確認排序順序為 🔴 嚴重🟡 警告🔵 建議,避免只透過檔案路徑間接判斷。

影響範圍

  • 只異動 app/comments.test.js
  • 不改 production code;目前主邏輯已經在送出 Review 前排序 comments。

驗證

  • npm test
## 變更摘要 - 補強 `postFindingsReview` 測試,直接驗證 Step6 產生的 Review comments 依嚴重等級排序。 - 確認排序順序為 `🔴 嚴重` → `🟡 警告` → `🔵 建議`,避免只透過檔案路徑間接判斷。 ## 影響範圍 - 只異動 `app/comments.test.js`。 - 不改 production code;目前主邏輯已經在送出 Review 前排序 comments。 ## 驗證 - `npm test`
jiantw83 added 1 commit 2026-06-22 15:36:44 +00:00
test(comments review): 驗證 Review comments 依嚴重度排序
AI / 計算版本號 (pull_request) Successful in 2s
AI / Code Review (pull_request) Successful in 56s
e443096325
Owner

🤖 AI Code Review 團隊

👤 角色 🎯 面向 🧠 個性
🗡️ Assassin security 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用
🎼 Bard style 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版
🧰 Leo maintainability 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來
🔮 Mage logic 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」
🧪 Maya testing 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑
Rogue efficiency 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」

🔍 服務:gemini 模型:gemini-2.5-flash

## 🤖 AI Code Review 團隊 | 👤 角色 | 🎯 面向 | 🧠 個性 | |--------|--------|--------| | **🗡️ Assassin** | security | 多疑偏執、以攻擊者視角看世界,假設每筆輸入都是惡意的,每個信任都會被濫用 | | **🎼 Bard** | style | 唯美龜毛、追求優雅,把可讀性與一致性當作旋律,最受不了走調的命名與排版 | | **🧰 Leo** | maintainability | 有遠見、重視長期維護成本,凡事先問「六個月後的自己還看得懂嗎?」,討厭把債留給未來 | | **🔮 Mage** | logic | 嚴謹冷靜、滴水不漏,凡事推演到最壞情況,深信「沒驗證過的假設都是 bug」 | | **🧪 Maya** | testing | 對測試覆蓋率有執念,深信「沒有測試的程式碼等於沒寫完」,溫和但堅持,最在意邊界與失敗路徑 | | **⚡ Rogue** | efficiency | 急性子、講求速度,最痛恨被浪費的 CPU 週期與記憶體,凡事先問「這能不能更快、更省」 | > 🔍 服務:gemini 模型:gemini-2.5-flash
admin reviewed 2026-06-22 15:37:43 +00:00
admin left a comment
Owner

AI Code Review 統計

🔴 嚴重 🟡 警告 🔵 建議
0 筆 5 筆 0 筆
## AI Code Review 統計 | 🔴 嚴重 | 🟡 警告 | 🔵 建議 | | --- | --- | --- | | 0 筆 | 5 筆 | 0 筆 |
@@ -208,6 +208,10 @@ describe('postFindingsReview', () => {
reviewCalls[0].comments.map(c => c.path),
['app/a.js', 'app/b.js', 'app/c.js'],
);
assert.deepEqual(
Owner

嚴重等級🟡 警告
審查員:Bard
問題:程式碼中直接嵌入了正規表達式 /嚴重等級\*\*:(.+)/,這是一個「魔術值」。它讓程式碼的意圖不夠清晰,且若未來需要修改此模式,會增加維護的困難度,也使得該行程式碼過於冗長,影響閱讀流暢性。
建議:建議將此正規表達式提取為一個具名常數,以提升可讀性與可維護性。例如:

const SEVERITY_PATTERN = /嚴重等級\*\*:(.+)/;
// ...
reviewCalls[0].comments.map(c => c.body.match(SEVERITY_PATTERN)?.[1]),
**嚴重等級**:🟡 警告 **審查員**:Bard **問題**:程式碼中直接嵌入了正規表達式 `/嚴重等級\*\*:(.+)/`,這是一個「魔術值」。它讓程式碼的意圖不夠清晰,且若未來需要修改此模式,會增加維護的困難度,也使得該行程式碼過於冗長,影響閱讀流暢性。 **建議**:建議將此正規表達式提取為一個具名常數,以提升可讀性與可維護性。例如: ```javascript const SEVERITY_PATTERN = /嚴重等級\*\*:(.+)/; // ... reviewCalls[0].comments.map(c => c.body.match(SEVERITY_PATTERN)?.[1]), ```
Owner

嚴重等級🟡 警告
審查員:Leo
問題:測試中用來解析 c.body 的正規表達式 (/嚴重等級\*\*:(.+)/) 過於依賴特定的字串格式「嚴重等級**:」。如果未來這個前綴文字有任何微小的變動(例如:多一個空格、換個標點符號、或改用其他詞彙),即使語義不變,測試也會立刻失效,導致不必要的維護工作,增加了測試的脆弱性。
建議:考慮讓正規表達式更具彈性,例如使用 \s* 匹配空白,或將這個字串格式的解析邏輯封裝成一個輔助函式,並在該函式中處理可能存在的格式變動彈性。如果 c.body 的內容是從結構化資料組裝而來,更理想的做法是測試該結構化資料本身,而非其最終的字串呈現。

**嚴重等級**:🟡 警告 **審查員**:Leo **問題**:測試中用來解析 `c.body` 的正規表達式 `(/嚴重等級\*\*:(.+)/)` 過於依賴特定的字串格式「嚴重等級**:」。如果未來這個前綴文字有任何微小的變動(例如:多一個空格、換個標點符號、或改用其他詞彙),即使語義不變,測試也會立刻失效,導致不必要的維護工作,增加了測試的脆弱性。 **建議**:考慮讓正規表達式更具彈性,例如使用 `\s*` 匹配空白,或將這個字串格式的解析邏輯封裝成一個輔助函式,並在該函式中處理可能存在的格式變動彈性。如果 `c.body` 的內容是從結構化資料組裝而來,更理想的做法是測試該結構化資料本身,而非其最終的字串呈現。
Owner

嚴重等級🟡 警告
審查員:Mage
問題:此處的正規表達式 嚴重等級\*\*:(.+) 使用了貪婪匹配 .+。這可能導致它捕獲到「嚴重等級**:」後方,直到字串結尾的所有內容,而非僅僅是預期的嚴重等級文字。若 c.body 中在嚴重等級後方還有其他文字(例如:「嚴重等級**:🔴 嚴重。請注意此問題。」),此測試將會因為提取到錯誤的內容而失敗,或在實際情況與預期不符時,無法正確驗證。
建議:為了確保只捕獲到預期的嚴重等級文字,應使用更精確的正規表達式。考量到測試的預期值是固定的 ['🔴 嚴重', '🟡 警告', '🔵 建議'],最穩健的作法是直接匹配這些值,例如:
c.body.match(/嚴重等級\*\*:(🔴 嚴重|🟡 警告|🔵 建議)/)?.[1]
或者,如果嚴重等級後方可能跟隨其他文字但有明確分隔符(如句點、換行符或字串結尾),可以使用非貪婪匹配並指定邊界,例如:
c.body.match(/嚴重等級\*\*:(.+?)(?:\s|$|\.|\n)/)?.[1]

**嚴重等級**:🟡 警告 **審查員**:Mage **問題**:此處的正規表達式 `嚴重等級\*\*:(.+)` 使用了貪婪匹配 `.+`。這可能導致它捕獲到「嚴重等級**:」後方,直到字串結尾的所有內容,而非僅僅是預期的嚴重等級文字。若 `c.body` 中在嚴重等級後方還有其他文字(例如:「嚴重等級**:🔴 嚴重。請注意此問題。」),此測試將會因為提取到錯誤的內容而失敗,或在實際情況與預期不符時,無法正確驗證。 **建議**:為了確保只捕獲到預期的嚴重等級文字,應使用更精確的正規表達式。考量到測試的預期值是固定的 `['🔴 嚴重', '🟡 警告', '🔵 建議']`,最穩健的作法是直接匹配這些值,例如: `c.body.match(/嚴重等級\*\*:(🔴 嚴重|🟡 警告|🔵 建議)/)?.[1]` 或者,如果嚴重等級後方可能跟隨其他文字但有明確分隔符(如句點、換行符或字串結尾),可以使用非貪婪匹配並指定邊界,例如: `c.body.match(/嚴重等級\*\*:(.+?)(?:\s|$|\.|\n)/)?.[1]`
Owner

嚴重等級🟡 警告
審查員:Maya
問題:這個新增的斷言只驗證了評論內文(c.body)中存在且格式正確的嚴重等級資訊。然而,它沒有涵蓋到評論內文可能沒有嚴重等級資訊,或是嚴重等級格式不符預期的情境,這讓程式碼的行為在這些邊界條件下缺乏驗證。
建議:建議新增測試案例,或擴充現有案例的測試資料,以涵蓋以下情境:

  1. 評論內文完全沒有「嚴重等級**:」這個模式時,應驗證程式碼的行為(例如,是否正確提取到 undefined 或預設值)。
  2. 評論內文有「嚴重等級**:」但後面沒有內容,或內容格式不符預期時,應驗證程式碼的行為(例如,是否正確處理為 undefined 或拋出錯誤)。
**嚴重等級**:🟡 警告 **審查員**:Maya **問題**:這個新增的斷言只驗證了評論內文(`c.body`)中存在且格式正確的嚴重等級資訊。然而,它沒有涵蓋到評論內文可能沒有嚴重等級資訊,或是嚴重等級格式不符預期的情境,這讓程式碼的行為在這些邊界條件下缺乏驗證。 **建議**:建議新增測試案例,或擴充現有案例的測試資料,以涵蓋以下情境: 1. 評論內文完全沒有「嚴重等級**:」這個模式時,應驗證程式碼的行為(例如,是否正確提取到 `undefined` 或預設值)。 2. 評論內文有「嚴重等級**:」但後面沒有內容,或內容格式不符預期時,應驗證程式碼的行為(例如,是否正確處理為 `undefined` 或拋出錯誤)。
@@ -209,2 +209,4 @@
['app/a.js', 'app/b.js', 'app/c.js'],
);
assert.deepEqual(
reviewCalls[0].comments.map(c => c.body.match(/嚴重等級\*\*(.+)/)?.[1]),
Owner

嚴重等級🟡 警告
審查員:Leo
問題:測試中直接硬編碼了嚴重等級的顯示文字 ['🔴 嚴重', '🟡 警告', '🔵 建議']。這些字串很可能是應用程式中定義的常數,直接複製貼上會導致未來當這些等級的顯示文字需要調整時,必須同時修改應用程式程式碼和測試程式碼,增加維護負擔,也容易造成不一致。
建議:如果這些嚴重等級的顯示文字在應用程式中已有定義(例如:SEVERITY_LEVELS.CRITICAL.DISPLAY_TEXT),建議在測試中引入並使用這些常數,確保測試與實際邏輯保持同步,避免重複定義的技術債。

**嚴重等級**:🟡 警告 **審查員**:Leo **問題**:測試中直接硬編碼了嚴重等級的顯示文字 `['🔴 嚴重', '🟡 警告', '🔵 建議']`。這些字串很可能是應用程式中定義的常數,直接複製貼上會導致未來當這些等級的顯示文字需要調整時,必須同時修改應用程式程式碼和測試程式碼,增加維護負擔,也容易造成不一致。 **建議**:如果這些嚴重等級的顯示文字在應用程式中已有定義(例如:`SEVERITY_LEVELS.CRITICAL.DISPLAY_TEXT`),建議在測試中引入並使用這些常數,確保測試與實際邏輯保持同步,避免重複定義的技術債。
admin added 1 commit 2026-06-22 15:37:46 +00:00
chore: update ai-review findings [ai-review-bot][success]
AI / 計算版本號 (pull_request) Successful in 2s
AI / Code Review (pull_request) Successful in 3s
fae9e1b686
jiantw83 merged commit 392851fe37 into develop 2026-06-22 15:39:49 +00:00
jiantw83 deleted branch ai-review-resolve/20260622-153600 2026-06-22 15:39:49 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: old-actions/code-review#33