209 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| /*
 | |
|  * Copyright 2025 coze-dev Authors
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| import { describe, it, expect, vi, beforeEach } from 'vitest';
 | |
| 
 | |
| import {
 | |
|   type BotInputLengthConfig,
 | |
|   type WorkInfoOnboardingContent,
 | |
| } from '../src/services/type';
 | |
| import { BotInputLengthService, botInputLengthService } from '../src/services';
 | |
| 
 | |
| // Analog SuggestedQuestionsShowMode Enumeration
 | |
| enum SuggestedQuestionsShowMode {
 | |
|   Random = 0,
 | |
|   All = 1,
 | |
| }
 | |
| 
 | |
| // simulation configuration
 | |
| const mockConfig: BotInputLengthConfig = {
 | |
|   botName: 10,
 | |
|   botDescription: 100,
 | |
|   onboarding: 50,
 | |
|   onboardingSuggestion: 20,
 | |
|   suggestionPrompt: 200,
 | |
|   projectName: 10,
 | |
|   projectDescription: 100,
 | |
| };
 | |
| 
 | |
| // Function to simulate acquisition configuration
 | |
| const mockGetConfig = vi.fn().mockReturnValue(mockConfig);
 | |
| 
 | |
| describe('BotInputLengthService', () => {
 | |
|   let service: BotInputLengthService;
 | |
| 
 | |
|   beforeEach(() => {
 | |
|     // Reset simulation
 | |
|     vi.clearAllMocks();
 | |
|     // Create a service instance
 | |
|     service = new BotInputLengthService(mockGetConfig);
 | |
|   });
 | |
| 
 | |
|   describe('getInputLengthLimit', () => {
 | |
|     it('应该返回指定字段的长度限制', () => {
 | |
|       expect(service.getInputLengthLimit('botName')).toBe(10);
 | |
|       expect(service.getInputLengthLimit('botDescription')).toBe(100);
 | |
|       expect(service.getInputLengthLimit('onboarding')).toBe(50);
 | |
|       expect(service.getInputLengthLimit('onboardingSuggestion')).toBe(20);
 | |
|       expect(service.getInputLengthLimit('suggestionPrompt')).toBe(200);
 | |
|       expect(service.getInputLengthLimit('projectName')).toBe(10);
 | |
|       expect(service.getInputLengthLimit('projectDescription')).toBe(100);
 | |
| 
 | |
|       // Verify that the configuration get function is called
 | |
|       expect(mockGetConfig).toHaveBeenCalledTimes(7);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('getValueLength', () => {
 | |
|     it('应该返回字符串的字形簇数量', () => {
 | |
|       // Normal string
 | |
|       expect(service.getValueLength('hello')).toBe(5);
 | |
| 
 | |
|       // A string containing the emoji (the emoji counts as a glyph cluster)
 | |
|       expect(service.getValueLength('hi😊')).toBe(3);
 | |
| 
 | |
|       // A string containing combined characters
 | |
|       expect(service.getValueLength('café')).toBe(4);
 | |
| 
 | |
|       // empty string
 | |
|       expect(service.getValueLength('')).toBe(0);
 | |
| 
 | |
|       // undefined
 | |
|       expect(service.getValueLength(undefined)).toBe(0);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('sliceStringByMaxLength', () => {
 | |
|     it('应该根据字段限制截取字符串', () => {
 | |
|       // String length less than limit
 | |
|       expect(
 | |
|         service.sliceStringByMaxLength({ value: 'hello', field: 'botName' }),
 | |
|       ).toBe('hello');
 | |
| 
 | |
|       // String length equals limit
 | |
|       expect(
 | |
|         service.sliceStringByMaxLength({
 | |
|           value: '1234567890',
 | |
|           field: 'botName',
 | |
|         }),
 | |
|       ).toBe('1234567890');
 | |
| 
 | |
|       // String length is greater than limit
 | |
|       expect(
 | |
|         service.sliceStringByMaxLength({
 | |
|           value: '12345678901234567890',
 | |
|           field: 'botName',
 | |
|         }),
 | |
|       ).toBe('1234567890');
 | |
| 
 | |
|       // A string containing emoji
 | |
|       expect(
 | |
|         service.sliceStringByMaxLength({
 | |
|           value: 'hello😊world',
 | |
|           field: 'botName',
 | |
|         }),
 | |
|       ).toBe('hello😊worl');
 | |
| 
 | |
|       // Verify that the configuration get function is called
 | |
|       expect(mockGetConfig).toHaveBeenCalledTimes(4);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   describe('sliceWorkInfoOnboardingByMaxLength', () => {
 | |
|     it('应该截取工作信息的开场白和建议问题', () => {
 | |
|       const workInfo: WorkInfoOnboardingContent = {
 | |
|         prologue:
 | |
|           'This is a very long prologue that exceeds the limit of 50 characters and should be truncated',
 | |
|         suggested_questions: [
 | |
|           {
 | |
|             id: '1',
 | |
|             content:
 | |
|               'This is a very long suggested question that exceeds the limit',
 | |
|             highlight: true,
 | |
|           },
 | |
|           { id: '2', content: 'Short question' },
 | |
|           {
 | |
|             id: '3',
 | |
|             content:
 | |
|               'Another very long suggested question that should be truncated',
 | |
|             highlight: false,
 | |
|           },
 | |
|         ],
 | |
|         suggested_questions_show_mode: SuggestedQuestionsShowMode.All,
 | |
|       };
 | |
| 
 | |
|       const result = service.sliceWorkInfoOnboardingByMaxLength(workInfo);
 | |
| 
 | |
|       // Verify that the opening statement was intercepted
 | |
|       expect(result.prologue).toBe(
 | |
|         'This is a very long prologue that exceeds the limi',
 | |
|       );
 | |
|       expect(result.prologue.length).toBeLessThanOrEqual(50);
 | |
| 
 | |
|       // Validation suggestion problem intercepted
 | |
|       expect(result.suggested_questions[0]?.content).toBe(
 | |
|         'This is a very long ',
 | |
|       );
 | |
|       expect(result.suggested_questions[0]?.content.length).toBeLessThanOrEqual(
 | |
|         20,
 | |
|       );
 | |
|       expect(result.suggested_questions[0]?.id).toBe('1');
 | |
|       expect(result.suggested_questions[0]?.highlight).toBe(true);
 | |
| 
 | |
|       expect(result.suggested_questions[1]?.content).toBe('Short question');
 | |
|       expect(result.suggested_questions[1]?.id).toBe('2');
 | |
| 
 | |
|       expect(result.suggested_questions[2]?.content).toBe(
 | |
|         'Another very long su',
 | |
|       );
 | |
|       expect(result.suggested_questions[2]?.content.length).toBeLessThanOrEqual(
 | |
|         20,
 | |
|       );
 | |
|       expect(result.suggested_questions[2]?.id).toBe('3');
 | |
|       expect(result.suggested_questions[2]?.highlight).toBe(false);
 | |
| 
 | |
|       // Verify that the display mode remains unchanged
 | |
|       expect(result.suggested_questions_show_mode).toBe(
 | |
|         SuggestedQuestionsShowMode.All,
 | |
|       );
 | |
|     });
 | |
| 
 | |
|     it('应该处理空的工作信息', () => {
 | |
|       const workInfo: WorkInfoOnboardingContent = {
 | |
|         prologue: '',
 | |
|         suggested_questions: [],
 | |
|         suggested_questions_show_mode: SuggestedQuestionsShowMode.Random,
 | |
|       };
 | |
| 
 | |
|       const result = service.sliceWorkInfoOnboardingByMaxLength(workInfo);
 | |
| 
 | |
|       expect(result.prologue).toBe('');
 | |
|       expect(result.suggested_questions).toEqual([]);
 | |
|       expect(result.suggested_questions_show_mode).toBe(
 | |
|         SuggestedQuestionsShowMode.Random,
 | |
|       );
 | |
|     });
 | |
|   });
 | |
| });
 | |
| 
 | |
| // Test Exported Singletons
 | |
| describe('botInputLengthService', () => {
 | |
|   it('应该导出一个 BotInputLengthService 的实例', () => {
 | |
|     // Verify that the exported singleton is an instance of BotInputLengthService
 | |
|     expect(botInputLengthService).toBeInstanceOf(BotInputLengthService);
 | |
|   });
 | |
| });
 |