Skip to content

Commit e373c15

Browse files
committed
Use ILogger interface for unit testing
1 parent 1d855be commit e373c15

14 files changed

+75
-27
lines changed

src/features/Console.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import vscode = require("vscode");
55
import { NotificationType, RequestType } from "vscode-languageclient";
66
import { LanguageClient } from "vscode-languageclient/node";
77
import { ICheckboxQuickPickItem, showCheckboxQuickPick } from "../controls/checkboxQuickPick";
8-
import { Logger } from "../logging";
8+
import { ILogger } from "../logging";
99
import { getSettings } from "../settings";
1010
import { LanguageClientConsumer } from "../languageClientConsumer";
1111

@@ -170,7 +170,7 @@ export class ConsoleFeature extends LanguageClientConsumer {
170170
private commands: vscode.Disposable[];
171171
private handlers: vscode.Disposable[] = [];
172172

173-
constructor(private logger: Logger) {
173+
constructor(private logger: ILogger) {
174174
super();
175175
this.commands = [
176176
vscode.commands.registerCommand("PowerShell.RunSelection", async () => {

src/features/DebugSession.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { getPlatformDetails, OperatingSystem } from "../platform";
1212
import { PowerShellProcess } from "../process";
1313
import { IEditorServicesSessionDetails, SessionManager, SessionStatus } from "../session";
1414
import { getSettings } from "../settings";
15-
import { Logger } from "../logging";
15+
import { ILogger } from "../logging";
1616
import { LanguageClientConsumer } from "../languageClientConsumer";
1717
import path = require("path");
1818
import utils = require("../utils");
@@ -65,7 +65,7 @@ export class DebugSessionFeature extends LanguageClientConsumer
6565
},
6666
};
6767

68-
constructor(context: ExtensionContext, private sessionManager: SessionManager, private logger: Logger) {
68+
constructor(context: ExtensionContext, private sessionManager: SessionManager, private logger: ILogger) {
6969
super();
7070
// Register a debug configuration provider
7171
context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("PowerShell", this));
@@ -359,7 +359,7 @@ export class PickPSHostProcessFeature extends LanguageClientConsumer {
359359
private waitingForClientToken?: vscode.CancellationTokenSource;
360360
private getLanguageClientResolve?: (value: LanguageClient) => void;
361361

362-
constructor(private logger: Logger) {
362+
constructor(private logger: ILogger) {
363363
super();
364364

365365
this.command =
@@ -485,7 +485,7 @@ export class PickRunspaceFeature extends LanguageClientConsumer {
485485
private waitingForClientToken?: vscode.CancellationTokenSource;
486486
private getLanguageClientResolve?: (value: LanguageClient) => void;
487487

488-
constructor(private logger: Logger) {
488+
constructor(private logger: ILogger) {
489489
super();
490490
this.command =
491491
vscode.commands.registerCommand("PowerShell.PickRunspace", (processId) => {

src/features/ExtensionCommands.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
Position, Range, RequestType
1010
} from "vscode-languageclient";
1111
import { LanguageClient } from "vscode-languageclient/node";
12-
import { Logger } from "../logging";
12+
import { ILogger } from "../logging";
1313
import { getSettings, validateCwdSetting } from "../settings";
1414
import { LanguageClientConsumer } from "../languageClientConsumer";
1515

@@ -149,7 +149,7 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
149149
private handlers: vscode.Disposable[] = [];
150150
private extensionCommands: IExtensionCommand[] = [];
151151

152-
constructor(private logger: Logger) {
152+
constructor(private logger: ILogger) {
153153
super();
154154
this.commands = [
155155
vscode.commands.registerCommand("PowerShell.ShowAdditionalCommands", async () => {

src/features/ExternalApi.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import * as vscode from "vscode";
55
import { v4 as uuidv4 } from "uuid";
66
import { LanguageClientConsumer } from "../languageClientConsumer";
7-
import { Logger } from "../logging";
7+
import { ILogger } from "../logging";
88
import { SessionManager } from "../session";
99

1010
export interface IExternalPowerShellDetails {
@@ -39,7 +39,7 @@ export class ExternalApiFeature extends LanguageClientConsumer implements IPower
3939
constructor(
4040
private extensionContext: vscode.ExtensionContext,
4141
private sessionManager: SessionManager,
42-
private logger: Logger) {
42+
private logger: ILogger) {
4343
super();
4444
}
4545

src/features/GetCommands.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import * as vscode from "vscode";
55
import { RequestType0 } from "vscode-languageclient";
66
import { LanguageClient } from "vscode-languageclient/node";
7-
import { Logger } from "../logging";
7+
import { ILogger } from "../logging";
88
import { LanguageClientConsumer } from "../languageClientConsumer";
99
import { getSettings } from "../settings";
1010

@@ -30,7 +30,7 @@ export class GetCommandsFeature extends LanguageClientConsumer {
3030
private commandsExplorerProvider: CommandsExplorerProvider;
3131
private commandsExplorerTreeView: vscode.TreeView<Command>;
3232

33-
constructor(private logger: Logger) {
33+
constructor(private logger: ILogger) {
3434
super();
3535
this.commands = [
3636
vscode.commands.registerCommand("PowerShell.RefreshCommandsExplorer",

src/features/NewFileOrProject.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import vscode = require("vscode");
55
import { RequestType } from "vscode-languageclient";
66
import { LanguageClient } from "vscode-languageclient/node";
77
import { LanguageClientConsumer } from "../languageClientConsumer";
8-
import { Logger } from "../logging";
8+
import { ILogger } from "../logging";
99

1010
export class NewFileOrProjectFeature extends LanguageClientConsumer {
1111

1212
private readonly loadIcon = " $(sync) ";
1313
private command: vscode.Disposable;
1414
private waitingForClientToken?: vscode.CancellationTokenSource;
1515

16-
constructor(private logger: Logger) {
16+
constructor(private logger: ILogger) {
1717
super();
1818
this.command =
1919
vscode.commands.registerCommand("PowerShell.NewProjectFromTemplate", async () => {

src/features/PesterTests.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import * as path from "path";
55
import vscode = require("vscode");
6-
import { Logger } from "../logging";
6+
import { ILogger } from "../logging";
77
import { SessionManager } from "../session";
88
import { getSettings, chosenWorkspace, validateCwdSetting } from "../settings";
99
import utils = require("../utils");
@@ -17,7 +17,7 @@ export class PesterTestsFeature implements vscode.Disposable {
1717
private commands: vscode.Disposable[];
1818
private invokePesterStubScriptPath: string;
1919

20-
constructor(private sessionManager: SessionManager, private logger: Logger) {
20+
constructor(private sessionManager: SessionManager, private logger: ILogger) {
2121
this.invokePesterStubScriptPath = path.resolve(__dirname, "../modules/PowerShellEditorServices/InvokePesterStub.ps1");
2222
this.commands = [
2323
// File context-menu command - Run Pester Tests

src/features/RunCode.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import vscode = require("vscode");
55
import { SessionManager } from "../session";
6-
import { Logger } from "../logging";
6+
import { ILogger } from "../logging";
77
import { getSettings, chosenWorkspace, validateCwdSetting } from "../settings";
88

99
enum LaunchType {
@@ -14,7 +14,7 @@ enum LaunchType {
1414
export class RunCodeFeature implements vscode.Disposable {
1515
private command: vscode.Disposable;
1616

17-
constructor(private sessionManager: SessionManager, private logger: Logger) {
17+
constructor(private sessionManager: SessionManager, private logger: ILogger) {
1818
this.command = vscode.commands.registerCommand(
1919
"PowerShell.RunCode",
2020
async (runInDebugger: boolean, scriptToRun: string, args: string[]) => {

src/logging.ts

+7
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,19 @@ export enum LogLevel {
1919
* This will allow for easy mocking of the logger during unit tests.
2020
*/
2121
export interface ILogger {
22+
getLogFilePath(baseName: string): vscode.Uri;
23+
updateLogLevel(logLevelName: string): void;
2224
write(message: string, ...additionalMessages: string[]): void;
25+
writeAndShowInformation(message: string, ...additionalMessages: string[]): Promise<void>;
2326
writeDiagnostic(message: string, ...additionalMessages: string[]): void;
2427
writeVerbose(message: string, ...additionalMessages: string[]): void;
2528
writeWarning(message: string, ...additionalMessages: string[]): void;
2629
writeAndShowWarning(message: string, ...additionalMessages: string[]): Promise<void>;
2730
writeError(message: string, ...additionalMessages: string[]): void;
31+
writeAndShowError(message: string, ...additionalMessages: string[]): Promise<void>;
32+
writeAndShowErrorWithActions(
33+
message: string,
34+
actions: { prompt: string; action: (() => Promise<void>) | undefined }[]): Promise<void>;
2835
}
2936

3037
export class Logger implements ILogger {

src/platform.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import * as os from "os";
55
import * as path from "path";
66
import * as process from "process";
77
import { integer } from "vscode-languageserver-protocol";
8-
import { Logger } from "./logging";
8+
import { ILogger } from "./logging";
99
import { PowerShellAdditionalExePathSettings } from "./settings";
1010

1111
// This uses require so we can rewire it in unit tests!
@@ -86,7 +86,7 @@ export class PowerShellExeFinder {
8686
private platformDetails: IPlatformDetails,
8787
// Additional configured PowerShells
8888
private additionalPowerShellExes: PowerShellAdditionalExePathSettings,
89-
private logger: Logger) { }
89+
private logger: ILogger) { }
9090

9191
/**
9292
* Returns the first available PowerShell executable found in the search order.

src/process.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import cp = require("child_process");
55
import path = require("path");
66
import vscode = require("vscode");
7-
import { Logger } from "./logging";
7+
import { ILogger } from "./logging";
88
import Settings = require("./settings");
99
import utils = require("./utils");
1010
import { IEditorServicesSessionDetails } from "./session";
@@ -24,7 +24,7 @@ export class PowerShellProcess {
2424
public exePath: string,
2525
private bundledModulesPath: string,
2626
private title: string,
27-
private logger: Logger,
27+
private logger: ILogger,
2828
private startPsesArgs: string,
2929
private sessionFilePath: vscode.Uri,
3030
private sessionSettings: Settings.Settings) {

src/session.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as semver from "semver";
77
import vscode = require("vscode");
88
import TelemetryReporter, { TelemetryEventProperties, TelemetryEventMeasurements } from "@vscode/extension-telemetry";
99
import { Message } from "vscode-jsonrpc";
10-
import { Logger } from "./logging";
10+
import { ILogger } from "./logging";
1111
import { PowerShellProcess } from "./process";
1212
import { Settings, changeSetting, getSettings, getEffectiveConfigurationTarget, validateCwdSetting } from "./settings";
1313
import utils = require("./utils");
@@ -103,7 +103,7 @@ export class SessionManager implements Middleware {
103103
constructor(
104104
private extensionContext: vscode.ExtensionContext,
105105
private sessionSettings: Settings,
106-
private logger: Logger,
106+
private logger: ILogger,
107107
private documentSelector: DocumentSelector,
108108
hostName: string,
109109
hostVersion: string,

src/settings.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import vscode = require("vscode");
55
import utils = require("./utils");
66
import os = require("os");
7-
import { Logger } from "./logging";
7+
import { ILogger } from "./logging";
88

99
// TODO: Quite a few of these settings are unused in the client and instead
1010
// exist just for the server. Those settings do not need to be represented in
@@ -193,7 +193,7 @@ export async function changeSetting(
193193
// eslint-disable-next-line @typescript-eslint/no-explicit-any
194194
newValue: any,
195195
configurationTarget: vscode.ConfigurationTarget | boolean | undefined,
196-
logger: Logger | undefined): Promise<void> {
196+
logger: ILogger | undefined): Promise<void> {
197197

198198
logger?.writeDiagnostic(`Changing '${settingName}' at scope '${configurationTarget} to '${newValue}'`);
199199

@@ -209,7 +209,7 @@ export async function changeSetting(
209209
let hasPrompted = false;
210210
export let chosenWorkspace: vscode.WorkspaceFolder | undefined = undefined;
211211

212-
export async function validateCwdSetting(logger: Logger): Promise<string> {
212+
export async function validateCwdSetting(logger: ILogger): Promise<string> {
213213
let cwd: string | undefined = vscode.workspace.getConfiguration(utils.PowerShellLanguageId).get<string>("cwd");
214214

215215
// Only use the cwd setting if it exists.

test/utils.ts

+41
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import * as path from "path";
55
import * as vscode from "vscode";
6+
import { ILogger } from "../src/logging";
67
import { IPowerShellExtensionClient } from "../src/features/ExternalApi";
78

89
// This lets us test the rest of our path assumptions against the baseline of
@@ -12,6 +13,46 @@ export const rootPath = path.resolve(__dirname, "../../");
1213
const packageJSON: any = require(path.resolve(rootPath, "package.json"));
1314
export const extensionId = `${packageJSON.publisher}.${packageJSON.name}`;
1415

16+
export class TestLogger implements ILogger {
17+
getLogFilePath(_baseName: string): vscode.Uri {
18+
return vscode.Uri.file("");
19+
}
20+
updateLogLevel(_logLevelName: string): void {
21+
return;
22+
}
23+
write(_message: string, ..._additionalMessages: string[]): void {
24+
return;
25+
}
26+
writeAndShowInformation(_message: string, ..._additionalMessages: string[]): Promise<void> {
27+
return Promise.resolve();
28+
}
29+
writeDiagnostic(_message: string, ..._additionalMessages: string[]): void {
30+
return;
31+
}
32+
writeVerbose(_message: string, ..._additionalMessages: string[]): void {
33+
return;
34+
}
35+
writeWarning(_message: string, ..._additionalMessages: string[]): void {
36+
return;
37+
}
38+
writeAndShowWarning(_message: string, ..._additionalMessages: string[]): Promise<void> {
39+
return Promise.resolve();
40+
}
41+
writeError(_message: string, ..._additionalMessages: string[]): void {
42+
return;
43+
}
44+
writeAndShowError(_message: string, ..._additionalMessages: string[]): Promise<void> {
45+
return Promise.resolve();
46+
}
47+
writeAndShowErrorWithActions(
48+
_message: string,
49+
_actions: { prompt: string; action: (() => Promise<void>) | undefined }[]): Promise<void> {
50+
return Promise.resolve();
51+
}
52+
}
53+
54+
export const testLogger = new TestLogger();
55+
1556
export async function ensureExtensionIsActivated(): Promise<IPowerShellExtensionClient> {
1657
const extension = vscode.extensions.getExtension(extensionId);
1758
if (!extension!.isActive) { await extension!.activate(); }

0 commit comments

Comments
 (0)