@@ -7,6 +7,12 @@ vi.mock('@/lib/toast', () => ({
77 showToast : { error : vi . fn ( ) } ,
88} ) )
99
10+ const defaultProps = {
11+ sessionId : 'test-session' ,
12+ isConnected : true ,
13+ isReconnecting : false ,
14+ }
15+
1016describe ( 'SessionSendErrorBanner' , ( ) => {
1117 beforeEach ( ( ) => {
1218 useSendErrorStore . setState ( { errors : { } } )
@@ -20,14 +26,14 @@ describe('SessionSendErrorBanner', () => {
2026 detail : 'Stack trace here' ,
2127 } )
2228
23- render ( < SessionSendErrorBanner sessionId = "test-session" /> )
29+ render ( < SessionSendErrorBanner { ... defaultProps } /> )
2430 expect ( screen . getByText ( 'Error' ) ) . toBeInTheDocument ( )
2531 expect ( screen . getByText ( 'Something failed' ) ) . toBeInTheDocument ( )
2632 expect ( screen . getByText ( 'Stack trace here' ) ) . toBeInTheDocument ( )
2733 } )
2834
2935 it ( 'does not render banner when no error exists' , ( ) => {
30- render ( < SessionSendErrorBanner sessionId = "test-session" /> )
36+ render ( < SessionSendErrorBanner { ... defaultProps } /> )
3137 expect ( screen . queryByRole ( 'button' ) ) . not . toBeInTheDocument ( )
3238 } )
3339
@@ -38,7 +44,7 @@ describe('SessionSendErrorBanner', () => {
3844 message : 'Something failed' ,
3945 } )
4046
41- render ( < SessionSendErrorBanner sessionId = { undefined } /> )
47+ render ( < SessionSendErrorBanner sessionId = { undefined } isConnected = { true } isReconnecting = { false } /> )
4248 expect ( screen . queryByRole ( 'button' ) ) . not . toBeInTheDocument ( )
4349 } )
4450
@@ -49,7 +55,7 @@ describe('SessionSendErrorBanner', () => {
4955 message : 'Something failed' ,
5056 } )
5157
52- render ( < SessionSendErrorBanner sessionId = "test-session" /> )
58+ render ( < SessionSendErrorBanner { ... defaultProps } /> )
5359 expect ( screen . getByText ( 'Something failed' ) ) . toBeInTheDocument ( )
5460
5561 fireEvent . click ( screen . getByRole ( 'button' ) )
@@ -65,7 +71,74 @@ describe('SessionSendErrorBanner', () => {
6571 message : 'Something failed' ,
6672 } )
6773
68- render ( < SessionSendErrorBanner sessionId = "test-session" /> )
74+ render ( < SessionSendErrorBanner { ... defaultProps } /> )
6975 expect ( showToast . error ) . not . toHaveBeenCalled ( )
7076 } )
77+
78+ it ( 'does not render a network-kind error while disconnected' , ( ) => {
79+ useSendErrorStore . getState ( ) . setError ( {
80+ sessionID : 'test-session' ,
81+ title : 'Connection Failed' ,
82+ message : 'Could not connect.' ,
83+ kind : 'network' ,
84+ } )
85+
86+ render ( < SessionSendErrorBanner sessionId = "test-session" isConnected = { false } isReconnecting = { false } /> )
87+ expect ( screen . queryByText ( 'Connection Failed' ) ) . not . toBeInTheDocument ( )
88+ } )
89+
90+ it ( 'does not render a network-kind error while reconnecting' , ( ) => {
91+ useSendErrorStore . getState ( ) . setError ( {
92+ sessionID : 'test-session' ,
93+ title : 'Connection Failed' ,
94+ message : 'Could not connect.' ,
95+ kind : 'network' ,
96+ } )
97+
98+ render ( < SessionSendErrorBanner sessionId = "test-session" isConnected = { true } isReconnecting = { true } /> )
99+ expect ( screen . queryByText ( 'Connection Failed' ) ) . not . toBeInTheDocument ( )
100+ } )
101+
102+ it ( 'renders a network-kind error when connected and stable' , ( ) => {
103+ useSendErrorStore . getState ( ) . setError ( {
104+ sessionID : 'test-session' ,
105+ title : 'Connection Failed' ,
106+ message : 'Could not connect.' ,
107+ kind : 'network' ,
108+ } )
109+
110+ render ( < SessionSendErrorBanner sessionId = "test-session" isConnected = { true } isReconnecting = { false } /> )
111+ expect ( screen . getByText ( 'Connection Failed' ) ) . toBeInTheDocument ( )
112+ } )
113+
114+ it ( 'renders a session-kind error even while disconnected' , ( ) => {
115+ useSendErrorStore . getState ( ) . setQueuedPrompt ( 'test-session' , 'queued message' )
116+ useSendErrorStore . getState ( ) . failQueuedPrompt ( {
117+ sessionID : 'test-session' ,
118+ title : 'Session error' ,
119+ message : 'Server reported failure' ,
120+ } )
121+
122+ render ( < SessionSendErrorBanner sessionId = "test-session" isConnected = { false } isReconnecting = { false } /> )
123+ expect ( screen . getByText ( 'Session error' ) ) . toBeInTheDocument ( )
124+ } )
125+
126+ it ( 'renders a previously hidden network error after reconnecting' , ( ) => {
127+ useSendErrorStore . getState ( ) . setError ( {
128+ sessionID : 'test-session' ,
129+ title : 'Connection Failed' ,
130+ message : 'Could not connect.' ,
131+ kind : 'network' ,
132+ } )
133+
134+ const { rerender } = render (
135+ < SessionSendErrorBanner sessionId = "test-session" isConnected = { false } isReconnecting = { false } /> ,
136+ )
137+ expect ( screen . queryByText ( 'Connection Failed' ) ) . not . toBeInTheDocument ( )
138+
139+ rerender (
140+ < SessionSendErrorBanner sessionId = "test-session" isConnected = { true } isReconnecting = { false } /> ,
141+ )
142+ expect ( screen . getByText ( 'Connection Failed' ) ) . toBeInTheDocument ( )
143+ } )
71144} )
0 commit comments