Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/services/dialogs/test/electron-browser/fileDialogService.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import * as sinon from 'sinon';
8
import { Schemas } from '../../../../../base/common/network.js';
9
import { URI } from '../../../../../base/common/uri.js';
10
import { mock } from '../../../../../base/test/common/mock.js';
11
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
12
import { ICodeEditorService } from '../../../../../editor/browser/services/codeEditorService.js';
13
import { ILanguageService } from '../../../../../editor/common/languages/language.js';
14
import { ICommandService } from '../../../../../platform/commands/common/commands.js';
15
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
16
import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';
17
import { IDialogService, IFileDialogService, IOpenDialogOptions, ISaveDialogOptions } from '../../../../../platform/dialogs/common/dialogs.js';
18
import { IFileService } from '../../../../../platform/files/common/files.js';
19
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
20
import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';
21
import { ILabelService } from '../../../../../platform/label/common/label.js';
22
import { ILogService } from '../../../../../platform/log/common/log.js';
23
import { INativeHostService } from '../../../../../platform/native/common/native.js';
24
import { IOpenerService } from '../../../../../platform/opener/common/opener.js';
25
import { IWorkspaceContextService } from '../../../../../platform/workspace/common/workspace.js';
26
import { IWorkspacesService } from '../../../../../platform/workspaces/common/workspaces.js';
27
import { ISimpleFileDialog } from '../../browser/simpleFileDialog.js';
28
import { FileDialogService } from '../../electron-browser/fileDialogService.js';
29
import { IEditorService } from '../../../editor/common/editorService.js';
30
import { BrowserWorkbenchEnvironmentService } from '../../../environment/browser/environmentService.js';
31
import { IWorkbenchEnvironmentService } from '../../../environment/common/environmentService.js';
32
import { IHistoryService } from '../../../history/common/history.js';
33
import { IHostService } from '../../../host/browser/host.js';
34
import { IPathService } from '../../../path/common/pathService.js';
35
import { BrowserWorkspaceEditingService } from '../../../workspaces/browser/workspaceEditingService.js';
36
import { IWorkspaceEditingService } from '../../../workspaces/common/workspaceEditing.js';
37
import { workbenchInstantiationService } from '../../../../test/browser/workbenchTestServices.js';
38
39
class TestFileDialogService extends FileDialogService {
40
constructor(
41
private simple: ISimpleFileDialog,
42
@IHostService hostService: IHostService,
43
@IWorkspaceContextService contextService: IWorkspaceContextService,
44
@IHistoryService historyService: IHistoryService,
45
@IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService,
46
@IInstantiationService instantiationService: IInstantiationService,
47
@IConfigurationService configurationService: IConfigurationService,
48
@IFileService fileService: IFileService,
49
@IOpenerService openerService: IOpenerService,
50
@INativeHostService nativeHostService: INativeHostService,
51
@IDialogService dialogService: IDialogService,
52
@ILanguageService languageService: ILanguageService,
53
@IWorkspacesService workspacesService: IWorkspacesService,
54
@ILabelService labelService: ILabelService,
55
@IPathService pathService: IPathService,
56
@ICommandService commandService: ICommandService,
57
@IEditorService editorService: IEditorService,
58
@ICodeEditorService codeEditorService: ICodeEditorService,
59
@ILogService logService: ILogService
60
) {
61
super(hostService, contextService, historyService, environmentService, instantiationService, configurationService, fileService,
62
openerService, nativeHostService, dialogService, languageService, workspacesService, labelService, pathService, commandService, editorService, codeEditorService, logService);
63
}
64
65
protected override getSimpleFileDialog() {
66
if (this.simple) {
67
return this.simple;
68
} else {
69
return super.getSimpleFileDialog();
70
}
71
}
72
}
73
74
suite('FileDialogService', function () {
75
76
let instantiationService: TestInstantiationService;
77
const disposables = ensureNoDisposablesAreLeakedInTestSuite();
78
const testFile: URI = URI.file('/test/file');
79
80
setup(async function () {
81
disposables.add(instantiationService = workbenchInstantiationService(undefined, disposables));
82
const configurationService = new TestConfigurationService();
83
await configurationService.setUserConfiguration('files', { simpleDialog: { enable: true } });
84
instantiationService.stub(IConfigurationService, configurationService);
85
86
});
87
88
test('Local - open/save workspaces availableFilesystems', async function () {
89
class TestSimpleFileDialog implements ISimpleFileDialog {
90
async showOpenDialog(options: IOpenDialogOptions): Promise<URI | undefined> {
91
assert.strictEqual(options.availableFileSystems?.length, 1);
92
assert.strictEqual(options.availableFileSystems[0], Schemas.file);
93
return testFile;
94
}
95
async showSaveDialog(options: ISaveDialogOptions): Promise<URI | undefined> {
96
assert.strictEqual(options.availableFileSystems?.length, 1);
97
assert.strictEqual(options.availableFileSystems[0], Schemas.file);
98
return testFile;
99
}
100
dispose(): void { }
101
}
102
103
const dialogService = instantiationService.createInstance(TestFileDialogService, new TestSimpleFileDialog());
104
instantiationService.set(IFileDialogService, dialogService);
105
const workspaceService: IWorkspaceEditingService = disposables.add(instantiationService.createInstance(BrowserWorkspaceEditingService));
106
assert.strictEqual((await workspaceService.pickNewWorkspacePath())?.path.startsWith(testFile.path), true);
107
assert.strictEqual(await dialogService.pickWorkspaceAndOpen({}), undefined);
108
});
109
110
test('Virtual - open/save workspaces availableFilesystems', async function () {
111
class TestSimpleFileDialog {
112
async showOpenDialog(options: IOpenDialogOptions): Promise<URI | undefined> {
113
assert.strictEqual(options.availableFileSystems?.length, 1);
114
assert.strictEqual(options.availableFileSystems[0], Schemas.file);
115
return testFile;
116
}
117
async showSaveDialog(options: ISaveDialogOptions): Promise<URI | undefined> {
118
assert.strictEqual(options.availableFileSystems?.length, 1);
119
assert.strictEqual(options.availableFileSystems[0], Schemas.file);
120
return testFile;
121
}
122
dispose(): void { }
123
}
124
125
instantiationService.stub(IPathService, new class {
126
defaultUriScheme: string = 'vscode-virtual-test';
127
userHome = async () => URI.file('/user/home');
128
} as IPathService);
129
const dialogService = instantiationService.createInstance(TestFileDialogService, new TestSimpleFileDialog());
130
instantiationService.set(IFileDialogService, dialogService);
131
const workspaceService: IWorkspaceEditingService = disposables.add(instantiationService.createInstance(BrowserWorkspaceEditingService));
132
assert.strictEqual((await workspaceService.pickNewWorkspacePath())?.path.startsWith(testFile.path), true);
133
assert.strictEqual(await dialogService.pickWorkspaceAndOpen({}), undefined);
134
});
135
136
test('Remote - open/save workspaces availableFilesystems', async function () {
137
class TestSimpleFileDialog implements ISimpleFileDialog {
138
async showOpenDialog(options: IOpenDialogOptions): Promise<URI | undefined> {
139
assert.strictEqual(options.availableFileSystems?.length, 2);
140
assert.strictEqual(options.availableFileSystems[0], Schemas.vscodeRemote);
141
assert.strictEqual(options.availableFileSystems[1], Schemas.file);
142
return testFile;
143
}
144
async showSaveDialog(options: ISaveDialogOptions): Promise<URI | undefined> {
145
assert.strictEqual(options.availableFileSystems?.length, 2);
146
assert.strictEqual(options.availableFileSystems[0], Schemas.vscodeRemote);
147
assert.strictEqual(options.availableFileSystems[1], Schemas.file);
148
return testFile;
149
}
150
dispose(): void { }
151
}
152
153
instantiationService.set(IWorkbenchEnvironmentService, new class extends mock<BrowserWorkbenchEnvironmentService>() {
154
override get remoteAuthority() {
155
return 'testRemote';
156
}
157
});
158
instantiationService.stub(IPathService, new class {
159
defaultUriScheme: string = Schemas.vscodeRemote;
160
userHome = async () => URI.file('/user/home');
161
} as IPathService);
162
const dialogService = instantiationService.createInstance(TestFileDialogService, new TestSimpleFileDialog());
163
instantiationService.set(IFileDialogService, dialogService);
164
const workspaceService: IWorkspaceEditingService = disposables.add(instantiationService.createInstance(BrowserWorkspaceEditingService));
165
assert.strictEqual((await workspaceService.pickNewWorkspacePath())?.path.startsWith(testFile.path), true);
166
assert.strictEqual(await dialogService.pickWorkspaceAndOpen({}), undefined);
167
});
168
169
test('Remote - filters default files/folders to RA (#195938)', async function () {
170
class TestSimpleFileDialog implements ISimpleFileDialog {
171
async showOpenDialog(): Promise<URI | undefined> {
172
return testFile;
173
}
174
async showSaveDialog(): Promise<URI | undefined> {
175
return testFile;
176
}
177
dispose(): void { }
178
}
179
instantiationService.set(IWorkbenchEnvironmentService, new class extends mock<BrowserWorkbenchEnvironmentService>() {
180
override get remoteAuthority() {
181
return 'testRemote';
182
}
183
});
184
instantiationService.stub(IPathService, new class {
185
defaultUriScheme: string = Schemas.vscodeRemote;
186
userHome = async () => URI.file('/user/home');
187
} as IPathService);
188
189
190
const dialogService = instantiationService.createInstance(TestFileDialogService, new TestSimpleFileDialog());
191
const historyService = instantiationService.get(IHistoryService);
192
const getLastActiveWorkspaceRoot = sinon.spy(historyService, 'getLastActiveWorkspaceRoot');
193
const getLastActiveFile = sinon.spy(historyService, 'getLastActiveFile');
194
195
await dialogService.defaultFilePath();
196
assert.deepStrictEqual(getLastActiveFile.args, [[Schemas.vscodeRemote, 'testRemote']]);
197
assert.deepStrictEqual(getLastActiveWorkspaceRoot.args, [[Schemas.vscodeRemote, 'testRemote']]);
198
199
await dialogService.defaultFolderPath();
200
assert.deepStrictEqual(getLastActiveWorkspaceRoot.args[1], [Schemas.vscodeRemote, 'testRemote']);
201
});
202
});
203
204