style: apply biome formatting to test files

This commit is contained in:
Ben Vargas
2025-06-17 13:38:19 -06:00
committed by Ralph Khreish
parent 5d82b69610
commit 18a5f63d06
3 changed files with 131 additions and 73 deletions

View File

@@ -18,7 +18,9 @@ jest.unstable_mockModule('@anthropic-ai/claude-code', () => {
}); });
// Import after mocking // Import after mocking
const { ClaudeCodeProvider } = await import('../../src/ai-providers/claude-code.js'); const { ClaudeCodeProvider } = await import(
'../../src/ai-providers/claude-code.js'
);
describe('Claude Code Optional Dependency Integration', () => { describe('Claude Code Optional Dependency Integration', () => {
describe('when @anthropic-ai/claude-code is not installed', () => { describe('when @anthropic-ai/claude-code is not installed', () => {
@@ -43,10 +45,14 @@ describe('Claude Code Optional Dependency Integration', () => {
const model = client('opus'); const model = client('opus');
// The actual usage should fail with the lazy loading error // The actual usage should fail with the lazy loading error
await expect(model.doGenerate({ await expect(
prompt: [{ role: 'user', content: 'Hello' }], model.doGenerate({
mode: { type: 'regular' } prompt: [{ role: 'user', content: 'Hello' }],
})).rejects.toThrow("Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider."); mode: { type: 'regular' }
})
).rejects.toThrow(
"Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider."
);
}); });
it('should provide helpful error message for streaming', async () => { it('should provide helpful error message for streaming', async () => {
@@ -54,10 +60,14 @@ describe('Claude Code Optional Dependency Integration', () => {
const client = provider.getClient({}); const client = provider.getClient({});
const model = client('sonnet'); const model = client('sonnet');
await expect(model.doStream({ await expect(
prompt: [{ role: 'user', content: 'Hello' }], model.doStream({
mode: { type: 'regular' } prompt: [{ role: 'user', content: 'Hello' }],
})).rejects.toThrow("Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider."); mode: { type: 'regular' }
})
).rejects.toThrow(
"Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider."
);
}); });
}); });
@@ -74,7 +84,7 @@ describe('Claude Code Optional Dependency Integration', () => {
// when the actual model is used // when the actual model is used
const provider = new ClaudeCodeProvider(); const provider = new ClaudeCodeProvider();
expect(provider).toBeDefined(); expect(provider).toBeDefined();
// In real usage, ai-services-unified would: // In real usage, ai-services-unified would:
// 1. Get the provider instance (works) // 1. Get the provider instance (works)
// 2. Call provider.getClient() (works) // 2. Call provider.getClient() (works)
@@ -82,4 +92,4 @@ describe('Claude Code Optional Dependency Integration', () => {
// 4. Try to generate (fails with clear error) // 4. Try to generate (fails with clear error)
}); });
}); });
}); });

View File

@@ -1,18 +1,21 @@
import { jest } from '@jest/globals'; import { jest } from '@jest/globals';
// Mock the claude-code SDK module // Mock the claude-code SDK module
jest.unstable_mockModule('../../../src/ai-providers/custom-sdk/claude-code/index.js', () => ({ jest.unstable_mockModule(
createClaudeCode: jest.fn(() => { '../../../src/ai-providers/custom-sdk/claude-code/index.js',
const provider = (modelId, settings) => ({ () => ({
// Mock language model createClaudeCode: jest.fn(() => {
id: modelId, const provider = (modelId, settings) => ({
settings // Mock language model
}); id: modelId,
provider.languageModel = jest.fn((id, settings) => ({ id, settings })); settings
provider.chat = provider.languageModel; });
return provider; provider.languageModel = jest.fn((id, settings) => ({ id, settings }));
provider.chat = provider.languageModel;
return provider;
})
}) })
})); );
// Mock the base provider // Mock the base provider
jest.unstable_mockModule('../../../src/ai-providers/base-provider.js', () => ({ jest.unstable_mockModule('../../../src/ai-providers/base-provider.js', () => ({
@@ -27,7 +30,9 @@ jest.unstable_mockModule('../../../src/ai-providers/base-provider.js', () => ({
})); }));
// Import after mocking // Import after mocking
const { ClaudeCodeProvider } = await import('../../../src/ai-providers/claude-code.js'); const { ClaudeCodeProvider } = await import(
'../../../src/ai-providers/claude-code.js'
);
describe('ClaudeCodeProvider', () => { describe('ClaudeCodeProvider', () => {
let provider; let provider;
@@ -53,10 +58,12 @@ describe('ClaudeCodeProvider', () => {
}); });
it('should work with any params passed', () => { it('should work with any params passed', () => {
expect(() => provider.validateAuth({ expect(() =>
apiKey: 'some-key', provider.validateAuth({
baseURL: 'https://example.com' apiKey: 'some-key',
})).not.toThrow(); baseURL: 'https://example.com'
})
).not.toThrow();
}); });
}); });
@@ -91,14 +98,18 @@ describe('ClaudeCodeProvider', () => {
describe('error handling', () => { describe('error handling', () => {
it('should handle client initialization errors', async () => { it('should handle client initialization errors', async () => {
// Force an error by making createClaudeCode throw // Force an error by making createClaudeCode throw
const { createClaudeCode } = await import('../../../src/ai-providers/custom-sdk/claude-code/index.js'); const { createClaudeCode } = await import(
'../../../src/ai-providers/custom-sdk/claude-code/index.js'
);
createClaudeCode.mockImplementationOnce(() => { createClaudeCode.mockImplementationOnce(() => {
throw new Error('Mock initialization error'); throw new Error('Mock initialization error');
}); });
// Create a new provider instance to use the mocked createClaudeCode // Create a new provider instance to use the mocked createClaudeCode
const errorProvider = new ClaudeCodeProvider(); const errorProvider = new ClaudeCodeProvider();
expect(() => errorProvider.getClient({})).toThrow('Mock initialization error'); expect(() => errorProvider.getClient({})).toThrow(
'Mock initialization error'
);
}); });
}); });
}); });

View File

@@ -15,21 +15,30 @@ jest.unstable_mockModule('@ai-sdk/provider-utils', () => ({
generateId: jest.fn(() => 'test-id-123') generateId: jest.fn(() => 'test-id-123')
})); }));
jest.unstable_mockModule('../../../../../src/ai-providers/custom-sdk/claude-code/message-converter.js', () => ({ jest.unstable_mockModule(
convertToClaudeCodeMessages: jest.fn((prompt) => ({ '../../../../../src/ai-providers/custom-sdk/claude-code/message-converter.js',
messagesPrompt: 'converted-prompt', () => ({
systemPrompt: 'system' convertToClaudeCodeMessages: jest.fn((prompt) => ({
})) messagesPrompt: 'converted-prompt',
})); systemPrompt: 'system'
}))
})
);
jest.unstable_mockModule('../../../../../src/ai-providers/custom-sdk/claude-code/json-extractor.js', () => ({ jest.unstable_mockModule(
extractJson: jest.fn((text) => text) '../../../../../src/ai-providers/custom-sdk/claude-code/json-extractor.js',
})); () => ({
extractJson: jest.fn((text) => text)
})
);
jest.unstable_mockModule('../../../../../src/ai-providers/custom-sdk/claude-code/errors.js', () => ({ jest.unstable_mockModule(
createAPICallError: jest.fn((opts) => new Error(opts.message)), '../../../../../src/ai-providers/custom-sdk/claude-code/errors.js',
createAuthenticationError: jest.fn((opts) => new Error(opts.message)) () => ({
})); createAPICallError: jest.fn((opts) => new Error(opts.message)),
createAuthenticationError: jest.fn((opts) => new Error(opts.message))
})
);
// This mock will be controlled by tests // This mock will be controlled by tests
let mockClaudeCodeModule = null; let mockClaudeCodeModule = null;
@@ -41,7 +50,9 @@ jest.unstable_mockModule('@anthropic-ai/claude-code', () => {
}); });
// Import the module under test // Import the module under test
const { ClaudeCodeLanguageModel } = await import('../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js'); const { ClaudeCodeLanguageModel } = await import(
'../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js'
);
describe('ClaudeCodeLanguageModel', () => { describe('ClaudeCodeLanguageModel', () => {
beforeEach(() => { beforeEach(() => {
@@ -65,15 +76,21 @@ describe('ClaudeCodeLanguageModel', () => {
}); });
it('should throw NoSuchModelError for invalid model ID', async () => { it('should throw NoSuchModelError for invalid model ID', async () => {
expect(() => new ClaudeCodeLanguageModel({ expect(
id: '', () =>
settings: {} new ClaudeCodeLanguageModel({
})).toThrow('No such model: '); id: '',
settings: {}
})
).toThrow('No such model: ');
expect(() => new ClaudeCodeLanguageModel({ expect(
id: null, () =>
settings: {} new ClaudeCodeLanguageModel({
})).toThrow('No such model: null'); id: null,
settings: {}
})
).toThrow('No such model: null');
}); });
}); });
@@ -85,19 +102,30 @@ describe('ClaudeCodeLanguageModel', () => {
settings: {} settings: {}
}); });
await expect(model.doGenerate({ await expect(
prompt: [{ role: 'user', content: 'test' }], model.doGenerate({
mode: { type: 'regular' } prompt: [{ role: 'user', content: 'test' }],
})).rejects.toThrow("Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider."); mode: { type: 'regular' }
})
).rejects.toThrow(
"Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider."
);
}); });
it('should load package successfully when available', async () => { it('should load package successfully when available', async () => {
// Mock successful package load // Mock successful package load
const mockQuery = jest.fn(async function* () { const mockQuery = jest.fn(async function* () {
yield { type: 'assistant', message: { content: [{ type: 'text', text: 'Hello' }] } }; yield {
yield { type: 'result', subtype: 'done', usage: { output_tokens: 10, input_tokens: 5 } }; type: 'assistant',
message: { content: [{ type: 'text', text: 'Hello' }] }
};
yield {
type: 'result',
subtype: 'done',
usage: { output_tokens: 10, input_tokens: 5 }
};
}); });
mockClaudeCodeModule = { mockClaudeCodeModule = {
query: mockQuery, query: mockQuery,
AbortError: class AbortError extends Error {} AbortError: class AbortError extends Error {}
@@ -105,8 +133,10 @@ describe('ClaudeCodeLanguageModel', () => {
// Need to re-import to get fresh module with mocks // Need to re-import to get fresh module with mocks
jest.resetModules(); jest.resetModules();
const { ClaudeCodeLanguageModel: FreshModel } = await import('../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js'); const { ClaudeCodeLanguageModel: FreshModel } = await import(
'../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js'
);
const model = new FreshModel({ const model = new FreshModel({
id: 'opus', id: 'opus',
settings: {} settings: {}
@@ -124,24 +154,30 @@ describe('ClaudeCodeLanguageModel', () => {
it('should only attempt to load package once', async () => { it('should only attempt to load package once', async () => {
// Get a fresh import to ensure clean state // Get a fresh import to ensure clean state
jest.resetModules(); jest.resetModules();
const { ClaudeCodeLanguageModel: TestModel } = await import('../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js'); const { ClaudeCodeLanguageModel: TestModel } = await import(
'../../../../../src/ai-providers/custom-sdk/claude-code/language-model.js'
);
const model = new TestModel({ const model = new TestModel({
id: 'opus', id: 'opus',
settings: {} settings: {}
}); });
// First call should throw // First call should throw
await expect(model.doGenerate({ await expect(
prompt: [{ role: 'user', content: 'test' }], model.doGenerate({
mode: { type: 'regular' } prompt: [{ role: 'user', content: 'test' }],
})).rejects.toThrow("Claude Code SDK is not installed"); mode: { type: 'regular' }
})
).rejects.toThrow('Claude Code SDK is not installed');
// Second call should also throw without trying to load again // Second call should also throw without trying to load again
await expect(model.doGenerate({ await expect(
prompt: [{ role: 'user', content: 'test' }], model.doGenerate({
mode: { type: 'regular' } prompt: [{ role: 'user', content: 'test' }],
})).rejects.toThrow("Claude Code SDK is not installed"); mode: { type: 'regular' }
})
).rejects.toThrow('Claude Code SDK is not installed');
}); });
}); });
@@ -163,7 +199,8 @@ describe('ClaudeCodeLanguageModel', () => {
expect(warnings[0]).toEqual({ expect(warnings[0]).toEqual({
type: 'unsupported-setting', type: 'unsupported-setting',
setting: 'temperature', setting: 'temperature',
details: 'Claude Code CLI does not support the temperature parameter. It will be ignored.' details:
'Claude Code CLI does not support the temperature parameter. It will be ignored.'
}); });
}); });
@@ -197,4 +234,4 @@ describe('ClaudeCodeLanguageModel', () => {
expect(model.getModel()).toBe('custom-model'); expect(model.getModel()).toBe('custom-model');
}); });
}); });
}); });