test(app): 新增 node:test 單元與整合測試並加入 test 指令

This commit is contained in:
Jeffery
2026-06-26 15:27:30 +08:00
parent 20b0387b4d
commit 264be4de30
6 changed files with 351 additions and 1 deletions
+79
View File
@@ -0,0 +1,79 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';
import {
truncateDiff,
fallbackSummary,
buildResolveBranchName,
buildResolveBody,
} from './index.js';
test('truncateDiff: 內容在上限內不截斷', () => {
const { diff, truncated } = truncateDiff('abc', 100);
assert.equal(diff, 'abc');
assert.equal(truncated, false);
});
test('truncateDiff: null/空字串回傳空字串且不截斷', () => {
assert.deepEqual(truncateDiff(null, 100), { diff: '', truncated: false });
assert.deepEqual(truncateDiff('', 100), { diff: '', truncated: false });
});
test('truncateDiff: 超過上限時截斷並標示', () => {
const big = 'x'.repeat(50);
const { diff, truncated } = truncateDiff(big, 10);
assert.equal(truncated, true);
assert.ok(diff.startsWith('xxxxxxxxxx'));
assert.ok(diff.includes('已截斷'));
});
test('fallbackSummary: 取首個 commit 當標題', () => {
const s = fallbackSummary({
source: 'feature',
target: 'develop',
commitMessages: '- feat: 新增功能\n- fix: 修正',
diffStat: ' a.js | 2 +-',
});
assert.equal(s.title, 'feat: 新增功能');
assert.ok(s.description.includes('## 變更摘要'));
assert.ok(s.description.includes('a.js'));
});
test('fallbackSummary: 無 commit 時退回 Merge 標題且描述非空', () => {
const s = fallbackSummary({
source: 'feature',
target: 'develop',
commitMessages: '',
diffStat: '',
});
assert.equal(s.title, 'Merge feature into develop');
assert.ok(s.description.includes('(無)'));
assert.ok(s.description.length > 0);
});
test('buildResolveBranchName: 含前綴並淨化非法字元', () => {
const name = buildResolveBranchName('develop', 'feature/x y');
assert.ok(name.startsWith('resolve-conflict/'));
assert.ok(name.includes('-into-'));
// 空白等非法字元被替換為 -
assert.ok(!/\s/.test(name));
});
test('buildResolveBranchName: 過長 target/source 仍遠低於 255', () => {
const long = 'a'.repeat(500);
const name = buildResolveBranchName(long, long);
assert.ok(name.length < 255);
});
test('buildResolveBody: 含衝突檔案清單與人工檢查清單', () => {
const body = buildResolveBody({
source: 'feature',
target: 'develop',
resolveBranch: 'resolve-conflict/develop-into-feature',
files: ['a.js', 'b.js'],
summary: { title: 't', description: '摘要內容' },
});
assert.ok(body.includes('- `a.js`'));
assert.ok(body.includes('- `b.js`'));
assert.ok(body.includes('合併前人工檢查清單'));
assert.ok(body.includes('摘要內容'));
});