group-operations-access-smoke-test.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/env node
  2. const assert = require('assert');
  3. const fs = require('fs');
  4. const os = require('os');
  5. const path = require('path');
  6. const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-group-ops-access-'));
  7. process.env.QIWEI_OUTPUTS_DIR = path.join(tempDir, 'outputs');
  8. const { getGroupOperationsStore } = require('../mcp/src/core/group-operations-store');
  9. const { qiweiGroupOpsManageAccess, qiweiGroupOpsManagePlaybook, qiweiGroupOpsGeneratePlan, qiweiGroupOpsExecuteItem } = require('../mcp/src/tools/qiwei-group-operations-run');
  10. const store = getGroupOperationsStore();
  11. (async () => {
  12. try {
  13. const key = 'access-smoke';
  14. const hq = 'hq-test';
  15. const manager = 'store-manager-test';
  16. const auditor = 'auditor-test';
  17. const bootstrapped = await qiweiGroupOpsManageAccess({ accountKey: key, action: 'upsert', principal: hq, role: 'headquarters_admin', actor: hq, bootstrapConfirmed: true });
  18. assert.equal(bootstrapped.status, 'ok');
  19. assert.equal((await qiweiGroupOpsManageAccess({ accountKey: key, action: 'upsert', principal: manager, requester: hq, role: 'store_manager', storeScope: ['store-a'], actor: hq })).status, 'ok');
  20. assert.equal((await qiweiGroupOpsManageAccess({ accountKey: key, action: 'upsert', principal: auditor, requester: hq, role: 'auditor', actor: hq })).status, 'ok');
  21. const created = await qiweiGroupOpsManagePlaybook({ accountKey: key, action: 'create', name: '权限测试 SOP', groupType: 'customer', content: { cadence: [{ template: '测试 {{room_name}}' }] }, actor: hq, principal: hq });
  22. assert.equal(created.status, 'ok');
  23. const playbookId = created.data.playbook.id;
  24. assert.equal((await qiweiGroupOpsManagePlaybook({ accountKey: key, action: 'publish', playbookId, confirmed: true, actor: hq, principal: hq })).status, 'ok');
  25. store.upsertGroup(key, { roomId: 'room-a', roomName: '门店 A 群', storeId: 'store-a', playbookId }, hq);
  26. store.upsertGroup(key, { roomId: 'room-b', roomName: '门店 B 群', storeId: 'store-b', playbookId }, hq);
  27. const allowedPlan = await qiweiGroupOpsGeneratePlan({ accountKey: key, principal: manager, actor: manager, roomId: 'room-a', planDate: '2026-07-20' });
  28. assert.equal(allowedPlan.status, 'ok');
  29. const deniedPlan = await qiweiGroupOpsGeneratePlan({ accountKey: key, principal: manager, actor: manager, roomId: 'room-b', planDate: '2026-07-20' });
  30. assert.equal(deniedPlan.status, 'error');
  31. assert.match(deniedPlan.assistantMessage, /无权操作门店/);
  32. const deniedPublish = await qiweiGroupOpsManagePlaybook({ accountKey: key, principal: manager, actor: manager, action: 'publish', playbookId, confirmed: true });
  33. assert.equal(deniedPublish.status, 'error');
  34. const itemId = allowedPlan.data.plan.items[0].id;
  35. const deniedExecute = await qiweiGroupOpsExecuteItem({ accountKey: key, principal: auditor, actor: auditor, itemId, action: 'approve' });
  36. assert.equal(deniedExecute.status, 'error');
  37. assert.match(deniedExecute.assistantMessage, /没有 execute_items 权限/);
  38. console.log('group-operations access smoke: ok');
  39. } finally {
  40. store.close();
  41. fs.rmSync(tempDir, { recursive: true, force: true });
  42. }
  43. })().catch(error => { console.error(error.stack || error.message); process.exit(1); });