2
2
// Licensed under the MIT License.
3
3
4
4
import * as typemoq from 'typemoq' ;
5
+ import * as sinon from 'sinon' ;
5
6
import { assert , expect } from 'chai' ;
6
7
import { Uri , EventEmitter , ConfigurationTarget , WorkspaceFolder } from 'vscode' ;
7
8
import { cloneDeep } from 'lodash' ;
@@ -11,6 +12,7 @@ import {
11
12
IExtensions ,
12
13
IInterpreterPathService ,
13
14
IPythonSettings ,
15
+ Resource ,
14
16
} from '../client/common/types' ;
15
17
import { IServiceContainer } from '../client/ioc/types' ;
16
18
import {
@@ -35,8 +37,15 @@ import {
35
37
} from '../client/proposedApiTypes' ;
36
38
import { IWorkspaceService } from '../client/common/application/types' ;
37
39
import { IEnvironmentVariablesProvider } from '../client/common/variables/types' ;
40
+ import * as workspaceApis from '../client/common/vscodeApis/workspaceApis' ;
38
41
39
42
suite ( 'Proposed Extension API' , ( ) => {
43
+ const workspacePath = 'path/to/workspace' ;
44
+ const workspaceFolder = {
45
+ name : 'workspace' ,
46
+ uri : Uri . file ( workspacePath ) ,
47
+ index : 0 ,
48
+ } ;
40
49
let serviceContainer : typemoq . IMock < IServiceContainer > ;
41
50
let discoverAPI : typemoq . IMock < IDiscoveryAPI > ;
42
51
let interpreterPathService : typemoq . IMock < IInterpreterPathService > ;
@@ -52,6 +61,13 @@ suite('Proposed Extension API', () => {
52
61
53
62
setup ( ( ) => {
54
63
serviceContainer = typemoq . Mock . ofType < IServiceContainer > ( ) ;
64
+ sinon . stub ( workspaceApis , 'getWorkspaceFolders' ) . returns ( [ workspaceFolder ] ) ;
65
+ sinon . stub ( workspaceApis , 'getWorkspaceFolder' ) . callsFake ( ( resource : Resource ) => {
66
+ if ( resource ?. fsPath === workspaceFolder . uri . fsPath ) {
67
+ return workspaceFolder ;
68
+ }
69
+ return undefined ;
70
+ } ) ;
55
71
discoverAPI = typemoq . Mock . ofType < IDiscoveryAPI > ( ) ;
56
72
extensions = typemoq . Mock . ofType < IExtensions > ( ) ;
57
73
workspaceService = typemoq . Mock . ofType < IWorkspaceService > ( ) ;
@@ -85,21 +101,20 @@ suite('Proposed Extension API', () => {
85
101
teardown ( ( ) => {
86
102
// Verify each API method sends telemetry regarding who called the API.
87
103
extensions . verifyAll ( ) ;
104
+ sinon . restore ( ) ;
88
105
} ) ;
89
106
90
107
test ( 'Provide an event to track when environment variables change' , async ( ) => {
91
- const resource = Uri . file ( 'x' ) ;
92
- const folder = ( { uri : resource } as unknown ) as WorkspaceFolder ;
108
+ const resource = workspaceFolder . uri ;
93
109
const envVars = { PATH : 'path' } ;
94
110
envVarsProvider . setup ( ( e ) => e . getEnvironmentVariablesSync ( resource ) ) . returns ( ( ) => envVars ) ;
95
- workspaceService . setup ( ( w ) => w . getWorkspaceFolder ( resource ) ) . returns ( ( ) => folder ) ;
96
111
const events : EnvironmentVariablesChangeEvent [ ] = [ ] ;
97
112
proposed . environments . onDidEnvironmentVariablesChange ( ( e ) => {
98
113
events . push ( e ) ;
99
114
} ) ;
100
115
onDidChangeEnvironmentVariables . fire ( resource ) ;
101
116
await sleep ( 1 ) ;
102
- assert . deepEqual ( events , [ { env : envVars , resource : folder } ] ) ;
117
+ assert . deepEqual ( events , [ { env : envVars , resource : workspaceFolder } ] ) ;
103
118
} ) ;
104
119
105
120
test ( 'getEnvironmentVariables: No resource' , async ( ) => {
@@ -196,7 +211,7 @@ suite('Proposed Extension API', () => {
196
211
kind : PythonEnvKind . System ,
197
212
arch : Architecture . x64 ,
198
213
sysPrefix : 'prefix/path' ,
199
- searchLocation : Uri . file ( 'path/to/project' ) ,
214
+ searchLocation : Uri . file ( workspacePath ) ,
200
215
} ) ;
201
216
discoverAPI . setup ( ( p ) => p . resolveEnv ( pythonPath ) ) . returns ( ( ) => Promise . resolve ( env ) ) ;
202
217
@@ -216,13 +231,13 @@ suite('Proposed Extension API', () => {
216
231
kind : PythonEnvKind . System ,
217
232
arch : Architecture . x64 ,
218
233
sysPrefix : 'prefix/path' ,
219
- searchLocation : Uri . file ( 'path/to/project' ) ,
234
+ searchLocation : Uri . file ( workspacePath ) ,
220
235
} ) ;
221
236
const partialEnv = buildEnvInfo ( {
222
237
executable : pythonPath ,
223
238
kind : PythonEnvKind . System ,
224
239
sysPrefix : 'prefix/path' ,
225
- searchLocation : Uri . file ( 'path/to/project' ) ,
240
+ searchLocation : Uri . file ( workspacePath ) ,
226
241
} ) ;
227
242
discoverAPI . setup ( ( p ) => p . resolveEnv ( pythonPath ) ) . returns ( ( ) => Promise . resolve ( env ) ) ;
228
243
@@ -237,7 +252,7 @@ suite('Proposed Extension API', () => {
237
252
} ) ;
238
253
239
254
test ( 'environments: python found' , async ( ) => {
240
- const envs = [
255
+ const expectedEnvs = [
241
256
{
242
257
executable : {
243
258
filename : 'this/is/a/test/python/path1' ,
@@ -281,12 +296,37 @@ suite('Proposed Extension API', () => {
281
296
} ,
282
297
} ,
283
298
] ;
299
+ const envs = [
300
+ ...expectedEnvs ,
301
+ {
302
+ executable : {
303
+ filename : 'this/is/a/test/python/path3' ,
304
+ ctime : 1 ,
305
+ mtime : 2 ,
306
+ sysPrefix : 'prefix/path' ,
307
+ } ,
308
+ version : {
309
+ major : 3 ,
310
+ minor : - 1 ,
311
+ micro : - 1 ,
312
+ } ,
313
+ kind : PythonEnvKind . Venv ,
314
+ arch : Architecture . x64 ,
315
+ name : '' ,
316
+ location : '' ,
317
+ source : [ PythonEnvSource . PathEnvVar ] ,
318
+ distro : {
319
+ org : '' ,
320
+ } ,
321
+ searchLocation : Uri . file ( 'path/outside/workspace' ) ,
322
+ } ,
323
+ ] ;
284
324
discoverAPI . setup ( ( d ) => d . getEnvs ( ) ) . returns ( ( ) => envs ) ;
285
325
const actual = proposed . environments . known ;
286
326
const actualEnvs = actual ?. map ( ( a ) => ( a as EnvironmentReference ) . internal ) ;
287
327
assert . deepEqual (
288
328
actualEnvs ?. sort ( ( a , b ) => a . id . localeCompare ( b . id ) ) ,
289
- envs . map ( ( e ) => convertEnvInfo ( e ) ) . sort ( ( a , b ) => a . id . localeCompare ( b . id ) ) ,
329
+ expectedEnvs . map ( ( e ) => convertEnvInfo ( e ) ) . sort ( ( a , b ) => a . id . localeCompare ( b . id ) ) ,
290
330
) ;
291
331
} ) ;
292
332
@@ -302,7 +342,7 @@ suite('Proposed Extension API', () => {
302
342
executable : 'pythonPath' ,
303
343
kind : PythonEnvKind . System ,
304
344
sysPrefix : 'prefix/path' ,
305
- searchLocation : Uri . file ( 'path/to/project' ) ,
345
+ searchLocation : Uri . file ( workspacePath ) ,
306
346
} ) ,
307
347
{
308
348
executable : {
0 commit comments