Skip to content

Fix unit tests related to terminal code execution #18549

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 22 additions & 3 deletions src/test/terminals/codeExecution/djangoShellCodeExect.unit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ import { ICommandManager, IDocumentManager, IWorkspaceService } from '../../../c
import { IFileSystem, IPlatformService } from '../../../client/common/platform/types';
import { createCondaEnv } from '../../../client/common/process/pythonEnvironment';
import { createPythonProcessService } from '../../../client/common/process/pythonProcess';
import { IProcessService, IPythonExecutionFactory } from '../../../client/common/process/types';
import {
IProcessService,
IPythonExecutionFactory,
IPythonExecutionService,
} from '../../../client/common/process/types';
import { ITerminalService, ITerminalServiceFactory } from '../../../client/common/terminal/types';
import { IConfigurationService, IPythonSettings, ITerminalSettings } from '../../../client/common/types';
import { DjangoShellCodeExecutionProvider } from '../../../client/terminals/codeExecution/djangoShellCodeExecution';
Expand All @@ -19,6 +23,7 @@ import { PYTHON_PATH } from '../../common';
import { Conda, CONDA_RUN_VERSION } from '../../../client/pythonEnvironments/common/environmentManagers/conda';
import { SemVer } from 'semver';
import assert from 'assert';
import { PythonExecInfo } from '../../../client/pythonEnvironments/exec';

suite('Terminal - Django Shell Code Execution', () => {
let executor: ICodeExecutionService;
Expand Down Expand Up @@ -86,7 +91,14 @@ suite('Terminal - Django Shell Code Execution', () => {
resource?: Uri,
) {
platform.setup((p) => p.isWindows).returns(() => isWindows);
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);

const replCommandArgs = await (executor as DjangoShellCodeExecutionProvider).getExecutableInfo(resource);
Expand Down Expand Up @@ -205,7 +217,14 @@ suite('Terminal - Django Shell Code Execution', () => {
condaEnv: { name: string; path: string },
resource?: Uri,
) {
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);

const condaFile = 'conda';
Expand Down
136 changes: 120 additions & 16 deletions src/test/terminals/codeExecution/terminalCodeExec.unit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ import { ICommandManager, IDocumentManager, IWorkspaceService } from '../../../c
import { IFileSystem, IPlatformService } from '../../../client/common/platform/types';
import { createCondaEnv } from '../../../client/common/process/pythonEnvironment';
import { createPythonProcessService } from '../../../client/common/process/pythonProcess';
import { IProcessService, IPythonExecutionFactory } from '../../../client/common/process/types';
import {
IProcessService,
IPythonExecutionFactory,
IPythonExecutionService,
} from '../../../client/common/process/types';
import {
ITerminalService,
ITerminalServiceFactory,
Expand All @@ -26,6 +30,7 @@ import { ICodeExecutionService } from '../../../client/terminals/types';
import { PYTHON_PATH } from '../../common';
import * as sinon from 'sinon';
import assert from 'assert';
import { PythonExecInfo } from '../../../client/pythonEnvironments/exec';

suite('Terminal - Code Execution', () => {
['Terminal Execution', 'Repl Execution', 'Django Execution'].forEach((testSuiteName) => {
Expand Down Expand Up @@ -143,7 +148,14 @@ suite('Terminal - Code Execution', () => {
platform.setup((p) => p.isWindows).returns(() => isWindows);
platform.setup((p) => p.isMac).returns(() => isOsx);
platform.setup((p) => p.isLinux).returns(() => isLinux);
settings.setup((s) => s.pythonPath).returns(() => PYTHON_PATH);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: PYTHON_PATH, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => []);

await executor.initializeRepl();
Expand Down Expand Up @@ -176,7 +188,14 @@ suite('Terminal - Code Execution', () => {
workspace.setup((w) => w.rootPath).returns(() => path.join('c:', 'path', 'to'));
workspaceFolder.setup((w) => w.uri).returns(() => Uri.file(path.join('c:', 'path', 'to')));
platform.setup((p) => p.isWindows).returns(() => true);
settings.setup((s) => s.pythonPath).returns(() => PYTHON_PATH);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: PYTHON_PATH, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => []);

await executor.executeFile(file);
Expand All @@ -201,7 +220,14 @@ suite('Terminal - Code Execution', () => {
workspace.setup((w) => w.rootPath).returns(() => path.join('c:', 'path', 'to'));
workspaceFolder.setup((w) => w.uri).returns(() => Uri.file(path.join('c:', 'path', 'to')));
platform.setup((p) => p.isWindows).returns(() => true);
settings.setup((s) => s.pythonPath).returns(() => PYTHON_PATH);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: PYTHON_PATH, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => []);

await executor.executeFile(file);
Expand All @@ -217,7 +243,14 @@ suite('Terminal - Code Execution', () => {
workspace.setup((w) => w.getWorkspaceFolder(TypeMoq.It.isAny())).returns(() => workspaceFolder.object);
workspaceFolder.setup((w) => w.uri).returns(() => Uri.file(path.join('c', 'path', 'to')));
platform.setup((p) => p.isWindows).returns(() => false);
settings.setup((s) => s.pythonPath).returns(() => PYTHON_PATH);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: PYTHON_PATH, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => []);

await executor.executeFile(file);
Expand All @@ -241,7 +274,14 @@ suite('Terminal - Code Execution', () => {
workspace.setup((w) => w.getWorkspaceFolder(TypeMoq.It.isAny())).returns(() => workspaceFolder.object);
workspaceFolder.setup((w) => w.uri).returns(() => Uri.file(path.join('c', 'path', 'to')));
platform.setup((p) => p.isWindows).returns(() => isWindows);
settings.setup((s) => s.pythonPath).returns(() => PYTHON_PATH);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: PYTHON_PATH, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => []);

await executor.executeFile(file);
Expand All @@ -267,7 +307,14 @@ suite('Terminal - Code Execution', () => {
.setup((w) => w.uri)
.returns(() => Uri.file(path.join('c', 'path', 'to', 'file with spaces in path')));
platform.setup((p) => p.isWindows).returns(() => isWindows);
settings.setup((s) => s.pythonPath).returns(() => PYTHON_PATH);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: PYTHON_PATH, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => []);

await executor.executeFile(file);
Expand All @@ -288,7 +335,14 @@ suite('Terminal - Code Execution', () => {
terminalSettings.setup((t) => t.executeInFileDir).returns(() => true);
workspace.setup((w) => w.getWorkspaceFolder(TypeMoq.It.isAny())).returns(() => undefined);
platform.setup((p) => p.isWindows).returns(() => isWindows);
settings.setup((s) => s.pythonPath).returns(() => PYTHON_PATH);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: PYTHON_PATH, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => []);

await executor.executeFile(file);
Expand All @@ -309,7 +363,14 @@ suite('Terminal - Code Execution', () => {
file: Uri,
): Promise<void> {
platform.setup((p) => p.isWindows).returns(() => isWindows);
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);
terminalSettings.setup((t) => t.executeInFileDir).returns(() => false);
workspace.setup((w) => w.getWorkspaceFolder(TypeMoq.It.isAny())).returns(() => undefined);
Expand Down Expand Up @@ -353,7 +414,15 @@ suite('Terminal - Code Execution', () => {
file: Uri,
condaEnv: { name: string; path: string },
): Promise<void> {
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const condaRunArgs = 'conda run args';
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: condaRunArgs } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);
terminalSettings.setup((t) => t.executeInFileDir).returns(() => false);
workspace.setup((w) => w.getWorkspaceFolder(TypeMoq.It.isAny())).returns(() => undefined);
Expand Down Expand Up @@ -385,7 +454,7 @@ suite('Terminal - Code Execution', () => {

await executor.executeFile(file);

const expectedArgs = [...terminalArgs, file.fsPath.fileToCommandArgument()];
const expectedArgs = [...condaRunArgs, ...terminalArgs, file.fsPath.fileToCommandArgument()];

terminalService.verify(
async (t) => t.sendCommand(TypeMoq.It.isValue(pythonPath), TypeMoq.It.isValue(expectedArgs)),
Expand Down Expand Up @@ -419,7 +488,14 @@ suite('Terminal - Code Execution', () => {
.setup((p) => p.createCondaExecutionService(TypeMoq.It.isAny(), TypeMoq.It.isAny()))
.returns(() => Promise.resolve(undefined));
platform.setup((p) => p.isWindows).returns(() => isWindows);
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);
const expectedTerminalArgs = isDjangoRepl ? terminalArgs.concat(['manage.py', 'shell']) : terminalArgs;

Expand Down Expand Up @@ -469,7 +545,14 @@ suite('Terminal - Code Execution', () => {
terminalArgs: string[],
condaEnv: { name: string; path: string },
) {
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);

const condaFile = 'conda';
Expand Down Expand Up @@ -539,7 +622,14 @@ suite('Terminal - Code Execution', () => {
const terminalArgs = ['-a', 'b', 'c'];

platform.setup((p) => p.isWindows).returns(() => false);
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);

await executor.execute('cmd1');
Expand All @@ -558,7 +648,14 @@ suite('Terminal - Code Execution', () => {
const pythonPath = 'usr/bin/python1234';
const terminalArgs = ['-a', 'b', 'c'];
platform.setup((p) => p.isWindows).returns(() => false);
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);

let closeTerminalCallback: undefined | (() => void);
Expand Down Expand Up @@ -605,7 +702,14 @@ suite('Terminal - Code Execution', () => {
const pythonPath = 'usr/bin/python1234';
const terminalArgs = ['-a', 'b', 'c'];
platform.setup((p) => p.isWindows).returns(() => false);
settings.setup((s) => s.pythonPath).returns(() => pythonPath);
const executionService = TypeMoq.Mock.ofType<IPythonExecutionService>();
pythonExecutionFactory
.setup((p) => p.create(TypeMoq.It.isAny()))
.returns(() => Promise.resolve(executionService.object));
executionService.setup((p) => (p as any).then).returns(() => undefined);
executionService
.setup((e) => e.getExecutionInfo())
.returns(() => (({ command: pythonPath, args: [] } as unknown) as PythonExecInfo));
terminalSettings.setup((t) => t.launchArgs).returns(() => terminalArgs);

await executor.execute('cmd1');
Expand Down