knowledge-library-crud-smoke-test.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. 'use strict';
  2. const assert = require('assert/strict');
  3. const fs = require('fs');
  4. const os = require('os');
  5. const path = require('path');
  6. const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwei-knowledge-crud-'));
  7. process.env.QIWEI_OUTPUTS_DIR = tempRoot;
  8. const service = require('../mcp/src/dashboard/workspace-library-service');
  9. function flatten(nodes = []) { return nodes.flatMap(node => [node, ...(node.children ? flatten(node.children) : [])]); }
  10. function userTree() { return service.listKnowledgeTree().data.roots.find(root => root.libraryId === 'user-knowledge'); }
  11. function find(name) { return flatten([userTree()]).find(node => node.name === name); }
  12. try {
  13. const root = userTree();
  14. assert.equal(root.writable, true);
  15. assert.equal(root.name, '我的知识库');
  16. service.createKnowledgeFolder({ libraryId: 'user-knowledge', name: '客户资料' });
  17. service.createKnowledgeFolder({ libraryId: 'user-knowledge', parentPath: '客户资料', name: '销售话术' });
  18. const created = service.createKnowledgeFile({ libraryId: 'user-knowledge', parentPath: '客户资料/销售话术', name: '欢迎语.md', content: '# 欢迎\n\n你好,欢迎咨询。' });
  19. const createdNode = find('欢迎语.md');
  20. assert.ok(createdNode?.id);
  21. assert.equal(service.readKnowledgeFile(createdNode.id).data.content.includes('欢迎咨询'), true);
  22. const renamed = service.updateKnowledgeNode({ id: createdNode.id, name: '欢迎语-更新.md', content: '# 更新内容' });
  23. const renamedNode = find('欢迎语-更新.md');
  24. assert.ok(renamed.data.nodeId);
  25. assert.equal(service.readKnowledgeFile(renamedNode.id).data.content, '# 更新内容');
  26. const destination = find('客户资料');
  27. service.moveKnowledgeNode({ id: renamedNode.id, parentId: destination.id });
  28. const movedNode = find('欢迎语-更新.md');
  29. assert.equal(movedNode.relativePath, '客户资料/欢迎语-更新.md');
  30. service.deleteKnowledgeNode({ id: destination.id });
  31. assert.equal(find('欢迎语-更新.md'), undefined, JSON.stringify(userTree()));
  32. assert.throws(() => service.createKnowledgeFile({ libraryId: 'agent-knowledge', name: '越权.md', content: 'x' }), /只读/);
  33. assert.throws(() => service.createKnowledgeFolder({ libraryId: 'user-knowledge', parentPath: '../', name: '越界' }), /目录之外|分类/);
  34. process.stdout.write(JSON.stringify({ status: 'ok', checks: ['中文分类', '文件创建与读取', '重命名与编辑', '移动分类', '递归删除', '只读目录保护', '路径边界保护'] }, null, 2) + '\n');
  35. } finally {
  36. fs.rmSync(tempRoot, { recursive: true, force: true });
  37. }