diff --git a/packages/salesforcedx-vscode-apex/package.json b/packages/salesforcedx-vscode-apex/package.json
index cd9f47481b..61dcb6241e 100644
--- a/packages/salesforcedx-vscode-apex/package.json
+++ b/packages/salesforcedx-vscode-apex/package.json
@@ -140,12 +140,17 @@
{
"command": "sf.test.view.run",
"when": "view == sf.test.view",
- "group": "navigation"
+ "group": "navigation@1"
},
{
"command": "sf.test.view.refresh",
"when": "view == sf.test.view",
- "group": "navigation"
+ "group": "navigation@2"
+ },
+ {
+ "command": "sf.test.view.collapseAll",
+ "when": "view == sf.test.view",
+ "group": "navigation@3"
}
],
"view/item/context": [
@@ -276,6 +281,14 @@
"dark": "resources/dark/play-button.svg"
}
},
+ {
+ "command": "sf.test.view.collapseAll",
+ "title": "%collapse_tests_title%",
+ "icon": {
+ "light": "resources/light/collapse-all.svg",
+ "dark": "resources/dark/collapse-all.svg"
+ }
+ },
{
"command": "sf.test.view.refresh",
"title": "%refresh_test_title%",
diff --git a/packages/salesforcedx-vscode-apex/package.nls.ja.json b/packages/salesforcedx-vscode-apex/package.nls.ja.json
index 46208eead2..3ce21ea685 100644
--- a/packages/salesforcedx-vscode-apex/package.nls.ja.json
+++ b/packages/salesforcedx-vscode-apex/package.nls.ja.json
@@ -18,6 +18,7 @@
"apex_trace_server_description": "Controls the level of detail for trace logs in the Apex Language Server",
"apex_verbose_level_trace_description": "Output everything, including details about notifications and responses received by the client, and requests sent by the server.",
"configuration_title": "Salesforce Apex Configuration",
+ "collapse_tests_title": "SFDX: Apex テストを隠す",
"go_to_definition_title": "定義に移動",
"java_home_description": "Apex 言語サーバの起動に使用される Java 8 または Java 11 ランタイムのフォルダパスを指定します。(例: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home)",
"java_memory_description": "Apex 言語サーバへのメモリ割り当て量を MB 単位で指定します。空の場合はシステムのデフォルト値を使用します。",
diff --git a/packages/salesforcedx-vscode-apex/package.nls.json b/packages/salesforcedx-vscode-apex/package.nls.json
index 95e32f9b3e..abceb70277 100644
--- a/packages/salesforcedx-vscode-apex/package.nls.json
+++ b/packages/salesforcedx-vscode-apex/package.nls.json
@@ -18,6 +18,7 @@
"apex_trace_server_description": "Controls the level of detail for trace logs in the Apex Language Server",
"apex_verbose_level_trace_description": "Output everything, including details about notifications and responses received by the client, and requests sent by the server.",
"configuration_title": "Salesforce Apex Configuration",
+ "collapse_tests_title": "SFDX: Collapse All Apex Tests",
"go_to_definition_title": "Go to Definition",
"java_home_description": "Specifies the folder path to the Java 11 or Java 17 runtime used to launch the Apex Language Server. Note on Windows the backslashes must be escaped.\n\nMac Example: `/Library/Java/JavaVirtualMachines/openjdk-11.jdk/Contents/Home`\n\nWindows Example: `C:\\\\Program Files\\\\Zulu\\\\zulu-17`\n\nLinux Example: `/usr/lib/jvm/java-17-openjdk-amd64`",
"java_memory_description": "Specifies the amount of memory allocation to the Apex Language Server in MB, or null to use the system default value.",
diff --git a/packages/salesforcedx-vscode-apex/resources/dark/collapse-all.svg b/packages/salesforcedx-vscode-apex/resources/dark/collapse-all.svg
new file mode 100644
index 0000000000..65c6f5149c
--- /dev/null
+++ b/packages/salesforcedx-vscode-apex/resources/dark/collapse-all.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/packages/salesforcedx-vscode-apex/resources/light/collapse-all.svg b/packages/salesforcedx-vscode-apex/resources/light/collapse-all.svg
new file mode 100644
index 0000000000..b70b6d5c96
--- /dev/null
+++ b/packages/salesforcedx-vscode-apex/resources/light/collapse-all.svg
@@ -0,0 +1,4 @@
+
diff --git a/packages/salesforcedx-vscode-apex/src/index.ts b/packages/salesforcedx-vscode-apex/src/index.ts
index 07443d1e15..7e3e9d6231 100644
--- a/packages/salesforcedx-vscode-apex/src/index.ts
+++ b/packages/salesforcedx-vscode-apex/src/index.ts
@@ -47,7 +47,7 @@ import {
import { nls } from './messages';
import { retrieveEnableSyncInitJobs } from './settings';
import { telemetryService } from './telemetry';
-import { getTestOutlineProvider } from './views/testOutlineProvider';
+import { getTestOutlineProvider, TestNode } from './views/testOutlineProvider';
import { ApexTestRunner, TestRunType } from './views/testRunner';
export const activate = async (extensionContext: vscode.ExtensionContext) => {
@@ -229,48 +229,64 @@ const registerTestView = (): vscode.Disposable => {
const testViewItems = new Array();
const testProvider = vscode.window.registerTreeDataProvider(
- 'sf.test.view',
+ testOutlineProvider.getId(),
testOutlineProvider
);
testViewItems.push(testProvider);
// Run Test Button on Test View command
testViewItems.push(
- vscode.commands.registerCommand('sf.test.view.run', () =>
+ vscode.commands.registerCommand(`${testOutlineProvider.getId()}.run`, () =>
testRunner.runAllApexTests()
)
);
// Show Error Message command
testViewItems.push(
- vscode.commands.registerCommand('sf.test.view.showError', test =>
- testRunner.showErrorMessage(test)
+ vscode.commands.registerCommand(
+ `${testOutlineProvider.getId()}.showError`,
+ (test: TestNode) => testRunner.showErrorMessage(test)
)
);
// Show Definition command
testViewItems.push(
- vscode.commands.registerCommand('sf.test.view.goToDefinition', test =>
- testRunner.showErrorMessage(test)
+ vscode.commands.registerCommand(
+ `${testOutlineProvider.getId()}.goToDefinition`,
+ (test: TestNode) => testRunner.showErrorMessage(test)
)
);
// Run Class Tests command
testViewItems.push(
- vscode.commands.registerCommand('sf.test.view.runClassTests', test =>
- testRunner.runApexTests([test.name], TestRunType.Class)
+ vscode.commands.registerCommand(
+ `${testOutlineProvider.getId()}.runClassTests`,
+ (test: TestNode) =>
+ testRunner.runApexTests([test.name], TestRunType.Class)
)
);
// Run Single Test command
testViewItems.push(
- vscode.commands.registerCommand('sf.test.view.runSingleTest', test =>
- testRunner.runApexTests([test.name], TestRunType.Method)
+ vscode.commands.registerCommand(
+ `${testOutlineProvider.getId()}.runSingleTest`,
+ (test: TestNode) =>
+ testRunner.runApexTests([test.name], TestRunType.Method)
)
);
// Refresh Test View command
testViewItems.push(
- vscode.commands.registerCommand('sf.test.view.refresh', () => {
- if (languageClientUtils.getStatus().isReady()) {
- return testOutlineProvider.refresh();
+ vscode.commands.registerCommand(
+ `${testOutlineProvider.getId()}.refresh`,
+ () => {
+ if (languageClientUtils.getStatus().isReady()) {
+ return testOutlineProvider.refresh();
+ }
}
- })
+ )
+ );
+ // Collapse All Apex Tests command
+ testViewItems.push(
+ vscode.commands.registerCommand(
+ `${testOutlineProvider.getId()}.collapseAll`,
+ () => testOutlineProvider.collapseAll()
+ )
);
return vscode.Disposable.from(...testViewItems);
@@ -297,16 +313,19 @@ const createLanguageClient = async (
const languageClient = languageClientUtils.getClientInstance();
if (languageClient) {
- languageClient.errorHandler?.addListener('error', message => {
+ languageClient.errorHandler?.addListener('error', (message: string) => {
languageServerStatusBarItem.error(message);
});
- languageClient.errorHandler?.addListener('restarting', count => {
- languageServerStatusBarItem.error(
- nls
- .localize('apex_language_server_quit_and_restarting')
- .replace('$N', count)
- );
- });
+ languageClient.errorHandler?.addListener(
+ 'restarting',
+ (count: number) => {
+ languageServerStatusBarItem.error(
+ nls
+ .localize('apex_language_server_quit_and_restarting')
+ .replace('$N', `${count}`)
+ );
+ }
+ );
languageClient.errorHandler?.addListener('startFailed', () => {
languageServerStatusBarItem.error(
nls.localize('apex_language_server_failed_activate')
@@ -343,17 +362,25 @@ const createLanguageClient = async (
);
}
} catch (e) {
- languageClientUtils.setStatus(ClientStatus.Error, e);
- let eMsg =
- typeof e === 'string' ? e : e.message ?? nls.localize('unknown_error');
+ let errorMessage = '';
+ if (typeof e === 'string') {
+ errorMessage = e;
+ } else if (e instanceof Error) {
+ errorMessage = e.message ?? nls.localize('unknown_error');
+ }
if (
- eMsg.includes(nls.localize('wrong_java_version_text', SET_JAVA_DOC_LINK))
+ errorMessage.includes(
+ nls.localize('wrong_java_version_text', SET_JAVA_DOC_LINK)
+ )
) {
- eMsg = nls.localize('wrong_java_version_short');
+ errorMessage = nls.localize('wrong_java_version_short');
}
+ languageClientUtils.setStatus(ClientStatus.Error, errorMessage);
languageServerStatusBarItem.error(
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
- `${nls.localize('apex_language_server_failed_activate')} - ${eMsg}`
+ `${nls.localize(
+ 'apex_language_server_failed_activate'
+ )} - ${errorMessage}`
);
}
};
diff --git a/packages/salesforcedx-vscode-apex/src/views/testOutlineProvider.ts b/packages/salesforcedx-vscode-apex/src/views/testOutlineProvider.ts
index 734ba4ae68..1e2534b316 100644
--- a/packages/salesforcedx-vscode-apex/src/views/testOutlineProvider.ts
+++ b/packages/salesforcedx-vscode-apex/src/views/testOutlineProvider.ts
@@ -20,13 +20,17 @@ import { nls } from '../messages';
import { IconsEnum, iconHelpers } from './icons';
import { ApexTestMethod } from './lspConverter';
+// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
+const safeLocalize = (val: string) => nls.localize(val);
+
// Message
-const LOADING_MESSAGE = nls.localize('test_view_loading_message');
-const NO_TESTS_MESSAGE = nls.localize('test_view_no_tests_message');
-const NO_TESTS_DESCRIPTION = nls.localize('test_view_no_tests_description');
+const LOADING_MESSAGE = safeLocalize('test_view_loading_message');
+const NO_TESTS_MESSAGE = safeLocalize('test_view_no_tests_message');
+const NO_TESTS_DESCRIPTION = safeLocalize('test_view_no_tests_description');
const TEST_RUN_ID_FILE = 'test-run-id.txt';
const TEST_RESULT_JSON_FILE = 'test-result.json';
+const BASE_ID = 'sf.test.view';
export class ApexTestOutlineProvider
implements vscode.TreeDataProvider
@@ -56,6 +60,10 @@ export class ApexTestOutlineProvider
}
}
+ public getId(): string {
+ return BASE_ID;
+ }
+
public getChildren(element: TestNode): TestNode[] {
if (element) {
return element.children;
@@ -68,7 +76,7 @@ export class ApexTestOutlineProvider
const languageClientStatus = languageClientUtils.getStatus();
if (!languageClientStatus.isReady()) {
if (languageClientStatus.failedToInitialize()) {
- vscode.window.showInformationMessage(
+ void vscode.window.showInformationMessage(
languageClientStatus.getStatusMessage()
);
return new Array();
@@ -110,30 +118,29 @@ export class ApexTestOutlineProvider
this.rootNode = null; // Reset tests
this.apexTestMap.clear();
this.testStrings.clear();
- this.apexTestInfo = null;
- if (languageClientUtils.getStatus().isReady()) {
- this.apexTestInfo = await getApexTests();
- this.createTestIndex();
- }
+ this.apexTestInfo = await getApexTests();
+ this.createTestIndex();
this.getAllApexTests();
this.onDidChangeTestData.fire(undefined);
}
+ public async collapseAll(): Promise {
+ return vscode.commands.executeCommand(
+ `workbench.actions.treeView.${this.getId()}.collapseAll`
+ );
+ }
+
public async onResultFileCreate(
apexTestPath: string,
testResultFile: string
) {
const testRunIdFile = path.join(apexTestPath, TEST_RUN_ID_FILE);
- const testRunId = readFileSync(testRunIdFile);
- let testResultFilePath;
- if (testRunId.toString() === '') {
- testResultFilePath = path.join(apexTestPath, TEST_RESULT_JSON_FILE);
- } else {
- testResultFilePath = path.join(
- apexTestPath,
- `test-result-${testRunId.toString()}.json`
- );
- }
+ const testRunId = readFileSync(testRunIdFile).toString();
+ const testResultFilePath = path.join(
+ apexTestPath,
+ !testRunId ? TEST_RESULT_JSON_FILE : `test-result-${testRunId}.json`
+ );
+
if (testResultFile === testResultFilePath) {
await this.refresh();
this.updateTestResults(testResultFile);
@@ -157,7 +164,7 @@ export class ApexTestOutlineProvider
}
private getAllApexTests(): TestNode {
- if (this.rootNode == null) {
+ if (this.rootNode === null) {
// Starting Out
this.rootNode = new ApexTestGroupNode(APEX_TESTS, null);
}
@@ -254,8 +261,8 @@ export abstract class TestNode extends vscode.TreeItem {
this.description = label;
this.name = label;
this.command = {
- command: 'sf.test.view.showError',
- title: nls.localize('test_view_show_error_title'),
+ command: `${BASE_ID}.showError`,
+ title: safeLocalize('test_view_show_error_title'),
arguments: [this]
};
}
@@ -316,12 +323,10 @@ export class ApexTestGroupNode extends TestNode {
this.failing = 0;
this.skipping = 0;
this.children.forEach(child => {
- if ((child as ApexTestNode).outcome === PASS_RESULT) {
- this.passing++;
- } else if ((child as ApexTestNode).outcome === FAIL_RESULT) {
- this.failing++;
- } else if ((child as ApexTestNode).outcome === SKIP_RESULT) {
- this.skipping++;
+ if (child instanceof ApexTestNode) {
+ this.passing += child.outcome === PASS_RESULT ? 1 : 0;
+ this.failing += child.outcome === FAIL_RESULT ? 1 : 0;
+ this.skipping += child.outcome === SKIP_RESULT ? 1 : 0;
}
});
diff --git a/packages/salesforcedx-vscode-apex/test/jest/index.test.ts b/packages/salesforcedx-vscode-apex/test/jest/index.test.ts
index 85afccb1ae..35e7c66843 100644
--- a/packages/salesforcedx-vscode-apex/test/jest/index.test.ts
+++ b/packages/salesforcedx-vscode-apex/test/jest/index.test.ts
@@ -74,7 +74,9 @@ describe('deactivate', () => {
let stopSpy: jest.SpyInstance;
beforeEach(() => {
stopSpy = jest.fn();
- jest.spyOn(languageClientUtils, 'getClientInstance').mockReturnValue({ stop: stopSpy } as unknown as ApexLanguageClient);
+ jest
+ .spyOn(languageClientUtils, 'getClientInstance')
+ .mockReturnValue({ stop: stopSpy } as unknown as ApexLanguageClient);
});
it('should call stop on the language client', async () => {
diff --git a/packages/salesforcedx-vscode-apex/test/jest/views/testOutlineProvider.test.ts b/packages/salesforcedx-vscode-apex/test/jest/views/testOutlineProvider.test.ts
new file mode 100644
index 0000000000..2bf5717c2e
--- /dev/null
+++ b/packages/salesforcedx-vscode-apex/test/jest/views/testOutlineProvider.test.ts
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2024, salesforce.com, inc.
+ * All rights reserved.
+ * Licensed under the BSD 3-Clause license.
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
+ */
+
+import * as vscode from 'vscode';
+import { iconHelpers } from '../../../src/views/icons/iconHelpers';
+
+import { getTestOutlineProvider } from '../../../src/views/testOutlineProvider';
+
+describe('testOutlineProvider Unit Tests.', () => {
+ const vscodeMocked = jest.mocked(vscode);
+ let commandMock: jest.SpyInstance;
+
+ beforeEach(() => {
+ // testOutlineProvider has a hidden dependency on iconHelpers.getIconPath that needs to be mocked
+ // for our purposes, the return value has no bearing on what we're testing
+ jest
+ .spyOn(iconHelpers, 'getIconPath')
+ .mockReturnValue(vscode.Uri.parse('https://salesforce.com'));
+ commandMock = jest.spyOn(vscodeMocked.commands, 'executeCommand');
+ });
+
+ it('sets test outline provider id', () => {
+ const provider = getTestOutlineProvider();
+ expect(provider.getId()).toBe('sf.test.view');
+ });
+
+ it('calls collapse all apex tests', () => {
+ const provider = getTestOutlineProvider();
+
+ void provider.collapseAll();
+
+ expect(commandMock.mock.calls.length).toBe(1);
+ expect(commandMock.mock.calls[0].length).toBe(1);
+ expect(commandMock.mock.calls[0][0]).toBe(
+ `workbench.actions.treeView.${provider.getId()}.collapseAll`
+ );
+ });
+});
diff --git a/packages/salesforcedx-vscode-lwc/package.json b/packages/salesforcedx-vscode-lwc/package.json
index b7c20d3842..4d8780fc03 100644
--- a/packages/salesforcedx-vscode-lwc/package.json
+++ b/packages/salesforcedx-vscode-lwc/package.json
@@ -196,12 +196,17 @@
{
"command": "sf.lightning.lwc.test.runAllTests",
"when": "view == sf.lightning.lwc.test.view",
- "group": "navigation"
+ "group": "navigation@1"
},
{
"command": "sf.lightning.lwc.test.refreshTestExplorer",
"when": "view == sf.lightning.lwc.test.view",
- "group": "navigation"
+ "group": "navigation@2"
+ },
+ {
+ "command": "sf.lightning.lwc.test.view.collapseAll",
+ "when": "view == sf.lightning.lwc.test.view",
+ "group": "navigation@3"
}
],
"view/item/context": [
@@ -336,6 +341,14 @@
"dark": "resources/dark/refresh.svg"
}
},
+ {
+ "command": "sf.lightning.lwc.test.view.collapseAll",
+ "title": "%lightning_lwc_test_collapse_all_text%",
+ "icon": {
+ "light": "resources/light/collapse-all.svg",
+ "dark": "resources/dark/collapse-all.svg"
+ }
+ },
{
"command": "sf.lightning.lwc.test.navigateToTest",
"title": "%lightning_lwc_test_navigate_to_test%"
diff --git a/packages/salesforcedx-vscode-lwc/package.nls.ja.json b/packages/salesforcedx-vscode-lwc/package.nls.ja.json
index dfbdef757f..ffb1d5de64 100644
--- a/packages/salesforcedx-vscode-lwc/package.nls.ja.json
+++ b/packages/salesforcedx-vscode-lwc/package.nls.ja.json
@@ -10,6 +10,7 @@
"lightning_lwc_stop_text": "SFDX: ローカルの開発サーバを停止",
"lightning_lwc_test_case_debug_text": "SFDX: Lightning Web コンポーネントのテストケースをデバッグ",
"lightning_lwc_test_case_run_text": "SFDX: Lightning Web コンポーネントのテストケースを実行",
+ "lightning_lwc_test_collapse_all_text": "SFDX: Lightning Web コンポーネントテストエクスプローラを隠す",
"lightning_lwc_test_debug_current_file_text": "SFDX: 現在の Lightning Web コンポーネントのテストファイルをデバッグ",
"lightning_lwc_test_file_debug_text": "SFDX: Lightning Web コンポーネントのテストファイルをデバッグ",
"lightning_lwc_test_file_run_text": "SFDX: Lightning Web コンポーネントのテストファイルを実行",
diff --git a/packages/salesforcedx-vscode-lwc/package.nls.json b/packages/salesforcedx-vscode-lwc/package.nls.json
index 246ab7fda2..4aa18fe2fc 100644
--- a/packages/salesforcedx-vscode-lwc/package.nls.json
+++ b/packages/salesforcedx-vscode-lwc/package.nls.json
@@ -9,6 +9,7 @@
"lightning_lwc_start_text": "SFDX: Start Local Development Server",
"lightning_lwc_stop_text": "SFDX: Stop Local Development Server",
"lightning_lwc_test_case_debug_text": "SFDX: Debug Lightning Web Component Test Case",
+ "lightning_lwc_test_collapse_all_text": "SFDX: Lightning Web Component Collapse All Tests",
"lightning_lwc_test_case_run_text": "SFDX: Run Lightning Web Component Test Case",
"lightning_lwc_test_debug_current_file_text": "SFDX: Debug Current Lightning Web Component Test File",
"lightning_lwc_test_file_debug_text": "SFDX: Debug Lightning Web Component Test File",
diff --git a/packages/salesforcedx-vscode-lwc/resources/dark/collapse-all.svg b/packages/salesforcedx-vscode-lwc/resources/dark/collapse-all.svg
new file mode 100644
index 0000000000..65c6f5149c
--- /dev/null
+++ b/packages/salesforcedx-vscode-lwc/resources/dark/collapse-all.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/packages/salesforcedx-vscode-lwc/resources/light/collapse-all.svg b/packages/salesforcedx-vscode-lwc/resources/light/collapse-all.svg
new file mode 100644
index 0000000000..b70b6d5c96
--- /dev/null
+++ b/packages/salesforcedx-vscode-lwc/resources/light/collapse-all.svg
@@ -0,0 +1,4 @@
+
diff --git a/packages/salesforcedx-vscode-lwc/src/testSupport/testExplorer/testOutlineProvider.ts b/packages/salesforcedx-vscode-lwc/src/testSupport/testExplorer/testOutlineProvider.ts
index c1ed11719c..b8da0d126b 100644
--- a/packages/salesforcedx-vscode-lwc/src/testSupport/testExplorer/testOutlineProvider.ts
+++ b/packages/salesforcedx-vscode-lwc/src/testSupport/testExplorer/testOutlineProvider.ts
@@ -59,6 +59,16 @@ export class SfTestOutlineProvider
);
}
+ public getId(): string {
+ return 'sf.lightning.lwc.test.view';
+ }
+
+ public async collapseAll(): Promise {
+ return vscode.commands.executeCommand(
+ `workbench.actions.treeView.${this.getId()}.collapseAll`
+ );
+ }
+
public dispose() {
while (this.disposables.length) {
const disposable = this.disposables.pop();
@@ -132,9 +142,15 @@ export const registerLwcTestExplorerTreeView = (
) => {
const testOutlineProvider = new SfTestOutlineProvider();
const testProvider = vscode.window.registerTreeDataProvider(
- 'sf.lightning.lwc.test.view',
+ testOutlineProvider.getId(),
testOutlineProvider
);
extensionContext.subscriptions.push(testOutlineProvider);
extensionContext.subscriptions.push(testProvider);
+
+ const collapseAllTestCommand = vscode.commands.registerCommand(
+ `${testOutlineProvider.getId()}.collapseAll`,
+ () => testOutlineProvider.collapseAll()
+ );
+ extensionContext.subscriptions.push(collapseAllTestCommand);
};
diff --git a/packages/salesforcedx-vscode-lwc/test/jest/testExplorer/testOutlineProvider.test.ts b/packages/salesforcedx-vscode-lwc/test/jest/testExplorer/testOutlineProvider.test.ts
new file mode 100644
index 0000000000..cccfdf8b7b
--- /dev/null
+++ b/packages/salesforcedx-vscode-lwc/test/jest/testExplorer/testOutlineProvider.test.ts
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2024, salesforce.com, inc.
+ * All rights reserved.
+ * Licensed under the BSD 3-Clause license.
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
+ */
+
+import { extensionUris } from '@salesforce/salesforcedx-utils-vscode';
+import * as vscode from 'vscode';
+
+// SfTestOutlineProvider has a hidden dependency on @salesforce/salesforcedx-utils-vscode.extensionUri that needs to be mocked
+// and, crucially, the mock has to be done prior to the class import!
+// for our purposes, the return value has no bearing on what we're testing
+const mockUri = vscode.Uri.parse('https://salesforce.com');
+jest.spyOn(extensionUris, 'extensionUri').mockReturnValue(mockUri);
+jest.spyOn(extensionUris, 'join').mockReturnValue(mockUri);
+
+import { SfTestOutlineProvider } from '../../../src/testSupport/testExplorer/testOutlineProvider';
+
+describe('testOutlineProvider Unit Tests.', () => {
+ const vscodeMocked = jest.mocked(vscode);
+ let commandMock: jest.SpyInstance;
+
+ beforeEach(() => {
+ commandMock = jest.spyOn(vscodeMocked.commands, 'executeCommand');
+ });
+
+ it('sets test outline provider id', () => {
+ const provider = new SfTestOutlineProvider();
+ expect(provider.getId()).toBe('sf.lightning.lwc.test.view');
+ });
+
+ it('calls collapse all lwc tests', () => {
+ const provider = new SfTestOutlineProvider();
+
+ void provider.collapseAll();
+
+ expect(commandMock.mock.calls.length).toBe(1);
+ expect(commandMock.mock.calls[0].length).toBe(1);
+ expect(commandMock.mock.calls[0][0]).toBe(
+ `workbench.actions.treeView.${provider.getId()}.collapseAll`
+ );
+ });
+});
diff --git a/packages/salesforcedx-vscode-lwc/test/unit/commands/commandConstants.test.ts b/packages/salesforcedx-vscode-lwc/test/unit/commands/commandConstants.test.ts
index 07a04ec464..ef57206d63 100644
--- a/packages/salesforcedx-vscode-lwc/test/unit/commands/commandConstants.test.ts
+++ b/packages/salesforcedx-vscode-lwc/test/unit/commands/commandConstants.test.ts
@@ -9,7 +9,7 @@ import { DEV_SERVER_DEFAULT_BASE_URL } from '../../../src/commands/commandConsta
describe('force:lightning:lwc:start constants', () => {
describe('base url', () => {
- it('should include localhost', async () => {
+ it('should include localhost', () => {
expect(DEV_SERVER_DEFAULT_BASE_URL).to.include('localhost');
});
});