'use strict'; const test = require('node:test'); const assert = require('node:assert/strict'); const { main } = require('../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 請求失敗/); });