account-isolation-smoke-test.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/usr/bin/env node
  2. 'use strict';
  3. const assert = require('assert/strict');
  4. const fs = require('fs');
  5. const os = require('os');
  6. const path = require('path');
  7. const root = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-account-isolation-'));
  8. process.env.QIWEI_OUTPUTS_DIR = path.join(root, 'outputs');
  9. process.env.QIWEI_MESSAGES_DIR = path.join(root, 'messages');
  10. process.env.QIWEI_LEGACY_ACCOUNT_KEY = 'legacy-default';
  11. process.env.QIWEI_MESSAGE_ARCHIVE_ENABLED = '1';
  12. process.env.QIWEI_AGENT_MEMORY_ENABLED = '1';
  13. const { setActiveQiweiContext, qiweiAccountKey } = require('../mcp/src/core/credentials');
  14. const { writeCustomer, readCustomerById, customerFilePath } = require('../mcp/src/core/customer-broker-store');
  15. const { appendChatRecord, ensureMemory, memoryRelBase, drainQueues } = require('../mcp/src/core/message-archive');
  16. const { writeConfirmedMapping, readConfirmedMapping } = require('../mcp/src/tools/qiwei-group-management-run');
  17. async function run() {
  18. const accountA = { uid: 'shared-device', userId: 'wecom-user-a', nickname: 'A' };
  19. const accountB = { uid: 'shared-device', userId: 'wecom-user-b', nickname: 'B' };
  20. const keyA = qiweiAccountKey(accountA);
  21. const keyB = qiweiAccountKey(accountB);
  22. assert.notEqual(keyA, keyB);
  23. setActiveQiweiContext(accountA);
  24. writeCustomer({ customerId: 'customer-1', name: 'Customer A' });
  25. appendChatRecord({ wxid: 'customer-1', content: 'A', createdAt: '2026-08-04T10:00:00.000Z' });
  26. ensureMemory('customer-1', 'Customer A');
  27. writeConfirmedMapping({ 'room-a': { roomId: 'room-a' } });
  28. const customerAPath = customerFilePath('customer-1');
  29. const memoryA = memoryRelBase('customer-1');
  30. setActiveQiweiContext(accountB);
  31. assert.equal(readCustomerById('customer-1'), null);
  32. assert.deepEqual(readConfirmedMapping(), {});
  33. writeCustomer({ customerId: 'customer-1', name: 'Customer B' });
  34. appendChatRecord({ wxid: 'customer-1', content: 'B', createdAt: '2026-08-04T10:00:00.000Z' });
  35. ensureMemory('customer-1', 'Customer B');
  36. writeConfirmedMapping({ 'room-b': { roomId: 'room-b' } });
  37. const customerBPath = customerFilePath('customer-1');
  38. const memoryB = memoryRelBase('customer-1');
  39. await drainQueues();
  40. assert.notEqual(customerAPath, customerBPath);
  41. assert.notEqual(memoryA, memoryB);
  42. assert.equal(JSON.parse(fs.readFileSync(customerAPath, 'utf8')).name, 'Customer A');
  43. assert.equal(JSON.parse(fs.readFileSync(customerBPath, 'utf8')).name, 'Customer B');
  44. assert(fs.existsSync(path.join(root, 'messages', 'chat', keyA, 'customer-1', '2026-08-04.json')));
  45. assert(fs.existsSync(path.join(root, 'messages', 'chat', keyB, 'customer-1', '2026-08-04.json')));
  46. assert(fs.existsSync(path.join(root, 'outputs', 'groups', keyA, 'confirmed-mapping.json')));
  47. assert(fs.existsSync(path.join(root, 'outputs', 'groups', keyB, 'confirmed-mapping.json')));
  48. console.log(`account isolation smoke test passed (${keyA} != ${keyB})`);
  49. }
  50. run()
  51. .finally(() => fs.rmSync(root, { recursive: true, force: true }))
  52. .catch(error => {
  53. console.error(error);
  54. process.exitCode = 1;
  55. });