1+ import * as fs from 'fs' ;
2+ import * as path from 'path' ;
3+
4+ import { beforeEach , afterEach , describe , expect , it , vi } from 'vitest' ;
5+
6+ import { getProjectConfigFile } from '../../src/settings/config.js' ;
7+ import { getProjectSettingsDir } from '../../src/settings/settings.js' ;
8+
9+ // Mock fs module
10+ vi . mock ( 'fs' , ( ) => ( {
11+ existsSync : vi . fn ( ) ,
12+ mkdirSync : vi . fn ( ) ,
13+ statSync : vi . fn ( ) ,
14+ } ) ) ;
15+
16+ // Mock path module
17+ vi . mock ( 'path' , async ( importOriginal ) => {
18+ const actual = await importOriginal ( ) ;
19+ return {
20+ ...actual ,
21+ parse : vi . fn ( ) ,
22+ } ;
23+ } ) ;
24+
25+ // Only mock specific functions from settings.js
26+ vi . mock ( '../../src/settings/settings.js' , async ( importOriginal ) => {
27+ const actual = await importOriginal ( ) ;
28+ return {
29+ ...actual ,
30+ getProjectSettingsDir : vi . fn ( ) ,
31+ } ;
32+ } ) ;
33+
34+ describe ( 'Project Config File' , ( ) => {
35+ const mockCwd = '/mock/project/dir' ;
36+ const mockProjectDir = path . join ( mockCwd , '.mycoder' ) ;
37+ const expectedConfigFile = path . join ( mockProjectDir , 'config.json' ) ;
38+
39+ beforeEach ( ( ) => {
40+ // Reset mocks
41+ vi . resetAllMocks ( ) ;
42+
43+ // Mock process.cwd()
44+ vi . spyOn ( process , 'cwd' ) . mockReturnValue ( mockCwd ) ;
45+
46+ // Mock path.parse
47+ vi . mocked ( path . parse ) . mockReturnValue ( {
48+ root : '/' ,
49+ dir : '/mock' ,
50+ base : 'dir' ,
51+ name : 'dir' ,
52+ ext : '' ,
53+ } ) ;
54+
55+ // Default mock for existsSync
56+ vi . mocked ( fs . existsSync ) . mockReturnValue ( false ) ;
57+
58+ // Default mock for statSync
59+ vi . mocked ( fs . statSync ) . mockReturnValue ( {
60+ isDirectory : ( ) => true ,
61+ } as unknown as fs . Stats ) ;
62+ } ) ;
63+
64+ afterEach ( ( ) => {
65+ vi . resetAllMocks ( ) ;
66+ } ) ;
67+
68+ it ( 'should return project config file path in current directory' , ( ) => {
69+ // Mock getProjectSettingsDir to return the project dir
70+ vi . mocked ( getProjectSettingsDir ) . mockReturnValue ( mockProjectDir ) ;
71+
72+ const result = getProjectConfigFile ( ) ;
73+
74+ expect ( result ) . toBe ( expectedConfigFile ) ;
75+ } ) ;
76+
77+ it ( 'should create project directory if it does not exist' , ( ) => {
78+ // Mock getProjectSettingsDir to return the project dir
79+ vi . mocked ( getProjectSettingsDir ) . mockReturnValue ( mockProjectDir ) ;
80+
81+ // Mock directory does not exist
82+ vi . mocked ( fs . existsSync ) . mockReturnValue ( false ) ;
83+
84+ getProjectConfigFile ( ) ;
85+
86+ // Verify directory creation was attempted
87+ expect ( fs . mkdirSync ) . toHaveBeenCalledWith ( mockProjectDir , { recursive : true } ) ;
88+ } ) ;
89+
90+ it ( 'should not create project directory if it already exists' , ( ) => {
91+ // Mock getProjectSettingsDir to return the project dir
92+ vi . mocked ( getProjectSettingsDir ) . mockReturnValue ( mockProjectDir ) ;
93+
94+ // Mock directory already exists
95+ vi . mocked ( fs . existsSync ) . mockReturnValue ( true ) ;
96+
97+ getProjectConfigFile ( ) ;
98+
99+ // Verify directory creation was not attempted
100+ expect ( fs . mkdirSync ) . not . toHaveBeenCalled ( ) ;
101+ } ) ;
102+
103+ it ( 'should return empty string if project directory cannot be determined' , ( ) => {
104+ // Mock getProjectSettingsDir to return empty string (error case)
105+ vi . mocked ( getProjectSettingsDir ) . mockReturnValue ( '' ) ;
106+
107+ const result = getProjectConfigFile ( ) ;
108+
109+ expect ( result ) . toBe ( '' ) ;
110+ } ) ;
111+ } ) ;
0 commit comments