@@ -48,9 +48,53 @@ vi.mock('../../../../src/env/socket-cli-git-user-email.mts', () => mockGitEmail)
4848const mockGitUser = vi . hoisted ( ( ) => ( { SOCKET_CLI_GIT_USER_NAME : '' } ) )
4949vi . mock ( '../../../../src/env/socket-cli-git-user-name.mts' , ( ) => mockGitUser )
5050
51+ // Mock GITHUB_REPOSITORY.
52+ const mockGithubRepo = vi . hoisted ( ( ) => ( { GITHUB_REPOSITORY : '' } ) )
53+ vi . mock ( '../../../../src/env/github-repository.mts' , ( ) => mockGithubRepo )
54+
55+ // Mock git operations.
56+ const mockGetBaseBranch = vi . hoisted ( ( ) =>
57+ vi . fn ( ) . mockResolvedValue ( 'main' ) ,
58+ )
59+ const mockGetRepoInfo = vi . hoisted ( ( ) =>
60+ vi . fn ( ) . mockResolvedValue ( { owner : 'test-owner' , repo : 'test-repo' } ) ,
61+ )
62+ vi . mock ( '../../../../src/utils/git/operations.mts' , ( ) => ( {
63+ getBaseBranch : mockGetBaseBranch ,
64+ getRepoInfo : mockGetRepoInfo ,
65+ } ) )
66+
67+ // Mock pull-request functions.
68+ const mockGetSocketFixPrs = vi . hoisted ( ( ) => vi . fn ( ) . mockResolvedValue ( [ ] ) )
69+ vi . mock ( '../../../../src/commands/fix/pull-request.mts' , ( ) => ( {
70+ getSocketFixPrs : mockGetSocketFixPrs ,
71+ } ) )
72+
73+ // Mock logger.
74+ const mockLogger = vi . hoisted ( ( ) => ( {
75+ error : vi . fn ( ) ,
76+ fail : vi . fn ( ) ,
77+ info : vi . fn ( ) ,
78+ log : vi . fn ( ) ,
79+ success : vi . fn ( ) ,
80+ warn : vi . fn ( ) ,
81+ } ) )
82+ vi . mock ( '@socketsecurity/lib/logger' , ( ) => ( {
83+ getDefaultLogger : ( ) => mockLogger ,
84+ } ) )
85+
86+ // Mock debug.
87+ const mockDebug = vi . hoisted ( ( ) => vi . fn ( ) )
88+ const mockIsDebug = vi . hoisted ( ( ) => vi . fn ( ( ) => false ) )
89+ vi . mock ( '@socketsecurity/lib/debug' , ( ) => ( {
90+ debug : mockDebug ,
91+ isDebug : mockIsDebug ,
92+ } ) )
93+
5194import {
5295 checkCiEnvVars ,
5396 getCiEnvInstructions ,
97+ getFixEnv ,
5498} from '../../../../src/commands/fix/env-helpers.mts'
5599
56100describe ( 'env-helpers' , ( ) => {
@@ -60,6 +104,11 @@ describe('env-helpers', () => {
60104 mockGetSocketCliGithubToken . mockReturnValue ( undefined )
61105 mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = ''
62106 mockGitUser . SOCKET_CLI_GIT_USER_NAME = ''
107+ mockGithubRepo . GITHUB_REPOSITORY = ''
108+ mockGetBaseBranch . mockResolvedValue ( 'main' )
109+ mockGetRepoInfo . mockResolvedValue ( { owner : 'test-owner' , repo : 'test-repo' } )
110+ mockGetSocketFixPrs . mockResolvedValue ( [ ] )
111+ mockIsDebug . mockReturnValue ( false )
63112 } )
64113
65114 describe ( 'getCiEnvInstructions' , ( ) => {
@@ -159,4 +208,156 @@ describe('env-helpers', () => {
159208 expect ( result . present ) . toHaveLength ( 4 )
160209 } )
161210 } )
211+
212+ describe ( 'getFixEnv' , ( ) => {
213+ it ( 'should return basic fix env when not in CI' , async ( ) => {
214+ mockGetCI . mockReturnValue ( false )
215+
216+ const result = await getFixEnv ( )
217+
218+ expect ( result . isCi ) . toBe ( false )
219+ expect ( result . baseBranch ) . toBe ( 'main' )
220+ expect ( result . prs ) . toEqual ( [ ] )
221+ expect ( result . repoInfo ) . toEqual ( { owner : 'test-owner' , repo : 'test-repo' } )
222+ } )
223+
224+ it ( 'should return isCi true when all CI vars are set' , async ( ) => {
225+ mockGetCI . mockReturnValue ( true )
226+ mockGetSocketCliGithubToken . mockReturnValue ( 'ghp_test_token' )
227+ mockGitUser . SOCKET_CLI_GIT_USER_NAME = 'test-user'
228+ mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = 'test@example.com'
229+ mockGithubRepo . GITHUB_REPOSITORY = 'owner/repo'
230+
231+ const result = await getFixEnv ( )
232+
233+ expect ( result . isCi ) . toBe ( true )
234+ expect ( result . gitUser ) . toBe ( 'test-user' )
235+ expect ( result . gitEmail ) . toBe ( 'test@example.com' )
236+ expect ( result . githubToken ) . toBe ( 'ghp_test_token' )
237+ } )
238+
239+ it ( 'should use GITHUB_REPOSITORY env var for repoInfo in CI' , async ( ) => {
240+ mockGetCI . mockReturnValue ( true )
241+ mockGetSocketCliGithubToken . mockReturnValue ( 'ghp_test_token' )
242+ mockGitUser . SOCKET_CLI_GIT_USER_NAME = 'test-user'
243+ mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = 'test@example.com'
244+ mockGithubRepo . GITHUB_REPOSITORY = 'my-owner/my-repo'
245+
246+ const result = await getFixEnv ( )
247+
248+ expect ( result . repoInfo ) . toEqual ( { owner : 'my-owner' , repo : 'my-repo' } )
249+ // Should not call getRepoInfo when GITHUB_REPOSITORY is valid.
250+ expect ( mockGetRepoInfo ) . not . toHaveBeenCalled ( )
251+ } )
252+
253+ it ( 'should fall back to getRepoInfo when GITHUB_REPOSITORY is invalid' , async ( ) => {
254+ mockGetCI . mockReturnValue ( true )
255+ mockGetSocketCliGithubToken . mockReturnValue ( 'ghp_test_token' )
256+ mockGitUser . SOCKET_CLI_GIT_USER_NAME = 'test-user'
257+ mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = 'test@example.com'
258+ // Invalid GITHUB_REPOSITORY (no slash).
259+ mockGithubRepo . GITHUB_REPOSITORY = 'invalid-repo'
260+
261+ const result = await getFixEnv ( )
262+
263+ expect ( result . repoInfo ) . toEqual ( { owner : 'test-owner' , repo : 'test-repo' } )
264+ expect ( mockGetRepoInfo ) . toHaveBeenCalled ( )
265+ } )
266+
267+ it ( 'should fall back to getRepoInfo when GITHUB_REPOSITORY is empty' , async ( ) => {
268+ mockGetCI . mockReturnValue ( true )
269+ mockGetSocketCliGithubToken . mockReturnValue ( 'ghp_test_token' )
270+ mockGitUser . SOCKET_CLI_GIT_USER_NAME = 'test-user'
271+ mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = 'test@example.com'
272+ mockGithubRepo . GITHUB_REPOSITORY = ''
273+
274+ const result = await getFixEnv ( )
275+
276+ expect ( mockGetRepoInfo ) . toHaveBeenCalled ( )
277+ } )
278+
279+ it ( 'should warn when CI is set but other vars are missing' , async ( ) => {
280+ mockGetCI . mockReturnValue ( true )
281+ // Missing: githubToken, gitUser, gitEmail.
282+ mockGetSocketCliGithubToken . mockReturnValue ( undefined )
283+ mockGitUser . SOCKET_CLI_GIT_USER_NAME = ''
284+ mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = ''
285+
286+ await getFixEnv ( )
287+
288+ expect ( mockLogger . warn ) . toHaveBeenCalledWith (
289+ expect . stringContaining ( 'CI mode detected' ) ,
290+ )
291+ expect ( mockLogger . warn ) . toHaveBeenCalledWith (
292+ expect . stringContaining ( 'Missing:' ) ,
293+ )
294+ } )
295+
296+ it ( 'should not warn when not in CI' , async ( ) => {
297+ mockGetCI . mockReturnValue ( false )
298+
299+ await getFixEnv ( )
300+
301+ expect ( mockLogger . warn ) . not . toHaveBeenCalled ( )
302+ } )
303+
304+ it ( 'should log debug message when not in CI but some vars are set' , async ( ) => {
305+ mockGetCI . mockReturnValue ( false )
306+ mockGetSocketCliGithubToken . mockReturnValue ( 'ghp_test_token' )
307+ mockIsDebug . mockReturnValue ( true )
308+
309+ await getFixEnv ( )
310+
311+ expect ( mockDebug ) . toHaveBeenCalledWith (
312+ expect . stringContaining ( 'isCi is false' ) ,
313+ )
314+ } )
315+
316+ it ( 'should fetch PRs when in CI mode' , async ( ) => {
317+ mockGetCI . mockReturnValue ( true )
318+ mockGetSocketCliGithubToken . mockReturnValue ( 'ghp_test_token' )
319+ mockGitUser . SOCKET_CLI_GIT_USER_NAME = 'test-user'
320+ mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = 'test@example.com'
321+ mockGithubRepo . GITHUB_REPOSITORY = 'owner/repo'
322+ mockGetSocketFixPrs . mockResolvedValue ( [
323+ { number : 1 , title : 'Fix PR' } ,
324+ ] )
325+
326+ const result = await getFixEnv ( )
327+
328+ expect ( mockGetSocketFixPrs ) . toHaveBeenCalledWith ( 'owner' , 'repo' , {
329+ author : 'test-user' ,
330+ states : 'all' ,
331+ } )
332+ expect ( result . prs ) . toEqual ( [ { number : 1 , title : 'Fix PR' } ] )
333+ } )
334+
335+ it ( 'should not fetch PRs when not in CI mode' , async ( ) => {
336+ mockGetCI . mockReturnValue ( false )
337+
338+ await getFixEnv ( )
339+
340+ expect ( mockGetSocketFixPrs ) . not . toHaveBeenCalled ( )
341+ } )
342+
343+ it ( 'should return gitEmail and gitUser from env vars' , async ( ) => {
344+ mockGitUser . SOCKET_CLI_GIT_USER_NAME = 'custom-user'
345+ mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = 'custom@example.com'
346+
347+ const result = await getFixEnv ( )
348+
349+ expect ( result . gitUser ) . toBe ( 'custom-user' )
350+ expect ( result . gitEmail ) . toBe ( 'custom@example.com' )
351+ } )
352+
353+ it ( 'should return undefined for gitEmail and gitUser when not set' , async ( ) => {
354+ mockGitUser . SOCKET_CLI_GIT_USER_NAME = ''
355+ mockGitEmail . SOCKET_CLI_GIT_USER_EMAIL = ''
356+
357+ const result = await getFixEnv ( )
358+
359+ expect ( result . gitUser ) . toBe ( '' )
360+ expect ( result . gitEmail ) . toBe ( '' )
361+ } )
362+ } )
162363} )
0 commit comments