test(app): 新增 node:test 單元與整合測試並加入 test 指令
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { extractResult } from './opencode.js';
|
||||
|
||||
test('extractResult: 解析乾淨的 JSON', () => {
|
||||
const r = extractResult('{"title":"標題","description":"描述"}');
|
||||
assert.deepEqual(r, { title: '標題', description: '描述' });
|
||||
});
|
||||
|
||||
test('extractResult: 忽略 JSON 前後的雜訊文字', () => {
|
||||
const r = extractResult('以下是結果:\n{"title":"T","description":"D"}\n完成');
|
||||
assert.deepEqual(r, { title: 'T', description: 'D' });
|
||||
});
|
||||
|
||||
test('extractResult: 修正字串值內未跳脫的換行', () => {
|
||||
// LLM 常輸出字串內含真實換行的無效 JSON
|
||||
const r = extractResult('{"title":"T","description":"第一行\n第二行"}');
|
||||
assert.equal(r.title, 'T');
|
||||
assert.equal(r.description, '第一行\n第二行');
|
||||
});
|
||||
|
||||
test('extractResult: 去除 ANSI 控制碼後解析', () => {
|
||||
const r = extractResult('\x1b[32m{"title":"T","description":"D"}\x1b[0m');
|
||||
assert.deepEqual(r, { title: 'T', description: 'D' });
|
||||
});
|
||||
|
||||
test('extractResult: 挑出第一個含 title 的物件', () => {
|
||||
const r = extractResult('{"foo":1}\n{"title":"對的","description":"D"}');
|
||||
assert.equal(r.title, '對的');
|
||||
});
|
||||
|
||||
test('extractResult: 無有效物件回傳 null', () => {
|
||||
assert.equal(extractResult('沒有任何 JSON'), null);
|
||||
assert.equal(extractResult(''), null);
|
||||
assert.equal(extractResult('{"description":"缺少 title"}'), null);
|
||||
});
|
||||
|
||||
test('extractResult: description 缺漏時以空字串補上', () => {
|
||||
const r = extractResult('{"title":"只有標題"}');
|
||||
assert.deepEqual(r, { title: '只有標題', description: '' });
|
||||
});
|
||||
Reference in New Issue
Block a user