11import { expect } from 'chai' ;
22import WebSocket = require( 'isomorphic-ws' ) ;
33import { ReadableStreamBuffer , WritableStreamBuffer } from 'stream-buffers' ;
4- import { anyFunction , capture , instance , mock , verify , when } from 'ts-mockito' ;
4+ import { anyFunction , anything , capture , instance , mock , verify , when } from 'ts-mockito' ;
55
6+ import { CallAwaiter , matchBuffer } from '../test' ;
67import { V1Status } from './api' ;
78import { KubeConfig } from './config' ;
89import { Exec } from './exec' ;
10+ import { TerminalSize , TerminalSizeQueue } from './terminal-size-queue' ;
911import { WebSocketHandler , WebSocketInterface } from './web-socket-handler' ;
1012
1113describe ( 'Exec' , ( ) => {
@@ -55,11 +57,14 @@ describe('Exec', () => {
5557
5658 it ( 'should correctly attach to streams' , async ( ) => {
5759 const kc = new KubeConfig ( ) ;
58- const fakeWebSocket : WebSocketInterface = mock ( WebSocketHandler ) ;
59- const exec = new Exec ( kc , instance ( fakeWebSocket ) ) ;
60+ const fakeWebSocketInterface : WebSocketInterface = mock ( WebSocketHandler ) ;
61+ const fakeWebSocket : WebSocket = mock ( WebSocket ) ;
62+ const callAwaiter : CallAwaiter = new CallAwaiter ( ) ;
63+ const exec = new Exec ( kc , instance ( fakeWebSocketInterface ) ) ;
6064 const osStream = new WritableStreamBuffer ( ) ;
6165 const errStream = new WritableStreamBuffer ( ) ;
6266 const isStream = new ReadableStreamBuffer ( ) ;
67+ const terminalSizeQueue = new TerminalSizeQueue ( ) ;
6368
6469 const namespace = 'somenamespace' ;
6570 const pod = 'somepod' ;
@@ -71,8 +76,12 @@ describe('Exec', () => {
7176
7277 let statusOut = { } as V1Status ;
7378
74- const fakeConn : WebSocket = mock ( WebSocket ) ;
75- when ( fakeWebSocket . connect ( `${ path } ?${ args } ` , null , anyFunction ( ) ) ) . thenResolve ( fakeConn ) ;
79+ const fakeConn : WebSocket = instance ( fakeWebSocket ) ;
80+ when ( fakeWebSocketInterface . connect ( `${ path } ?${ args } ` , null , anyFunction ( ) ) ) . thenResolve (
81+ fakeConn ,
82+ ) ;
83+ when ( fakeWebSocket . send ( anything ( ) ) ) . thenCall ( callAwaiter . resolveCall ( 'send' ) ) ;
84+ when ( fakeWebSocket . close ( ) ) . thenCall ( callAwaiter . resolveCall ( 'close' ) ) ;
7685
7786 await exec . exec (
7887 namespace ,
@@ -86,9 +95,10 @@ describe('Exec', () => {
8695 ( status : V1Status ) => {
8796 statusOut = status ;
8897 } ,
98+ terminalSizeQueue ,
8999 ) ;
90100
91- const [ , , outputFn ] = capture ( fakeWebSocket . connect ) . last ( ) ;
101+ const [ , , outputFn ] = capture ( fakeWebSocketInterface . connect ) . last ( ) ;
92102
93103 /* tslint:disable:no-unused-expression */
94104 expect ( outputFn ) . to . not . be . null ;
@@ -116,19 +126,30 @@ describe('Exec', () => {
116126 }
117127
118128 const msg = 'This is test data' ;
129+ const inputPromise = callAwaiter . awaitCall ( 'send' ) ;
119130 isStream . put ( msg ) ;
120- verify ( fakeConn . send ( msg ) ) ;
131+ await inputPromise ;
132+ verify ( fakeWebSocket . send ( matchBuffer ( WebSocketHandler . StdinStream , msg ) ) ) . called ( ) ;
133+
134+ const terminalSize : TerminalSize = { height : 80 , width : 120 } ;
135+ const resizePromise = callAwaiter . awaitCall ( 'send' ) ;
136+ terminalSizeQueue . resize ( terminalSize ) ;
137+ await resizePromise ;
138+ verify (
139+ fakeWebSocket . send ( matchBuffer ( WebSocketHandler . ResizeStream , JSON . stringify ( terminalSize ) ) ) ,
140+ ) . called ( ) ;
121141
122142 const statusIn = {
123143 code : 100 ,
124144 message : 'this is a test' ,
125145 } as V1Status ;
126-
127146 outputFn ( WebSocketHandler . StatusStream , Buffer . from ( JSON . stringify ( statusIn ) ) ) ;
128147 expect ( statusOut ) . to . deep . equal ( statusIn ) ;
129148
149+ const closePromise = callAwaiter . awaitCall ( 'close' ) ;
130150 isStream . stop ( ) ;
131- verify ( fakeConn . close ( ) ) ;
151+ await closePromise ;
152+ verify ( fakeWebSocket . close ( ) ) . called ( ) ;
132153 } ) ;
133154 } ) ;
134155} ) ;
0 commit comments