response-monitor-smoke-test.js 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. const assert = require('assert');
  2. const fs = require('fs');
  3. const os = require('os');
  4. const path = require('path');
  5. const { responseMonitor, isStaffMessage } = require('../mcp/src/dashboard/response-monitor-service');
  6. const root = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-response-monitor-'));
  7. const groupsDir = path.join(root, 'outputs', 'groups');
  8. const messagesDir = path.join(root, 'outputs', 'messages');
  9. fs.mkdirSync(groupsDir, { recursive: true });
  10. fs.mkdirSync(messagesDir, { recursive: true });
  11. fs.writeFileSync(path.join(groupsDir, 'confirmed-mapping.json'), JSON.stringify({
  12. 'room-1': { roomName: '重点客户群' },
  13. 'room-2': { roomName: '待同步客户群' },
  14. }), 'utf8');
  15. fs.writeFileSync(path.join(groupsDir, 'rooms-latest.json'), JSON.stringify([
  16. { roomId: 'room-1', roomName: '重点客户群' },
  17. ]), 'utf8');
  18. fs.writeFileSync(path.join(messagesDir, 'room-room-1-2026-07-20T10-00-00.json'), JSON.stringify([
  19. { msgId: 'group-1', senderId: 'customer-1', senderName: '客户甲', content: '麻烦尽快回复', timestamp: '2026-07-20T08:00:00.000Z' },
  20. ]), 'utf8');
  21. const result = responseMonitor({
  22. projectRoot: root,
  23. now: Date.parse('2026-07-20T10:00:00.000Z'),
  24. warningMinutes: 15,
  25. urgentMinutes: 60,
  26. selfUserIds: ['staff-1'],
  27. selfNames: ['客服小夏'],
  28. conversations: [
  29. {
  30. id: 'conversation-1',
  31. contactId: 'customer-1',
  32. displayName: '王刚',
  33. messages: [{ role: 'customer', content: '在吗', timestamp: '2026-07-20T09:40:00.000Z' }],
  34. },
  35. {
  36. id: 'conversation-2',
  37. contactId: 'customer-2',
  38. displayName: '已回复客户',
  39. messages: [
  40. { role: 'customer', content: '你好', timestamp: '2026-07-20T09:20:00.000Z' },
  41. { role: 'human', content: '您好', timestamp: '2026-07-20T09:22:00.000Z' },
  42. ],
  43. },
  44. {
  45. id: 'conversation-3',
  46. contactId: 'customer-3',
  47. displayName: '无需回复客户',
  48. handledMessageId: 'ack-1',
  49. messages: [{ id: 'ack-1', role: 'customer', content: '收到', timestamp: '2026-07-20T09:00:00.000Z' }],
  50. },
  51. ],
  52. });
  53. assert.strictEqual(result.summary.monitoredCustomers, 3);
  54. assert.strictEqual(result.summary.monitoredGroups, 0);
  55. assert.strictEqual(result.summary.overdue, 1);
  56. assert.strictEqual(result.summary.urgent, 0);
  57. assert.strictEqual(result.summary.warning, 1);
  58. assert.strictEqual(result.summary.awaitingSync, 0);
  59. assert.strictEqual(result.reminders[0].kind, 'customer');
  60. assert.strictEqual(result.reminders[0].conversationId, 'conversation-1');
  61. assert.strictEqual(result.scope.customers[1].status, 'replied');
  62. assert.strictEqual(result.scope.customers[2].status, 'no_reply_needed');
  63. assert.strictEqual(result.scope.customers[2].waitingMinutes, 0);
  64. assert.deepStrictEqual(result.scope.groups, []);
  65. assert.strictEqual(isStaffMessage({ senderId: 'staff-1' }, ['staff-1'], []), true);
  66. assert.strictEqual(isStaffMessage({ senderName: '客服小夏' }, [], ['客服小夏']), true);
  67. const repliedResult = responseMonitor({
  68. projectRoot: root,
  69. now: Date.parse('2026-07-20T10:00:00.000Z'),
  70. warningMinutes: 15,
  71. urgentMinutes: 60,
  72. selfUserIds: ['staff-1'],
  73. selfNames: ['客服小夏'],
  74. conversations: [],
  75. });
  76. assert.deepStrictEqual(repliedResult.scope.groups, []);
  77. assert.strictEqual(repliedResult.summary.overdue, 0);
  78. fs.rmSync(root, { recursive: true, force: true });
  79. console.log(JSON.stringify({
  80. status: 'ok',
  81. checks: 16,
  82. monitoredCustomers: result.summary.monitoredCustomers,
  83. monitoredGroups: result.summary.monitoredGroups,
  84. overdue: result.summary.overdue,
  85. }, null, 2));