@@ -7,6 +7,14 @@ jest.mock('langchain/chat_models/universal', () => ({
77 initChatModel : jest . fn ( ) ,
88} ) ) ;
99
10+ // Mock logger
11+ const mockLogger = {
12+ warn : jest . fn ( ) ,
13+ info : jest . fn ( ) ,
14+ error : jest . fn ( ) ,
15+ debug : jest . fn ( ) ,
16+ } ;
17+
1018describe ( 'LangChainProvider' , ( ) => {
1119 describe ( 'convertMessagesToLangChain' , ( ) => {
1220 it ( 'converts system messages to SystemMessage' , ( ) => {
@@ -100,6 +108,61 @@ describe('LangChainProvider', () => {
100108 } ) ;
101109 } ) ;
102110
111+ describe ( 'invokeModel' , ( ) => {
112+ let mockLLM : any ;
113+ let provider : LangChainProvider ;
114+
115+ beforeEach ( ( ) => {
116+ mockLLM = {
117+ invoke : jest . fn ( ) ,
118+ } ;
119+ provider = new LangChainProvider ( mockLLM , mockLogger ) ;
120+ jest . clearAllMocks ( ) ;
121+ } ) ;
122+
123+ it ( 'returns success=true for string content' , async ( ) => {
124+ const mockResponse = new AIMessage ( 'Test response' ) ;
125+ mockLLM . invoke . mockResolvedValue ( mockResponse ) ;
126+
127+ const messages = [ { role : 'user' as const , content : 'Hello' } ] ;
128+ const result = await provider . invokeModel ( messages ) ;
129+
130+ expect ( result . metrics . success ) . toBe ( true ) ;
131+ expect ( result . message . content ) . toBe ( 'Test response' ) ;
132+ expect ( mockLogger . warn ) . not . toHaveBeenCalled ( ) ;
133+ } ) ;
134+
135+ it ( 'returns success=false for non-string content and logs warning' , async ( ) => {
136+ const mockResponse = new AIMessage ( { type : 'image' , data : 'base64data' } as any ) ;
137+ mockLLM . invoke . mockResolvedValue ( mockResponse ) ;
138+
139+ const messages = [ { role : 'user' as const , content : 'Hello' } ] ;
140+ const result = await provider . invokeModel ( messages ) ;
141+
142+ expect ( result . metrics . success ) . toBe ( false ) ;
143+ expect ( result . message . content ) . toBe ( '' ) ;
144+ expect ( mockLogger . warn ) . toHaveBeenCalledWith (
145+ 'Multimodal response not supported, expecting a string. Content type: object, Content:' ,
146+ JSON . stringify ( { type : 'image' , data : 'base64data' } , null , 2 ) ,
147+ ) ;
148+ } ) ;
149+
150+ it ( 'returns success=false for array content and logs warning' , async ( ) => {
151+ const mockResponse = new AIMessage ( [ 'text' , { type : 'image' , data : 'base64data' } ] as any ) ;
152+ mockLLM . invoke . mockResolvedValue ( mockResponse ) ;
153+
154+ const messages = [ { role : 'user' as const , content : 'Hello' } ] ;
155+ const result = await provider . invokeModel ( messages ) ;
156+
157+ expect ( result . metrics . success ) . toBe ( false ) ;
158+ expect ( result . message . content ) . toBe ( '' ) ;
159+ expect ( mockLogger . warn ) . toHaveBeenCalledWith (
160+ 'Multimodal response not supported, expecting a string. Content type: object, Content:' ,
161+ JSON . stringify ( [ 'text' , { type : 'image' , data : 'base64data' } ] , null , 2 ) ,
162+ ) ;
163+ } ) ;
164+ } ) ;
165+
103166 describe ( 'mapProvider' , ( ) => {
104167 it ( 'maps gemini to google-genai' , ( ) => {
105168 expect ( LangChainProvider . mapProvider ( 'gemini' ) ) . toBe ( 'google-genai' ) ;
0 commit comments