1- import { commands , extensions , window , workspace , type ExtensionContext , type WorkspaceConfiguration } from "vscode"
1+ import * as vscode from "vscode"
22import { activate } from "../src/extension"
33
4- // Define the mock workspace type
5- type MockWorkspace = {
6- workspaceFolders : { uri : { fsPath : string } ; name : string ; index : number } [ ] | undefined
7- getConfiguration : jest . Mock
8- }
9-
10- jest . mock ( "vscode" , ( ) => {
11- const original = jest . requireActual ( "vscode" )
12-
13- // Create mock workspace inside jest.mock
14- const mockWorkspace : MockWorkspace = {
15- workspaceFolders : [ { uri : { fsPath : "/test/workspace" } , name : "test" , index : 0 } ] ,
16- getConfiguration : jest . fn ( ) ,
17- }
18-
19- return {
20- ...original ,
21- workspace : mockWorkspace ,
22- }
23- } )
24-
25- // Get the mocked workspace
26- const mockWorkspace = workspace as unknown as MockWorkspace
4+ jest . mock ( "vscode" )
275
286describe ( "Configuration Handling" , ( ) => {
29- let mockContext : ExtensionContext
30- let registeredCommands : Map < string , Function >
7+ let mockContext : any
318 let configGetMock : jest . Mock
329
3310 beforeEach ( ( ) => {
3411 jest . clearAllMocks ( )
35- registeredCommands = new Map ( )
36-
37- // Reset workspace folders
38- mockWorkspace . workspaceFolders = [ { uri : { fsPath : "/test/workspace" } , name : "test" , index : 0 } ]
39-
40- // Create a trackable mock for configuration.get
41- configGetMock = jest . fn ( )
42-
43- // Mock command registration
44- jest . spyOn ( commands , "registerCommand" ) . mockImplementation ( ( commandId : string , callback : Function ) => {
45- registeredCommands . set ( commandId , callback )
46- return { dispose : jest . fn ( ) }
47- } )
4812
4913 // Mock context
5014 mockContext = {
@@ -54,152 +18,169 @@ describe("Configuration Handling", () => {
5418 store : jest . fn ( ) ,
5519 delete : jest . fn ( ) ,
5620 } ,
57- } as unknown as ExtensionContext
21+ }
22+
23+ // Mock workspace configuration
24+ configGetMock = jest . fn ( )
25+ ; ( vscode . workspace . getConfiguration as jest . Mock ) . mockImplementation ( ( section ?: string ) => {
26+ if ( section === "diffCommit" ) {
27+ return {
28+ get : configGetMock ,
29+ }
30+ }
31+ return {
32+ get : jest . fn ( ) ,
33+ }
34+ } )
35+
36+ // Mock workspace event handlers
37+ ; ( vscode . workspace . onDidSaveTextDocument as jest . Mock ) . mockReturnValue ( { dispose : jest . fn ( ) } )
38+ ; ( vscode . workspace . onDidCloseTextDocument as jest . Mock ) . mockReturnValue ( { dispose : jest . fn ( ) } )
5839
5940 // Mock Git extension
6041 const mockGitRepo = {
61- diff : jest . fn ( ) . mockResolvedValue ( "test diff" ) ,
42+ state : {
43+ HEAD : {
44+ name : "main" ,
45+ } ,
46+ } ,
6247 inputBox : { value : "" } ,
48+ diff : jest . fn ( ) . mockResolvedValue ( "test diff" ) ,
6349 }
64- const mockGitAPI = { repositories : [ mockGitRepo ] }
50+
6551 const mockGitExtension = {
6652 exports : {
67- getAPI : jest . fn ( ) . mockReturnValue ( mockGitAPI ) ,
53+ getAPI : ( version : number ) => ( {
54+ repositories : [ mockGitRepo ] ,
55+ } ) ,
6856 } ,
6957 }
70- jest . spyOn ( extensions , "getExtension" ) . mockReturnValue ( mockGitExtension as any )
7158
72- // Reset workspace configuration mock
73- const mockConfig : Partial < WorkspaceConfiguration > = {
74- get : configGetMock ,
75- }
76- mockWorkspace . getConfiguration . mockReturnValue ( mockConfig )
59+ ; ( vscode . extensions . getExtension as jest . Mock ) . mockImplementation ( ( extensionId : string ) => {
60+ if ( extensionId === "vscode.git" ) {
61+ return mockGitExtension
62+ }
63+ return undefined
64+ } )
65+
66+ // Mock workspace folders
67+ ; ( vscode . workspace . workspaceFolders as any ) = [ { uri : { fsPath : "/test/workspace" } } ]
7768 } )
7869
79- it ( "should use configured values when available" , async ( ) => {
80- // Mock configuration values
70+ test ( "should use configured values when available" , async ( ) => {
8171 configGetMock . mockImplementation ( ( key : string ) => {
82- switch ( key ) {
83- case "model" :
84- return "claude-3-haiku-20240307"
85- case "maxTokens" :
86- return 2048
87- case "temperature" :
88- return 0.7
89- default :
90- return undefined
72+ const config : { [ key : string ] : any } = {
73+ model : "claude-3" ,
74+ maxTokens : 2000 ,
75+ temperature : 0.5 ,
76+ allowedTypes : [ "feat" , "fix" ] ,
77+ customInstructions : "custom instructions" ,
9178 }
79+ return config [ key ]
9280 } )
9381
9482 await activate ( mockContext )
95- const generateCommitMessage = registeredCommands . get ( "diffCommit.generateCommitMessage" )
96- if ( generateCommitMessage ) {
97- await generateCommitMessage ( )
98- }
83+ await vscode . commands . executeCommand ( "diffCommit.generateCommitMessage" )
9984
100- expect ( mockWorkspace . getConfiguration ) . toHaveBeenCalledWith ( "diffCommit" )
10185 expect ( configGetMock ) . toHaveBeenCalledWith ( "model" )
10286 expect ( configGetMock ) . toHaveBeenCalledWith ( "maxTokens" )
10387 expect ( configGetMock ) . toHaveBeenCalledWith ( "temperature" )
88+ expect ( configGetMock ) . toHaveBeenCalledWith ( "allowedTypes" )
89+ expect ( configGetMock ) . toHaveBeenCalledWith ( "customInstructions" )
10490 } )
10591
106- it ( "should use default values when configuration is missing" , async ( ) => {
107- // Mock all configuration values as undefined
92+ test ( "should use default values when configuration is missing" , async ( ) => {
10893 configGetMock . mockReturnValue ( undefined )
10994
11095 await activate ( mockContext )
111- const generateCommitMessage = registeredCommands . get ( "diffCommit.generateCommitMessage" )
112- if ( generateCommitMessage ) {
113- await generateCommitMessage ( )
114- }
96+ await vscode . commands . executeCommand ( "diffCommit.generateCommitMessage" )
11597
116- expect ( mockWorkspace . getConfiguration ) . toHaveBeenCalledWith ( "diffCommit" )
117- expect ( configGetMock ) . toHaveBeenCalledWith ( "model" )
118- expect ( configGetMock ) . toHaveBeenCalledWith ( "maxTokens" )
119- expect ( configGetMock ) . toHaveBeenCalledWith ( "temperature" )
98+ expect ( configGetMock ) . toHaveBeenCalled ( )
12099 } )
121100
122- it ( "should handle custom instructions when provided" , async ( ) => {
123- // Mock custom instructions
101+ test ( "should handle custom instructions when provided" , async ( ) => {
124102 configGetMock . mockImplementation ( ( key : string ) => {
125- if ( key === "customInstructions" ) return "Custom commit guidelines"
103+ if ( key === "customInstructions" ) {
104+ return "custom instructions"
105+ }
126106 return undefined
127107 } )
128108
129109 await activate ( mockContext )
130- const generateCommitMessage = registeredCommands . get ( "diffCommit.generateCommitMessage" )
131- if ( generateCommitMessage ) {
132- await generateCommitMessage ( )
133- }
110+ await vscode . commands . executeCommand ( "diffCommit.generateCommitMessage" )
134111
135- expect ( mockWorkspace . getConfiguration ) . toHaveBeenCalledWith ( "diffCommit" )
136112 expect ( configGetMock ) . toHaveBeenCalledWith ( "customInstructions" )
137113 } )
138114
139- it ( "should handle missing workspace folder" , async ( ) => {
140- // Mock missing workspace folder
141- mockWorkspace . workspaceFolders = undefined
115+ test ( "should handle missing workspace folder" , async ( ) => {
116+ ; ( vscode . workspace . workspaceFolders as any ) = undefined
142117
143118 await activate ( mockContext )
144- const generateCommitMessage = registeredCommands . get ( "diffCommit.generateCommitMessage" )
145- if ( generateCommitMessage ) {
146- await generateCommitMessage ( )
147- }
119+ await vscode . commands . executeCommand ( "diffCommit.generateCommitMessage" )
148120
149- expect ( window . showErrorMessage ) . toHaveBeenCalledWith ( "No workspace folder found" )
121+ expect ( vscode . window . showErrorMessage ) . toHaveBeenCalledWith ( "No workspace folder found" )
150122 } )
151123
152- it ( "should handle missing Git extension" , async ( ) => {
153- // Mock missing Git extension
154- jest . spyOn ( extensions , "getExtension" ) . mockReturnValue ( undefined )
124+ test ( "should handle missing Git extension" , async ( ) => {
125+ ; ( vscode . extensions . getExtension as jest . Mock ) . mockReturnValue ( undefined )
155126
156127 await activate ( mockContext )
157- const generateCommitMessage = registeredCommands . get ( "diffCommit.generateCommitMessage" )
158- if ( generateCommitMessage ) {
159- await generateCommitMessage ( )
160- }
128+ await vscode . commands . executeCommand ( "diffCommit.generateCommitMessage" )
161129
162- expect ( window . showErrorMessage ) . toHaveBeenCalledWith ( "Git extension not found" )
130+ expect ( vscode . window . showErrorMessage ) . toHaveBeenCalledWith ( "Git extension not found" )
163131 } )
164132
165- it ( "should handle empty Git repositories" , async ( ) => {
166- // Mock Git extension with no repositories
133+ test ( "should handle empty Git repositories" , async ( ) => {
167134 const mockGitExtension = {
168135 exports : {
169- getAPI : jest . fn ( ) . mockReturnValue ( { repositories : [ ] } ) ,
136+ getAPI : ( version : number ) => ( {
137+ repositories : [ ] ,
138+ } ) ,
170139 } ,
171140 }
172- jest . spyOn ( extensions , "getExtension" ) . mockReturnValue ( mockGitExtension as any )
141+
142+ ; ( vscode . extensions . getExtension as jest . Mock ) . mockImplementation ( ( extensionId : string ) => {
143+ if ( extensionId === "vscode.git" ) {
144+ return mockGitExtension
145+ }
146+ return undefined
147+ } )
173148
174149 await activate ( mockContext )
175- const generateCommitMessage = registeredCommands . get ( "diffCommit.generateCommitMessage" )
176- if ( generateCommitMessage ) {
177- await generateCommitMessage ( )
178- }
150+ await vscode . commands . executeCommand ( "diffCommit.generateCommitMessage" )
179151
180- expect ( window . showErrorMessage ) . toHaveBeenCalledWith ( "No Git repository found" )
152+ expect ( vscode . window . showErrorMessage ) . toHaveBeenCalledWith ( "No Git repository found" )
181153 } )
182154
183- it ( "should handle no Git changes" , async ( ) => {
184- // Mock Git repo with no changes
155+ test ( "should handle no Git changes" , async ( ) => {
185156 const mockGitRepo = {
186- diff : jest . fn ( ) . mockResolvedValue ( "" ) ,
157+ state : {
158+ HEAD : {
159+ name : "main" ,
160+ } ,
161+ } ,
187162 inputBox : { value : "" } ,
163+ diff : jest . fn ( ) . mockResolvedValue ( "" ) ,
188164 }
189- const mockGitAPI = { repositories : [ mockGitRepo ] }
165+
190166 const mockGitExtension = {
191167 exports : {
192- getAPI : jest . fn ( ) . mockReturnValue ( mockGitAPI ) ,
168+ getAPI : ( version : number ) => ( {
169+ repositories : [ mockGitRepo ] ,
170+ } ) ,
193171 } ,
194172 }
195- jest . spyOn ( extensions , "getExtension" ) . mockReturnValue ( mockGitExtension as any )
173+
174+ ; ( vscode . extensions . getExtension as jest . Mock ) . mockImplementation ( ( extensionId : string ) => {
175+ if ( extensionId === "vscode.git" ) {
176+ return mockGitExtension
177+ }
178+ return undefined
179+ } )
196180
197181 await activate ( mockContext )
198- const generateCommitMessage = registeredCommands . get ( "diffCommit.generateCommitMessage" )
199- if ( generateCommitMessage ) {
200- await generateCommitMessage ( )
201- }
182+ await vscode . commands . executeCommand ( "diffCommit.generateCommitMessage" )
202183
203- expect ( window . showErrorMessage ) . toHaveBeenCalledWith ( "No changes detected" )
184+ expect ( vscode . window . showErrorMessage ) . toHaveBeenCalledWith ( "No changes detected" )
204185 } )
205186} )
0 commit comments