industry-research-directions.test.js 2.1 KB

12345678910111213141516171819202122232425
  1. import { test } from 'node:test';
  2. import assert from 'node:assert/strict';
  3. import { researchDirections, selectedResearch, researchSelectionPatch } from '../src/core/industry-research-directions.js';
  4. test('未命中方向保留假设与缺口,不借用好评或标题作为痛点', () => {
  5. const d = { decisions: { directions: [], leadId: '' }, claims: [{ label: '地域风味', products: 19, examples: ['jd:1'] }] };
  6. const rows = researchDirections(d);
  7. assert.equal(rows.length, 15);
  8. for (const row of rows) for (const key of ['question','concept','action','measure','gate','missing']) assert.ok(row[key], row.id + key);
  9. const health = rows.find(row => row.id === 'health');
  10. assert.equal(health.count, 0); assert.equal(health.status, '待建立依据'); assert.equal(health.metric, '组障碍/愿望');
  11. const local = rows.find(row => row.id === 'regional-flavor');
  12. assert.equal(local.count, 19); assert.equal(local.qualified, null); assert.equal(local.status, '仅供给线索'); assert.deepEqual(local.examples, []);
  13. });
  14. test('场景与动机使用各自现有去重数,不合并或推定交集', () => {
  15. const d = { decisions: { directions: [] }, scenarios: [{ id: 'night', units: 40, products: 24, qualifiedUnits: 3, evidenceIds: ['jd:1:r'], examples: [{ productId: 'jd:1', reviewId: 'jd:1:r' }] }], motives: [{ id: 'repeat', units: 57, qualifiedUnits: 9, evidenceIds: ['jd:2:r'], examples: [] }] };
  16. const rows = researchDirections(d), night = rows.find(row => row.id === 'night-meal'), repeat = rows.find(row => row.id === 'repeat-choice');
  17. assert.equal(night.count, 40); assert.equal(night.qualified, 3); assert.equal(repeat.count, 57); assert.equal(repeat.qualified, 9);
  18. assert.deepEqual(night.evidenceIds, ['jd:1:r']); assert.deepEqual(repeat.evidenceIds, ['jd:2:r']);
  19. assert.equal(selectedResearch(d, { w_research: 'night-meal' }).id, 'night-meal');
  20. assert.deepEqual(researchSelectionPatch('night-meal'), { w_research: 'night-meal', w_focus: '', w_view: 'directions' });
  21. assert.equal(researchSelectionPatch('seasoning').w_focus, 'seasoning');
  22. assert.equal(researchSelectionPatch('invalid').w_view, 'products');
  23. });