Skip to content

Commit d9b912f

Browse files
committed
fix unit test
1 parent 5030975 commit d9b912f

File tree

1 file changed

+58
-72
lines changed

1 file changed

+58
-72
lines changed

packages/ai-providers/server-ai-vercel/__tests__/VercelProvider.test.ts

Lines changed: 58 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { generateObject, generateText } from 'ai';
1+
import { generateObject, generateText, jsonSchema } from 'ai';
22

33
import { VercelProvider } from '../src/VercelProvider';
44

55
// Mock Vercel AI SDK
66
jest.mock('ai', () => ({
77
generateText: jest.fn(),
88
generateObject: jest.fn(),
9+
jsonSchema: jest.fn((schema) => schema),
910
}));
1011

1112
describe('VercelProvider', () => {
@@ -15,6 +16,7 @@ describe('VercelProvider', () => {
1516
beforeEach(() => {
1617
mockModel = { name: 'test-model' };
1718
provider = new VercelProvider(mockModel, {});
19+
jest.clearAllMocks();
1820
});
1921

2022
describe('createAIMetrics', () => {
@@ -117,76 +119,6 @@ describe('VercelProvider', () => {
117119
});
118120
});
119121

120-
describe('convertToZodSchema', () => {
121-
it('converts simple object structure to Zod schema', () => {
122-
const responseStructure = {
123-
name: 'string',
124-
age: 0,
125-
isActive: true,
126-
};
127-
128-
const schema = VercelProvider.convertToZodSchema(responseStructure);
129-
130-
expect(schema).toBeDefined();
131-
expect(typeof schema.parse).toBe('function');
132-
});
133-
134-
it('converts nested object structure to Zod schema', () => {
135-
const responseStructure = {
136-
user: {
137-
name: 'string',
138-
age: 0,
139-
},
140-
settings: {
141-
theme: 'string',
142-
notifications: true,
143-
},
144-
};
145-
146-
const schema = VercelProvider.convertToZodSchema(responseStructure);
147-
148-
expect(schema).toBeDefined();
149-
expect(typeof schema.parse).toBe('function');
150-
});
151-
152-
it('converts array structure to Zod schema', () => {
153-
const responseStructure = {
154-
items: ['string'],
155-
numbers: [0],
156-
booleans: [true],
157-
};
158-
159-
const schema = VercelProvider.convertToZodSchema(responseStructure);
160-
161-
expect(schema).toBeDefined();
162-
expect(typeof schema.parse).toBe('function');
163-
});
164-
165-
it('handles empty array structure', () => {
166-
const responseStructure = {
167-
items: [],
168-
};
169-
170-
const schema = VercelProvider.convertToZodSchema(responseStructure);
171-
172-
expect(schema).toBeDefined();
173-
expect(typeof schema.parse).toBe('function');
174-
});
175-
176-
it('handles null and undefined values', () => {
177-
const responseStructure = {
178-
nullable: null,
179-
undefined,
180-
string: 'string',
181-
};
182-
183-
const schema = VercelProvider.convertToZodSchema(responseStructure);
184-
185-
expect(schema).toBeDefined();
186-
expect(typeof schema.parse).toBe('function');
187-
});
188-
});
189-
190122
describe('invokeModel', () => {
191123
it('invokes Vercel AI generateText and returns response', async () => {
192124
const mockResponse = {
@@ -247,6 +179,30 @@ describe('VercelProvider', () => {
247179
},
248180
});
249181
});
182+
183+
it('handles errors and returns failure metrics', async () => {
184+
const mockError = new Error('API call failed');
185+
(generateText as jest.Mock).mockRejectedValue(mockError);
186+
187+
const mockLogger = {
188+
warn: jest.fn(),
189+
};
190+
provider = new VercelProvider(mockModel, {}, mockLogger as any);
191+
192+
const messages = [{ role: 'user' as const, content: 'Hello!' }];
193+
const result = await provider.invokeModel(messages);
194+
195+
expect(mockLogger.warn).toHaveBeenCalledWith('Vercel AI model invocation failed:', mockError);
196+
expect(result).toEqual({
197+
message: {
198+
role: 'assistant',
199+
content: '',
200+
},
201+
metrics: {
202+
success: false,
203+
},
204+
});
205+
});
250206
});
251207

252208
describe('invokeStructuredModel', () => {
@@ -278,8 +234,9 @@ describe('VercelProvider', () => {
278234
expect(generateObject).toHaveBeenCalledWith({
279235
model: mockModel,
280236
messages: [{ role: 'user', content: 'Generate user data' }],
281-
schema: expect.any(Object), // Zod schema
237+
schema: responseStructure,
282238
});
239+
expect(jsonSchema).toHaveBeenCalledWith(responseStructure);
283240

284241
expect(result).toEqual({
285242
data: {
@@ -332,6 +289,35 @@ describe('VercelProvider', () => {
332289
},
333290
});
334291
});
292+
293+
it('handles errors and returns failure metrics', async () => {
294+
const mockError = new Error('API call failed');
295+
(generateObject as jest.Mock).mockRejectedValue(mockError);
296+
297+
const mockLogger = {
298+
warn: jest.fn(),
299+
};
300+
provider = new VercelProvider(mockModel, {}, mockLogger as any);
301+
302+
const messages = [{ role: 'user' as const, content: 'Generate result' }];
303+
const responseStructure = {
304+
result: 'string',
305+
};
306+
307+
const result = await provider.invokeStructuredModel(messages, responseStructure);
308+
309+
expect(mockLogger.warn).toHaveBeenCalledWith(
310+
'Vercel AI structured model invocation failed:',
311+
mockError,
312+
);
313+
expect(result).toEqual({
314+
data: {},
315+
rawResponse: '',
316+
metrics: {
317+
success: false,
318+
},
319+
});
320+
});
335321
});
336322

337323
describe('getModel', () => {

0 commit comments

Comments
 (0)