Files
waooplus/tests/unit/helpers/migrate-gateway-route-openai-compat.test.ts
2026-03-08 17:10:06 +08:00

90 lines
2.8 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
migrateGatewayRoutePayload,
migrateProviderEntry,
} from '@/lib/migrations/gateway-route-openai-compat'
describe('gateway-route openai-compat migration', () => {
it('migrates openai-compatible litellm route to openai-compat', () => {
const result = migrateProviderEntry({
id: 'openai-compatible:oa-1',
gatewayRoute: 'litellm',
})
expect(result.changed).toBe(true)
expect(result.next).toMatchObject({
id: 'openai-compatible:oa-1',
gatewayRoute: 'openai-compat',
})
expect(result.summary.routeLitellmToOpenaiCompat).toBe(1)
})
it('forces gemini-compatible to gemini-sdk + official route', () => {
const result = migrateProviderEntry({
id: 'gemini-compatible:gm-1',
apiMode: 'openai-official',
gatewayRoute: 'openai-compat',
})
expect(result.changed).toBe(true)
expect(result.next).toMatchObject({
id: 'gemini-compatible:gm-1',
apiMode: 'gemini-sdk',
gatewayRoute: 'official',
})
expect(result.summary.geminiApiModeCorrected).toBe(1)
expect(result.summary.routeForcedOfficial).toBe(1)
})
it('forces non-openai-compatible compat routes to official', () => {
const result = migrateProviderEntry({
id: 'openrouter',
gatewayRoute: 'openai-compat',
})
expect(result.changed).toBe(true)
expect(result.next).toMatchObject({
id: 'openrouter',
gatewayRoute: 'official',
})
expect(result.summary.routeForcedOfficial).toBe(1)
})
it('returns invalid status for malformed payload json', () => {
const result = migrateGatewayRoutePayload('{bad-json')
expect(result.status).toBe('invalid')
expect(result.summary.invalidPayload).toBe(true)
})
it('migrates mixed provider payload and reports aggregate stats', () => {
const result = migrateGatewayRoutePayload(JSON.stringify([
{
id: 'openai-compatible:oa-1',
gatewayRoute: 'litellm',
},
{
id: 'gemini-compatible:gm-1',
apiMode: 'openai-official',
gatewayRoute: 'openai-compat',
},
{
id: 'google',
gatewayRoute: 'official',
},
]))
expect(result.status).toBe('ok')
expect(result.changed).toBe(true)
expect(result.summary.providersScanned).toBe(3)
expect(result.summary.providersChanged).toBe(2)
expect(result.summary.routeLitellmToOpenaiCompat).toBe(1)
expect(result.summary.routeForcedOfficial).toBe(1)
expect(result.summary.geminiApiModeCorrected).toBe(1)
const nextPayload = JSON.parse(result.nextRaw || '[]') as Array<Record<string, unknown>>
expect(nextPayload[0]?.gatewayRoute).toBe('openai-compat')
expect(nextPayload[1]?.apiMode).toBe('gemini-sdk')
expect(nextPayload[1]?.gatewayRoute).toBe('official')
})
})