'use strict'; const assert = require('node:assert/strict'); const test = require('node:test'); const gitea = require('../src/lib/gitea'); function withFetchStub(handler, callback) { const originalFetch = global.fetch; const calls = []; global.fetch = async (url, options = {}) => { calls.push({ url, options }); return handler(url, options); }; return Promise.resolve() .then(() => callback(calls)) .finally(() => { global.fetch = originalFetch; }); } function jsonResponse(data, ok = true, status = 200) { return { ok, status, async text() { return JSON.stringify(data); }, }; } test('addIssueDependency 使用正確 endpoint、method 與 IssueMeta body', async () => { const ctx = { apiBase: 'https://gitea.example.test/api/v1', token: 'hidden', owner: 'owner', repo: 'repo', }; await withFetchStub(() => jsonResponse({ ok: true }), async (calls) => { await gitea.addIssueDependency(ctx, 12, 34); assert.equal(calls.length, 1); assert.equal(calls[0].url, 'https://gitea.example.test/api/v1/repos/owner/repo/issues/12/dependencies'); assert.equal(calls[0].options.method, 'POST'); assert.equal(calls[0].options.headers.Authorization, 'token hidden'); assert.deepEqual(JSON.parse(calls[0].options.body), { index: 34, owner: 'owner', repo: 'repo', }); }); }); test('createIssue 空 labels 不送出 labels 欄位', async () => { const ctx = { apiBase: 'https://gitea.example.test/api/v1', token: 'hidden', owner: 'owner', repo: 'repo', }; await withFetchStub(() => jsonResponse({ number: 5 }), async (calls) => { await gitea.createIssue(ctx, { title: 'title', body: 'body', labels: [] }); assert.equal(calls[0].url, 'https://gitea.example.test/api/v1/repos/owner/repo/issues'); assert.equal(calls[0].options.method, 'POST'); assert.deepEqual(JSON.parse(calls[0].options.body), { title: 'title', body: 'body', }); }); });