From a842d1b9176615a071fe9f0a1c1139d7ae00541b Mon Sep 17 00:00:00 2001 From: Kacper Date: Tue, 30 Dec 2025 00:22:07 +0100 Subject: [PATCH] fix(tests): Update provider-factory tests for CursorProvider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update test assertions from expecting 1 provider to 2 - Add CursorProvider import and tests for Cursor model routing - Add tests for Cursor models (cursor-auto, cursor-sonnet-4.5, etc.) - Update tests for gpt-5.2/grok/gemini-3-pro as valid Cursor models - Add tests for checkAllProviders to expect cursor status - Add tests for getProviderByName with 'cursor' 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../unit/providers/provider-factory.test.ts | 102 ++++++++++++++---- 1 file changed, 79 insertions(+), 23 deletions(-) diff --git a/apps/server/tests/unit/providers/provider-factory.test.ts b/apps/server/tests/unit/providers/provider-factory.test.ts index 069fbf86..eb37d83a 100644 --- a/apps/server/tests/unit/providers/provider-factory.test.ts +++ b/apps/server/tests/unit/providers/provider-factory.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { ProviderFactory } from '@/providers/provider-factory.js'; import { ClaudeProvider } from '@/providers/claude-provider.js'; +import { CursorProvider } from '@/providers/cursor-provider.js'; describe('provider-factory.ts', () => { let consoleSpy: any; @@ -65,39 +66,65 @@ describe('provider-factory.ts', () => { }); }); + describe('Cursor models (cursor-* prefix)', () => { + it('should return CursorProvider for cursor-auto', () => { + const provider = ProviderFactory.getProviderForModel('cursor-auto'); + expect(provider).toBeInstanceOf(CursorProvider); + }); + + it('should return CursorProvider for cursor-sonnet-4.5', () => { + const provider = ProviderFactory.getProviderForModel('cursor-sonnet-4.5'); + expect(provider).toBeInstanceOf(CursorProvider); + }); + + it('should return CursorProvider for cursor-gpt-5.2', () => { + const provider = ProviderFactory.getProviderForModel('cursor-gpt-5.2'); + expect(provider).toBeInstanceOf(CursorProvider); + }); + + it('should be case-insensitive for cursor models', () => { + const provider = ProviderFactory.getProviderForModel('CURSOR-AUTO'); + expect(provider).toBeInstanceOf(CursorProvider); + }); + + it('should return CursorProvider for known cursor model ID without prefix', () => { + const provider = ProviderFactory.getProviderForModel('auto'); + expect(provider).toBeInstanceOf(CursorProvider); + }); + }); + describe('Unknown models', () => { it('should default to ClaudeProvider for unknown model', () => { const provider = ProviderFactory.getProviderForModel('unknown-model-123'); expect(provider).toBeInstanceOf(ClaudeProvider); }); - it('should warn when defaulting to Claude', () => { - ProviderFactory.getProviderForModel('random-model'); - expect(consoleSpy.warn).toHaveBeenCalledWith( - expect.stringContaining('Unknown model prefix') - ); - expect(consoleSpy.warn).toHaveBeenCalledWith(expect.stringContaining('random-model')); - expect(consoleSpy.warn).toHaveBeenCalledWith( - expect.stringContaining('defaulting to Claude') - ); - }); - - it('should handle empty string', () => { + it('should handle empty string by defaulting to ClaudeProvider', () => { const provider = ProviderFactory.getProviderForModel(''); expect(provider).toBeInstanceOf(ClaudeProvider); - expect(consoleSpy.warn).toHaveBeenCalled(); }); - it('should default to ClaudeProvider for gpt models (not supported)', () => { + it('should default to ClaudeProvider for completely unknown prefixes', () => { + const provider = ProviderFactory.getProviderForModel('random-xyz-model'); + expect(provider).toBeInstanceOf(ClaudeProvider); + }); + }); + + describe('Cursor models via model ID lookup', () => { + it('should return CursorProvider for gpt-5.2 (valid Cursor model)', () => { + // gpt-5.2 is in CURSOR_MODEL_MAP const provider = ProviderFactory.getProviderForModel('gpt-5.2'); - expect(provider).toBeInstanceOf(ClaudeProvider); - expect(consoleSpy.warn).toHaveBeenCalled(); + expect(provider).toBeInstanceOf(CursorProvider); }); - it('should default to ClaudeProvider for o-series models (not supported)', () => { - const provider = ProviderFactory.getProviderForModel('o1'); - expect(provider).toBeInstanceOf(ClaudeProvider); - expect(consoleSpy.warn).toHaveBeenCalled(); + it('should return CursorProvider for grok (valid Cursor model)', () => { + const provider = ProviderFactory.getProviderForModel('grok'); + expect(provider).toBeInstanceOf(CursorProvider); + }); + + it('should return CursorProvider for gemini-3-pro (valid Cursor model)', () => { + const provider = ProviderFactory.getProviderForModel('gemini-3-pro'); + expect(provider).toBeInstanceOf(CursorProvider); }); }); }); @@ -114,9 +141,15 @@ describe('provider-factory.ts', () => { expect(hasClaudeProvider).toBe(true); }); - it('should return exactly 1 provider', () => { + it('should return exactly 2 providers', () => { const providers = ProviderFactory.getAllProviders(); - expect(providers).toHaveLength(1); + expect(providers).toHaveLength(2); + }); + + it('should include CursorProvider', () => { + const providers = ProviderFactory.getAllProviders(); + const hasCursorProvider = providers.some((p) => p instanceof CursorProvider); + expect(hasCursorProvider).toBe(true); }); it('should create new instances each time', () => { @@ -145,7 +178,14 @@ describe('provider-factory.ts', () => { const keys = Object.keys(statuses); expect(keys).toContain('claude'); - expect(keys).toHaveLength(1); + expect(keys).toContain('cursor'); + expect(keys).toHaveLength(2); + }); + + it('should include cursor status', async () => { + const statuses = await ProviderFactory.checkAllProviders(); + + expect(statuses.cursor).toHaveProperty('installed'); }); }); @@ -160,12 +200,19 @@ describe('provider-factory.ts', () => { expect(provider).toBeInstanceOf(ClaudeProvider); }); + it("should return CursorProvider for 'cursor'", () => { + const provider = ProviderFactory.getProviderByName('cursor'); + expect(provider).toBeInstanceOf(CursorProvider); + }); + it('should be case-insensitive', () => { const provider1 = ProviderFactory.getProviderByName('CLAUDE'); const provider2 = ProviderFactory.getProviderByName('ANTHROPIC'); + const provider3 = ProviderFactory.getProviderByName('CURSOR'); expect(provider1).toBeInstanceOf(ClaudeProvider); expect(provider2).toBeInstanceOf(ClaudeProvider); + expect(provider3).toBeInstanceOf(CursorProvider); }); it('should return null for unknown provider', () => { @@ -218,5 +265,14 @@ describe('provider-factory.ts', () => { expect(hasClaudeModels).toBe(true); }); + + it('should include Cursor models', () => { + const models = ProviderFactory.getAllAvailableModels(); + + // Cursor models should include cursor provider + const hasCursorModels = models.some((m) => m.provider === 'cursor'); + + expect(hasCursorModels).toBe(true); + }); }); });