Files
crm-ai/bridge/test/reply-links.test.js
T

70 lines
3.5 KiB
JavaScript

'use strict';
const test = require('node:test');
const assert = require('node:assert/strict');
const { appendMissingProductLinks, collectProductLinks } = require('../src/reply-links');
const TOOL_RESULTS = [{
products: [
{ name: 'Triple Rings Ring', url: 'https://www.yehwang.com/triple-rings-ring-gold-color-17590.html', price: '$2.88', stock: 26 },
{ name: 'Aurora Rings Ring', url: 'https://www.yehwang.com/aurora-rings-ring-silver-color-color-17549.html', price: '$3.17', stock: 63 },
],
category_links: [{ name: 'Rings', url: 'https://www.yehwang.com/jewelry/rings' }],
}];
test('reply-links: appends real product/category links as markdown', () => {
const r = appendMissingProductLinks({ content: 'Here are some rings.', toolResults: TOOL_RESULTS, lang: 'English' });
assert.equal(r.appended, 3);
assert.match(r.content, /\[Triple Rings Ring\]\(https:\/\/www\.yehwang\.com\/triple-rings-ring-gold-color-17590\.html\)/);
assert.match(r.content, /\[Rings\]\(https:\/\/www\.yehwang\.com\/jewelry\/rings\)/);
assert.match(r.content, /Click to view:/);
assert.match(r.content, /26 pcs/);
});
test('reply-links: skips links already written by the model', () => {
const content = 'See https://www.yehwang.com/triple-rings-ring-gold-color-17590.html for details.';
const r = appendMissingProductLinks({ content, toolResults: TOOL_RESULTS, lang: 'English' });
assert.equal(r.appended, 2);
assert.equal((r.content.match(/triple-rings-ring-gold-color-17590/g) || []).length, 1);
});
test('reply-links: respects the limit', () => {
const r = appendMissingProductLinks({ content: 'Rings:', toolResults: TOOL_RESULTS, lang: 'English', limit: 1 });
assert.equal(r.appended, 1);
assert.doesNotMatch(r.content, /Aurora Rings Ring/);
});
test('reply-links: html mode emits clickable anchors', () => {
const r = appendMissingProductLinks({ content: '<p>Rings:</p>', toolResults: TOOL_RESULTS, lang: 'Chinese', html: true });
assert.equal(r.appended, 3);
assert.match(r.content, /<a href="https:\/\/www\.yehwang\.com\/triple-rings-ring-gold-color-17590\.html"/);
assert.match(r.content, /可直接查看:/);
assert.doesNotMatch(r.content, /\[Triple Rings Ring\]\(/);
});
test('reply-links: does not backfill when the reply already says there is no match', () => {
const r = appendMissingProductLinks({ content: 'No exact matches found.', toolResults: TOOL_RESULTS, lang: 'English' });
assert.equal(r.appended, 0);
assert.equal(r.content, 'No exact matches found.');
});
test('reply-links: collects only http(s) urls and dedupes', () => {
const links = collectProductLinks([
{ products: [{ name: 'A', url: 'https://a.example/1' }, { name: 'B', url: 'https://a.example/1' }] },
{ category_links: [{ name: 'C', url: 'https://c.example/2' }, { name: 'bad', url: '/relative/3' }] },
]);
assert.deepEqual(links.map((l) => l.url), ['https://a.example/1', 'https://c.example/2']);
});
test('reply-links: prefers in-stock products over out-of-stock ones', () => {
const toolResults = [{ products: [
{ name: 'Out', url: 'https://a.example/out', price: '$1.00', stock: 0 },
{ name: 'In', url: 'https://a.example/in', price: '$2.00', stock: 26 },
{ name: 'Backorder', url: 'https://a.example/bo', price: '$3.00', stock: 0 },
] }];
const r = appendMissingProductLinks({ content: 'Rings:', toolResults, lang: 'English', limit: 2 });
assert.equal(r.appended, 2);
assert.match(r.content, /\[In\]\(https:\/\/a\.example\/in\)/);
assert.ok(r.content.indexOf('a.example/in') < r.content.indexOf('a.example/out'), 'in-stock link comes first');
});