From 29a10c1389f62dbe061abc446ff88642b5438f79 Mon Sep 17 00:00:00 2001 From: "gru-agent[bot]" <185149714+gru-agent[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 13:46:21 +0800 Subject: [PATCH] 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> --- projects/app/src/global/core/chat/utils.ts | 2 +- test/cases/global/core/chat/utils.test.ts | 191 +++++++++++++++++++++ 2 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 test/cases/global/core/chat/utils.test.ts diff --git a/projects/app/src/global/core/chat/utils.ts b/projects/app/src/global/core/chat/utils.ts index 737d91b36..52a194c1e 100644 --- a/projects/app/src/global/core/chat/utils.ts +++ b/projects/app/src/global/core/chat/utils.ts @@ -3,7 +3,7 @@ import { ChatHistoryItemResType, ChatItemType } from '@fastgpt/global/core/chat/ import { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; -const isLLMNode = (item: ChatHistoryItemResType) => +export const isLLMNode = (item: ChatHistoryItemResType) => item.moduleType === FlowNodeTypeEnum.chatNode || item.moduleType === FlowNodeTypeEnum.tools; export function transformPreviewHistories( diff --git a/test/cases/global/core/chat/utils.test.ts b/test/cases/global/core/chat/utils.test.ts new file mode 100644 index 000000000..9e7f8b85a --- /dev/null +++ b/test/cases/global/core/chat/utils.test.ts @@ -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 + }); + }); +});