1
1
import { expect } from 'chai' ;
2
2
import WebSocket = require( 'isomorphic-ws' ) ;
3
3
import { 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' ;
5
5
6
+ import { CallAwaiter , matchBuffer } from '../test' ;
6
7
import { V1Status } from './api' ;
7
8
import { KubeConfig } from './config' ;
8
9
import { Exec } from './exec' ;
10
+ import { TerminalSize , TerminalSizeQueue } from './terminal-size-queue' ;
9
11
import { WebSocketHandler , WebSocketInterface } from './web-socket-handler' ;
10
12
11
13
describe ( 'Exec' , ( ) => {
@@ -55,11 +57,14 @@ describe('Exec', () => {
55
57
56
58
it ( 'should correctly attach to streams' , async ( ) => {
57
59
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 ) ) ;
60
64
const osStream = new WritableStreamBuffer ( ) ;
61
65
const errStream = new WritableStreamBuffer ( ) ;
62
66
const isStream = new ReadableStreamBuffer ( ) ;
67
+ const terminalSizeQueue = new TerminalSizeQueue ( ) ;
63
68
64
69
const namespace = 'somenamespace' ;
65
70
const pod = 'somepod' ;
@@ -71,8 +76,12 @@ describe('Exec', () => {
71
76
72
77
let statusOut = { } as V1Status ;
73
78
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' ) ) ;
76
85
77
86
await exec . exec (
78
87
namespace ,
@@ -86,9 +95,10 @@ describe('Exec', () => {
86
95
( status : V1Status ) => {
87
96
statusOut = status ;
88
97
} ,
98
+ terminalSizeQueue ,
89
99
) ;
90
100
91
- const [ , , outputFn ] = capture ( fakeWebSocket . connect ) . last ( ) ;
101
+ const [ , , outputFn ] = capture ( fakeWebSocketInterface . connect ) . last ( ) ;
92
102
93
103
/* tslint:disable:no-unused-expression */
94
104
expect ( outputFn ) . to . not . be . null ;
@@ -116,19 +126,30 @@ describe('Exec', () => {
116
126
}
117
127
118
128
const msg = 'This is test data' ;
129
+ const inputPromise = callAwaiter . awaitCall ( 'send' ) ;
119
130
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 ( ) ;
121
141
122
142
const statusIn = {
123
143
code : 100 ,
124
144
message : 'this is a test' ,
125
145
} as V1Status ;
126
-
127
146
outputFn ( WebSocketHandler . StatusStream , Buffer . from ( JSON . stringify ( statusIn ) ) ) ;
128
147
expect ( statusOut ) . to . deep . equal ( statusIn ) ;
129
148
149
+ const closePromise = callAwaiter . awaitCall ( 'close' ) ;
130
150
isStream . stop ( ) ;
131
- verify ( fakeConn . close ( ) ) ;
151
+ await closePromise ;
152
+ verify ( fakeWebSocket . close ( ) ) . called ( ) ;
132
153
} ) ;
133
154
} ) ;
134
155
} ) ;
0 commit comments