1
+ import { subscribeSpyTo } from '@hirez_io/observer-spy' ;
1
2
import chalk from 'chalk' ;
2
3
3
4
import { FakeCommand } from './fixtures/fake-command' ;
4
5
import { Logger } from './logger' ;
5
6
6
- let emitSpy : jest . SpyInstance ;
7
-
8
7
beforeEach ( ( ) => {
9
8
// Force chalk to use colors, otherwise tests may pass when they were supposed to be failing.
10
9
chalk . level = 3 ;
@@ -13,58 +12,60 @@ beforeEach(() => {
13
12
const createLogger = ( ...options : ConstructorParameters < typeof Logger > ) => {
14
13
const logger = new Logger ( ...options ) ;
15
14
jest . spyOn ( logger , 'log' ) ;
16
- emitSpy = jest . spyOn ( logger , 'emit' ) ;
17
- return logger ;
15
+ const spy = subscribeSpyTo ( logger . output ) ;
16
+ return { logger, spy } ;
18
17
} ;
19
18
20
19
describe ( '#log()' , ( ) => {
21
- it ( 'writes prefix + text to the output stream' , ( ) => {
22
- const logger = createLogger ( { } ) ;
20
+ it ( 'emits prefix + text in the output stream' , ( ) => {
21
+ const { logger, spy } = createLogger ( { } ) ;
23
22
logger . log ( 'foo' , 'bar' ) ;
24
23
25
- expect ( logger . emit ) . toHaveBeenCalledTimes ( 2 ) ;
26
- expect ( logger . emit ) . toHaveBeenCalledWith ( undefined , 'foo' ) ;
27
- expect ( logger . emit ) . toHaveBeenCalledWith ( undefined , 'bar' ) ;
24
+ const values = spy . getValues ( ) ;
25
+ expect ( values ) . toHaveLength ( 2 ) ;
26
+ expect ( values [ 0 ] ) . toEqual ( { command : undefined , text : 'foo' } ) ;
27
+ expect ( values [ 1 ] ) . toEqual ( { command : undefined , text : 'bar' } ) ;
28
28
} ) ;
29
29
30
- it ( 'writes multiple lines of text with prefix on each' , ( ) => {
31
- const logger = createLogger ( { } ) ;
30
+ it ( 'emits multiple lines of text with prefix on each' , ( ) => {
31
+ const { logger, spy } = createLogger ( { } ) ;
32
32
logger . log ( 'foo' , 'bar\nbaz\n' ) ;
33
33
34
- expect ( logger . emit ) . toHaveBeenCalledTimes ( 2 ) ;
35
- expect ( logger . emit ) . toHaveBeenCalledWith ( undefined , 'foo' ) ;
36
- expect ( logger . emit ) . toHaveBeenCalledWith ( undefined , 'bar\nfoobaz\n' ) ;
34
+ const values = spy . getValues ( ) ;
35
+ expect ( values ) . toHaveLength ( 2 ) ;
36
+ expect ( values [ 0 ] ) . toEqual ( { command : undefined , text : 'foo' } ) ;
37
+ expect ( values [ 1 ] ) . toEqual ( { command : undefined , text : 'bar\nfoobaz\n' } ) ;
37
38
} ) ;
38
39
39
- it ( 'does not prepend prefix if last call did not finish with a LF' , ( ) => {
40
- const logger = createLogger ( { } ) ;
40
+ it ( 'does not emit prefix if last call did not finish with a LF' , ( ) => {
41
+ const { logger, spy } = createLogger ( { } ) ;
41
42
logger . log ( 'foo' , 'bar' ) ;
42
- emitSpy . mockClear ( ) ;
43
43
logger . log ( 'foo' , 'baz' ) ;
44
44
45
- expect ( logger . emit ) . toHaveBeenCalledTimes ( 1 ) ;
46
- expect ( logger . emit ) . toHaveBeenCalledWith ( undefined , 'baz' ) ;
45
+ expect ( spy . getValuesLength ( ) ) . toBe ( 3 ) ;
46
+ expect ( spy . getLastValue ( ) ) . toEqual ( { command : undefined , text : 'baz' } ) ;
47
47
} ) ;
48
48
49
- it ( 'does not prepend prefix or handle text if logger is in raw mode' , ( ) => {
50
- const logger = createLogger ( { raw : true } ) ;
49
+ it ( 'does not emit prefix nor handle text if logger is in raw mode' , ( ) => {
50
+ const { logger, spy } = createLogger ( { raw : true } ) ;
51
51
logger . log ( 'foo' , 'bar\nbaz\n' ) ;
52
52
53
- expect ( logger . emit ) . toHaveBeenCalledTimes ( 1 ) ;
54
- expect ( logger . emit ) . toHaveBeenCalledWith ( undefined , 'bar\nbaz\n' ) ;
53
+ const values = spy . getValues ( ) ;
54
+ expect ( values ) . toHaveLength ( 1 ) ;
55
+ expect ( values [ 0 ] ) . toEqual ( { command : undefined , text : 'bar\nbaz\n' } ) ;
55
56
} ) ;
56
57
} ) ;
57
58
58
59
describe ( '#logGlobalEvent()' , ( ) => {
59
60
it ( 'does nothing if in raw mode' , ( ) => {
60
- const logger = createLogger ( { raw : true } ) ;
61
+ const { logger } = createLogger ( { raw : true } ) ;
61
62
logger . logGlobalEvent ( 'foo' ) ;
62
63
63
64
expect ( logger . log ) . not . toHaveBeenCalled ( ) ;
64
65
} ) ;
65
66
66
67
it ( 'logs in gray dim style with arrow prefix' , ( ) => {
67
- const logger = createLogger ( { } ) ;
68
+ const { logger } = createLogger ( { } ) ;
68
69
logger . logGlobalEvent ( 'foo' ) ;
69
70
70
71
expect ( logger . log ) . toHaveBeenCalledWith (
@@ -76,23 +77,23 @@ describe('#logGlobalEvent()', () => {
76
77
77
78
describe ( '#logCommandText()' , ( ) => {
78
79
it ( 'logs with name if no prefixFormat is set' , ( ) => {
79
- const logger = createLogger ( { } ) ;
80
+ const { logger } = createLogger ( { } ) ;
80
81
const cmd = new FakeCommand ( 'bla' ) ;
81
82
logger . logCommandText ( 'foo' , cmd ) ;
82
83
83
84
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( '[bla]' ) + ' ' , 'foo' , cmd ) ;
84
85
} ) ;
85
86
86
87
it ( 'logs with index if no prefixFormat is set, and command has no name' , ( ) => {
87
- const logger = createLogger ( { } ) ;
88
+ const { logger } = createLogger ( { } ) ;
88
89
const cmd = new FakeCommand ( '' , undefined , 2 ) ;
89
90
logger . logCommandText ( 'foo' , cmd ) ;
90
91
91
92
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( '[2]' ) + ' ' , 'foo' , cmd ) ;
92
93
} ) ;
93
94
94
95
it ( 'logs with prefixFormat set to pid' , ( ) => {
95
- const logger = createLogger ( { prefixFormat : 'pid' } ) ;
96
+ const { logger } = createLogger ( { prefixFormat : 'pid' } ) ;
96
97
const cmd = new FakeCommand ( ) ;
97
98
cmd . pid = 123 ;
98
99
logger . logCommandText ( 'foo' , cmd ) ;
@@ -101,23 +102,23 @@ describe('#logCommandText()', () => {
101
102
} ) ;
102
103
103
104
it ( 'logs with prefixFormat set to name' , ( ) => {
104
- const logger = createLogger ( { prefixFormat : 'name' } ) ;
105
+ const { logger } = createLogger ( { prefixFormat : 'name' } ) ;
105
106
const cmd = new FakeCommand ( 'bar' ) ;
106
107
logger . logCommandText ( 'foo' , cmd ) ;
107
108
108
109
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( '[bar]' ) + ' ' , 'foo' , cmd ) ;
109
110
} ) ;
110
111
111
112
it ( 'logs with prefixFormat set to index' , ( ) => {
112
- const logger = createLogger ( { prefixFormat : 'index' } ) ;
113
+ const { logger } = createLogger ( { prefixFormat : 'index' } ) ;
113
114
const cmd = new FakeCommand ( undefined , undefined , 3 ) ;
114
115
logger . logCommandText ( 'foo' , cmd ) ;
115
116
116
117
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( '[3]' ) + ' ' , 'foo' , cmd ) ;
117
118
} ) ;
118
119
119
120
it ( 'logs with prefixFormat set to time (with timestampFormat)' , ( ) => {
120
- const logger = createLogger ( { prefixFormat : 'time' , timestampFormat : 'yyyy' } ) ;
121
+ const { logger } = createLogger ( { prefixFormat : 'time' , timestampFormat : 'yyyy' } ) ;
121
122
const cmd = new FakeCommand ( ) ;
122
123
logger . logCommandText ( 'foo' , cmd ) ;
123
124
@@ -126,47 +127,47 @@ describe('#logCommandText()', () => {
126
127
} ) ;
127
128
128
129
it ( 'logs with templated prefixFormat' , ( ) => {
129
- const logger = createLogger ( { prefixFormat : '{index}-{name}' } ) ;
130
+ const { logger } = createLogger ( { prefixFormat : '{index}-{name}' } ) ;
130
131
const cmd = new FakeCommand ( 'bar' ) ;
131
132
logger . logCommandText ( 'foo' , cmd ) ;
132
133
133
134
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( '0-bar' ) + ' ' , 'foo' , cmd ) ;
134
135
} ) ;
135
136
136
137
it ( 'does not strip spaces from beginning or end of prefixFormat' , ( ) => {
137
- const logger = createLogger ( { prefixFormat : ' {index}-{name} ' } ) ;
138
+ const { logger } = createLogger ( { prefixFormat : ' {index}-{name} ' } ) ;
138
139
const cmd = new FakeCommand ( 'bar' ) ;
139
140
logger . logCommandText ( 'foo' , cmd ) ;
140
141
141
142
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( ' 0-bar ' ) + ' ' , 'foo' , cmd ) ;
142
143
} ) ;
143
144
144
145
it ( 'logs with no prefix' , ( ) => {
145
- const logger = createLogger ( { prefixFormat : 'none' } ) ;
146
+ const { logger } = createLogger ( { prefixFormat : 'none' } ) ;
146
147
const cmd = new FakeCommand ( ) ;
147
148
logger . logCommandText ( 'foo' , cmd ) ;
148
149
149
150
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( '' ) , 'foo' , cmd ) ;
150
151
} ) ;
151
152
152
153
it ( 'logs prefix using command line itself' , ( ) => {
153
- const logger = createLogger ( { prefixFormat : 'command' } ) ;
154
+ const { logger } = createLogger ( { prefixFormat : 'command' } ) ;
154
155
const cmd = new FakeCommand ( ) ;
155
156
logger . logCommandText ( 'foo' , cmd ) ;
156
157
157
158
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( '[echo foo]' ) + ' ' , 'foo' , cmd ) ;
158
159
} ) ;
159
160
160
161
it ( 'logs prefix using command line itself, capped at prefixLength bytes' , ( ) => {
161
- const logger = createLogger ( { prefixFormat : 'command' , prefixLength : 6 } ) ;
162
+ const { logger } = createLogger ( { prefixFormat : 'command' , prefixLength : 6 } ) ;
162
163
const cmd = new FakeCommand ( ) ;
163
164
logger . logCommandText ( 'foo' , cmd ) ;
164
165
165
166
expect ( logger . log ) . toHaveBeenCalledWith ( chalk . reset ( '[ec..oo]' ) + ' ' , 'foo' , cmd ) ;
166
167
} ) ;
167
168
168
169
it ( 'logs prefix using prefixColor from command' , ( ) => {
169
- const logger = createLogger ( { } ) ;
170
+ const { logger } = createLogger ( { } ) ;
170
171
const cmd = new FakeCommand ( '' , undefined , 1 , {
171
172
prefixColor : 'blue' ,
172
173
} ) ;
@@ -176,7 +177,7 @@ describe('#logCommandText()', () => {
176
177
} ) ;
177
178
178
179
it ( 'logs prefix in gray dim if prefixColor from command does not exist' , ( ) => {
179
- const logger = createLogger ( { } ) ;
180
+ const { logger } = createLogger ( { } ) ;
180
181
const cmd = new FakeCommand ( '' , undefined , 1 , {
181
182
prefixColor : 'blue.fake' ,
182
183
} ) ;
@@ -186,7 +187,7 @@ describe('#logCommandText()', () => {
186
187
} ) ;
187
188
188
189
it ( 'logs prefix using prefixColor from command if prefixColor is a hex value' , ( ) => {
189
- const logger = createLogger ( { } ) ;
190
+ const { logger } = createLogger ( { } ) ;
190
191
const prefixColor = '#32bd8a' ;
191
192
const cmd = new FakeCommand ( '' , undefined , 1 , {
192
193
prefixColor,
@@ -197,15 +198,15 @@ describe('#logCommandText()', () => {
197
198
} ) ;
198
199
199
200
it ( 'does nothing if command is hidden by name' , ( ) => {
200
- const logger = createLogger ( { hide : [ 'abc' ] } ) ;
201
+ const { logger } = createLogger ( { hide : [ 'abc' ] } ) ;
201
202
const cmd = new FakeCommand ( 'abc' ) ;
202
203
logger . logCommandText ( 'foo' , cmd ) ;
203
204
204
205
expect ( logger . log ) . not . toHaveBeenCalled ( ) ;
205
206
} ) ;
206
207
207
208
it ( 'does nothing if command is hidden by index' , ( ) => {
208
- const logger = createLogger ( { hide : [ 3 ] } ) ;
209
+ const { logger } = createLogger ( { hide : [ 3 ] } ) ;
209
210
const cmd = new FakeCommand ( '' , undefined , 3 ) ;
210
211
logger . logCommandText ( 'foo' , cmd ) ;
211
212
@@ -215,30 +216,30 @@ describe('#logCommandText()', () => {
215
216
216
217
describe ( '#logCommandEvent()' , ( ) => {
217
218
it ( 'does nothing if in raw mode' , ( ) => {
218
- const logger = createLogger ( { raw : true } ) ;
219
+ const { logger } = createLogger ( { raw : true } ) ;
219
220
logger . logCommandEvent ( 'foo' , new FakeCommand ( ) ) ;
220
221
221
222
expect ( logger . log ) . not . toHaveBeenCalled ( ) ;
222
223
} ) ;
223
224
224
225
it ( 'does nothing if command is hidden by name' , ( ) => {
225
- const logger = createLogger ( { hide : [ 'abc' ] } ) ;
226
+ const { logger } = createLogger ( { hide : [ 'abc' ] } ) ;
226
227
const cmd = new FakeCommand ( 'abc' ) ;
227
228
logger . logCommandEvent ( 'foo' , cmd ) ;
228
229
229
230
expect ( logger . log ) . not . toHaveBeenCalled ( ) ;
230
231
} ) ;
231
232
232
233
it ( 'does nothing if command is hidden by index' , ( ) => {
233
- const logger = createLogger ( { hide : [ 3 ] } ) ;
234
+ const { logger } = createLogger ( { hide : [ 3 ] } ) ;
234
235
const cmd = new FakeCommand ( '' , undefined , 3 ) ;
235
236
logger . logCommandEvent ( 'foo' , cmd ) ;
236
237
237
238
expect ( logger . log ) . not . toHaveBeenCalled ( ) ;
238
239
} ) ;
239
240
240
241
it ( 'logs text in gray dim' , ( ) => {
241
- const logger = createLogger ( { } ) ;
242
+ const { logger } = createLogger ( { } ) ;
242
243
const cmd = new FakeCommand ( '' , undefined , 1 ) ;
243
244
logger . logCommandEvent ( 'foo' , cmd ) ;
244
245
@@ -252,14 +253,14 @@ describe('#logCommandEvent()', () => {
252
253
253
254
describe ( '#logTable()' , ( ) => {
254
255
it ( 'does not log anything in raw mode' , ( ) => {
255
- const logger = createLogger ( { raw : true } ) ;
256
+ const { logger } = createLogger ( { raw : true } ) ;
256
257
logger . logTable ( [ { foo : 1 , bar : 2 } ] ) ;
257
258
258
259
expect ( logger . log ) . not . toHaveBeenCalled ( ) ;
259
260
} ) ;
260
261
261
262
it ( 'does not log anything if value is not an array' , ( ) => {
262
- const logger = createLogger ( { } ) ;
263
+ const { logger } = createLogger ( { } ) ;
263
264
logger . logTable ( { } as never ) ;
264
265
logger . logTable ( null as never ) ;
265
266
logger . logTable ( 0 as never ) ;
@@ -269,21 +270,21 @@ describe('#logTable()', () => {
269
270
} ) ;
270
271
271
272
it ( 'does not log anything if array is empy' , ( ) => {
272
- const logger = createLogger ( { } ) ;
273
+ const { logger } = createLogger ( { } ) ;
273
274
logger . logTable ( [ ] ) ;
274
275
275
276
expect ( logger . log ) . not . toHaveBeenCalled ( ) ;
276
277
} ) ;
277
278
278
279
it ( 'does not log anything if array items have no properties' , ( ) => {
279
- const logger = createLogger ( { } ) ;
280
+ const { logger } = createLogger ( { } ) ;
280
281
logger . logTable ( [ { } ] ) ;
281
282
282
283
expect ( logger . log ) . not . toHaveBeenCalled ( ) ;
283
284
} ) ;
284
285
285
286
it ( "logs a header for each item's properties" , ( ) => {
286
- const logger = createLogger ( { } ) ;
287
+ const { logger } = createLogger ( { } ) ;
287
288
logger . logTable ( [ { foo : 1 , bar : 2 } ] ) ;
288
289
289
290
expect ( logger . log ) . toHaveBeenCalledWith (
@@ -293,7 +294,7 @@ describe('#logTable()', () => {
293
294
} ) ;
294
295
295
296
it ( "logs padded headers according to longest column's value" , ( ) => {
296
- const logger = createLogger ( { } ) ;
297
+ const { logger } = createLogger ( { } ) ;
297
298
logger . logTable ( [ { a : 'foo' , b : 'barbaz' } ] ) ;
298
299
299
300
expect ( logger . log ) . toHaveBeenCalledWith (
@@ -303,7 +304,7 @@ describe('#logTable()', () => {
303
304
} ) ;
304
305
305
306
it ( "logs each items's values" , ( ) => {
306
- const logger = createLogger ( { } ) ;
307
+ const { logger } = createLogger ( { } ) ;
307
308
logger . logTable ( [ { foo : 123 } , { foo : 456 } ] ) ;
308
309
309
310
expect ( logger . log ) . toHaveBeenCalledWith (
@@ -317,7 +318,7 @@ describe('#logTable()', () => {
317
318
} ) ;
318
319
319
320
it ( "logs each items's values with empty column" , ( ) => {
320
- const logger = createLogger ( { } ) ;
321
+ const { logger } = createLogger ( { } ) ;
321
322
logger . logTable ( [ { foo : 123 } , { foo : null } ] ) ;
322
323
323
324
expect ( logger . log ) . toHaveBeenCalledWith (
@@ -331,7 +332,7 @@ describe('#logTable()', () => {
331
332
} ) ;
332
333
333
334
it ( "logs each items's values padded according to longest column's value" , ( ) => {
334
- const logger = createLogger ( { } ) ;
335
+ const { logger } = createLogger ( { } ) ;
335
336
logger . logTable ( [ { foo : 1 } , { foo : 123 } ] ) ;
336
337
337
338
expect ( logger . log ) . toHaveBeenCalledWith (
@@ -341,7 +342,7 @@ describe('#logTable()', () => {
341
342
} ) ;
342
343
343
344
it ( 'logs items with different properties in each' , ( ) => {
344
- const logger = createLogger ( { } ) ;
345
+ const { logger } = createLogger ( { } ) ;
345
346
logger . logTable ( [ { foo : 1 } , { bar : 2 } ] ) ;
346
347
347
348
expect ( logger . log ) . toHaveBeenCalledWith (
0 commit comments