/** * status 子指令:在出事之前先知道自己是什麼狀態。 * * 這裡最要緊的一條是 ok 與健康狀態分離:ok 的意思一直是「這支指令跑成功了」, * 不兼差表達環境好壞。混用的話呼叫端就分不出「status 掛了」與「status 成功查到 * 你環境有問題」,而這兩件事的下一步完全不同。 */ import test from 'node:test'; import assert from 'node:assert/strict'; import { join } from 'node:path'; import { manifest, pathWithOnly, repoRoot, runBin } from './helpers/run-script.js'; import { healthyRoutes, stubEnv, withStubGitea } from './helpers/stub-gitea.js'; const REPO = 'plugins/tea-sdlc'; const version = () => manifest().version; test('回報版本、正本位置、是不是 link 模式、健康旗標與環境四項', async (t) => { const stub = await withStubGitea(t, healthyRoutes(REPO)); const { code, json } = await runBin(['status'], { env: stubEnv(stub) }); assert.equal(code, 0); assert.equal(json.ok, true); assert.equal(json.data.version, version()); assert.equal(json.data.root, repoRoot); assert.equal(json.data.healthy, true); assert.deepEqual(Object.keys(json.data.environment).sort(), ['git', 'login', 'node', 'tea']); }); test('從 working tree 跑的時候是 link 模式,root 指向 working tree', async (t) => { const stub = await withStubGitea(t, healthyRoutes(REPO)); const { json } = await runBin(['status'], { env: stubEnv(stub) }); assert.equal(json.data.linked, true); assert.equal(json.data.root.includes('node_modules'), false); }); test('缺少 git 或 tea 時對應欄位為 false,健康旗標跟著倒下', async (t) => { const stub = await withStubGitea(t, healthyRoutes(REPO)); const { code, json } = await runBin(['status'], { env: stubEnv(stub), path: pathWithOnly(['node']), }); // 查詢本身仍然成功——它成功查到你的環境有問題 assert.equal(code, 0); assert.equal(json.ok, true); assert.equal(json.data.environment.node, true); assert.equal(json.data.environment.git, false); assert.equal(json.data.environment.tea, false); assert.equal(json.data.healthy, false); }); test('Gitea 登入失效時 ok 仍為 true,healthy 為 false', async (t) => { const stub = await withStubGitea(t, { ...healthyRoutes(REPO), 'GET /api/v1/user': { status: 401, body: { message: 'token expired' } }, }); const { code, json } = await runBin(['status'], { env: stubEnv(stub) }); assert.equal(code, 0); assert.equal(json.ok, true); assert.equal(json.data.environment.login, false); assert.equal(json.data.healthy, false); }); test('登入檢查走既有的單一 HTTP 出口,打的是 /user', async (t) => { const stub = await withStubGitea(t, healthyRoutes(REPO)); await runBin(['status'], { env: stubEnv(stub) }); assert.deepEqual( stub.requests.map((request) => `${request.method} ${request.path}`), ['GET /api/v1/user'], ); assert.equal(stub.requests[0].authorization, 'token stub-token'); }); test('根本還沒登入時也只是 login 為 false,不會讓整支指令失敗', async (t) => { const { code, json } = await runBin(['status'], { env: { TEA_SDLC_CONFIG: join(repoRoot, '.tmp', 'no-such-tea-config.yml') }, }); assert.equal(code, 0); assert.equal(json.ok, true); assert.equal(json.data.environment.login, false); assert.equal(json.data.healthy, false); });