test(calculate-version): 補上 GITEA_SERVER_URL 驗證與 main 失敗路徑測試
新增 config 的 URL 格式/協定驗證測試,以及以相依注入覆蓋 main 成功與 loadConfig/fetchReleases 失敗路徑的整合測試。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
fdf33b41d8
commit
3c8704d1a3
@@ -59,3 +59,17 @@ test('loadConfig 缺少 token 視為匿名(null)', () => {
|
|||||||
test('loadConfig 缺少必填項目時拋錯', () => {
|
test('loadConfig 缺少必填項目時拋錯', () => {
|
||||||
assert.throws(() => loadConfig({ GITEA_REPOSITORY: 'owner/repo' }), /GITEA_SERVER_URL 未設定/);
|
assert.throws(() => loadConfig({ GITEA_REPOSITORY: 'owner/repo' }), /GITEA_SERVER_URL 未設定/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('loadConfig 於 GITEA_SERVER_URL 非合法 URL 時拋錯', () => {
|
||||||
|
assert.throws(() => loadConfig({
|
||||||
|
GITEA_SERVER_URL: 'not-a-url',
|
||||||
|
GITEA_REPOSITORY: 'owner/repo',
|
||||||
|
}), /GITEA_SERVER_URL 格式錯誤/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('loadConfig 於 GITEA_SERVER_URL 使用非 http(s) 協定時拋錯', () => {
|
||||||
|
assert.throws(() => loadConfig({
|
||||||
|
GITEA_SERVER_URL: 'ftp://gitea.example.com',
|
||||||
|
GITEA_REPOSITORY: 'owner/repo',
|
||||||
|
}), /必須使用 http 或 https/);
|
||||||
|
});
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const test = require('node:test');
|
||||||
|
const assert = require('node:assert/strict');
|
||||||
|
|
||||||
|
const { main } = require('../app/index');
|
||||||
|
|
||||||
|
// 安靜的 log 記錄器,避免測試輸出雜訊
|
||||||
|
const silentLog = { section() {}, info() {}, error() {} };
|
||||||
|
|
||||||
|
const okConfig = {
|
||||||
|
serverUrl: 'https://gitea.example.com',
|
||||||
|
repository: 'owner/repo',
|
||||||
|
token: null,
|
||||||
|
isBeta: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
test('main 成功時計算版本並寫出 output', async () => {
|
||||||
|
let written;
|
||||||
|
const version = await main({
|
||||||
|
loadConfig: () => okConfig,
|
||||||
|
fetchReleases: async () => ([{ tag_name: 'v1.2.3' }]),
|
||||||
|
writeOutput: (name, value) => { written = { name, value }; },
|
||||||
|
log: silentLog,
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(version, '1.2.4');
|
||||||
|
assert.deepEqual(written, { name: 'version', value: '1.2.4' });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('main 將 release URL 與 token 傳給 fetchReleases', async () => {
|
||||||
|
let receivedUrl;
|
||||||
|
let receivedOptions;
|
||||||
|
await main({
|
||||||
|
loadConfig: () => ({ ...okConfig, token: 'secret' }),
|
||||||
|
fetchReleases: async (url, options) => { receivedUrl = url; receivedOptions = options; return []; },
|
||||||
|
writeOutput: () => {},
|
||||||
|
log: silentLog,
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(receivedUrl, 'https://gitea.example.com/api/v1/repos/owner/repo/releases');
|
||||||
|
assert.equal(receivedOptions.token, 'secret');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('main 於 loadConfig 失敗時向外拋出', async () => {
|
||||||
|
await assert.rejects(() => main({
|
||||||
|
loadConfig: () => { throw new Error('GITEA_SERVER_URL 未設定'); },
|
||||||
|
log: silentLog,
|
||||||
|
}), /GITEA_SERVER_URL 未設定/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('main 於 fetchReleases 失敗時向外拋出', async () => {
|
||||||
|
await assert.rejects(() => main({
|
||||||
|
loadConfig: () => okConfig,
|
||||||
|
fetchReleases: async () => { throw new Error('release API 請求失敗 (page=1)'); },
|
||||||
|
writeOutput: () => {},
|
||||||
|
log: silentLog,
|
||||||
|
}), /release API 請求失敗/);
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user