library-selection.test.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import test from 'node:test';
  2. import assert from 'node:assert/strict';
  3. import { libraryMaterial, addLibraryMaterials, restoreLibrarySelection, libraryMaterialsText, librarySelectionPath, withoutLibrarySelectionQuery, LIBRARY_SELECTION_LIMIT } from '../src/core/library-selection.js';
  4. test('多选按资料类型和完整ID去重,政策编号不要求平台前缀', () => {
  5. const document = libraryMaterial({ id: 'GB14880-2012', title: '标准' }, 'documents');
  6. const clause = libraryMaterial({ id: 'GB14880-2012' }, 'clauses');
  7. assert.equal(addLibraryMaterials([document], [document, clause]).items.length, 2);
  8. assert.equal(libraryMaterial({ id: '' }, 'products'), null);
  9. assert.equal(libraryMaterial({ id: 'x' }, 'not-a-type'), null);
  10. assert.equal(libraryMaterial({ id: 'jd:1\nnew-task' }, 'products'), null);
  11. });
  12. test('跨页追加保留每条选取条件,达到上限不悄悄丢掉已有选择', () => {
  13. const context = { filters: { brand: 'ksf' }, quality: 'audit' };
  14. const product = libraryMaterial({ id: 'jd:123' }, 'products', context);
  15. context.filters.brand = 'changed';
  16. const social = libraryMaterial({ id: 'bilibili:123' }, 'social', { filters: {}, quality: 'analysis' });
  17. const { items } = addLibraryMaterials([product], [social]);
  18. assert.equal(items[0].context.filters.brand, 'ksf');
  19. assert.equal(items[1].context.quality, 'analysis');
  20. const full = Array.from({ length: LIBRARY_SELECTION_LIMIT }, (_, i) => libraryMaterial({ id: `jd:${i}` }, 'products'));
  21. const result = addLibraryMaterials(full, [social]);
  22. assert.equal(result.items.length, LIBRARY_SELECTION_LIMIT);
  23. assert.equal(result.skipped, 1);
  24. assert.deepEqual(result.items, full);
  25. });
  26. test('刷新恢复选择,代际变化清空,损坏的浏览器保存不当成有效资料', () => {
  27. const items = [libraryMaterial({ id: 'jd:123', source_record_id: 'source-1' }, 'products')];
  28. const saved = JSON.stringify({ generation: 'g1', items });
  29. assert.deepEqual(restoreLibrarySelection(saved, 'g1'), { items, stale: false });
  30. assert.deepEqual(restoreLibrarySelection(saved, 'g2'), { items: [], stale: true });
  31. assert.deepEqual(restoreLibrarySelection('{broken', 'g1'), { items: [], stale: false });
  32. });
  33. test('复制仅包含资料名称与数据库定位键,保留完整ID和版本,省去提示词', () => {
  34. const review = libraryMaterial({ record_id: 'jd:123:r1', title: '含换行\n标题', content: '真'.repeat(800), product_id: 'jd:123', source_record_id: 'source-1', is_default: null, rating_scale: null, token: 'MUST_NOT_COPY' }, 'reviews', { filters: { productId: 'jd:123' }, quality: 'audit' });
  35. const report = libraryMaterial({ id: 'artifact-1', title: '报告', updatedAt: '2026-11-07' }, 'reports');
  36. const text = libraryMaterialsText([review, report], { generation: 'g1' });
  37. const rows = text.split('\n').filter(line => line.startsWith('{')).map(JSON.parse);
  38. assert.equal(rows.length, 2);
  39. assert.equal(rows[0].id, 'jd:123:r1');
  40. assert.equal(rows[0].title, '含换行\n标题');
  41. assert.ok(text.includes('generation:g1'));
  42. assert.equal(rows[0].source_record_id, 'source-1');
  43. assert.equal(rows[0].productId, 'jd:123');
  44. assert.deepEqual(Object.keys(rows[0]).sort(), ['database', 'entity', 'id', 'productId', 'source_record_id', 'title', 'type'].sort());
  45. assert.equal(rows[1].className, 'KfArtifact');
  46. assert.equal(rows[1].objectId, 'artifact-1');
  47. assert.equal(rows[1].database, 'workshop');
  48. assert.equal(rows[1].updatedAt, '2026-11-07');
  49. for (const phrase of ['员工', '请返回', '请你', '查库要求', '分析要求', 'ksf-voc-library', 'workshop-read', 'MUST_NOT_COPY', 'jd:jd:', 'selectionContext', 'previewNote', 'selectedData']) assert.ok(!text.includes(phrase), phrase);
  50. assert.ok(text.length < 700);
  51. assert.throws(() => libraryMaterialsText([], { generation: 'g1' }));
  52. });
  53. test('行业监测转入精确商品及版本,清理旧对比参数后保留浏览范围', () => {
  54. const url = new URL(librarySelectionPath(['jd:123', 'jd:123', 'tmall:456'], 'g1'), 'http://localhost');
  55. assert.deepEqual(JSON.parse(url.searchParams.get('selectProducts')), ['jd:123', 'tmall:456']);
  56. assert.equal(url.searchParams.get('selectionGeneration'), 'g1');
  57. assert.deepEqual(withoutLibrarySelectionQuery({ compare: '["jd:123"]', comparing: '1', selectProducts: '[]', selectionGeneration: 'g1', type: 'products', brand: 'ksf' }), { type: 'products', brand: 'ksf' });
  58. });