Skip to content

Commit c5e6c77

Browse files
committed
test: fix mock constructor issues and convert output-list-repos to vi.doMock()
Fixes three test files that were failing after @socketsecurity/lib update: 1. output-list-repos.test.mts: Convert from vi.mock() to vi.doMock() pattern - Converts all 8 tests to use dynamic imports with vi.resetModules() - Fixes logger mocking issues caused by hoisted vi.mock() 2. config.test.mts: Fix constructor mock using arrow function - Change vi.fn().mockImplementation(() => {}) to vi.fn(function() {}) - Allows proper use of 'new NpmConfig()' constructor 3. providers.test.mts: Fix Gitlab constructor mock - Same arrow function → regular function fix - Enables 'new Gitlab()' to work correctly All 2757 tests now passing locally.
1 parent 4252641 commit c5e6c77

File tree

3 files changed

+226
-76
lines changed

3 files changed

+226
-76
lines changed

packages/cli/src/commands/repository/output-list-repos.test.mts

Lines changed: 202 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,39 @@
1-
import chalkTable from 'chalk-table'
21
import { beforeEach, describe, expect, it, vi } from 'vitest'
32

4-
import { outputListRepos } from './output-list-repos.mts'
53
import {
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

128
import type { CResult } from '../../types.mts'
139
import 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-
5311
describe('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

Comments
 (0)