Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion _regroup/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
"@types/express": "5.0.5",
"@types/node": "24.9.1",
"@types/yargs": "17.0.34",
"@vitest/coverage-v8": "3.2.4",
"@vitest/coverage-v8": "4.0.6",
"eslint": "9.38.0",
"eslint-plugin-simple-import-sort": "12.1.1",
"esm": "3.2.25",
Expand Down
6 changes: 3 additions & 3 deletions apps/server/src/routes/api/llm.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@

// Mock chat pipeline
const mockChatPipelineExecute = vi.fn();
const MockChatPipeline = vi.fn().mockImplementation(() => ({
execute: mockChatPipelineExecute
}));
const MockChatPipeline = vi.fn().mockImplementation(function () {
this.execute = mockChatPipelineExecute;

Check failure on line 56 in apps/server/src/routes/api/llm.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
});
vi.mock("../../services/llm/pipeline/chat_pipeline.js", () => ({
ChatPipeline: MockChatPipeline
}));
Expand Down
26 changes: 13 additions & 13 deletions apps/server/src/services/llm/ai_service_manager.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,24 @@
}));

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);

Check failure on line 39 in apps/server/src/services/llm/ai_service_manager.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
this.generateChatCompletion = vi.fn();

Check failure on line 40 in apps/server/src/services/llm/ai_service_manager.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
})
}));

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);

Check failure on line 46 in apps/server/src/services/llm/ai_service_manager.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
this.generateChatCompletion = vi.fn();

Check failure on line 47 in apps/server/src/services/llm/ai_service_manager.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
};

Check failure on line 48 in apps/server/src/services/llm/ai_service_manager.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

')' expected.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

This semicolon introduces a syntax error. The function body should be closed with a } and the mockImplementation call with a ). This will cause the test to fail.

Suggested change
};
})

}));

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);

Check failure on line 53 in apps/server/src/services/llm/ai_service_manager.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
this.generateChatCompletion = vi.fn();

Check failure on line 54 in apps/server/src/services/llm/ai_service_manager.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
})
}));

vi.mock('./config/configuration_helpers.js', () => ({
Expand All @@ -65,7 +65,7 @@
}));

vi.mock('./context/index.js', () => ({
ContextExtractor: vi.fn().mockImplementation(() => ({}))
ContextExtractor: vi.fn().mockImplementation(function () {})
}));

vi.mock('./context_extractors/index.js', () => ({
Expand Down
6 changes: 3 additions & 3 deletions apps/server/src/services/llm/chat/rest_chat_service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@
}));

vi.mock('./handlers/tool_handler.js', () => ({
ToolHandler: vi.fn().mockImplementation(() => ({
handleToolCalls: vi.fn()
}))
ToolHandler: vi.fn().mockImplementation(function () {
this.handleToolCalls = vi.fn()

Check failure on line 43 in apps/server/src/services/llm/chat/rest_chat_service.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
})
}));

vi.mock('../chat_storage_service.js', () => ({
Expand Down
46 changes: 24 additions & 22 deletions apps/server/src/services/llm/chat_service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,22 @@
}));

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, {

Check failure on line 40 in apps/server/src/services/llm/chat_service.spec.ts

View workflow job for this annotation

GitHub Actions / Test development

'this' implicitly has type 'any' because it does not have a type annotation.
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', () => ({
Expand All @@ -67,12 +69,12 @@

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(),
Expand All @@ -87,10 +89,10 @@
}
}
};

// 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);
Expand Down Expand Up @@ -228,7 +230,7 @@

it('should create new session if not found', async () => {
mockChatStorageService.getChat.mockResolvedValueOnce(null);

const mockNewChat = {
id: 'chat-new',
title: 'New Chat',
Expand Down Expand Up @@ -301,7 +303,7 @@

mockChatStorageService.getChat.mockResolvedValue(mockChat);
mockChatStorageService.updateChat.mockResolvedValue(mockChat);

mockChatPipeline.execute.mockResolvedValue({
text: 'Hello! How can I help you?',
model: 'gpt-3.5-turbo',
Expand Down Expand Up @@ -435,7 +437,7 @@

mockChatStorageService.getChat.mockResolvedValue(mockChat);
mockChatStorageService.updateChat.mockResolvedValue(mockChat);

mockChatPipeline.execute.mockResolvedValue({
text: 'Based on the context, here is my response.',
model: 'gpt-4',
Expand Down Expand Up @@ -841,7 +843,7 @@

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');
});
Expand All @@ -858,4 +860,4 @@
expect(title).toBe('First line');
});
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand All @@ -59,7 +59,7 @@ describe('ContextService', () => {
beforeEach(() => {
vi.clearAllMocks();
service = new ContextService();

mockLLMService = {
generateChatCompletion: vi.fn().mockResolvedValue({
content: 'Mock LLM response',
Expand All @@ -84,15 +84,15 @@ 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);
});

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);
});

Expand All @@ -102,9 +102,9 @@ describe('ContextService', () => {
service.initialize(),
service.initialize()
];

await Promise.all(promises);

expect((service as any).initialized).toBe(true);
});
});
Expand Down Expand Up @@ -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();
});
Expand Down Expand Up @@ -224,4 +224,4 @@ describe('ContextService', () => {
});
});
});
});
});
12 changes: 7 additions & 5 deletions apps/server/src/services/llm/providers/anthropic_service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -71,8 +71,8 @@ vi.mock('@anthropic-ai/sdk', () => {
}
});
})
}
}));
};
});

return { default: mockAnthropic };
});
Expand Down Expand Up @@ -127,7 +127,9 @@ describe('AnthropicService', () => {
}
};

AnthropicMock.mockImplementation(() => mockAnthropicInstance);
AnthropicMock.mockImplementation(function () {
Object.assign(this, mockAnthropicInstance);
});

service = new AnthropicService();
});
Expand Down
30 changes: 16 additions & 14 deletions apps/server/src/services/llm/providers/ollama_service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -44,8 +44,8 @@ vi.mock('../formatters/ollama_formatter.js', () => ({
totalTokens: 15
},
tool_calls: null
})
}))
});
})
}));

vi.mock('../tools/tool_registry.js', () => ({
Expand Down Expand Up @@ -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);
}
Expand All @@ -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: '',
Expand All @@ -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',
Expand All @@ -119,7 +119,7 @@ vi.mock('ollama', () => {
}
]
})
}));
});

return { Ollama: mockOllama };
});
Expand Down Expand Up @@ -196,7 +196,9 @@ describe('OllamaService', () => {
})
};

OllamaMock.mockImplementation(() => mockOllamaInstance);
OllamaMock.mockImplementation(function () {
Object.assign(this, mockOllamaInstance);
});

service = new OllamaService();

Expand Down
Loading