test(app): 新增 node:test 單元與整合測試並加入 test 指令
This commit is contained in:
@@ -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 已存在時回查既有 PR,created=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);
|
||||
});
|
||||
Reference in New Issue
Block a user