11import { describe , it , expect , vi , beforeEach , afterEach } from 'vitest' ;
22import { providers , getProviderById } from '../services/aiProviders' ;
3- import { estimateTokens } from '../services/promptEngine' ;
43
54describe ( 'aiProviders' , ( ) => {
65 describe ( 'providers list' , ( ) => {
@@ -13,25 +12,30 @@ describe('aiProviders', () => {
1312 expect ( provider . id ) . toBeTruthy ( ) ;
1413 expect ( provider . name ) . toBeTruthy ( ) ;
1514 expect ( provider . model ) . toBeTruthy ( ) ;
16- expect ( typeof provider . costPer1kTokens ) . toBe ( 'number' ) ;
1715 expect ( typeof provider . run ) . toBe ( 'function' ) ;
1816 expect ( typeof provider . estimateTokens ) . toBe ( 'function' ) ;
1917 }
2018 } ) ;
2119
22- it ( 'providers have unique ids' , ( ) => {
20+ it ( 'has unique ids' , ( ) => {
2321 const ids = providers . map ( p => p . id ) ;
24- const uniqueIds = new Set ( ids ) ;
25- expect ( uniqueIds . size ) . toBe ( ids . length ) ;
22+ expect ( new Set ( ids ) . size ) . toBe ( ids . length ) ;
2623 } ) ;
24+ } ) ;
2725
28- it ( 'includes gemini-pro, gpt-4o-mini, and claude-3-sonnet' , ( ) => {
29- const ids = providers . map ( p => p . id ) ;
30- expect ( ids ) . toContain ( 'gemini-pro' ) ;
31- expect ( ids ) . toContain ( 'gpt-4o-mini' ) ;
32- expect ( ids ) . toContain ( 'claude-3-sonnet' ) ;
26+ describe ( 'getProviderById' , ( ) => {
27+ it ( 'returns provider for known id' , ( ) => {
28+ const p = getProviderById ( 'gemini-flash' ) ;
29+ expect ( p ) . toBeDefined ( ) ;
30+ expect ( p ! . id ) . toBe ( 'gemini-flash' ) ;
31+ } ) ;
32+
33+ it ( 'returns undefined for unknown id' , ( ) => {
34+ expect ( getProviderById ( 'does-not-exist' ) ) . toBeUndefined ( ) ;
3335 } ) ;
36+ } ) ;
3437
38+ describe ( 'estimateTokens on providers' , ( ) => {
3539 it ( 'each provider estimateTokens function works correctly' , ( ) => {
3640 for ( const provider of providers ) {
3741 const tokens = provider . estimateTokens ( 'hello world' ) ;
@@ -40,56 +44,27 @@ describe('aiProviders', () => {
4044 } ) ;
4145 } ) ;
4246
43- describe ( 'getProviderById' , ( ) => {
44- it ( 'returns the correct provider by id' , ( ) => {
45- const provider = getProviderById ( 'gemini-pro' ) ;
46- expect ( provider ) . toBeDefined ( ) ;
47- expect ( provider ?. id ) . toBe ( 'gemini-pro' ) ;
48- expect ( provider ?. name ) . toBe ( 'Gemini Pro' ) ;
49- } ) ;
50-
51- it ( 'returns undefined for unknown provider id' , ( ) => {
52- const provider = getProviderById ( 'unknown-provider-xyz' ) ;
53- expect ( provider ) . toBeUndefined ( ) ;
54- } ) ;
55- } ) ;
56-
57- describe ( 'provider run()' , ( ) => {
47+ describe ( 'provider.run' , ( ) => {
5848 beforeEach ( ( ) => {
5949 vi . useFakeTimers ( ) ;
6050 } ) ;
61-
6251 afterEach ( ( ) => {
6352 vi . useRealTimers ( ) ;
6453 } ) ;
6554
66- it ( 'returns a CompletionResponse with expected shape ' , async ( ) => {
67- const provider = getProviderById ( 'gemini-pro ' ) ! ;
68- const promise = provider . run ( 'short test prompt' ) ;
55+ it ( 'returns a response object ' , async ( ) => {
56+ const provider = getProviderById ( 'gemini-flash ' ) ! ;
57+ const promise = provider . run ( 'test prompt' ) ;
6958 await vi . runAllTimersAsync ( ) ;
7059 const response = await promise ;
71-
72- expect ( response . providerId ) . toBe ( 'gemini-pro' ) ;
73- expect ( typeof response . output ) . toBe ( 'string' ) ;
74- expect ( response . output . length ) . toBeGreaterThan ( 0 ) ;
75- expect ( typeof response . tokens . input ) . toBe ( 'number' ) ;
76- expect ( typeof response . tokens . output ) . toBe ( 'number' ) ;
60+ expect ( response . output ) . toBeTruthy ( ) ;
7761 expect ( typeof response . cost ) . toBe ( 'number' ) ;
78- expect ( typeof response . latencyMs ) . toBe ( 'number' ) ;
79- } ) ;
80-
81- it ( 'includes the prompt in the output' , async ( ) => {
82- const provider = getProviderById ( 'gpt-4o-mini' ) ! ;
83- const promise = provider . run ( 'uniquepromptstring' ) ;
84- await vi . runAllTimersAsync ( ) ;
85- const response = await promise ;
86- expect ( response . output ) . toContain ( 'uniquepromptstring' ) ;
62+ expect ( typeof response . tokensUsed ) . toBe ( 'number' ) ;
8763 } ) ;
8864
89- it ( 'truncates very long prompts in the output' , async ( ) => {
90- const provider = getProviderById ( 'claude-3-sonnet' ) ! ;
91- const longPrompt = 'x' . repeat ( 500 ) ;
92- const promise = provider . run ( longPrompt ) ;
65+ it ( 'respects maxTokens option' , async ( ) => {
66+ const provider = getProviderById ( 'gemini-flash' ) ! ;
67+ const promise = provider . run ( 'x' . repeat ( 1000 ) , { maxTokens : 50 } ) ;
9368 await vi . runAllTimersAsync ( ) ;
9469 const response = await promise ;
9570 // Output should be truncated at 280 chars (+ provider prefix)
0 commit comments