Skip to content

Commit 928cc29

Browse files
Copilotalexr00
andcommitted
Fix removeMissingRepos tests: use real temp dirs instead of stubbing vscode.workspace.fs.stat
The `stat` property on `vscode.workspace.fs` is non-configurable, so sinon cannot stub it. Replace with real filesystem operations: create temporary directories, then delete one to simulate a removed worktree. Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent 51dc310 commit 928cc29

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

src/test/github/repositoriesManager.test.ts

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7+
import * as fs from 'fs';
8+
import * as os from 'os';
9+
import * as path from 'path';
710
import { SinonSandbox, createSandbox } from 'sinon';
811
import { 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

Comments
 (0)