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
+78
View File
@@ -0,0 +1,78 @@
import { test, afterEach } from 'node:test';
import assert from 'node:assert/strict';
import { GiteaClient } from './gitea.js';
const realFetch = globalThis.fetch;
afterEach(() => { globalThis.fetch = realFetch; });
function makeClient() {
return new GiteaClient({
serverUrl: 'https://gitea.example',
owner: 'o',
repo: 'r',
token: 't',
});
}
/** 建立假的 fetch,依序回傳給定的回應。 */
function stubFetch(responses) {
const calls = [];
globalThis.fetch = async (url, opts) => {
calls.push({ url, opts });
const r = responses.shift();
return {
ok: r.status >= 200 && r.status < 300,
status: r.status,
text: async () => (r.body == null ? '' : JSON.stringify(r.body)),
};
};
return calls;
}
test('createPull: 成功建立回傳 created=true', async () => {
stubFetch([{ status: 201, body: { number: 7, html_url: 'u' } }]);
const { pull, created } = await makeClient().createPull({
head: 'feature', base: 'develop', title: 't', body: 'b',
});
assert.equal(created, true);
assert.equal(pull.number, 7);
});
test('createPull: 422 已存在時回查既有 PRcreated=false', async () => {
stubFetch([
{ status: 422, body: { message: 'already exists' } },
{ status: 200, body: [
{ number: 3, head: { ref: 'feature' }, base: { ref: 'develop' } },
] },
]);
const { pull, created } = await makeClient().createPull({
head: 'feature', base: 'develop', title: 't', body: 'b',
});
assert.equal(created, false);
assert.equal(pull.number, 3);
});
test('createPull: 422 但查無對應 PR 時丟出錯誤', async () => {
stubFetch([
{ status: 422, body: { message: 'bad' } },
{ status: 200, body: [] },
]);
await assert.rejects(
() => makeClient().createPull({ head: 'feature', base: 'develop', title: 't', body: 'b' }),
/建立 PR 失敗/,
);
});
test('createPull: 其他錯誤狀態碼直接丟出', async () => {
stubFetch([{ status: 500, body: { message: '伺服器錯誤' } }]);
await assert.rejects(
() => makeClient().createPull({ head: 'feature', base: 'develop', title: 't', body: 'b' }),
/建立 PR 失敗 \(500\)/,
);
});
test('findOpenPull: 非陣列回應回傳 null', async () => {
stubFetch([{ status: 200, body: { unexpected: true } }]);
const r = await makeClient().findOpenPull('feature', 'develop');
assert.equal(r, null);
});