44 *--------------------------------------------------------------------------------------------*/
55
66import * as vscode from 'vscode' ;
7+ import * as fs from 'fs' ;
8+ import * as os from 'os' ;
9+ import * as path from 'path' ;
710import { SinonSandbox , createSandbox } from 'sinon' ;
811import { default as assert } from 'assert' ;
912
@@ -141,28 +144,38 @@ describe('RepositoriesManager', function () {
141144 } ) ;
142145
143146 describe ( 'removeMissingRepos' , function ( ) {
147+ let tmpDir : string ;
148+
149+ beforeEach ( function ( ) {
150+ tmpDir = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , 'vscode-pr-test-' ) ) ;
151+ } ) ;
152+
153+ afterEach ( function ( ) {
154+ fs . rmSync ( tmpDir , { recursive : true , force : true } ) ;
155+ } ) ;
156+
144157 it ( 'removes folder managers whose root URIs no longer exist on disk' , async function ( ) {
158+ const existingDir = path . join ( tmpDir , 'existing-repo' ) ;
159+ fs . mkdirSync ( existingDir ) ;
160+
161+ const removedDir = path . join ( tmpDir , 'removed-worktree' ) ;
162+ fs . mkdirSync ( removedDir ) ;
163+
145164 const repo1 = new MockRepository ( ) ;
146- repo1 . rootUri = vscode . Uri . file ( '/existing-repo' ) ;
165+ repo1 . rootUri = vscode . Uri . file ( existingDir ) ;
147166 repo1 . addRemote ( 'origin' , 'git@github.com:aaa/bbb' ) ;
148167
149168 const repo2 = new MockRepository ( ) ;
150- repo2 . rootUri = vscode . Uri . file ( '/removed-worktree' ) ;
169+ repo2 . rootUri = vscode . Uri . file ( removedDir ) ;
151170 repo2 . addRemote ( 'origin' , 'git@github.com:aaa/bbb' ) ;
152171
153172 reposManager . insertFolderManager ( new FolderRepositoryManager ( 0 , context , repo1 , telemetry , new GitApiImpl ( reposManager ) , credentialStore , createPrHelper , mockThemeWatcher ) ) ;
154173 reposManager . insertFolderManager ( new FolderRepositoryManager ( 1 , context , repo2 , telemetry , new GitApiImpl ( reposManager ) , credentialStore , createPrHelper , mockThemeWatcher ) ) ;
155174
156175 assert . strictEqual ( reposManager . folderManagers . length , 2 ) ;
157176
158- // Stub vscode.workspace.fs.stat to succeed for repo1 and fail for repo2
159- const statStub = sinon . stub ( vscode . workspace . fs , 'stat' ) ;
160- statStub . callsFake ( async ( uri : vscode . Uri ) => {
161- if ( uri . fsPath === repo2 . rootUri . fsPath ) {
162- throw vscode . FileSystemError . FileNotFound ( uri ) ;
163- }
164- return { type : vscode . FileType . Directory , ctime : 0 , mtime : 0 , size : 0 } ;
165- } ) ;
177+ // Remove the directory to simulate worktree deletion
178+ fs . rmSync ( removedDir , { recursive : true } ) ;
166179
167180 await reposManager . removeMissingRepos ( ) ;
168181
@@ -171,20 +184,23 @@ describe('RepositoriesManager', function () {
171184 } ) ;
172185
173186 it ( 'keeps all repos when all paths exist on disk' , async function ( ) {
187+ const dir1 = path . join ( tmpDir , 'repo1' ) ;
188+ fs . mkdirSync ( dir1 ) ;
189+
190+ const dir2 = path . join ( tmpDir , 'repo2' ) ;
191+ fs . mkdirSync ( dir2 ) ;
192+
174193 const repo1 = new MockRepository ( ) ;
175- repo1 . rootUri = vscode . Uri . file ( '/repo1' ) ;
194+ repo1 . rootUri = vscode . Uri . file ( dir1 ) ;
176195 repo1 . addRemote ( 'origin' , 'git@github.com:aaa/bbb' ) ;
177196
178197 const repo2 = new MockRepository ( ) ;
179- repo2 . rootUri = vscode . Uri . file ( '/repo2' ) ;
198+ repo2 . rootUri = vscode . Uri . file ( dir2 ) ;
180199 repo2 . addRemote ( 'origin' , 'git@github.com:ccc/ddd' ) ;
181200
182201 reposManager . insertFolderManager ( new FolderRepositoryManager ( 0 , context , repo1 , telemetry , new GitApiImpl ( reposManager ) , credentialStore , createPrHelper , mockThemeWatcher ) ) ;
183202 reposManager . insertFolderManager ( new FolderRepositoryManager ( 1 , context , repo2 , telemetry , new GitApiImpl ( reposManager ) , credentialStore , createPrHelper , mockThemeWatcher ) ) ;
184203
185- const statStub = sinon . stub ( vscode . workspace . fs , 'stat' ) ;
186- statStub . resolves ( { type : vscode . FileType . Directory , ctime : 0 , mtime : 0 , size : 0 } ) ;
187-
188204 await reposManager . removeMissingRepos ( ) ;
189205
190206 assert . strictEqual ( reposManager . folderManagers . length , 2 ) ;
0 commit comments