@@ -48,7 +48,6 @@ const stubs = [
4848 'AssistantIcon' ,
4949 'AssistantText' ,
5050 'InlineAskAssistantButton' ,
51- 'AssistantLoadingMessage' ,
5251] ;
5352
5453// Stub MessageWrapper to render message as stringified JSON
@@ -293,12 +292,32 @@ describe('AskAssistantChat', () => {
293292 // Tool messages are now grouped into thinking-group messages and rendered by ThinkingMessage component
294293 // instead of MessageWrapper. These tests verify the grouping behavior.
295294
296- const ThinkingMessageMock = vi . fn ( ( ) => ( {
295+ const thinkingMessageProps : Array < {
296+ items : ChatUI . ThinkingItem [ ] ;
297+ latestStatusText : string ;
298+ defaultExpanded ?: boolean ;
299+ isStreaming ?: boolean ;
300+ } > = [ ] ;
301+ let thinkingMessageCallCount = 0 ;
302+ const ThinkingMessageMock = {
303+ name : 'ThinkingMessage' ,
304+ props : [ 'items' , 'latestStatusText' , 'isStreaming' , 'defaultExpanded' ] ,
305+ setup ( props : Record < string , unknown > ) {
306+ thinkingMessageCallCount ++ ;
307+ thinkingMessageProps . push ( {
308+ items : props . items as ChatUI . ThinkingItem [ ] ,
309+ latestStatusText : props . latestStatusText as string ,
310+ defaultExpanded : props . defaultExpanded as boolean | undefined ,
311+ isStreaming : props . isStreaming as boolean | undefined ,
312+ } ) ;
313+ return { } ;
314+ } ,
297315 template : '<div data-testid="thinking-message-mock"></div>' ,
298- } ) ) ;
316+ } ;
299317 const MessageWrapperMock = vi . fn ( ( ) => ( {
300318 template : '<div data-testid="message-wrapper-mock"></div>' ,
301319 } ) ) ;
320+
302321 const stubsWithMocks = {
303322 ...Object . fromEntries ( stubs . map ( ( stub ) => [ stub , true ] ) ) ,
304323 MessageWrapper : MessageWrapperMock ,
@@ -320,7 +339,8 @@ describe('AskAssistantChat', () => {
320339
321340 const renderWithMessages = ( messages : ChatUI . AssistantMessage [ ] , extraProps = { } ) => {
322341 MessageWrapperMock . mockClear ( ) ;
323- ThinkingMessageMock . mockClear ( ) ;
342+ thinkingMessageCallCount = 0 ;
343+ thinkingMessageProps . length = 0 ;
324344 return render ( AskAssistantChat , {
325345 global : { stubs : stubsWithMocks } ,
326346 props : {
@@ -333,7 +353,8 @@ describe('AskAssistantChat', () => {
333353
334354 const renderWithDirectives = ( messages : ChatUI . AssistantMessage [ ] , extraProps = { } ) => {
335355 MessageWrapperMock . mockClear ( ) ;
336- ThinkingMessageMock . mockClear ( ) ;
356+ thinkingMessageCallCount = 0 ;
357+ thinkingMessageProps . length = 0 ;
337358 return render ( AskAssistantChat , {
338359 global : {
339360 directives : { n8nHtml } ,
@@ -348,9 +369,8 @@ describe('AskAssistantChat', () => {
348369 } ;
349370
350371 const getThinkingMessageProps = ( callIndex = 0 ) => {
351- const mockCall = ThinkingMessageMock . mock . calls [ callIndex ] ;
352- expect ( mockCall ) . toBeDefined ( ) ;
353- return mockCall as unknown as [ { items : ChatUI . ThinkingItem [ ] ; latestStatusText : string } ] ;
372+ expect ( thinkingMessageProps [ callIndex ] ) . toBeDefined ( ) ;
373+ return thinkingMessageProps [ callIndex ] ;
354374 } ;
355375
356376 const getMessageWrapperProps = ( callIndex = 0 ) : MessageWrapperProps => {
@@ -369,10 +389,10 @@ describe('AskAssistantChat', () => {
369389 renderWithMessages ( [ message ] ) ;
370390
371391 // Tool messages are rendered as ThinkingMessage, not MessageWrapper
372- expect ( ThinkingMessageMock ) . toHaveBeenCalledTimes ( 1 ) ;
392+ expect ( thinkingMessageCallCount ) . toBe ( 1 ) ;
373393 expect ( MessageWrapperMock ) . toHaveBeenCalledTimes ( 0 ) ;
374394
375- const props = getThinkingMessageProps ( ) [ 0 ] ;
395+ const props = getThinkingMessageProps ( ) ;
376396 expect ( props . items ) . toHaveLength ( 1 ) ;
377397 expect ( props . items [ 0 ] . displayTitle ) . toBe ( 'Search Results' ) ;
378398 } ) ;
@@ -403,10 +423,10 @@ describe('AskAssistantChat', () => {
403423 renderWithMessages ( messages ) ;
404424
405425 // All tool messages with same toolName should be grouped into one thinking-group
406- expect ( ThinkingMessageMock ) . toHaveBeenCalledTimes ( 1 ) ;
426+ expect ( thinkingMessageCallCount ) . toBe ( 1 ) ;
407427 expect ( MessageWrapperMock ) . toHaveBeenCalledTimes ( 0 ) ;
408428
409- const props = getThinkingMessageProps ( ) [ 0 ] ;
429+ const props = getThinkingMessageProps ( ) ;
410430 // Should have 1 item after deduplication by toolName
411431 expect ( props . items ) . toHaveLength ( 1 ) ;
412432 } ) ;
@@ -443,7 +463,7 @@ describe('AskAssistantChat', () => {
443463 renderWithMessages ( messages ) ;
444464
445465 // Hidden messages are filtered out, so tool messages are grouped together
446- expect ( ThinkingMessageMock ) . toHaveBeenCalledTimes ( 1 ) ;
466+ expect ( thinkingMessageCallCount ) . toBe ( 1 ) ;
447467 expect ( MessageWrapperMock ) . toHaveBeenCalledTimes ( 0 ) ;
448468 } ) ;
449469
@@ -466,10 +486,10 @@ describe('AskAssistantChat', () => {
466486 renderWithMessages ( messages ) ;
467487
468488 // Both tools should be in the same thinking-group but as separate items
469- expect ( ThinkingMessageMock ) . toHaveBeenCalledTimes ( 1 ) ;
489+ expect ( thinkingMessageCallCount ) . toBe ( 1 ) ;
470490 expect ( MessageWrapperMock ) . toHaveBeenCalledTimes ( 0 ) ;
471491
472- const props = getThinkingMessageProps ( ) [ 0 ] ;
492+ const props = getThinkingMessageProps ( ) ;
473493 expect ( props . items ) . toHaveLength ( 2 ) ;
474494 } ) ;
475495
@@ -493,7 +513,7 @@ describe('AskAssistantChat', () => {
493513 renderWithMessages ( messages ) ;
494514
495515 // Should render as ThinkingMessage with running tool
496- expect ( ThinkingMessageMock ) . toHaveBeenCalledTimes ( 1 ) ;
516+ expect ( thinkingMessageCallCount ) . toBe ( 1 ) ;
497517 expect ( MessageWrapperMock ) . toHaveBeenCalledTimes ( 0 ) ;
498518 } ) ;
499519
@@ -522,7 +542,7 @@ describe('AskAssistantChat', () => {
522542 renderWithDirectives ( messages ) ;
523543
524544 // Should have 2 thinking-groups and 1 text message
525- expect ( ThinkingMessageMock ) . toHaveBeenCalledTimes ( 2 ) ;
545+ expect ( thinkingMessageCallCount ) . toBe ( 2 ) ;
526546 expect ( MessageWrapperMock ) . toHaveBeenCalledTimes ( 1 ) ;
527547
528548 const textMessageProps = getMessageWrapperProps ( 0 ) ;
@@ -567,7 +587,7 @@ describe('AskAssistantChat', () => {
567587
568588 // 2 text messages via MessageWrapper, 1 thinking-group via ThinkingMessage
569589 expect ( MessageWrapperMock ) . toHaveBeenCalledTimes ( 2 ) ;
570- expect ( ThinkingMessageMock ) . toHaveBeenCalledTimes ( 1 ) ;
590+ expect ( thinkingMessageCallCount ) . toBe ( 1 ) ;
571591
572592 const firstProps = getMessageWrapperProps ( 0 ) ;
573593 expect ( firstProps . message ) . toEqual (
@@ -590,16 +610,35 @@ describe('AskAssistantChat', () => {
590610 ) ;
591611 } ) ;
592612
593- it ( 'should show initial thinking-group when streaming with no tool messages' , ( ) => {
594- renderWithMessages ( [ ] , { streaming : true , loadingMessage : 'Thinking... ' } ) ;
613+ it ( 'should show ThinkingMessage with placeholder item when streaming with no tool messages' , ( ) => {
614+ renderWithMessages ( [ ] , { streaming : true , loadingMessage : 'Thinking' } ) ;
595615
596- // Should create an initial thinking-group
597- expect ( ThinkingMessageMock ) . toHaveBeenCalledTimes ( 1 ) ;
616+ // Should render ThinkingMessage with a single "Thinking" item
617+ expect ( thinkingMessageCallCount ) . toBe ( 1 ) ;
598618
599- const props = getThinkingMessageProps ( ) [ 0 ] ;
619+ const props = getThinkingMessageProps ( ) ;
600620 expect ( props . items ) . toHaveLength ( 1 ) ;
601- expect ( props . items [ 0 ] . displayTitle ) . toBe ( 'Thinking...' ) ;
621+ expect ( props . items [ 0 ] . id ) . toBe ( 'thinking-placeholder' ) ;
622+ expect ( props . items [ 0 ] . displayTitle ) . toBe ( 'Thinking' ) ;
602623 expect ( props . items [ 0 ] . status ) . toBe ( 'running' ) ;
624+ expect ( props . latestStatusText ) . toBe ( 'Thinking' ) ;
625+ expect ( props . defaultExpanded ) . toBe ( true ) ;
626+ expect ( props . isStreaming ) . toBe ( true ) ;
627+ } ) ;
628+
629+ it ( 'should pass defaultExpanded as true to ThinkingMessage' , ( ) => {
630+ const message = createToolMessage ( {
631+ id : '1' ,
632+ displayTitle : 'Search Results' ,
633+ updates : [ { type : 'output' , data : { result : 'Found items' } } ] ,
634+ } ) ;
635+
636+ renderWithMessages ( [ message ] ) ;
637+
638+ expect ( thinkingMessageCallCount ) . toBe ( 1 ) ;
639+
640+ const props = getThinkingMessageProps ( ) ;
641+ expect ( props . defaultExpanded ) . toBe ( true ) ;
603642 } ) ;
604643 } ) ;
605644
0 commit comments