Files
ai-pull-request/app/lib/opencode.test.js

42 lines
1.6 KiB
JavaScript

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: '' });
});