From 3c8704d1a392b21c21bb72a683126fbe5457fee7 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 26 Jun 2026 10:52:19 +0800 Subject: [PATCH] =?UTF-8?q?test(calculate-version):=20=E8=A3=9C=E4=B8=8A?= =?UTF-8?q?=20GITEA=5FSERVER=5FURL=20=E9=A9=97=E8=AD=89=E8=88=87=20main=20?= =?UTF-8?q?=E5=A4=B1=E6=95=97=E8=B7=AF=E5=BE=91=E6=B8=AC=E8=A9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 config 的 URL 格式/協定驗證測試,以及以相依注入覆蓋 main 成功與 loadConfig/fetchReleases 失敗路徑的整合測試。 Co-Authored-By: Claude Opus 4.8 (1M context) --- test/config.test.js | 14 +++++++++++ test/index.test.js | 59 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 test/index.test.js diff --git a/test/config.test.js b/test/config.test.js index e72d1de..03a989d 100644 --- a/test/config.test.js +++ b/test/config.test.js @@ -59,3 +59,17 @@ test('loadConfig 缺少 token 視為匿名(null)', () => { test('loadConfig 缺少必填項目時拋錯', () => { 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/); +}); diff --git a/test/index.test.js b/test/index.test.js new file mode 100644 index 0000000..4309ba7 --- /dev/null +++ b/test/index.test.js @@ -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 請求失敗/); +});