@@ -135,6 +135,7 @@ vi.mock('./hooks/vim.js');
135135vi . mock ( './hooks/useFocus.js' ) ;
136136vi . mock ( './hooks/useBracketedPaste.js' ) ;
137137vi . mock ( './hooks/useLoadingIndicator.js' ) ;
138+ vi . mock ( './hooks/useSuspend.js' ) ;
138139vi . mock ( './hooks/useFolderTrust.js' ) ;
139140vi . mock ( './hooks/useIdeTrustListener.js' ) ;
140141vi . mock ( './hooks/useMessageQueue.js' ) ;
@@ -197,7 +198,7 @@ import { useTextBuffer } from './components/shared/text-buffer.js';
197198import { useLogger } from './hooks/useLogger.js' ;
198199import { useLoadingIndicator } from './hooks/useLoadingIndicator.js' ;
199200import { useInputHistoryStore } from './hooks/useInputHistoryStore.js' ;
200- import { useKeypress } from './hooks/useKeypress .js' ;
201+ import { useSuspend } from './hooks/useSuspend .js' ;
201202import { measureElement } from 'ink' ;
202203import { useTerminalSize } from './hooks/useTerminalSize.js' ;
203204import {
@@ -270,6 +271,7 @@ describe('AppContainer State Management', () => {
270271 const mockedUseTextBuffer = useTextBuffer as Mock ;
271272 const mockedUseLogger = useLogger as Mock ;
272273 const mockedUseLoadingIndicator = useLoadingIndicator as Mock ;
274+ const mockedUseSuspend = useSuspend as Mock ;
273275 const mockedUseInputHistoryStore = useInputHistoryStore as Mock ;
274276 const mockedUseHookDisplayState = useHookDisplayState as Mock ;
275277 const mockedUseTerminalTheme = useTerminalTheme as Mock ;
@@ -401,6 +403,9 @@ describe('AppContainer State Management', () => {
401403 elapsedTime : '0.0s' ,
402404 currentLoadingPhrase : '' ,
403405 } ) ;
406+ mockedUseSuspend . mockReturnValue ( {
407+ handleSuspend : vi . fn ( ) ,
408+ } ) ;
404409 mockedUseHookDisplayState . mockReturnValue ( [ ] ) ;
405410 mockedUseTerminalTheme . mockReturnValue ( undefined ) ;
406411 mockedUseShellInactivityStatus . mockReturnValue ( {
@@ -440,8 +445,8 @@ describe('AppContainer State Management', () => {
440445 ...defaultMergedSettings . ui ,
441446 showStatusInTitle : false ,
442447 hideWindowTitle : false ,
448+ useAlternateBuffer : false ,
443449 } ,
444- useAlternateBuffer : false ,
445450 } ,
446451 } as unknown as LoadedSettings ;
447452
@@ -727,10 +732,10 @@ describe('AppContainer State Management', () => {
727732 getChatRecordingService : vi . fn ( ( ) => mockChatRecordingService ) ,
728733 } ;
729734
730- const configWithRecording = {
731- ... mockConfig ,
732- getGeminiClient : vi . fn ( ( ) => mockGeminiClient ) ,
733- } as unknown as Config ;
735+ const configWithRecording = makeFakeConfig ( ) ;
736+ vi . spyOn ( configWithRecording , 'getGeminiClient' ) . mockReturnValue (
737+ mockGeminiClient as unknown as ReturnType < Config [ 'getGeminiClient' ] > ,
738+ ) ;
734739
735740 expect ( ( ) => {
736741 renderAppContainer ( {
@@ -761,11 +766,13 @@ describe('AppContainer State Management', () => {
761766 setHistory : vi . fn ( ) ,
762767 } ;
763768
764- const configWithRecording = {
765- ...mockConfig ,
766- getGeminiClient : vi . fn ( ( ) => mockGeminiClient ) ,
767- getSessionId : vi . fn ( ( ) => 'test-session-123' ) ,
768- } as unknown as Config ;
769+ const configWithRecording = makeFakeConfig ( ) ;
770+ vi . spyOn ( configWithRecording , 'getGeminiClient' ) . mockReturnValue (
771+ mockGeminiClient as unknown as ReturnType < Config [ 'getGeminiClient' ] > ,
772+ ) ;
773+ vi . spyOn ( configWithRecording , 'getSessionId' ) . mockReturnValue (
774+ 'test-session-123' ,
775+ ) ;
769776
770777 expect ( ( ) => {
771778 renderAppContainer ( {
@@ -801,10 +808,10 @@ describe('AppContainer State Management', () => {
801808 getUserTier : vi . fn ( ) ,
802809 } ;
803810
804- const configWithRecording = {
805- ... mockConfig ,
806- getGeminiClient : vi . fn ( ( ) => mockGeminiClient ) ,
807- } as unknown as Config ;
811+ const configWithRecording = makeFakeConfig ( ) ;
812+ vi . spyOn ( configWithRecording , 'getGeminiClient' ) . mockReturnValue (
813+ mockGeminiClient as unknown as ReturnType < Config [ 'getGeminiClient' ] > ,
814+ ) ;
808815
809816 renderAppContainer ( {
810817 config : configWithRecording ,
@@ -835,10 +842,10 @@ describe('AppContainer State Management', () => {
835842 } ) ) ,
836843 } ;
837844
838- const configWithClient = {
839- ... mockConfig ,
840- getGeminiClient : vi . fn ( ( ) => mockGeminiClient ) ,
841- } as unknown as Config ;
845+ const configWithClient = makeFakeConfig ( ) ;
846+ vi . spyOn ( configWithClient , 'getGeminiClient' ) . mockReturnValue (
847+ mockGeminiClient as unknown as ReturnType < Config [ 'getGeminiClient' ] > ,
848+ ) ;
842849
843850 const resumedData = {
844851 conversation : {
@@ -891,10 +898,10 @@ describe('AppContainer State Management', () => {
891898 getChatRecordingService : vi . fn ( ) ,
892899 } ;
893900
894- const configWithClient = {
895- ... mockConfig ,
896- getGeminiClient : vi . fn ( ( ) => mockGeminiClient ) ,
897- } as unknown as Config ;
901+ const configWithClient = makeFakeConfig ( ) ;
902+ vi . spyOn ( configWithClient , 'getGeminiClient' ) . mockReturnValue (
903+ mockGeminiClient as unknown as ReturnType < Config [ 'getGeminiClient' ] > ,
904+ ) ;
898905
899906 const resumedData = {
900907 conversation : {
@@ -944,10 +951,10 @@ describe('AppContainer State Management', () => {
944951 getUserTier : vi . fn ( ) ,
945952 } ;
946953
947- const configWithRecording = {
948- ... mockConfig ,
949- getGeminiClient : vi . fn ( ( ) => mockGeminiClient ) ,
950- } as unknown as Config ;
954+ const configWithRecording = makeFakeConfig ( ) ;
955+ vi . spyOn ( configWithRecording , 'getGeminiClient' ) . mockReturnValue (
956+ mockGeminiClient as unknown as ReturnType < Config [ 'getGeminiClient' ] > ,
957+ ) ;
951958
952959 renderAppContainer ( {
953960 config : configWithRecording ,
@@ -1942,6 +1949,19 @@ describe('AppContainer State Management', () => {
19421949 } ) ;
19431950 } ) ;
19441951
1952+ describe ( 'CTRL+Z' , ( ) => {
1953+ it ( 'should call handleSuspend' , async ( ) => {
1954+ const handleSuspend = vi . fn ( ) ;
1955+ mockedUseSuspend . mockReturnValue ( { handleSuspend } ) ;
1956+ await setupKeypressTest ( ) ;
1957+
1958+ pressKey ( '\x1A' ) ; // Ctrl+Z
1959+
1960+ expect ( handleSuspend ) . toHaveBeenCalledTimes ( 1 ) ;
1961+ unmount ( ) ;
1962+ } ) ;
1963+ } ) ;
1964+
19451965 describe ( 'Focus Handling (Tab / Shift+Tab)' , ( ) => {
19461966 beforeEach ( ( ) => {
19471967 // Mock activePtyId to enable focus
0 commit comments