account-remove-release-smoke-test.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. 'use strict';
  2. const assert = require('node:assert/strict');
  3. const fs = require('node:fs');
  4. const os = require('node:os');
  5. const path = require('node:path');
  6. const ROOT = path.resolve(__dirname, '..');
  7. function envValue(filePath, key) {
  8. const match = fs.readFileSync(filePath, 'utf8').match(new RegExp(`^${key}=(.*)$`, 'm'));
  9. return match ? match[1].trim() : undefined;
  10. }
  11. async function main() {
  12. const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-account-remove-'));
  13. const previous = { cwd: process.cwd(), env: { ...process.env }, fetch: global.fetch };
  14. try {
  15. process.env.QIWEI_PACKAGE_ROOT = tempRoot;
  16. process.env.QIWEI_WORKSPACE_ROOT = tempRoot;
  17. process.env.QIWEI_OUTPUTS_DIR = path.join(tempRoot, 'outputs');
  18. delete process.env.QIWEI_AUTH_TOKEN;
  19. process.chdir(tempRoot);
  20. fs.writeFileSync(path.join(tempRoot, '.env.local'), [
  21. 'QIWEI_AUTH_TOKEN=test-remove-token',
  22. 'QIWEI_API_BASE=http://gateway.test/api/qiwei',
  23. 'QIWEI_UID=uid-remove-a',
  24. 'QIWEI_GUID=guid-remove-a',
  25. 'OTHER_SETTING=keep-me',
  26. '',
  27. ].join('\n'), 'utf8');
  28. const requests = [];
  29. global.fetch = async (url, options = {}) => {
  30. const body = options.body ? JSON.parse(options.body) : {};
  31. requests.push({ path: new URL(String(url)).pathname, body });
  32. return new Response(JSON.stringify({ code: 0, data: { released: true } }), {
  33. status: 200,
  34. headers: { 'Content-Type': 'application/json' },
  35. });
  36. };
  37. const login = require(path.join(ROOT, 'mcp/src/tools/qiwei-login-run.js'));
  38. const first = await login.qiweiUserLogout({ uid: 'uid-remove-a', guid: 'guid-remove-a', apiBase: 'http://gateway.test/api/qiwei' });
  39. assert.equal(first.status, 'ok');
  40. assert.deepEqual(requests.map(item => item.body.method), ['/user/logout', '/client/stopClient']);
  41. assert.deepEqual(requests.map(item => item.body.uid), ['uid-remove-a', 'uid-remove-a']);
  42. assert.deepEqual(requests.map(item => item.body.params.guid), ['guid-remove-a', 'guid-remove-a']);
  43. assert.equal(envValue(path.join(tempRoot, '.env.local'), 'QIWEI_UID'), '');
  44. assert.equal(envValue(path.join(tempRoot, '.env.local'), 'QIWEI_GUID'), '');
  45. assert.equal(envValue(path.join(tempRoot, '.env.local'), 'QIWEI_AUTH_TOKEN'), 'test-remove-token');
  46. assert.equal(envValue(path.join(tempRoot, '.env.local'), 'OTHER_SETTING'), 'keep-me');
  47. const second = await login.qiweiUserLogout({ uid: 'uid-remove-a', guid: 'guid-remove-a', apiBase: 'http://gateway.test/api/qiwei' });
  48. assert.equal(second.status, 'ok');
  49. assert.equal(second.summary.credentialsCleared, true);
  50. process.stdout.write(`${JSON.stringify({
  51. status: 'ok',
  52. checks: 9,
  53. coverage: [
  54. 'logout_then_stop_client_order',
  55. 'guid_forwarded_to_both_upstream_calls',
  56. 'local_uid_guid_cleared',
  57. 'auth_token_preserved',
  58. 'unrelated_env_preserved',
  59. 'repeat_remove_is_idempotent',
  60. ],
  61. }, null, 2)}\n`);
  62. } finally {
  63. global.fetch = previous.fetch;
  64. process.chdir(previous.cwd);
  65. for (const key of Object.keys(process.env)) {
  66. if (!(key in previous.env)) delete process.env[key];
  67. }
  68. for (const [key, value] of Object.entries(previous.env)) process.env[key] = value;
  69. fs.rmSync(tempRoot, { recursive: true, force: true });
  70. }
  71. }
  72. main().catch(error => {
  73. process.stderr.write(`${error.stack || error.message}\n`);
  74. process.exitCode = 1;
  75. });