1- import chalkTable from 'chalk-table'
21import { beforeEach , describe , expect , it , vi } from 'vitest'
32
4- import { outputListRepos } from './output-list-repos.mts'
53import {
64 createErrorResult ,
75 createSuccessResult ,
86} from '../../../test/helpers/index.mts'
9- import { failMsgWithBadge } from '../../utils/error/fail-msg-with-badge.mts'
10- import { serializeResultJson } from '../../utils/output/result-json.mjs'
117
128import type { CResult } from '../../types.mts'
139import type { SocketSdkSuccessResult } from '@socketsecurity/sdk'
1410
15- // Mock the dependencies.
16- const mockLogger = vi . hoisted ( ( ) => ( {
17- fail : vi . fn ( ) ,
18- log : vi . fn ( ) ,
19- info : vi . fn ( ) ,
20- success : vi . fn ( ) ,
21- warn : vi . fn ( ) ,
22- error : vi . fn ( ) ,
23- } ) )
24-
25- // Helper references to mockLogger methods.
26- const mockLog = mockLogger . log
27- const mockFail = mockLogger . fail
28- const mockInfo = mockLogger . info
29-
30- vi . mock ( '@socketsecurity/lib/logger' , ( ) => ( {
31- getDefaultLogger : ( ) => mockLogger ,
32- logger : mockLogger ,
33- } ) )
34-
35- vi . mock ( '../../utils/output/result-json.mjs' , ( ) => ( {
36- serializeResultJson : vi . fn ( result => JSON . stringify ( result ) ) ,
37- } ) )
38-
39- vi . mock ( '../../utils/error/fail-msg-with-badge.mts' , ( ) => ( {
40- failMsgWithBadge : vi . fn ( ( msg , cause ) => `${ msg } : ${ cause } ` ) ,
41- } ) )
42-
43- vi . mock ( 'chalk-table' , ( ) => ( {
44- default : vi . fn ( ( _options , data ) => `Table with ${ data . length } rows` ) ,
45- } ) )
46-
47- vi . mock ( 'yoctocolors-cjs' , ( ) => ( {
48- default : {
49- magenta : vi . fn ( text => text ) ,
50- } ,
51- } ) )
52-
5311describe ( 'outputListRepos' , ( ) => {
54- beforeEach ( ( ) => {
55- vi . clearAllMocks ( )
12+ beforeEach ( async ( ) => {
13+ vi . resetModules ( )
5614 process . exitCode = undefined
5715 } )
5816
5917 it ( 'outputs JSON format for successful result with pagination' , async ( ) => {
60- const mockSerialize = vi . mocked ( serializeResultJson )
18+ const mockLogger = {
19+ fail : vi . fn ( ) ,
20+ log : vi . fn ( ) ,
21+ info : vi . fn ( ) ,
22+ success : vi . fn ( ) ,
23+ warn : vi . fn ( ) ,
24+ error : vi . fn ( ) ,
25+ }
26+ const mockSerializeResultJson = vi . fn ( result => JSON . stringify ( result ) )
27+
28+ vi . doMock ( '@socketsecurity/lib/logger' , ( ) => ( {
29+ getDefaultLogger : ( ) => mockLogger ,
30+ } ) )
31+
32+ vi . doMock ( '../../utils/output/result-json.mjs' , ( ) => ( {
33+ serializeResultJson : mockSerializeResultJson ,
34+ } ) )
35+
36+ const { outputListRepos } = await import ( './output-list-repos.mts' )
6137
6238 const result : CResult < SocketSdkSuccessResult < 'listRepositories' > [ 'data' ] > =
6339 createSuccessResult ( {
@@ -74,7 +50,7 @@ describe('outputListRepos', () => {
7450
7551 await outputListRepos ( result , 'json' , 1 , 2 , 'name' , 10 , 'asc' )
7652
77- expect ( mockSerialize ) . toHaveBeenCalledWith ( {
53+ expect ( mockSerializeResultJson ) . toHaveBeenCalledWith ( {
7854 ok : true ,
7955 data : {
8056 data : result . data ,
@@ -85,11 +61,31 @@ describe('outputListRepos', () => {
8561 sort : 'name' ,
8662 } ,
8763 } )
88- expect ( mockLog ) . toHaveBeenCalledWith ( expect . stringContaining ( 'ok' ) )
64+ expect ( mockLogger . log ) . toHaveBeenCalledWith ( expect . stringContaining ( 'ok' ) )
8965 expect ( process . exitCode ) . toBeUndefined ( )
9066 } )
9167
9268 it ( 'outputs error in JSON format' , async ( ) => {
69+ const mockLogger = {
70+ fail : vi . fn ( ) ,
71+ log : vi . fn ( ) ,
72+ info : vi . fn ( ) ,
73+ success : vi . fn ( ) ,
74+ warn : vi . fn ( ) ,
75+ error : vi . fn ( ) ,
76+ }
77+ const mockSerializeResultJson = vi . fn ( result => JSON . stringify ( result ) )
78+
79+ vi . doMock ( '@socketsecurity/lib/logger' , ( ) => ( {
80+ getDefaultLogger : ( ) => mockLogger ,
81+ } ) )
82+
83+ vi . doMock ( '../../utils/output/result-json.mjs' , ( ) => ( {
84+ serializeResultJson : mockSerializeResultJson ,
85+ } ) )
86+
87+ const { outputListRepos } = await import ( './output-list-repos.mts' )
88+
9389 const result : CResult < SocketSdkSuccessResult < 'listRepositories' > [ 'data' ] > =
9490 createErrorResult ( 'Unauthorized' , {
9591 cause : 'Invalid API token' ,
@@ -98,12 +94,38 @@ describe('outputListRepos', () => {
9894
9995 await outputListRepos ( result , 'json' , 1 , null , 'created_at' , 25 , 'desc' )
10096
101- expect ( mockLog ) . toHaveBeenCalled ( )
97+ expect ( mockLogger . log ) . toHaveBeenCalled ( )
10298 expect ( process . exitCode ) . toBe ( 2 )
10399 } )
104100
105101 it ( 'outputs text format with repository table' , async ( ) => {
106- const mockChalkTableFn = vi . mocked ( chalkTable )
102+ const mockLogger = {
103+ fail : vi . fn ( ) ,
104+ log : vi . fn ( ) ,
105+ info : vi . fn ( ) ,
106+ success : vi . fn ( ) ,
107+ warn : vi . fn ( ) ,
108+ error : vi . fn ( ) ,
109+ }
110+ const mockChalkTable = vi . fn (
111+ ( _options , data ) => `Table with ${ data . length } rows` ,
112+ )
113+
114+ vi . doMock ( '@socketsecurity/lib/logger' , ( ) => ( {
115+ getDefaultLogger : ( ) => mockLogger ,
116+ } ) )
117+
118+ vi . doMock ( 'chalk-table' , ( ) => ( {
119+ default : mockChalkTable ,
120+ } ) )
121+
122+ vi . doMock ( 'yoctocolors-cjs' , ( ) => ( {
123+ default : {
124+ magenta : vi . fn ( text => text ) ,
125+ } ,
126+ } ) )
127+
128+ const { outputListRepos } = await import ( './output-list-repos.mts' )
107129
108130 const repos = [
109131 {
@@ -129,10 +151,10 @@ describe('outputListRepos', () => {
129151
130152 await outputListRepos ( result , 'text' , 2 , 3 , 'updated_at' , 50 , 'desc' )
131153
132- expect ( mockLog ) . toHaveBeenCalledWith (
154+ expect ( mockLogger . log ) . toHaveBeenCalledWith (
133155 'Result page: 2, results per page: 50, sorted by: updated_at, direction: desc' ,
134156 )
135- expect ( mockChalkTableFn ) . toHaveBeenCalledWith (
157+ expect ( mockChalkTable ) . toHaveBeenCalledWith (
136158 expect . objectContaining ( {
137159 columns : expect . arrayContaining ( [
138160 expect . objectContaining ( { field : 'id' } ) ,
@@ -144,16 +166,34 @@ describe('outputListRepos', () => {
144166 } ) ,
145167 repos ,
146168 )
147- expect ( mockInfo ) . toHaveBeenCalledWith (
169+ expect ( mockLogger . info ) . toHaveBeenCalledWith (
148170 'This is page 2. Server indicated there are more results available on page 3...' ,
149171 )
150- expect ( mockInfo ) . toHaveBeenCalledWith (
172+ expect ( mockLogger . info ) . toHaveBeenCalledWith (
151173 '(Hint: you can use `socket repository list --page 3`)' ,
152174 )
153175 } )
154176
155177 it ( 'outputs error in text format' , async ( ) => {
156- const mockFailMsg = vi . mocked ( failMsgWithBadge )
178+ const mockLogger = {
179+ fail : vi . fn ( ) ,
180+ log : vi . fn ( ) ,
181+ info : vi . fn ( ) ,
182+ success : vi . fn ( ) ,
183+ warn : vi . fn ( ) ,
184+ error : vi . fn ( ) ,
185+ }
186+ const mockFailMsgWithBadge = vi . fn ( ( msg , cause ) => `${ msg } : ${ cause } ` )
187+
188+ vi . doMock ( '@socketsecurity/lib/logger' , ( ) => ( {
189+ getDefaultLogger : ( ) => mockLogger ,
190+ } ) )
191+
192+ vi . doMock ( '../../utils/error/fail-msg-with-badge.mts' , ( ) => ( {
193+ failMsgWithBadge : mockFailMsgWithBadge ,
194+ } ) )
195+
196+ const { outputListRepos } = await import ( './output-list-repos.mts' )
157197
158198 const result : CResult < SocketSdkSuccessResult < 'listRepositories' > [ 'data' ] > =
159199 createErrorResult ( 'Failed to fetch repositories' , {
@@ -163,15 +203,43 @@ describe('outputListRepos', () => {
163203
164204 await outputListRepos ( result , 'text' , 1 , null , 'name' , 10 , 'asc' )
165205
166- expect ( mockFailMsg ) . toHaveBeenCalledWith (
206+ expect ( mockFailMsgWithBadge ) . toHaveBeenCalledWith (
167207 'Failed to fetch repositories' ,
168208 'Network error' ,
169209 )
170- expect ( mockFail ) . toHaveBeenCalled ( )
210+ expect ( mockLogger . fail ) . toHaveBeenCalled ( )
171211 expect ( process . exitCode ) . toBe ( 1 )
172212 } )
173213
174214 it ( 'shows proper message when on last page' , async ( ) => {
215+ const mockLogger = {
216+ fail : vi . fn ( ) ,
217+ log : vi . fn ( ) ,
218+ info : vi . fn ( ) ,
219+ success : vi . fn ( ) ,
220+ warn : vi . fn ( ) ,
221+ error : vi . fn ( ) ,
222+ }
223+ const mockChalkTable = vi . fn (
224+ ( _options , data ) => `Table with ${ data . length } rows` ,
225+ )
226+
227+ vi . doMock ( '@socketsecurity/lib/logger' , ( ) => ( {
228+ getDefaultLogger : ( ) => mockLogger ,
229+ } ) )
230+
231+ vi . doMock ( 'chalk-table' , ( ) => ( {
232+ default : mockChalkTable ,
233+ } ) )
234+
235+ vi . doMock ( 'yoctocolors-cjs' , ( ) => ( {
236+ default : {
237+ magenta : vi . fn ( text => text ) ,
238+ } ,
239+ } ) )
240+
241+ const { outputListRepos } = await import ( './output-list-repos.mts' )
242+
175243 const result : CResult < SocketSdkSuccessResult < 'listRepositories' > [ 'data' ] > =
176244 createSuccessResult ( {
177245 results : [
@@ -187,12 +255,40 @@ describe('outputListRepos', () => {
187255
188256 await outputListRepos ( result , 'text' , 5 , null , 'name' , 20 , 'asc' )
189257
190- expect ( mockInfo ) . toHaveBeenCalledWith (
258+ expect ( mockLogger . info ) . toHaveBeenCalledWith (
191259 'This is page 5. Server indicated this is the last page with results.' ,
192260 )
193261 } )
194262
195263 it ( 'shows proper message when displaying entire list' , async ( ) => {
264+ const mockLogger = {
265+ fail : vi . fn ( ) ,
266+ log : vi . fn ( ) ,
267+ info : vi . fn ( ) ,
268+ success : vi . fn ( ) ,
269+ warn : vi . fn ( ) ,
270+ error : vi . fn ( ) ,
271+ }
272+ const mockChalkTable = vi . fn (
273+ ( _options , data ) => `Table with ${ data . length } rows` ,
274+ )
275+
276+ vi . doMock ( '@socketsecurity/lib/logger' , ( ) => ( {
277+ getDefaultLogger : ( ) => mockLogger ,
278+ } ) )
279+
280+ vi . doMock ( 'chalk-table' , ( ) => ( {
281+ default : mockChalkTable ,
282+ } ) )
283+
284+ vi . doMock ( 'yoctocolors-cjs' , ( ) => ( {
285+ default : {
286+ magenta : vi . fn ( text => text ) ,
287+ } ,
288+ } ) )
289+
290+ const { outputListRepos } = await import ( './output-list-repos.mts' )
291+
196292 const result : CResult < SocketSdkSuccessResult < 'listRepositories' > [ 'data' ] > =
197293 createSuccessResult ( {
198294 results : [ ] ,
@@ -208,13 +304,39 @@ describe('outputListRepos', () => {
208304 'asc' ,
209305 )
210306
211- expect ( mockInfo ) . toHaveBeenCalledWith (
307+ expect ( mockLogger . info ) . toHaveBeenCalledWith (
212308 'This should be the entire list available on the server.' ,
213309 )
214310 } )
215311
216312 it ( 'handles empty repository list' , async ( ) => {
217- const mockChalkTableFn = vi . mocked ( chalkTable )
313+ const mockLogger = {
314+ fail : vi . fn ( ) ,
315+ log : vi . fn ( ) ,
316+ info : vi . fn ( ) ,
317+ success : vi . fn ( ) ,
318+ warn : vi . fn ( ) ,
319+ error : vi . fn ( ) ,
320+ }
321+ const mockChalkTable = vi . fn (
322+ ( _options , data ) => `Table with ${ data . length } rows` ,
323+ )
324+
325+ vi . doMock ( '@socketsecurity/lib/logger' , ( ) => ( {
326+ getDefaultLogger : ( ) => mockLogger ,
327+ } ) )
328+
329+ vi . doMock ( 'chalk-table' , ( ) => ( {
330+ default : mockChalkTable ,
331+ } ) )
332+
333+ vi . doMock ( 'yoctocolors-cjs' , ( ) => ( {
334+ default : {
335+ magenta : vi . fn ( text => text ) ,
336+ } ,
337+ } ) )
338+
339+ const { outputListRepos } = await import ( './output-list-repos.mts' )
218340
219341 const result : CResult < SocketSdkSuccessResult < 'listRepositories' > [ 'data' ] > =
220342 createSuccessResult ( {
@@ -223,10 +345,30 @@ describe('outputListRepos', () => {
223345
224346 await outputListRepos ( result , 'text' , 1 , null , 'name' , 10 , 'desc' )
225347
226- expect ( mockChalkTableFn ) . toHaveBeenCalledWith ( expect . any ( Object ) , [ ] )
348+ expect ( mockChalkTable ) . toHaveBeenCalledWith ( expect . any ( Object ) , [ ] )
227349 } )
228350
229351 it ( 'sets default exit code when code is undefined' , async ( ) => {
352+ const mockLogger = {
353+ fail : vi . fn ( ) ,
354+ log : vi . fn ( ) ,
355+ info : vi . fn ( ) ,
356+ success : vi . fn ( ) ,
357+ warn : vi . fn ( ) ,
358+ error : vi . fn ( ) ,
359+ }
360+ const mockSerializeResultJson = vi . fn ( result => JSON . stringify ( result ) )
361+
362+ vi . doMock ( '@socketsecurity/lib/logger' , ( ) => ( {
363+ getDefaultLogger : ( ) => mockLogger ,
364+ } ) )
365+
366+ vi . doMock ( '../../utils/output/result-json.mjs' , ( ) => ( {
367+ serializeResultJson : mockSerializeResultJson ,
368+ } ) )
369+
370+ const { outputListRepos } = await import ( './output-list-repos.mts' )
371+
230372 const result : CResult < SocketSdkSuccessResult < 'listRepositories' > [ 'data' ] > =
231373 createErrorResult ( 'Error without code' )
232374
0 commit comments