test(ai-review): 補使用量統計 NaN 安全測試並排除微優化誤報 #46

Merged
jiantw83 merged 14 commits from ai-review-resolve/20260623-163642 into develop 2026-06-23 09:35:21 +00:00
Showing only changes of commit 6398d4a193 - Show all commits
+9
View File
2
@@ -244,4 +244,13 @@ describe('formatUsageStatsLine', () => {
const line = formatUsageStatsLine('ollama', 'llama3', usage, { available: false, reason: '本地服務,無帳號額度概念' }, { hasData: false });
assert.match(line, /;剩餘可用: 無法計算(本地服務,無帳號額度概念)/);
});
it('produces safe text (no NaN) when quota/rate carry invalid numbers', () => {
// quota.limit 為 NaN、rate.limit 為 NaN → 不應算出百分比、不得輸出 NaN
const line = formatUsageStatsLine('openai', 'm', usage,
admin marked this conversation as resolved Outdated
Outdated
Review

嚴重等級🟡 警告
審查員:Leo
問題:在測試案例中直接引用外部定義的 usage 變數,若該變數在其他測試中被意外修改,會導致測試間的隱性耦合,使得測試結果難以預測,降低測試的可維護性。
建議:建議直接在測試函式內定義該案例所需的完整 usage 物件,或是使用工廠函式(Factory function)來生成所需的測試資料,確保測試案例的獨立性與確定性。

**嚴重等級**:🟡 警告 **審查員**:Leo **問題**:在測試案例中直接引用外部定義的 `usage` 變數,若該變數在其他測試中被意外修改,會導致測試間的隱性耦合,使得測試結果難以預測,降低測試的可維護性。 **建議**:建議直接在測試函式內定義該案例所需的完整 `usage` 物件,或是使用工廠函式(Factory function)來生成所需的測試資料,確保測試案例的獨立性與確定性。
Outdated
Review

嚴重等級🟡 警告
審查員:Maya
問題:目前的測試僅針對 NaN 的情況,但未考慮到 Infinity、null 或 undefined 等其他同樣可能導致格式錯誤或輸出異常的「無效數字」邊界條件。
建議:建議補充針對 Infinity、null 與 undefined 的測試案例,確保這些值在 formatUsageStatsLine 中皆能正確處理並輸出友善的錯誤訊息,而非損壞的文字。

**嚴重等級**:🟡 警告 **審查員**:Maya **問題**:目前的測試僅針對 NaN 的情況,但未考慮到 Infinity、null 或 undefined 等其他同樣可能導致格式錯誤或輸出異常的「無效數字」邊界條件。 **建議**:建議補充針對 Infinity、null 與 undefined 的測試案例,確保這些值在 formatUsageStatsLine 中皆能正確處理並輸出友善的錯誤訊息,而非損壞的文字。
Outdated
Review

嚴重等級🔵 建議
審查員:Maya
問題:目前的測試案例將多個欄位同時設為 NaN,測試邏輯較為單一,未能明確驗證「單一欄位無效」與「組合欄位無效」時的具體行為差異。
建議:建議將測試拆分為更細緻的案例,分別驗證 quota.limit 與 rate.limit 欄位在單獨無效,以及兩者同時無效的情況,以確保各欄位的防禦性邏輯皆有被完整覆蓋。

**嚴重等級**:🔵 建議 **審查員**:Maya **問題**:目前的測試案例將多個欄位同時設為 NaN,測試邏輯較為單一,未能明確驗證「單一欄位無效」與「組合欄位無效」時的具體行為差異。 **建議**:建議將測試拆分為更細緻的案例,分別驗證 quota.limit 與 rate.limit 欄位在單獨無效,以及兩者同時無效的情況,以確保各欄位的防禦性邏輯皆有被完整覆蓋。
{ available: true, used: 5, limit: NaN, currency: 'USD' },
{ hasData: true, remaining: NaN, limit: NaN, kind: 'tokens' });
assert.doesNotMatch(line, /NaN/);
assert.match(line, /剩餘可用: 無法計算/);
admin marked this conversation as resolved Outdated
Outdated
Review

嚴重等級🔴 嚴重
審查員:Mage
問題:測試情境雖處理了 NaN,但未涵蓋 limit 為 0 或負數等極端數值(例如除以零導致的錯誤或異常百分比計算)。若 formatUsageStatsLine 內部有計算 (used / limit) * 100 或類似邏輯,傳入 0 會產生 Infinity,傳入負數則會產生荒謬的邏輯結果。
建議:建議新增對 limit: 0 以及負數邊界值的測試案例,確保函式對這些非預期的數值輸入同樣能輸出「無法計算」或相應的錯誤處理訊息,而非輸出 Infinity 或負百分比。

**嚴重等級**:🔴 嚴重 **審查員**:Mage **問題**:測試情境雖處理了 NaN,但未涵蓋 `limit` 為 0 或負數等極端數值(例如除以零導致的錯誤或異常百分比計算)。若 `formatUsageStatsLine` 內部有計算 `(used / limit) * 100` 或類似邏輯,傳入 0 會產生 `Infinity`,傳入負數則會產生荒謬的邏輯結果。 **建議**:建議新增對 `limit: 0` 以及負數邊界值的測試案例,確保函式對這些非預期的數值輸入同樣能輸出「無法計算」或相應的錯誤處理訊息,而非輸出 `Infinity` 或負百分比。
});
});