Files
geo/apps/desktop-client/src/main/adapters/yuanbao.test.ts
T

156 lines
5.6 KiB
TypeScript
Raw Normal View History

import { describe, expect, it } from 'vitest'
import { __yuanbaoTestUtils } from './yuanbao'
const {
appendUniqueSourceItems,
buildOrderedDomSourceItems,
buildSourceItem,
extractCitationMarkerIndexes,
extractQuestionText,
findUnresolvedCitationIndexes,
mergeText,
normalizeSourceUrl,
parseYuanbaoCaptures,
resolveCitationsFromMarkers,
} = __yuanbaoTestUtils
describe('yuanbao adapter helpers', () => {
it('unwraps redirect URLs and reads Yuanbao document URL fields', () => {
expect(
normalizeSourceUrl(
'https://yuanbao.tencent.com/link?target=https%3A%2F%2Fexample.com%2Fa%23ref',
),
).toBe('https://example.com/a')
expect(
buildSourceItem({
docUrl: 'https://example.com/doc?from=yuanbao#source',
title: '引用文章',
siteName: 'Example',
}),
).toMatchObject({
url: 'https://example.com/doc?from=yuanbao',
normalized_url: 'https://example.com/doc?from=yuanbao',
title: '引用文章',
site_name: 'Example',
host: 'example.com',
})
})
it('rejects browser and build diagnostics as monitoring questions', () => {
expect(extractQuestionText({ question_text: '合肥全屋定制推荐' })).toBe('合肥全屋定制推荐')
expect(() =>
extractQuestionText({
question_text:
"The resource http://localhost:8000/static/js/runtime.c632b2fe.js was preloaded using link preload but not used within a few seconds from the window's load event.",
}),
).toThrow('yuanbao_question_text_runtime_diagnostic')
expect(() =>
extractQuestionText({
question_text:
'failed to solve: process "/bin/sh -c go build" did not complete successfully: exit code: 1',
}),
).toThrow('yuanbao_question_text_runtime_diagnostic')
})
it('merges streaming answer fragments without duplicating a repeated prefix', () => {
const first =
'通过三轮搜索,我已经掌握了合肥全屋定制市场的高性价比品牌。一定要合同中的定标准确和责任。'
const repeated =
'通过三轮搜索,我已经掌握了合肥全屋定制市场的高性价比品牌。结合你的预算,我建议优先看本土老牌。'
expect(mergeText(first, repeated)).toBe(repeated)
})
it('resolves citation markers against the best available source pool', () => {
const sources = [
{ url: 'https://example.com/1', normalized_url: 'https://example.com/1' },
{ url: 'https://example.com/2', normalized_url: 'https://example.com/2' },
{ url: 'https://example.com/3', normalized_url: 'https://example.com/3' },
]
expect(extractCitationMarkerIndexes('正文 [citation:1] 和 [citation:3]')).toEqual([1, 3])
expect(
resolveCitationsFromMarkers('正文 [citation:1] 和 [citation:3]', [[], sources]).map(
(item) => item.url,
),
).toEqual(['https://example.com/1', 'https://example.com/3'])
})
it('preserves indexed DOM citation slots even when URLs repeat', () => {
const domSources = buildOrderedDomSourceItems([
{
url: 'https://example.com/repeated',
title: '来源 1',
text: null,
siteName: 'Example',
sourceIndex: 1,
},
{
url: 'https://example.com/repeated',
title: '来源 2',
text: null,
siteName: 'Example',
sourceIndex: 2,
},
{
url: 'https://example.com/third',
title: '来源 3',
text: null,
siteName: 'Example',
sourceIndex: 3,
},
])
expect(domSources).toHaveLength(3)
expect(domSources.map((item) => item.title)).toEqual(['来源 1', '来源 2', '来源 3'])
expect(findUnresolvedCitationIndexes('正文 [citation:2] [citation:3]', domSources)).toEqual([])
})
it('keeps primary DOM citation order when appending parsed extras', () => {
const primary = [
{ url: 'https://example.com/1', normalized_url: 'https://example.com/1' },
{ url: 'https://example.com/2', normalized_url: 'https://example.com/2' },
]
const appended = appendUniqueSourceItems(primary, [
{ url: 'https://example.com/2', normalized_url: 'https://example.com/2', title: 'duplicate' },
{ url: 'https://example.com/3', normalized_url: 'https://example.com/3' },
])
expect(appended.map((item) => item.url)).toEqual([
'https://example.com/1',
'https://example.com/2',
'https://example.com/3',
])
})
it('does not report incomplete citations when the answer has no markers', () => {
expect(findUnresolvedCitationIndexes('正文没有引用小图标', [])).toEqual([])
})
it('collects source candidates from deep search thinking fields', () => {
const summary = parseYuanbaoCaptures([
{
url: 'https://yuanbao.tencent.com/api/chat',
status: 200,
contentType: 'text/event-stream',
body: [
'data: {"type":"deepSearch","contents":[{"type":"step","webPages":[{"targetUrl":"https://example.com/a#ref","title":"来源 A","siteName":"Example"}],"references":[{"sourceUrl":"https://example.com/b","title":"来源 B"}]}]}',
'data: {"type":"text","msg":"正文 [citation:1] [citation:2]"}',
].join('\n\n'),
},
])
expect(summary.searchResults.map((item) => item.url)).toContain('https://example.com/a')
expect(summary.citations.map((item) => item.url)).toContain('https://example.com/b')
expect(
resolveCitationsFromMarkers(summary.answer, [
summary.citations,
summary.searchResults,
[...summary.citations, ...summary.searchResults],
]).map((item) => item.url),
).toEqual(['https://example.com/b', 'https://example.com/a'])
})
})