Skip to content

Commit

Permalink
Merge pull request #98 from augustocdias/add_tests_for_recent_prs
Browse files Browse the repository at this point in the history
Add tests for recent prs
  • Loading branch information
MarcelRobitaille committed Sep 20, 2024
2 parents 15f4a76 + d6a9813 commit f1cb44a
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 6 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Change Log

## [Unreleased]

- Improve error handling
- Improve parsing of boolean arguments

## [1.10.0] - 2024-04-06

- Support commands with spaces. Add `commandArgs` property, which causes `execFileSync` to be called with `command`.
Expand Down
53 changes: 53 additions & 0 deletions src/lib/CommandHandler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,3 +202,56 @@ test("commandArgs", async () => {
},
);
});

describe("Errors", async () => {
test("It should trigger an error for an empty result", async () => {
const testDataPath = path.join(__dirname, "../test/testData/errors");

const tasksJson = await import(path.join(testDataPath, ".vscode/tasks.json"));
const mockData = (await import(path.join(testDataPath, "mockData.ts"))).default;

mockVscode.setMockData(mockData);
const input = tasksJson.inputs[0].args;
const handler = new CommandHandler(
input,
new UserInputContext(),
mockExtensionContext as unknown as vscode.ExtensionContext,
child_process,
);

expect(() => handler.handle()).rejects.toThrowError(
"The command for input 'inputTest' returned empty result.");
});
});

describe("Argument parsing", () => {
test("Test defaults and that all boolean properties use parseBoolean", () => {
expect(CommandHandler.resolveBooleanArgs({ extraTestThing: 42 }))
.toStrictEqual({
rememberPrevious: false,
useFirstResult: false,
useSingleResult: false,
extraTestThing: 42,
});
});

test("parseBoolean", () => {
expect(CommandHandler.parseBoolean(undefined, true)).toBe(true);
expect(CommandHandler.parseBoolean(undefined, false)).toBe(false);

expect(CommandHandler.parseBoolean(false, true)).toBe(false);
expect(CommandHandler.parseBoolean(true, false)).toBe(true);

expect(CommandHandler.parseBoolean("false", true)).toBe(false);
expect(CommandHandler.parseBoolean("fALse", true)).toBe(false);
expect(CommandHandler.parseBoolean("true", false)).toBe(true);
expect(CommandHandler.parseBoolean("tRUe", false)).toBe(true);

expect(mockVscode.window.getShowWarningMessageCalls().length).toBe(0);

expect(CommandHandler.parseBoolean(42, true)).toBe(true);
expect(CommandHandler.parseBoolean(42, false)).toBe(false);

expect(mockVscode.window.getShowWarningMessageCalls().length).toBe(2);
});
});
13 changes: 7 additions & 6 deletions src/lib/CommandHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class CommandHandler {
context: vscode.ExtensionContext,
subprocess: typeof child_process,
) {
this.args = this.resolveBooleanArgs(args);
this.args = CommandHandler.resolveBooleanArgs(args);
if (!Object.prototype.hasOwnProperty.call(this.args, "command")) {
throw new ShellCommandException('Please specify the "command" property.');
}
Expand Down Expand Up @@ -52,17 +52,17 @@ export class CommandHandler {
this.subprocess = subprocess;
}

protected resolveBooleanArgs(args: object): ShellCommandOptions {
static resolveBooleanArgs(args: object): ShellCommandOptions {
const opt = args as ShellCommandOptions;
const resolvedBooleans = {
useFirstResult: this.parseBoolean(opt.useFirstResult, false),
useSingleResult: this.parseBoolean(opt.useSingleResult, false),
rememberPrevious: this.parseBoolean(opt.rememberPrevious, false),
useFirstResult: CommandHandler.parseBoolean(opt.useFirstResult, false),
useSingleResult: CommandHandler.parseBoolean(opt.useSingleResult, false),
rememberPrevious: CommandHandler.parseBoolean(opt.rememberPrevious, false),
};
return {...args, ...resolvedBooleans} as ShellCommandOptions;
}

protected parseBoolean(value: unknown, defaultValue: boolean): boolean {
static parseBoolean(value: unknown, defaultValue: boolean): boolean {
if (value === undefined) {
return defaultValue;
}
Expand Down Expand Up @@ -162,6 +162,7 @@ export class CommandHandler {
if (result.trim().length == 0) {
throw new ShellCommandException(`The command for input '${this.input.id}' returned empty result.`);
}

return result
.split(this.EOL)
.map<QuickPickItem>((value: string) => {
Expand Down
11 changes: 11 additions & 0 deletions src/mocks/vscode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ type MockData = {
};
}

// This mock does not need to be saved
const showWarningMessageCalls: string[] = [];

export namespace window {
export namespace activeTextEditor {
export namespace document {
Expand All @@ -81,6 +84,14 @@ export namespace window {
}
}
}

export function showWarningMessage(message: string) {
showWarningMessageCalls.push(message);
}

export function getShowWarningMessageCalls() {
return showWarningMessageCalls;
}
}

export namespace workspace {
Expand Down
28 changes: 28 additions & 0 deletions src/test/testData/errors/.vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "This should trigger an error",
"type": "shell",
"command": "echo ${input:inputTest}",
"problemMatcher": []
}
],
"inputs": [
{
"id": "inputTest",
"type": "command",
"command": "shellCommand.execute",
"args": {
"command": "echo ''",
"cwd": "${workspaceFolder}",
"env": {
"WORKSPACE": "${workspaceFolder[0]}",
"FILE": "${file}",
"PROJECT": "${workspaceFolderBasename}"
}
}
}
]
}

41 changes: 41 additions & 0 deletions src/test/testData/errors/mockData.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
export default {
"calls": {
"workspace.getConfiguration().inspect()": {
"[\"tasks\",null,\"inputs\"]": {
"key": "tasks.inputs",
"workspaceValue": [
{
"id": "inputTest",
"type": "command",
"command": "shellCommand.execute",
"args": {
"command": "echo ''",
"cwd": "${workspaceFolder}",
"env": {
"WORKSPACE": "${workspaceFolder[0]}",
"FILE": "${file}",
"PROJECT": "${workspaceFolderBasename}"
}
}
}
]
}
}
},
"staticData": {
"window.activeTextEditor.document.fileName": `${__dirname}/.vscode/tasks.json`,
"workspace.workspaceFolders": [
{
"uri": {
"$mid": 1,
"fsPath": `${__dirname}`,
"external": `file://${__dirname}}`,
"path": `${__dirname}`,
"scheme": "file"
},
"name": "vscode-shell-command",
"index": 0
}
]
}
};

0 comments on commit f1cb44a

Please sign in to comment.