From 35f244cf506f2482256c0595065a3aec46b36edb Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 1 Nov 2025 19:21:57 +0200 Subject: [PATCH] chore(deps): adapt most of the tests --- apps/server/src/routes/api/llm.spec.ts | 6 +-- .../services/llm/ai_service_manager.spec.ts | 26 +++++------ .../llm/chat/rest_chat_service.spec.ts | 6 +-- .../src/services/llm/chat_service.spec.ts | 46 ++++++++++--------- .../context/services/context_service.spec.ts | 22 ++++----- .../llm/providers/anthropic_service.spec.ts | 12 +++-- .../llm/providers/ollama_service.spec.ts | 30 ++++++------ 7 files changed, 77 insertions(+), 71 deletions(-) diff --git a/apps/server/src/routes/api/llm.spec.ts b/apps/server/src/routes/api/llm.spec.ts index f8afddfa6..90e33a03b 100644 --- a/apps/server/src/routes/api/llm.spec.ts +++ b/apps/server/src/routes/api/llm.spec.ts @@ -52,9 +52,9 @@ vi.mock("../../services/llm/ai_service_manager.js", () => ({ // Mock chat pipeline const mockChatPipelineExecute = vi.fn(); -const MockChatPipeline = vi.fn().mockImplementation(() => ({ - execute: mockChatPipelineExecute -})); +const MockChatPipeline = vi.fn().mockImplementation(function () { + this.execute = mockChatPipelineExecute; +}); vi.mock("../../services/llm/pipeline/chat_pipeline.js", () => ({ ChatPipeline: MockChatPipeline })); diff --git a/apps/server/src/services/llm/ai_service_manager.spec.ts b/apps/server/src/services/llm/ai_service_manager.spec.ts index 14305cf6b..33b6229ca 100644 --- a/apps/server/src/services/llm/ai_service_manager.spec.ts +++ b/apps/server/src/services/llm/ai_service_manager.spec.ts @@ -35,24 +35,24 @@ vi.mock('../log.js', () => ({ })); vi.mock('./providers/anthropic_service.js', () => ({ - AnthropicService: vi.fn().mockImplementation(() => ({ - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - })) + AnthropicService: vi.fn().mockImplementation(function () { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }) })); vi.mock('./providers/openai_service.js', () => ({ - OpenAIService: vi.fn().mockImplementation(() => ({ - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - })) + OpenAIService: vi.fn().mockImplementation(function () { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }; })); vi.mock('./providers/ollama_service.js', () => ({ - OllamaService: vi.fn().mockImplementation(() => ({ - isAvailable: vi.fn().mockReturnValue(true), - generateChatCompletion: vi.fn() - })) + OllamaService: vi.fn().mockImplementation(function () { + this.isAvailable = vi.fn().mockReturnValue(true); + this.generateChatCompletion = vi.fn(); + }) })); vi.mock('./config/configuration_helpers.js', () => ({ @@ -65,7 +65,7 @@ vi.mock('./config/configuration_helpers.js', () => ({ })); vi.mock('./context/index.js', () => ({ - ContextExtractor: vi.fn().mockImplementation(() => ({})) + ContextExtractor: vi.fn().mockImplementation(function () {}) })); vi.mock('./context_extractors/index.js', () => ({ diff --git a/apps/server/src/services/llm/chat/rest_chat_service.spec.ts b/apps/server/src/services/llm/chat/rest_chat_service.spec.ts index 03e52887d..d0ba94617 100644 --- a/apps/server/src/services/llm/chat/rest_chat_service.spec.ts +++ b/apps/server/src/services/llm/chat/rest_chat_service.spec.ts @@ -39,9 +39,9 @@ vi.mock('../pipeline/chat_pipeline.js', () => ({ })); vi.mock('./handlers/tool_handler.js', () => ({ - ToolHandler: vi.fn().mockImplementation(() => ({ - handleToolCalls: vi.fn() - })) + ToolHandler: vi.fn().mockImplementation(function () { + this.handleToolCalls = vi.fn() + }) })); vi.mock('../chat_storage_service.js', () => ({ diff --git a/apps/server/src/services/llm/chat_service.spec.ts b/apps/server/src/services/llm/chat_service.spec.ts index 5e39f9d15..f38508456 100644 --- a/apps/server/src/services/llm/chat_service.spec.ts +++ b/apps/server/src/services/llm/chat_service.spec.ts @@ -36,20 +36,22 @@ vi.mock('./constants/llm_prompt_constants.js', () => ({ })); vi.mock('./pipeline/chat_pipeline.js', () => ({ - ChatPipeline: vi.fn().mockImplementation((config) => ({ - config, - execute: vi.fn(), - getMetrics: vi.fn(), - resetMetrics: vi.fn(), - stages: { - contextExtraction: { - execute: vi.fn() - }, - semanticContextExtraction: { - execute: vi.fn() + ChatPipeline: vi.fn().mockImplementation(function (config) { + Object.assign(this, { + config, + execute: vi.fn(), + getMetrics: vi.fn(), + resetMetrics: vi.fn(), + stages: { + contextExtraction: { + execute: vi.fn() + }, + semanticContextExtraction: { + execute: vi.fn() + } } - } - })) + }); + }); })); vi.mock('./ai_service_manager.js', () => ({ @@ -67,12 +69,12 @@ describe('ChatService', () => { beforeEach(async () => { vi.clearAllMocks(); - + // Get mocked modules mockChatStorageService = (await import('./chat_storage_service.js')).default; mockAiServiceManager = (await import('./ai_service_manager.js')).default; mockLog = (await import('../log.js')).default; - + // Setup pipeline mock mockChatPipeline = { execute: vi.fn(), @@ -87,10 +89,10 @@ describe('ChatService', () => { } } }; - + // Create a new ChatService instance chatService = new ChatService(); - + // Replace the internal pipelines with our mock (chatService as any).pipelines.set('default', mockChatPipeline); (chatService as any).pipelines.set('agent', mockChatPipeline); @@ -228,7 +230,7 @@ describe('ChatService', () => { it('should create new session if not found', async () => { mockChatStorageService.getChat.mockResolvedValueOnce(null); - + const mockNewChat = { id: 'chat-new', title: 'New Chat', @@ -301,7 +303,7 @@ describe('ChatService', () => { mockChatStorageService.getChat.mockResolvedValue(mockChat); mockChatStorageService.updateChat.mockResolvedValue(mockChat); - + mockChatPipeline.execute.mockResolvedValue({ text: 'Hello! How can I help you?', model: 'gpt-3.5-turbo', @@ -435,7 +437,7 @@ describe('ChatService', () => { mockChatStorageService.getChat.mockResolvedValue(mockChat); mockChatStorageService.updateChat.mockResolvedValue(mockChat); - + mockChatPipeline.execute.mockResolvedValue({ text: 'Based on the context, here is my response.', model: 'gpt-4', @@ -841,7 +843,7 @@ describe('ChatService', () => { it('should return default title for empty or invalid messages', () => { const generateTitle = (chatService as any).generateTitleFromMessages.bind(chatService); - + expect(generateTitle([])).toBe('New Chat'); expect(generateTitle([{ role: 'assistant', content: 'Hello' }])).toBe('New Chat'); }); @@ -858,4 +860,4 @@ describe('ChatService', () => { expect(title).toBe('First line'); }); }); -}); \ No newline at end of file +}); diff --git a/apps/server/src/services/llm/context/services/context_service.spec.ts b/apps/server/src/services/llm/context/services/context_service.spec.ts index 2f8ff4b30..25b3ad96c 100644 --- a/apps/server/src/services/llm/context/services/context_service.spec.ts +++ b/apps/server/src/services/llm/context/services/context_service.spec.ts @@ -47,9 +47,9 @@ vi.mock('../../ai_service_manager.js', () => ({ })); vi.mock('../index.js', () => ({ - ContextExtractor: vi.fn().mockImplementation(() => ({ - findRelevantNotes: vi.fn().mockResolvedValue([]) - })) + ContextExtractor: vi.fn().mockImplementation(function () { + this.findRelevantNotes = vi.fn().mockResolvedValue([]) + }); })); describe('ContextService', () => { @@ -59,7 +59,7 @@ describe('ContextService', () => { beforeEach(() => { vi.clearAllMocks(); service = new ContextService(); - + mockLLMService = { generateChatCompletion: vi.fn().mockResolvedValue({ content: 'Mock LLM response', @@ -84,7 +84,7 @@ describe('ContextService', () => { describe('initialize', () => { it('should initialize successfully', async () => { const result = await service.initialize(); - + expect(result).toBeUndefined(); // initialize returns void expect((service as any).initialized).toBe(true); }); @@ -92,7 +92,7 @@ describe('ContextService', () => { it('should not initialize twice', async () => { await service.initialize(); await service.initialize(); // Second call should be a no-op - + expect((service as any).initialized).toBe(true); }); @@ -102,9 +102,9 @@ describe('ContextService', () => { service.initialize(), service.initialize() ]; - + await Promise.all(promises); - + expect((service as any).initialized).toBe(true); }); }); @@ -186,11 +186,11 @@ describe('ContextService', () => { describe('error handling', () => { it('should handle service operations', async () => { await service.initialize(); - + // These operations should not throw const result1 = await service.processQuery('test', mockLLMService); const result2 = await service.findRelevantNotes('test', null, {}); - + expect(result1).toBeDefined(); expect(result2).toBeDefined(); }); @@ -224,4 +224,4 @@ describe('ContextService', () => { }); }); }); -}); \ No newline at end of file +}); diff --git a/apps/server/src/services/llm/providers/anthropic_service.spec.ts b/apps/server/src/services/llm/providers/anthropic_service.spec.ts index 365b529f4..df48c1339 100644 --- a/apps/server/src/services/llm/providers/anthropic_service.spec.ts +++ b/apps/server/src/services/llm/providers/anthropic_service.spec.ts @@ -48,8 +48,8 @@ vi.mock('@anthropic-ai/sdk', () => { } }; - const mockAnthropic = vi.fn().mockImplementation(() => ({ - messages: { + const mockAnthropic = vi.fn().mockImplementation(function () { + this.messages = { create: vi.fn().mockImplementation((params) => { if (params.stream) { return Promise.resolve(mockStream); @@ -71,8 +71,8 @@ vi.mock('@anthropic-ai/sdk', () => { } }); }) - } - })); + }; + }); return { default: mockAnthropic }; }); @@ -127,7 +127,9 @@ describe('AnthropicService', () => { } }; - AnthropicMock.mockImplementation(() => mockAnthropicInstance); + AnthropicMock.mockImplementation(function () { + Object.assign(this, mockAnthropicInstance); + }); service = new AnthropicService(); }); diff --git a/apps/server/src/services/llm/providers/ollama_service.spec.ts b/apps/server/src/services/llm/providers/ollama_service.spec.ts index e2bee52d2..46b8072ea 100644 --- a/apps/server/src/services/llm/providers/ollama_service.spec.ts +++ b/apps/server/src/services/llm/providers/ollama_service.spec.ts @@ -30,11 +30,11 @@ vi.mock('./providers.js', () => ({ })); vi.mock('../formatters/ollama_formatter.js', () => ({ - OllamaMessageFormatter: vi.fn().mockImplementation(() => ({ - formatMessages: vi.fn().mockReturnValue([ + OllamaMessageFormatter: vi.fn().mockImplementation(function () { + this.formatMessages = vi.fn().mockReturnValue([ { role: 'user', content: 'Hello' } - ]), - formatResponse: vi.fn().mockReturnValue({ + ]); + this.formatResponse = vi.fn().mockReturnValue({ text: 'Hello! How can I help you today?', provider: 'Ollama', model: 'llama2', @@ -44,8 +44,8 @@ vi.mock('../formatters/ollama_formatter.js', () => ({ totalTokens: 15 }, tool_calls: null - }) - })) + }); + }) })); vi.mock('../tools/tool_registry.js', () => ({ @@ -83,8 +83,8 @@ vi.mock('ollama', () => { } }; - const mockOllama = vi.fn().mockImplementation(() => ({ - chat: vi.fn().mockImplementation((params) => { + const mockOllama = vi.fn().mockImplementation(function () { + this.chat = vi.fn().mockImplementation((params) => { if (params.stream) { return Promise.resolve(mockStream); } @@ -97,8 +97,8 @@ vi.mock('ollama', () => { model: 'llama2', done: true }); - }), - show: vi.fn().mockResolvedValue({ + }); + this.show = vi.fn().mockResolvedValue({ modelfile: 'FROM llama2', parameters: {}, template: '', @@ -109,8 +109,8 @@ vi.mock('ollama', () => { parameter_size: '7B', quantization_level: 'Q4_0' } - }), - list: vi.fn().mockResolvedValue({ + }); + this.list = vi.fn().mockResolvedValue({ models: [ { name: 'llama2:latest', @@ -119,7 +119,7 @@ vi.mock('ollama', () => { } ] }) - })); + }); return { Ollama: mockOllama }; }); @@ -196,7 +196,9 @@ describe('OllamaService', () => { }) }; - OllamaMock.mockImplementation(() => mockOllamaInstance); + OllamaMock.mockImplementation(function () { + Object.assign(this, mockOllamaInstance); + }); service = new OllamaService();