'use strict'; const assert = require('node:assert/strict'); const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); const ROOT = path.resolve(__dirname, '..'); function envValue(filePath, key) { const match = fs.readFileSync(filePath, 'utf8').match(new RegExp(`^${key}=(.*)$`, 'm')); return match ? match[1].trim() : undefined; } async function main() { const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-account-remove-')); const previous = { cwd: process.cwd(), env: { ...process.env }, fetch: global.fetch }; try { process.env.QIWEI_PACKAGE_ROOT = tempRoot; process.env.QIWEI_WORKSPACE_ROOT = tempRoot; process.env.QIWEI_OUTPUTS_DIR = path.join(tempRoot, 'outputs'); delete process.env.QIWEI_AUTH_TOKEN; process.chdir(tempRoot); fs.writeFileSync(path.join(tempRoot, '.env.local'), [ 'QIWEI_AUTH_TOKEN=test-remove-token', 'QIWEI_API_BASE=http://gateway.test/api/qiwei', 'QIWEI_UID=uid-remove-a', 'QIWEI_GUID=guid-remove-a', 'OTHER_SETTING=keep-me', '', ].join('\n'), 'utf8'); const requests = []; global.fetch = async (url, options = {}) => { const body = options.body ? JSON.parse(options.body) : {}; requests.push({ path: new URL(String(url)).pathname, body }); return new Response(JSON.stringify({ code: 0, data: { released: true } }), { status: 200, headers: { 'Content-Type': 'application/json' }, }); }; const login = require(path.join(ROOT, 'mcp/src/tools/qiwei-login-run.js')); const first = await login.qiweiUserLogout({ uid: 'uid-remove-a', guid: 'guid-remove-a', apiBase: 'http://gateway.test/api/qiwei' }); assert.equal(first.status, 'ok'); assert.deepEqual(requests.map(item => item.body.method), ['/user/logout', '/client/stopClient']); assert.deepEqual(requests.map(item => item.body.uid), ['uid-remove-a', 'uid-remove-a']); assert.deepEqual(requests.map(item => item.body.params.guid), ['guid-remove-a', 'guid-remove-a']); assert.equal(envValue(path.join(tempRoot, '.env.local'), 'QIWEI_UID'), ''); assert.equal(envValue(path.join(tempRoot, '.env.local'), 'QIWEI_GUID'), ''); assert.equal(envValue(path.join(tempRoot, '.env.local'), 'QIWEI_AUTH_TOKEN'), 'test-remove-token'); assert.equal(envValue(path.join(tempRoot, '.env.local'), 'OTHER_SETTING'), 'keep-me'); const second = await login.qiweiUserLogout({ uid: 'uid-remove-a', guid: 'guid-remove-a', apiBase: 'http://gateway.test/api/qiwei' }); assert.equal(second.status, 'ok'); assert.equal(second.summary.credentialsCleared, true); process.stdout.write(`${JSON.stringify({ status: 'ok', checks: 9, coverage: [ 'logout_then_stop_client_order', 'guid_forwarded_to_both_upstream_calls', 'local_uid_guid_cleared', 'auth_token_preserved', 'unrelated_env_preserved', 'repeat_remove_is_idempotent', ], }, null, 2)}\n`); } finally { global.fetch = previous.fetch; process.chdir(previous.cwd); for (const key of Object.keys(process.env)) { if (!(key in previous.env)) delete process.env[key]; } for (const [key, value] of Object.entries(previous.env)) process.env[key] = value; fs.rmSync(tempRoot, { recursive: true, force: true }); } } main().catch(error => { process.stderr.write(`${error.stack || error.message}\n`); process.exitCode = 1; });