Skip to content

Commit 09fe890

Browse files
committed
Add tests
1 parent a4d112a commit 09fe890

File tree

2 files changed

+156
-1
lines changed

2 files changed

+156
-1
lines changed

src/client/datascience/jupyter/kernels/kernelSelections.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,6 @@ export class KernelSelectionProvider {
135135
const jupyterKernelsPromise = new JupyterKernelSelectionListProvider(this.kernelService).getKernelSelections(cancelToken);
136136
const interpretersPromise = new InterpreterKernelSelectionListProvider(this.interpreterSelector).getKernelSelections(cancelToken);
137137
const [activeKernels, jupyterKernels, interprters] = await Promise.all([activeKernelsPromise, jupyterKernelsPromise, interpretersPromise]);
138-
return [...activeKernels!, ...jupyterKernels!, ...interprters];
138+
return [...jupyterKernels!, ...activeKernels!, ...interprters];
139139
}
140140
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
'use strict';
5+
6+
import { assert } from 'chai';
7+
import { anything, instance, mock, verify, when } from 'ts-mockito';
8+
import { PYTHON_LANGUAGE } from '../../../../client/common/constants';
9+
import * as localize from '../../../../client/common/utils/localize';
10+
import { noop } from '../../../../client/common/utils/misc';
11+
import { Architecture } from '../../../../client/common/utils/platform';
12+
import { JupyterSessionManager } from '../../../../client/datascience/jupyter/jupyterSessionManager';
13+
import { KernelSelectionProvider } from '../../../../client/datascience/jupyter/kernels/kernelSelections';
14+
import { KernelService } from '../../../../client/datascience/jupyter/kernels/kernelService';
15+
import { IKernelSpecQuickPickItem } from '../../../../client/datascience/jupyter/kernels/types';
16+
import { IJupyterKernel, IJupyterKernelSpec, IJupyterSessionManager } from '../../../../client/datascience/types';
17+
import { InterpreterSelector } from '../../../../client/interpreter/configuration/interpreterSelector';
18+
import { IInterpreterQuickPickItem, IInterpreterSelector } from '../../../../client/interpreter/configuration/types';
19+
import { InterpreterType } from '../../../../client/interpreter/contracts';
20+
21+
// tslint:disable-next-line: max-func-body-length
22+
suite('Data Science - KernelSelections', () => {
23+
let kernelSelectionProvider: KernelSelectionProvider;
24+
let kernelService: KernelService;
25+
let interpreterSelector: IInterpreterSelector;
26+
let sessionManager: IJupyterSessionManager;
27+
const activePython1KernelModel = { lastActivityTime: new Date(2011, 11, 10, 12, 15, 0, 0), numberOfConnections: 10, name: 'py1' };
28+
const activeJuliaKernelModel = { lastActivityTime: new Date(2001, 1, 1, 12, 15, 0, 0), numberOfConnections: 10, name: 'julia' };
29+
const python1KernelSpecModel = { display_name: 'Python display name', dispose: async () => noop(), language: PYTHON_LANGUAGE, name: 'py1', path: 'somePath', metadata: {} };
30+
const python3KernelSpecModel = { display_name: 'Python3', dispose: async () => noop(), language: PYTHON_LANGUAGE, name: 'py3', path: 'somePath3', metadata: {} };
31+
const juliaKernelSpecModel = { display_name: 'Julia display name', dispose: async () => noop(), language: PYTHON_LANGUAGE, name: 'julia', path: 'j', metadata: {} };
32+
const rKernelSpecModel = { display_name: 'R', dispose: async () => noop(), language: PYTHON_LANGUAGE, name: 'r', path: 'r', metadata: {} };
33+
34+
const allSpecs: IJupyterKernelSpec[] = [python1KernelSpecModel, python3KernelSpecModel, juliaKernelSpecModel, rKernelSpecModel];
35+
36+
const allInterpreters: IInterpreterQuickPickItem[] = [
37+
{
38+
label: 'Hello1',
39+
interpreter: { architecture: Architecture.Unknown, path: 'p1', sysPrefix: '', sysVersion: '', type: InterpreterType.Conda, displayName: 'Hello1' },
40+
path: 'p1',
41+
detail: 'p1'
42+
},
43+
{
44+
label: 'Hello1',
45+
interpreter: { architecture: Architecture.Unknown, path: 'p2', sysPrefix: '', sysVersion: '', type: InterpreterType.Conda, displayName: 'Hello2' },
46+
path: 'p1',
47+
detail: 'p1'
48+
},
49+
{
50+
label: 'Hello1',
51+
interpreter: { architecture: Architecture.Unknown, path: 'p3', sysPrefix: '', sysVersion: '', type: InterpreterType.Conda, displayName: 'Hello3' },
52+
path: 'p1',
53+
detail: 'p1'
54+
}
55+
];
56+
57+
setup(() => {
58+
interpreterSelector = mock(InterpreterSelector);
59+
sessionManager = mock(JupyterSessionManager);
60+
kernelService = mock(KernelService);
61+
kernelSelectionProvider = new KernelSelectionProvider(instance(kernelService), instance(interpreterSelector));
62+
});
63+
64+
test('Should return an empty list for remote kernels if there are none', async () => {
65+
when(sessionManager.getRunningKernels()).thenResolve([]);
66+
67+
const items = await kernelSelectionProvider.getKernelSelectionsForRemoteSession(instance(sessionManager));
68+
69+
assert.equal(items.length, 0);
70+
});
71+
test('Should return a list with the proper details in the quick pick for remote connections', async () => {
72+
const activeKernels: IJupyterKernel[] = [activePython1KernelModel, activeJuliaKernelModel];
73+
74+
when(sessionManager.getRunningKernels()).thenResolve(activeKernels);
75+
when(sessionManager.getKernelSpecs()).thenResolve(allSpecs);
76+
77+
// Quick pick must contain
78+
// - kernel spec display name
79+
// - selection = kernel model + kernel spec
80+
// - description = last activity and # of connections.
81+
const expectedItems: IKernelSpecQuickPickItem[] = [
82+
{
83+
label: python1KernelSpecModel.display_name,
84+
selection: { interpreter: undefined, kernelModel: { ...activePython1KernelModel, ...python1KernelSpecModel }, kernelSpec: undefined },
85+
description: localize.DataScience.jupyterSelectURIRunningDetailFormat().format(
86+
activePython1KernelModel.lastActivityTime.toLocaleString(),
87+
activePython1KernelModel.numberOfConnections.toString()
88+
)
89+
},
90+
{
91+
label: juliaKernelSpecModel.display_name,
92+
selection: { interpreter: undefined, kernelModel: { ...activeJuliaKernelModel, ...juliaKernelSpecModel }, kernelSpec: undefined },
93+
description: localize.DataScience.jupyterSelectURIRunningDetailFormat().format(
94+
activeJuliaKernelModel.lastActivityTime.toLocaleString(),
95+
activeJuliaKernelModel.numberOfConnections.toString()
96+
)
97+
}
98+
];
99+
const items = await kernelSelectionProvider.getKernelSelectionsForRemoteSession(instance(sessionManager));
100+
101+
verify(sessionManager.getRunningKernels()).once();
102+
verify(sessionManager.getKernelSpecs()).once();
103+
assert.deepEqual(items, expectedItems);
104+
});
105+
test('Should return a list Active + Local Kernels + Interpreters for local connection', async () => {
106+
const activeKernels: IJupyterKernel[] = [activePython1KernelModel, activeJuliaKernelModel];
107+
108+
when(sessionManager.getRunningKernels()).thenResolve(activeKernels);
109+
when(sessionManager.getKernelSpecs()).thenResolve(allSpecs);
110+
when(kernelService.getKernelSpecs(anything(), anything())).thenResolve(allSpecs);
111+
when(interpreterSelector.getSuggestions(undefined)).thenResolve(allInterpreters);
112+
113+
// Quick pick must contain
114+
// - kernel spec display name
115+
// - selection = kernel model + kernel spec
116+
// - description = last activity and # of connections.
117+
const expectedRemoteItems: IKernelSpecQuickPickItem[] = [
118+
{
119+
label: python1KernelSpecModel.display_name,
120+
selection: { interpreter: undefined, kernelModel: { ...activePython1KernelModel, ...python1KernelSpecModel }, kernelSpec: undefined },
121+
description: localize.DataScience.jupyterSelectURIRunningDetailFormat().format(
122+
activePython1KernelModel.lastActivityTime.toLocaleString(),
123+
activePython1KernelModel.numberOfConnections.toString()
124+
)
125+
},
126+
{
127+
label: juliaKernelSpecModel.display_name,
128+
selection: { interpreter: undefined, kernelModel: { ...activeJuliaKernelModel, ...juliaKernelSpecModel }, kernelSpec: undefined },
129+
description: localize.DataScience.jupyterSelectURIRunningDetailFormat().format(
130+
activeJuliaKernelModel.lastActivityTime.toLocaleString(),
131+
activeJuliaKernelModel.numberOfConnections.toString()
132+
)
133+
}
134+
];
135+
const expectedKernelItems: IKernelSpecQuickPickItem[] = allSpecs.map(item => {
136+
return {
137+
label: item.display_name,
138+
selection: { interpreter: undefined, kernelModel: undefined, kernelSpec: item },
139+
description: '(kernel)'
140+
};
141+
});
142+
const expectedInterpreterItems: IKernelSpecQuickPickItem[] = allInterpreters.map(item => {
143+
return {
144+
...item,
145+
description: '(register and use interpreter as kernel)',
146+
selection: { kernelModel: undefined, interpreter: item.interpreter, kernelSpec: undefined }
147+
};
148+
});
149+
const items = await kernelSelectionProvider.getLocalKernelSelectionProvider(instance(sessionManager));
150+
151+
verify(sessionManager.getRunningKernels()).once();
152+
verify(sessionManager.getKernelSpecs()).once();
153+
assert.deepEqual(items, [...expectedKernelItems, ...expectedRemoteItems, ...expectedInterpreterItems]);
154+
});
155+
});

0 commit comments

Comments
 (0)