98 lines
2.9 KiB
TypeScript
98 lines
2.9 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Mock GoogleGenAI constructor (must be hoisted for Vitest)
|
|
// ---------------------------------------------------------------------------
|
|
const GoogleGenAIMock = vi.hoisted(() => vi.fn())
|
|
|
|
vi.mock('@google/genai', () => ({
|
|
GoogleGenAI: GoogleGenAIMock,
|
|
FunctionCallingConfigMode: { AUTO: 'AUTO' },
|
|
}))
|
|
|
|
import { GeminiAdapter } from '../src/llm/gemini.js'
|
|
import { createAdapter } from '../src/llm/adapter.js'
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// GeminiAdapter tests
|
|
// ---------------------------------------------------------------------------
|
|
|
|
describe('GeminiAdapter', () => {
|
|
beforeEach(() => {
|
|
GoogleGenAIMock.mockClear()
|
|
})
|
|
|
|
it('has name "gemini"', () => {
|
|
const adapter = new GeminiAdapter()
|
|
expect(adapter.name).toBe('gemini')
|
|
})
|
|
|
|
it('uses GEMINI_API_KEY by default', () => {
|
|
const originalGemini = process.env['GEMINI_API_KEY']
|
|
const originalGoogle = process.env['GOOGLE_API_KEY']
|
|
process.env['GEMINI_API_KEY'] = 'gemini-env-key'
|
|
delete process.env['GOOGLE_API_KEY']
|
|
|
|
try {
|
|
new GeminiAdapter()
|
|
expect(GoogleGenAIMock).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
apiKey: 'gemini-env-key',
|
|
}),
|
|
)
|
|
} finally {
|
|
if (originalGemini === undefined) {
|
|
delete process.env['GEMINI_API_KEY']
|
|
} else {
|
|
process.env['GEMINI_API_KEY'] = originalGemini
|
|
}
|
|
if (originalGoogle === undefined) {
|
|
delete process.env['GOOGLE_API_KEY']
|
|
} else {
|
|
process.env['GOOGLE_API_KEY'] = originalGoogle
|
|
}
|
|
}
|
|
})
|
|
|
|
it('falls back to GOOGLE_API_KEY when GEMINI_API_KEY is unset', () => {
|
|
const originalGemini = process.env['GEMINI_API_KEY']
|
|
const originalGoogle = process.env['GOOGLE_API_KEY']
|
|
delete process.env['GEMINI_API_KEY']
|
|
process.env['GOOGLE_API_KEY'] = 'google-env-key'
|
|
|
|
try {
|
|
new GeminiAdapter()
|
|
expect(GoogleGenAIMock).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
apiKey: 'google-env-key',
|
|
}),
|
|
)
|
|
} finally {
|
|
if (originalGemini === undefined) {
|
|
delete process.env['GEMINI_API_KEY']
|
|
} else {
|
|
process.env['GEMINI_API_KEY'] = originalGemini
|
|
}
|
|
if (originalGoogle === undefined) {
|
|
delete process.env['GOOGLE_API_KEY']
|
|
} else {
|
|
process.env['GOOGLE_API_KEY'] = originalGoogle
|
|
}
|
|
}
|
|
})
|
|
|
|
it('allows overriding apiKey explicitly', () => {
|
|
new GeminiAdapter('explicit-key')
|
|
expect(GoogleGenAIMock).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
apiKey: 'explicit-key',
|
|
}),
|
|
)
|
|
})
|
|
|
|
it('createAdapter("gemini") returns GeminiAdapter instance', async () => {
|
|
const adapter = await createAdapter('gemini')
|
|
expect(adapter).toBeInstanceOf(GeminiAdapter)
|
|
})
|
|
})
|