test: Add unit test for projects/app/src/global/core/chat/utils.ts (#4328)

* Add unit tests for chat utility functions and enhance statistical data calculation in utils.ts.

* Update utils.ts

---------

Co-authored-by: gru-agent[bot] <185149714+gru-agent[bot]@users.noreply.github.com>
Co-authored-by: Archer <545436317@qq.com>
This commit is contained in:
gru-agent[bot]
2025-03-26 13:46:21 +08:00
committed by GitHub
parent 28877373ac
commit 29a10c1389
2 changed files with 192 additions and 1 deletions

View File

@@ -0,0 +1,191 @@
import { describe, expect, it } from 'vitest';
import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants';
import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant';
import { ChatHistoryItemResType, ChatItemType } from '@fastgpt/global/core/chat/type';
import {
transformPreviewHistories,
addStatisticalDataToHistoryItem
} from '@/global/core/chat/utils';
describe('transformPreviewHistories', () => {
it('should transform histories correctly with responseDetail=true', () => {
const histories: ChatItemType[] = [
{
obj: ChatRoleEnum.AI,
value: 'test response',
responseData: [
{
moduleType: FlowNodeTypeEnum.chatNode,
runningTime: 1.5
}
]
}
];
const result = transformPreviewHistories(histories, true);
expect(result[0]).toEqual({
obj: ChatRoleEnum.AI,
value: 'test response',
responseData: undefined,
llmModuleAccount: 1,
totalQuoteList: [],
totalRunningTime: 1.5,
historyPreviewLength: undefined
});
});
it('should transform histories correctly with responseDetail=false', () => {
const histories: ChatItemType[] = [
{
obj: ChatRoleEnum.AI,
value: 'test response',
responseData: [
{
moduleType: FlowNodeTypeEnum.chatNode,
runningTime: 1.5
}
]
}
];
const result = transformPreviewHistories(histories, false);
expect(result[0]).toEqual({
obj: ChatRoleEnum.AI,
value: 'test response',
responseData: undefined,
llmModuleAccount: 1,
totalQuoteList: undefined,
totalRunningTime: 1.5,
historyPreviewLength: undefined
});
});
});
describe('addStatisticalDataToHistoryItem', () => {
it('should return original item if obj is not AI', () => {
const item: ChatItemType = {
obj: ChatRoleEnum.Human,
value: 'test'
};
expect(addStatisticalDataToHistoryItem(item)).toBe(item);
});
it('should return original item if totalQuoteList is already defined', () => {
const item: ChatItemType = {
obj: ChatRoleEnum.AI,
value: 'test',
totalQuoteList: []
};
expect(addStatisticalDataToHistoryItem(item)).toBe(item);
});
it('should return original item if responseData is undefined', () => {
const item: ChatItemType = {
obj: ChatRoleEnum.AI,
value: 'test'
};
expect(addStatisticalDataToHistoryItem(item)).toBe(item);
});
it('should calculate statistics correctly', () => {
const item: ChatItemType = {
obj: ChatRoleEnum.AI,
value: 'test',
responseData: [
{
moduleType: FlowNodeTypeEnum.chatNode,
runningTime: 1.5,
historyPreview: ['preview1']
},
{
moduleType: FlowNodeTypeEnum.datasetSearchNode,
quoteList: [{ id: '1', q: 'test', a: 'answer' }],
runningTime: 0.5
},
{
moduleType: FlowNodeTypeEnum.tools,
runningTime: 1,
toolDetail: [
{
moduleType: FlowNodeTypeEnum.chatNode,
runningTime: 0.5
}
]
}
]
};
const result = addStatisticalDataToHistoryItem(item);
expect(result).toEqual({
...item,
llmModuleAccount: 3,
totalQuoteList: [{ id: '1', q: 'test', a: 'answer' }],
totalRunningTime: 3,
historyPreviewLength: 1
});
});
it('should handle empty arrays and undefined values', () => {
const item: ChatItemType = {
obj: ChatRoleEnum.AI,
value: 'test',
responseData: [
{
moduleType: FlowNodeTypeEnum.chatNode,
runningTime: 0
}
]
};
const result = addStatisticalDataToHistoryItem(item);
expect(result).toEqual({
...item,
llmModuleAccount: 1,
totalQuoteList: [],
totalRunningTime: 0,
historyPreviewLength: undefined
});
});
it('should handle nested plugin and loop details', () => {
const item: ChatItemType = {
obj: ChatRoleEnum.AI,
value: 'test',
responseData: [
{
moduleType: FlowNodeTypeEnum.chatNode,
runningTime: 1,
pluginDetail: [
{
moduleType: FlowNodeTypeEnum.chatNode,
runningTime: 0.5
}
],
loopDetail: [
{
moduleType: FlowNodeTypeEnum.tools,
runningTime: 0.3
}
]
}
]
};
const result = addStatisticalDataToHistoryItem(item);
expect(result).toEqual({
...item,
llmModuleAccount: 3,
totalQuoteList: [],
totalRunningTime: 1,
historyPreviewLength: undefined
});
});
});