style: apply biome formatting to test files
This commit is contained in:
committed by
Ralph Khreish
parent
5d82b69610
commit
18a5f63d06
@@ -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)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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'
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user