test(comments review): 抽出嚴重等級解析斷言 #38

Merged
jiantw83 merged 6 commits from ai-review-resolve/20260622-163133 into develop 2026-06-22 16:36:36 +00:00
Member

變更摘要

  • 將 Review comment 嚴重等級解析邏輯抽成具名 helper 與常數,避免測試中重複使用魔術正規表達式與硬編碼陣列。
  • 使用精確的嚴重等級格式匹配,避免貪婪匹配造成誤判。
  • 補上無嚴重等級、空值與不支援格式的邊界測試。
  • 移除已解決的 .gitea/ai-review/findings.json 項目。

影響範圍

  • app/comments.test.js
  • .gitea/ai-review/findings.json

驗證

  • npm test -- comments.test.js
  • npm test
## 變更摘要 - 將 Review comment 嚴重等級解析邏輯抽成具名 helper 與常數,避免測試中重複使用魔術正規表達式與硬編碼陣列。 - 使用精確的嚴重等級格式匹配,避免貪婪匹配造成誤判。 - 補上無嚴重等級、空值與不支援格式的邊界測試。 - 移除已解決的 `.gitea/ai-review/findings.json` 項目。 ## 影響範圍 - `app/comments.test.js` - `.gitea/ai-review/findings.json` ## 驗證 - `npm test -- comments.test.js` - `npm test`
jiantw83 added 2 commits 2026-06-22 16:32:48 +00:00
chore(ai-review 狀態): 移除已解決 findings
AI / 計算版本號 (pull_request) Successful in 2s
AI / Code Review (pull_request) Failing after 41s
1ba322e7a6
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 16:33:31 +00:00
admin left a comment
Owner

AI Code Review 統計

🔴 嚴重 🟡 警告 🔵 建議
1 筆 1 筆 1 筆
## AI Code Review 統計 | 🔴 嚴重 | 🟡 警告 | 🔵 建議 | | --- | --- | --- | | 1 筆 | 1 筆 | 1 筆 |
@@ -6,6 +6,13 @@ import path from 'node:path';
import { saveFindings, parseLocation, postNewCriticalComments, postFindingsReview } from './comments.js';
Owner

嚴重等級🔴 嚴重
審查員:Maya
問題:新增的 reviewSeverityLabel 函式,在處理輸入的 comment 物件本身為 nullundefined,或是 comment.body 屬性為 nullundefined 的邊界情況時,可能會拋出執行時期錯誤(TypeError),目前沒有對應的測試案例來驗證此失敗路徑。
建議:建議為 reviewSeverityLabel 函式新增測試案例,驗證當 commentnullundefined,以及 comment.bodynullundefined 時,函式能正確地回傳 undefined 而不拋出錯誤。同時,也請確保函式實作能妥善處理這些邊界輸入。

例如,可以在 app/comments.test.jsdescribe('postFindingsReview', ...) 區塊中,為 reviewSeverityLabel 函式新增以下測試案例:

it('handles null or undefined comment/body gracefully', () => {
  assert.equal(reviewSeverityLabel(null), undefined);
  assert.equal(reviewSeverityLabel(undefined), undefined);
  assert.equal(reviewSeverityLabel({}), undefined); // comment.body is undefined
  assert.equal(reviewSeverityLabel({ body: null }), undefined);
  assert.equal(reviewSeverityLabel({ body: undefined }), undefined);
});

並調整 reviewSeverityLabel 函式實作,例如:

function reviewSeverityLabel(comment) {
  if (!comment || !comment.body) {
    return undefined;
  }
  return comment.body.match(REVIEW_SEVERITY_PATTERN)?.[1];
}
**嚴重等級**:🔴 嚴重 **審查員**:Maya **問題**:新增的 `reviewSeverityLabel` 函式,在處理輸入的 `comment` 物件本身為 `null` 或 `undefined`,或是 `comment.body` 屬性為 `null` 或 `undefined` 的邊界情況時,可能會拋出執行時期錯誤(TypeError),目前沒有對應的測試案例來驗證此失敗路徑。 **建議**:建議為 `reviewSeverityLabel` 函式新增測試案例,驗證當 `comment` 為 `null` 或 `undefined`,以及 `comment.body` 為 `null` 或 `undefined` 時,函式能正確地回傳 `undefined` 而不拋出錯誤。同時,也請確保函式實作能妥善處理這些邊界輸入。 例如,可以在 `app/comments.test.js` 的 `describe('postFindingsReview', ...)` 區塊中,為 `reviewSeverityLabel` 函式新增以下測試案例: ```javascript it('handles null or undefined comment/body gracefully', () => { assert.equal(reviewSeverityLabel(null), undefined); assert.equal(reviewSeverityLabel(undefined), undefined); assert.equal(reviewSeverityLabel({}), undefined); // comment.body is undefined assert.equal(reviewSeverityLabel({ body: null }), undefined); assert.equal(reviewSeverityLabel({ body: undefined }), undefined); }); ``` 並調整 `reviewSeverityLabel` 函式實作,例如: ```javascript function reviewSeverityLabel(comment) { if (!comment || !comment.body) { return undefined; } return comment.body.match(REVIEW_SEVERITY_PATTERN)?.[1]; } ```
Owner

嚴重等級🟡 警告
審查員:Leo
問題:在 REVIEW_SEVERITY_PATTERNREVIEW_SEVERITY_LABELS 這兩個常數中,嚴重等級的標籤(例如 '🔴 嚴重')被重複定義了。這會導致未來若要修改或新增標籤時,需要同時更新兩處,容易造成維護上的疏漏與不一致。
建議:建議將嚴重等級標籤定義為單一來源,例如只維護 REVIEW_SEVERITY_LABELS 陣列,然後動態地從這個陣列產生 REVIEW_SEVERITY_PATTERN 的正規表達式字串。這樣可以確保兩者永遠同步,降低未來的維護成本。

例如:

const REVIEW_SEVERITY_LABELS = ['🔴 嚴重', '🟡 警告', '🔵 建議'];
const REVIEW_SEVERITY_PATTERN = new RegExp(`\\*\\*嚴重等級\\*\\*:(${REVIEW_SEVERITY_LABELS.join('|')})(?:\\n|$)`);
**嚴重等級**:🟡 警告 **審查員**:Leo **問題**:在 `REVIEW_SEVERITY_PATTERN` 和 `REVIEW_SEVERITY_LABELS` 這兩個常數中,嚴重等級的標籤(例如 '🔴 嚴重')被重複定義了。這會導致未來若要修改或新增標籤時,需要同時更新兩處,容易造成維護上的疏漏與不一致。 **建議**:建議將嚴重等級標籤定義為單一來源,例如只維護 `REVIEW_SEVERITY_LABELS` 陣列,然後動態地從這個陣列產生 `REVIEW_SEVERITY_PATTERN` 的正規表達式字串。這樣可以確保兩者永遠同步,降低未來的維護成本。 例如: ```javascript const REVIEW_SEVERITY_LABELS = ['🔴 嚴重', '🟡 警告', '🔵 建議']; const REVIEW_SEVERITY_PATTERN = new RegExp(`\\*\\*嚴重等級\\*\\*:(${REVIEW_SEVERITY_LABELS.join('|')})(?:\\n|$)`); ```
@@ -9,0 +10,4 @@
const REVIEW_SEVERITY_LABELS = ['🔴 嚴重', '🟡 警告', '🔵 建議'];
function reviewSeverityLabel(comment) {
return comment.body.match(REVIEW_SEVERITY_PATTERN)?.[1];
Owner

嚴重等級🔵 建議
審查員:Bard
問題:reviewSeverityLabel 函式是專為 postFindingsReview 測試區塊服務的輔助函式。將其定義在檔案頂層,而非其所屬的 describe 區塊內,可能讓程式碼的組織結構顯得不夠緊密,降低了相關程式碼的局部性。
建議:建議將 reviewSeverityLabel 函式及其相關的 REVIEW_SEVERITY_PATTERN 與 REVIEW_SEVERITY_LABELS 常數,一併移至 describe('postFindingsReview', ...) 區塊內部,以提升程式碼的內聚性與可讀性,讓相關的旋律能集中演奏。

**嚴重等級**:🔵 建議 **審查員**:Bard **問題**:reviewSeverityLabel 函式是專為 `postFindingsReview` 測試區塊服務的輔助函式。將其定義在檔案頂層,而非其所屬的 `describe` 區塊內,可能讓程式碼的組織結構顯得不夠緊密,降低了相關程式碼的局部性。 **建議**:建議將 reviewSeverityLabel 函式及其相關的 REVIEW_SEVERITY_PATTERN 與 REVIEW_SEVERITY_LABELS 常數,一併移至 `describe('postFindingsReview', ...)` 區塊內部,以提升程式碼的內聚性與可讀性,讓相關的旋律能集中演奏。
admin added 1 commit 2026-06-22 16:33:33 +00:00
chore: update ai-review findings [ai-review-bot][failure]
AI / 計算版本號 (pull_request) Successful in 2s
AI / Code Review (pull_request) Failing after 4s
185655f9ae
jiantw83 added 2 commits 2026-06-22 16:35:40 +00:00
chore(ai-review 狀態): 清除已解決 helper findings
AI / 計算版本號 (pull_request) Successful in 2s
AI / Code Review (pull_request) Successful in 39s
f8e1b61fc4
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 16:36:21 +00:00
admin left a comment
Owner

AI Code Review 統計

🔴 嚴重 🟡 警告 🔵 建議
0 筆 1 筆 1 筆
## AI Code Review 統計 | 🔴 嚴重 | 🟡 警告 | 🔵 建議 | | --- | --- | --- | | 0 筆 | 1 筆 | 1 筆 |
@@ -26,5 +26,5 @@
assert.equal(workspaceText, JSON.stringify(findings, null, 2) + '\n');
assert.equal(mirrorText, JSON.stringify(findings, null, 2) + '\n');
});
it('writes only to workspace when mirrorDir is omitted', () => {
Owner

嚴重等級🟡 警告
審查員:Leo
問題:常數 REVIEW_SEVERITY_LABELSREVIEW_SEVERITY_PATTERN 以及輔助函式 reviewSeverityLabel 被定義在測試檔案的 describe 區塊內。如果實際的應用程式邏輯(例如產生或處理這些評論的程式碼)也需要用到這些資訊,那麼這會造成邏輯重複或知識分散。未來若評論格式或嚴重等級標籤有變動,將需要同時修改多處,增加維護成本與出錯風險。
建議:將 REVIEW_SEVERITY_LABELSREVIEW_SEVERITY_PATTERNreviewSeverityLabel 這些與評論格式相關的常數與函式,提取到一個獨立的共用模組中(例如 app/utils/reviewComments.js),並讓測試檔案和任何需要用到它們的應用程式邏輯都從該模組匯入。這樣能確保「評論格式」的定義只有一個來源,提升可維護性。

**嚴重等級**:🟡 警告 **審查員**:Leo **問題**:常數 `REVIEW_SEVERITY_LABELS`、`REVIEW_SEVERITY_PATTERN` 以及輔助函式 `reviewSeverityLabel` 被定義在測試檔案的 `describe` 區塊內。如果實際的應用程式邏輯(例如產生或處理這些評論的程式碼)也需要用到這些資訊,那麼這會造成邏輯重複或知識分散。未來若評論格式或嚴重等級標籤有變動,將需要同時修改多處,增加維護成本與出錯風險。 **建議**:將 `REVIEW_SEVERITY_LABELS`、`REVIEW_SEVERITY_PATTERN` 和 `reviewSeverityLabel` 這些與評論格式相關的常數與函式,提取到一個獨立的共用模組中(例如 `app/utils/reviewComments.js`),並讓測試檔案和任何需要用到它們的應用程式邏輯都從該模組匯入。這樣能確保「評論格式」的定義只有一個來源,提升可維護性。
@@ -189,1 +189,4 @@
describe('postFindingsReview', () => {
const REVIEW_SEVERITY_LABELS = ['🔴 嚴重', '🟡 警告', '🔵 建議'];
const REVIEW_SEVERITY_PATTERN = new RegExp(`\\*\\*嚴重等級\\*\\*(${REVIEW_SEVERITY_LABELS.join('|')})(?:\\n|$)`);
Owner

嚴重等級🔵 建議
審查員:Bard
問題:此處新增的 reviewSeverityLabel 函式,雖其意圖在上下文脈絡中尚稱清晰,但若能為其添上一筆簡潔的 JSDoc 註解,闡明其參數與回傳值的語義,將使這段樂章更臻完善,即便在測試檔案中,亦能提升未來維護者的閱讀體驗,使程式碼的旋律更加和諧。
建議:建議為 reviewSeverityLabel 函式加上 JSDoc 註解,例如:

  /**
   * 從評論物件中提取嚴重等級標籤。
   * @param {object | null | undefined} comment - 評論物件,預期包含 `body` 屬性。
   * @returns {string | undefined} 嚴重等級標籤字串(如 '🔴 嚴重'),若無匹配或輸入無效則回傳 undefined。
   */
  function reviewSeverityLabel(comment) {
    return comment?.body?.match(REVIEW_SEVERITY_PATTERN)?.[1];
  }
**嚴重等級**:🔵 建議 **審查員**:Bard **問題**:此處新增的 `reviewSeverityLabel` 函式,雖其意圖在上下文脈絡中尚稱清晰,但若能為其添上一筆簡潔的 JSDoc 註解,闡明其參數與回傳值的語義,將使這段樂章更臻完善,即便在測試檔案中,亦能提升未來維護者的閱讀體驗,使程式碼的旋律更加和諧。 **建議**:建議為 `reviewSeverityLabel` 函式加上 JSDoc 註解,例如: ```javascript /** * 從評論物件中提取嚴重等級標籤。 * @param {object | null | undefined} comment - 評論物件,預期包含 `body` 屬性。 * @returns {string | undefined} 嚴重等級標籤字串(如 '🔴 嚴重'),若無匹配或輸入無效則回傳 undefined。 */ function reviewSeverityLabel(comment) { return comment?.body?.match(REVIEW_SEVERITY_PATTERN)?.[1]; } ```
admin added 1 commit 2026-06-22 16:36:23 +00:00
chore: update ai-review findings [ai-review-bot][success]
AI / 計算版本號 (pull_request) Successful in 3s
AI / Code Review (pull_request) Successful in 4s
fe865823f1
jiantw83 scheduled this pull request to auto merge when all checks succeed 2026-06-22 16:36:32 +00:00
jiantw83 merged commit bc70aae3e0 into develop 2026-06-22 16:36:36 +00:00
jiantw83 deleted branch ai-review-resolve/20260622-163133 2026-06-22 16:36:37 +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#38