Files
light_chat/src/utils/llmApi.test.js
T

130 lines
4.0 KiB
JavaScript

import { describe, it, expect, vi, beforeEach } from 'vitest'
import { sendMessage, testConnection } from '../utils/llmApi.js'
describe('LLM API', () => {
beforeEach(() => {
vi.clearAllMocks()
})
describe('sendMessage', () => {
it('should throw error when endpoint is missing', async () => {
await expect(sendMessage('', 'hello')).rejects.toThrow('API endpoint is required')
})
it('should send POST request and extract content from response', async () => {
global.fetch = vi.fn(() =>
Promise.resolve({
ok: true,
json: () => Promise.resolve({
choices: [{ message: { content: 'Hello there!' } }]
})
})
)
const result = await sendMessage('https://api.example.com/chat', 'Hi')
expect(fetch).toHaveBeenCalledWith(
'https://api.example.com/chat',
expect.objectContaining({
method: 'POST',
headers: { 'Content-Type': 'application/json' }
})
)
expect(result).toBe('Hello there!')
})
it('should throw error when response has no content', async () => {
global.fetch = vi.fn(() =>
Promise.resolve({
ok: true,
json: () => Promise.resolve({ choices: [] })
})
)
await expect(sendMessage('https://api.example.com/chat', 'Hi'))
.rejects.toThrow('Invalid response format: no content found')
})
it('should throw error on network failure', async () => {
global.fetch = vi.fn(() => Promise.reject(new Error('Network error')))
await expect(sendMessage('https://api.example.com/chat', 'Hi'))
.rejects.toThrow('Network error')
})
it('should include system prompt when provided', async () => {
global.fetch = vi.fn(() =>
Promise.resolve({
ok: true,
json: () => Promise.resolve({
choices: [{ message: { content: 'Response' } }]
})
})
)
await sendMessage('https://api.example.com/chat', 'Hi', [], 'You are helpful')
const callBody = JSON.parse(global.fetch.mock.calls[0][1].body)
expect(callBody.messages[0]).toEqual({ role: 'system', content: 'You are helpful' })
})
it('should include message history', async () => {
global.fetch = vi.fn(() =>
Promise.resolve({
ok: true,
json: () => Promise.resolve({
choices: [{ message: { content: 'Response' } }]
})
})
)
const history = [
{ role: 'user', content: 'Hello' },
{ role: 'assistant', content: 'Hi there!' }
]
await sendMessage('https://api.example.com/chat', 'How are you?', history)
const callBody = JSON.parse(global.fetch.mock.calls[0][1].body)
expect(callBody.messages[0]).toEqual({ role: 'user', content: 'Hello' })
expect(callBody.messages[1]).toEqual({ role: 'assistant', content: 'Hi there!' })
expect(callBody.messages[2]).toEqual({ role: 'user', content: 'How are you?' })
})
})
describe('testConnection', () => {
it('should return true on successful response', async () => {
global.fetch = vi.fn(() =>
Promise.resolve({ status: 200 })
)
const result = await testConnection('https://api.example.com/chat')
expect(result).toBe(true)
})
it('should return true on error response (not 404)', async () => {
global.fetch = vi.fn(() =>
Promise.resolve({ status: 401 })
)
const result = await testConnection('https://api.example.com/chat')
expect(result).toBe(true)
})
it('should return false on 404', async () => {
global.fetch = vi.fn(() =>
Promise.resolve({ status: 404 })
)
const result = await testConnection('https://api.example.com/chat')
expect(result).toBe(false)
})
it('should return false on network error', async () => {
global.fetch = vi.fn(() => Promise.reject(new Error('Network error')))
const result = await testConnection('https://api.example.com/chat')
expect(result).toBe(false)
})
})
})