From a8f06e2a0ad90d1ddea75037f010ead3e74425dd Mon Sep 17 00:00:00 2001 From: Rudy Flores <68666202+rudyflores@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:24:32 -0500 Subject: [PATCH 1/8] Add option for hiding profile from all trees Signed-off-by: Rudy Flores <68666202+rudyflores@users.noreply.github.com> --- .../zowe-explorer-api/src/tree/IZoweTree.ts | 8 +++- .../__mocks__/mockCreators/shared.ts | 41 ++++++++++++++++++- .../__unit__/dataset/DatasetTree.unit.test.ts | 19 ++++++++- .../__unit__/dataset/init.unit.test.ts | 2 +- .../__tests__/__unit__/extension.unit.test.ts | 4 +- .../__unit__/job/ZoweJobNode.unit.test.ts | 11 +++-- .../__tests__/__unit__/job/init.unit.test.ts | 2 +- .../__unit__/uss/USSTree.unit.test.ts | 14 +++++-- .../__tests__/__unit__/uss/init.unit.test.ts | 2 +- .../utils/ProfileManagement.unit.test.ts | 6 ++- .../src/utils/ProfileManagement.i18n.json | 6 +++ .../src/abstract/ZoweTreeProvider.ts | 20 ++++++--- .../zowe-explorer/src/dataset/DatasetTree.ts | 14 +++++-- packages/zowe-explorer/src/dataset/init.ts | 23 ++++++----- .../zowe-explorer/src/job/ZosJobsProvider.ts | 15 +++++-- packages/zowe-explorer/src/job/init.ts | 10 ++--- .../zowe-explorer/src/shared/TreeProviders.ts | 30 ++++++++------ packages/zowe-explorer/src/shared/init.ts | 10 +++-- packages/zowe-explorer/src/uss/USSTree.ts | 14 +++++-- packages/zowe-explorer/src/uss/init.ts | 10 ++--- .../src/utils/ProfileManagement.ts | 37 +++++++++++++++-- 21 files changed, 228 insertions(+), 70 deletions(-) diff --git a/packages/zowe-explorer-api/src/tree/IZoweTree.ts b/packages/zowe-explorer-api/src/tree/IZoweTree.ts index 9b5799d9e9..55ec8d8b0a 100644 --- a/packages/zowe-explorer-api/src/tree/IZoweTree.ts +++ b/packages/zowe-explorer-api/src/tree/IZoweTree.ts @@ -206,8 +206,9 @@ export interface IZoweTree extends vscode.TreeDataProvider { /** * Deletes a root node from the tree. * @param node: A root node representing a session + * @param hideFromAllTrees: whether to hide from all trees or just the single tree */ - deleteSession(node: IZoweTreeNode); + deleteSession(node: IZoweTreeNode, hideFromAllTrees?: boolean); /** * Lets the user open a dataset by filtering the currently-loaded list */ @@ -268,6 +269,11 @@ export interface IZoweTree extends vscode.TreeDataProvider { * @param {string} name the member to remove */ removeFileHistory?(name: string); + /** + * Removes session from the session array + * @param {string} name the sessions to remove + */ + removeSession?(name: string): void; /** * Returns a new dataset filter string, from an old filter and a new string * diff --git a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts index 07d17faaf5..9a3ffa5a90 100644 --- a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts +++ b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts @@ -13,7 +13,7 @@ import { ZoweTreeProvider } from "../../src/abstract/ZoweTreeProvider"; import { ZoweDatasetNode } from "../../src/dataset/ZoweDatasetNode"; import { ZoweUSSNode } from "../../src/uss/ZoweUSSNode"; import * as vscode from "vscode"; -import { ValidProfileEnum } from "@zowe/zowe-explorer-api"; +import { ValidProfileEnum, IZoweTreeNode } from "@zowe/zowe-explorer-api"; import { FilterDescriptor } from "../../src/utils/ProfilesUtils"; import { imperative, ZosmfSession } from "@zowe/cli"; import { SettingsConfig } from "../../src/utils/SettingsConfig"; @@ -548,3 +548,42 @@ export function createOutputChannel() { replace: jest.fn(), } as vscode.OutputChannel; } + +export function createMockNode(name: string): IZoweTreeNode { + return { + dirty: false, + getLabel: jest.fn(() => name), + getChildren: jest.fn(), + getParent: jest.fn(), + getProfile: jest.fn(), + getProfileName: jest.fn(), + getSession: jest.fn(), + getSessionNode: jest.fn(), + setProfileToChoice: jest.fn(), + setSessionToChoice: jest.fn(), + label: name, + }; +} + +export function createTreeProviders() { + return { + ds: { + mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + deleteSession: jest.fn(), + removeSession: jest.fn(), + refresh: jest.fn(), + } as any, + uss: { + mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + deleteSession: jest.fn(), + removeSession: jest.fn(), + refresh: jest.fn(), + } as any, + job: { + mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + removeSession: jest.fn(), + deleteSession: jest.fn(), + refresh: jest.fn(), + } as any, + }; +} diff --git a/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts index d4f853238b..da0d4a9b24 100644 --- a/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts @@ -40,6 +40,7 @@ import { createValidIProfile, createInstanceOfProfileInfo, createGetConfigMock, + createTreeProviders, } from "../../../__mocks__/mockCreators/shared"; import { createDatasetSessionNode, createDatasetTree, createDatasetFavoritesNode } from "../../../__mocks__/mockCreators/datasets"; import { bindMvsApi, createMvsApi } from "../../../__mocks__/mockCreators/api"; @@ -49,6 +50,7 @@ import * as dsUtils from "../../../src/dataset/utils"; import { SettingsConfig } from "../../../src/utils/SettingsConfig"; import * as sharedActions from "../../../src/shared/actions"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; +import { TreeProviders } from "../../../src/shared/TreeProviders"; jest.mock("fs"); jest.mock("util"); @@ -63,6 +65,7 @@ function createGlobalMocks() { mockShowWarningMessage: jest.fn(), mockProfileInfo: createInstanceOfProfileInfo(), mockProfilesCache: new ProfilesCache(zowe.imperative.Logger.getAppLogger()), + mockTreeProviders: createTreeProviders(), }; globalMocks.mockProfileInstance = createInstanceOfProfile(globalMocks.testProfileLoaded); @@ -1327,7 +1330,7 @@ describe("Dataset Tree Unit Tests - Function deleteSession", () => { }; } - it("Checking common run of function", async () => { + it("Checking common run of function", () => { createGlobalMocks(); const blockMocks = createBlockMocks(); @@ -1339,6 +1342,20 @@ describe("Dataset Tree Unit Tests - Function deleteSession", () => { expect(testTree.mSessionNodes.map((node) => node.label)).toEqual(["Favorites"]); }); + + it("Checking case profile needs to be hidden for all trees", async () => { + const globalMocks = createGlobalMocks(); + const blockMocks = createBlockMocks(); + + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); + mocked(vscode.window.createTreeView).mockReturnValueOnce(blockMocks.treeView); + const testTree = new DatasetTree(); + testTree.mSessionNodes.push(blockMocks.datasetSessionNode); + + testTree.deleteSession(testTree.mSessionNodes[1], true); + + expect(testTree.mSessionNodes.map((node) => node.label)).toEqual(["Favorites"]); + }); }); describe("Dataset Tree Unit Tests - Function flipState", () => { function createBlockMocks() { diff --git a/packages/zowe-explorer/__tests__/__unit__/dataset/init.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/dataset/init.unit.test.ts index 443446b047..86d1595754 100644 --- a/packages/zowe-explorer/__tests__/__unit__/dataset/init.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/dataset/init.unit.test.ts @@ -137,7 +137,7 @@ describe("Test src/dataset/extension", () => { name: "zowe.ds.removeSession", mock: [ { spy: jest.spyOn(contextuals, "isDsSession"), arg: [test.value], ret: true }, - { spy: jest.spyOn(dsProvider, "deleteSession"), arg: [test.value] }, + { spy: jest.spyOn(dsProvider, "deleteSession"), arg: [test.value, undefined] }, ], }, { diff --git a/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts index 5c9bc961a8..14aee629ab 100644 --- a/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/extension.unit.test.ts @@ -546,10 +546,12 @@ describe("Extension Unit Tests", () => { getProfile: jest.fn(), getParent: jest.fn().mockReturnValue({ getLabel: jest.fn() }), label: "TestNode", + getLabel: jest.fn(() => "TestNode"), }; + const deleteSessionSpy = jest.spyOn(providerObject.prototype, "deleteSession"); const commandFunction = allCommands.find((cmd) => command === cmd.cmd); - await (commandFunction as any).fun(testNode, [testNode]); + await (commandFunction as any).fun(testNode, [testNode], true); expect(deleteSessionSpy).toHaveBeenCalled(); } diff --git a/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts index 2d5351b450..34097a5e0b 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts @@ -26,10 +26,12 @@ import { createInstanceOfProfile, createISessionWithoutCredentials, createInstanceOfProfileInfo, + createTreeProviders, } from "../../../__mocks__/mockCreators/shared"; import * as contextually from "../../../src/shared/context"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; import { bindJesApi, createJesApi } from "../../../__mocks__/mockCreators/api"; +import { TreeProviders } from "../../../src/shared/TreeProviders"; async function createGlobalMocks() { const globalMocks = { @@ -86,6 +88,7 @@ async function createGlobalMocks() { }), mockProfileInfo: createInstanceOfProfileInfo(), mockProfilesCache: new ProfilesCache(zowe.imperative.Logger.getAppLogger()), + mockTreeProviders: createTreeProviders(), }; Object.defineProperty(globals, "LOG", { value: jest.fn(), configurable: true }); @@ -237,10 +240,12 @@ describe("ZoweJobNode unit tests - Function addSession", () => { describe("ZoweJobNode unit tests - Function deleteSession", () => { it("Tests that deleteSession removes the session from the tree", async () => { const globalMocks = await createGlobalMocks(); - + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); + globalMocks.testJobsProvider.mSessionNodes = globalMocks.mockTreeProviders.ds.mSessionNodes; await globalMocks.testJobsProvider.deleteSession(globalMocks.testJobsProvider.mSessionNodes[1]); - - expect(globalMocks.testJobsProvider.mSessionNodes.length).toBe(1); + expect(globalMocks.mockTreeProviders.ds.mSessionNodes.length).toEqual(2); + expect(globalMocks.mockTreeProviders.uss.mSessionNodes.length).toEqual(2); + expect(globalMocks.mockTreeProviders.job.mSessionNodes.length).toEqual(2); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/job/init.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/init.unit.test.ts index 9a9f9fdd85..c510fe0d36 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/init.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/init.unit.test.ts @@ -122,7 +122,7 @@ describe("Test src/jobs/extension", () => { name: "zowe.jobs.removeJobsSession", mock: [ { spy: jest.spyOn(contextuals, "isJobsSession"), arg: [test.value], ret: true }, - { spy: jest.spyOn(jobsProvider, "deleteSession"), arg: [test.value] }, + { spy: jest.spyOn(jobsProvider, "deleteSession"), arg: [test.value, undefined] }, ], }, { diff --git a/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts index 88a9389e34..80be9d8640 100644 --- a/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts @@ -23,6 +23,7 @@ import { createInstanceOfProfile, createValidIProfile, createTreeView, + createTreeProviders, } from "../../../__mocks__/mockCreators/shared"; import * as globals from "../../../src/globals"; import * as vscode from "vscode"; @@ -32,6 +33,7 @@ import { getIconByNode } from "../../../src/generators/icons"; import * as workspaceUtils from "../../../src/utils/workspace"; import { createUssApi, bindUssApi } from "../../../__mocks__/mockCreators/api"; import { ZoweLogger } from "../../../src/utils/LoggerUtils"; +import { TreeProviders } from "../../../src/shared/TreeProviders"; async function createGlobalMocks() { const globalMocks = { @@ -76,6 +78,7 @@ async function createGlobalMocks() { testTree: null, profilesForValidation: { status: "active", name: "fake" }, mockProfilesCache: new ProfilesCache(zowe.imperative.Logger.getAppLogger()), + mockTreeProviders: createTreeProviders(), }; globalMocks.mockTextDocuments.push(globalMocks.mockTextDocumentDirty); @@ -503,7 +506,7 @@ describe("USSTree Unit Tests - Function USSTree.deleteSession()", () => { const newMocks = { testTree2: new USSTree(), testSessionNode: new ZoweUSSNode("testSessionNode", vscode.TreeItemCollapsibleState.Collapsed, null, globalMocks.testSession, null), - startLength: null, + startLength: 0, }; const ussSessionTestNode = createUSSSessionNode(globalMocks.testSession, globalMocks.testProfile); newMocks.testTree2.mSessionNodes.push(ussSessionTestNode); @@ -517,8 +520,13 @@ describe("USSTree Unit Tests - Function USSTree.deleteSession()", () => { const globalMocks = await createGlobalMocks(); const blockMocks = await createBlockMocks(globalMocks); - blockMocks.testTree2.deleteSession(blockMocks.testTree2.mSessionNodes[blockMocks.startLength - 1]); - expect(blockMocks.testTree2.mSessionNodes.length).toEqual(blockMocks.startLength - 1); + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); + + blockMocks.testTree2.mSessionNodes = globalMocks.mockTreeProviders.ds.mSessionNodes; + blockMocks.testTree2.deleteSession(globalMocks.mockTreeProviders.ds.mSessionNodes[1]); + expect(globalMocks.mockTreeProviders.ds.mSessionNodes.length).toEqual(2); + expect(globalMocks.mockTreeProviders.uss.mSessionNodes.length).toEqual(2); + expect(globalMocks.mockTreeProviders.job.mSessionNodes.length).toEqual(2); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/uss/init.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/uss/init.unit.test.ts index b06e8c6882..99d10a9001 100644 --- a/packages/zowe-explorer/__tests__/__unit__/uss/init.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/uss/init.unit.test.ts @@ -99,7 +99,7 @@ describe("Test src/dataset/extension", () => { name: "zowe.uss.removeSession", mock: [ { spy: jest.spyOn(contextuals, "isUssSession"), arg: [test.value], ret: true }, - { spy: jest.spyOn(ussFileProvider, "deleteSession"), arg: [test.value] }, + { spy: jest.spyOn(ussFileProvider, "deleteSession"), arg: [test.value, undefined] }, ], }, { diff --git a/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts index 2cd395f690..6144d55419 100644 --- a/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts @@ -140,9 +140,10 @@ describe("ProfileManagement unit tests", () => { configurable: true, }); mocks.mockResolveQp.mockResolvedValueOnce(mocks.mockHideProfChosen); + mocks.mockResolveQp.mockResolvedValueOnce(ProfileManagement["getPromptHideFromAllTreesQpItems"]()[0]); await ProfileManagement.manageProfile(mocks.mockDsSessionNode); expect(mocks.debugLogSpy).toBeCalledWith(mocks.logMsg); - expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.removeSession", mocks.mockDsSessionNode); + expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.removeSession", mocks.mockDsSessionNode, null, true); }); it("profile using basic authentication should see delete commands called when Delete Profile chosen with v1 profile", async () => { const mocks = createBlockMocks(createGlobalMocks()); @@ -187,9 +188,10 @@ describe("ProfileManagement unit tests", () => { it("profile using token authentication should see correct command called for hiding a unix tree session node", async () => { const mocks = createBlockMocks(createGlobalMocks()); mocks.mockResolveQp.mockResolvedValueOnce(mocks.mockHideProfChosen); + mocks.mockResolveQp.mockResolvedValueOnce(ProfileManagement["getPromptHideFromAllTreesQpItems"]()[1]); await ProfileManagement.manageProfile(mocks.mockUnixSessionNode); expect(mocks.debugLogSpy).toBeCalledWith(mocks.logMsg); - expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.uss.removeSession", mocks.mockUnixSessionNode); + expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.uss.removeSession", mocks.mockUnixSessionNode, null, false); }); it("profile using token authentication should see correct command called for enabling validation a unix tree session node", async () => { const mocks = createBlockMocks(createGlobalMocks()); diff --git a/packages/zowe-explorer/i18n/sample/src/utils/ProfileManagement.i18n.json b/packages/zowe-explorer/i18n/sample/src/utils/ProfileManagement.i18n.json index f487573b50..d5673c600a 100644 --- a/packages/zowe-explorer/i18n/sample/src/utils/ProfileManagement.i18n.json +++ b/packages/zowe-explorer/i18n/sample/src/utils/ProfileManagement.i18n.json @@ -3,6 +3,12 @@ "qpPlaceholders.qp.basic": "Profile {0} is using basic authentication. Choose a profile action.", "qpPlaceholders.qp.token": "Profile {0} is using token authentication. Choose a profile action.", "qpPlaceholders.qp.choose": "Profile {0} doesn't specify an authentication method. Choose a profile action.", + "ProfileManagement.promptHideFromAllTrees.allLbl": "Yes", + "ProfileManagement.promptHideFromAllTrees.allDesc": "Hide for all trees", + "ProfileManagement.promptHideFromAllTrees.currentLbl": "No", + "ProfileManagement.promptHideFromAllTrees.currentDesc": "Hide for current tree selected", + "ProfileManagement.promptHideFromAllTrees.howToHide": "Do you wish to hide this profile from all trees?", + "ProfileManagement.handleHideProfiles.cancelled": "Operation Cancelled", "addBasicAuthQpItem.addCredentials.qpLabel": "$(plus) Add Credentials", "addBasicAuthQpItem.addCredentials.qpDetail": "Add username and password for basic authentication", "updateBasicAuthQpItem.updateCredentials.qpLabel": "$(refresh) Update Credentials", diff --git a/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts b/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts index eddd2868d5..c1ba543d03 100644 --- a/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts +++ b/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts @@ -22,6 +22,8 @@ import { setProfile, setSession, errorHandling } from "../utils/ProfilesUtils"; import * as nls from "vscode-nls"; import { SettingsConfig } from "../utils/SettingsConfig"; import { ZoweLogger } from "../utils/LoggerUtils"; +import { TreeProviders } from "../shared/TreeProviders"; +import { IZoweProviders } from "../shared/init"; // Set up localization nls.config({ @@ -182,6 +184,18 @@ export class ZoweTreeProvider { return undefined; } + public deleteSession(node: IZoweTreeNode): void { + ZoweLogger.trace("ZoweTreeProvider.deleteSession called."); + for (const key of Object.keys(TreeProviders.providers) as Array) { + const provider = TreeProviders.providers[key]; + provider.mSessionNodes = (provider.mSessionNodes as IZoweTreeNode[]).filter( + (mSessionNode: IZoweTreeNode) => mSessionNode.getLabel() !== node.getLabel() + ); + provider.removeSession(node.getLabel() as string); + provider.refresh(); + } + } + public async editSession(node: IZoweTreeNode, zoweFileProvider: IZoweTree): Promise { ZoweLogger.trace("ZoweTreeProvider.editSession called."); const profile = node.getProfile(); @@ -289,10 +303,4 @@ export class ZoweTreeProvider { ZoweLogger.trace("ZoweTreeProvider.createZoweSession called."); await Profiles.getInstance().createZoweSession(zoweFileProvider); } - - protected deleteSessionByLabel(revisedLabel: string): void { - ZoweLogger.trace("ZoweTreeProvider.deleteSessionByLabel called."); - this.mHistory.removeSession(revisedLabel); - this.refresh(); - } } diff --git a/packages/zowe-explorer/src/dataset/DatasetTree.ts b/packages/zowe-explorer/src/dataset/DatasetTree.ts index a9903ac8e0..39447a61f3 100644 --- a/packages/zowe-explorer/src/dataset/DatasetTree.ts +++ b/packages/zowe-explorer/src/dataset/DatasetTree.ts @@ -482,10 +482,13 @@ export class DatasetTree extends ZoweTreeProvider implements IZoweTree tempNode.label.toString() !== node.label.toString()); - this.mHistory.removeSession(node.label as string); + if (hideFromAllTrees) { + super.deleteSession(node); + } + this.mSessionNodes = this.mSessionNodes.filter((mSessionNode: IZoweDatasetTreeNode) => mSessionNode.getLabel() !== node.getLabel()); + this.removeSession(node.getLabel() as string); this.refresh(); } @@ -769,6 +772,11 @@ export class DatasetTree extends ZoweTreeProvider implements IZoweTree> { +export async function initDatasetProvider(context: vscode.ExtensionContext): Promise { ZoweLogger.trace("dataset.init.initDatasetProvider called."); const datasetProvider = await createDatasetTree(globals.LOG); if (datasetProvider == null) { @@ -109,14 +109,17 @@ export async function initDatasetProvider(context: vscode.ExtensionContext): Pro }) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.ds.removeSession", async (node: IZoweDatasetTreeNode, nodeList: IZoweDatasetTreeNode[]) => { - let selectedNodes = getSelectedNodeList(node, nodeList); - selectedNodes = selectedNodes.filter((sNode) => contextuals.isDsSession(sNode)); - for (const select of selectedNodes) { - datasetProvider.deleteSession(select); + vscode.commands.registerCommand( + "zowe.ds.removeSession", + async (node: IZoweDatasetTreeNode, nodeList: IZoweDatasetTreeNode[], hideFromAllTrees: boolean) => { + let selectedNodes = getSelectedNodeList(node, nodeList); + selectedNodes = selectedNodes.filter((sNode) => contextuals.isDsSession(sNode)); + for (const select of selectedNodes) { + datasetProvider.deleteSession(select, hideFromAllTrees); + } + await TreeViewUtils.fixVsCodeMultiSelect(datasetProvider); } - await TreeViewUtils.fixVsCodeMultiSelect(datasetProvider); - }) + ) ); context.subscriptions.push( vscode.commands.registerCommand("zowe.ds.removeFavorite", async (node, nodeList) => { diff --git a/packages/zowe-explorer/src/job/ZosJobsProvider.ts b/packages/zowe-explorer/src/job/ZosJobsProvider.ts index cd61cc7717..67337f4ee9 100644 --- a/packages/zowe-explorer/src/job/ZosJobsProvider.ts +++ b/packages/zowe-explorer/src/job/ZosJobsProvider.ts @@ -633,6 +633,11 @@ export class ZosJobsProvider extends ZoweTreeProvider implements IZoweTree tempNode.label !== node.label); - this.deleteSessionByLabel(node.getLabel() as string); + if (hideFromAllTrees) { + super.deleteSession(node); + } + this.mSessionNodes = this.mSessionNodes.filter((mSessionNode: IZoweJobTreeNode) => mSessionNode.getLabel() !== node.getLabel()); + this.removeSession(node.getLabel() as string); + this.refresh(); } /** diff --git a/packages/zowe-explorer/src/job/init.ts b/packages/zowe-explorer/src/job/init.ts index 81527474a2..01c92cdc80 100644 --- a/packages/zowe-explorer/src/job/init.ts +++ b/packages/zowe-explorer/src/job/init.ts @@ -13,16 +13,16 @@ import * as globals from "../globals"; import * as vscode from "vscode"; import * as jobActions from "./actions"; import * as refreshActions from "../shared/refresh"; -import { IZoweJobTreeNode, IZoweTreeNode, IZoweTree } from "@zowe/zowe-explorer-api"; +import { IZoweJobTreeNode, IZoweTreeNode } from "@zowe/zowe-explorer-api"; import { Profiles } from "../Profiles"; -import { createJobsTree } from "./ZosJobsProvider"; +import { ZosJobsProvider, createJobsTree } from "./ZosJobsProvider"; import * as contextuals from "../shared/context"; import { Job } from "./ZoweJobNode"; import { getSelectedNodeList } from "../shared/utils"; import { initSubscribers } from "../shared/init"; import { ZoweLogger } from "../utils/LoggerUtils"; -export async function initJobsProvider(context: vscode.ExtensionContext): Promise> { +export async function initJobsProvider(context: vscode.ExtensionContext): Promise { ZoweLogger.trace("job.init.initJobsProvider called."); const jobsProvider = await createJobsTree(globals.LOG); if (jobsProvider == null) { @@ -75,11 +75,11 @@ export async function initJobsProvider(context: vscode.ExtensionContext): Promis context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.setOwner", (job) => jobActions.setOwner(job, jobsProvider))); context.subscriptions.push(vscode.commands.registerCommand("zowe.jobs.setPrefix", (job) => jobActions.setPrefix(job, jobsProvider))); context.subscriptions.push( - vscode.commands.registerCommand("zowe.jobs.removeJobsSession", (job, jobList) => { + vscode.commands.registerCommand("zowe.jobs.removeJobsSession", (job, jobList, hideFromAllTrees) => { let selectedNodes = getSelectedNodeList(job, jobList); selectedNodes = selectedNodes.filter((element) => contextuals.isJobsSession(element)); for (const item of selectedNodes) { - jobsProvider.deleteSession(item); + jobsProvider.deleteSession(item, hideFromAllTrees); } }) ); diff --git a/packages/zowe-explorer/src/shared/TreeProviders.ts b/packages/zowe-explorer/src/shared/TreeProviders.ts index 703f60c990..cf9bc4b93e 100644 --- a/packages/zowe-explorer/src/shared/TreeProviders.ts +++ b/packages/zowe-explorer/src/shared/TreeProviders.ts @@ -10,34 +10,38 @@ */ import * as vscode from "vscode"; -import { IZoweTree, IZoweTreeNode } from "@zowe/zowe-explorer-api"; import { IZoweProviders } from "./init"; +import { DatasetTree } from "../dataset/DatasetTree"; +import { USSTree } from "../uss/USSTree"; +import { ZosJobsProvider } from "../job/ZosJobsProvider"; + +type ProviderFunctions = { + ds: (context: vscode.ExtensionContext) => Promise; + uss: (context: vscode.ExtensionContext) => Promise; + job: (context: vscode.ExtensionContext) => Promise; +}; -type ProviderFunction = (context: vscode.ExtensionContext) => Promise>; export class TreeProviders { - static #ds: IZoweTree; - static #uss: IZoweTree; - static #job: IZoweTree; - - public static async initializeProviders( - context: vscode.ExtensionContext, - initializers: { ds: ProviderFunction; uss: ProviderFunction; job: ProviderFunction } - ): Promise { + static #ds: DatasetTree; + static #uss: USSTree; + static #job: ZosJobsProvider; + + public static async initializeProviders(context: vscode.ExtensionContext, initializers: ProviderFunctions): Promise { TreeProviders.#ds = await initializers.ds(context); TreeProviders.#uss = await initializers.uss(context); TreeProviders.#job = await initializers.job(context); return TreeProviders.providers; } - public static get ds(): IZoweTree { + public static get ds(): DatasetTree { return TreeProviders.#ds; } - public static get uss(): IZoweTree { + public static get uss(): USSTree { return TreeProviders.#uss; } - public static get job(): IZoweTree { + public static get job(): ZosJobsProvider { return TreeProviders.#job; } diff --git a/packages/zowe-explorer/src/shared/init.ts b/packages/zowe-explorer/src/shared/init.ts index 8c0dcec39d..e519df9d0a 100644 --- a/packages/zowe-explorer/src/shared/init.ts +++ b/packages/zowe-explorer/src/shared/init.ts @@ -29,6 +29,9 @@ import { SettingsConfig } from "../utils/SettingsConfig"; import { spoolFilePollEvent } from "../job/actions"; import { HistoryView } from "./HistoryView"; import { ProfileManagement } from "../utils/ProfileManagement"; +import { DatasetTree } from "../dataset/DatasetTree"; +import { USSTree } from "../uss/USSTree"; +import { ZosJobsProvider } from "../job/ZosJobsProvider"; // Set up localization nls.config({ @@ -38,10 +41,9 @@ nls.config({ const localize: nls.LocalizeFunc = nls.loadMessageBundle(); export interface IZoweProviders { - ds: IZoweTree; - uss: IZoweTree; - job: IZoweTree; - // [key: string]: IZoweTree; + ds: DatasetTree; + uss: USSTree; + job: ZosJobsProvider; } export function registerRefreshCommand( diff --git a/packages/zowe-explorer/src/uss/USSTree.ts b/packages/zowe-explorer/src/uss/USSTree.ts index 58cde526ab..01bc371c75 100644 --- a/packages/zowe-explorer/src/uss/USSTree.ts +++ b/packages/zowe-explorer/src/uss/USSTree.ts @@ -363,10 +363,13 @@ export class USSTree extends ZoweTreeProvider implements IZoweTree tempNode.label.toString() !== node.label.toString()); - this.mHistory.removeSession(node.label as string); + if (hideFromAllTrees) { + super.deleteSession(node); + } + this.mSessionNodes = this.mSessionNodes.filter((mSessionNode: IZoweUSSTreeNode) => mSessionNode.getLabel() !== node.getLabel()); + this.removeSession(node.getLabel() as string); this.refresh(); } @@ -856,6 +859,11 @@ export class USSTree extends ZoweTreeProvider implements IZoweTree> { +export async function initUSSProvider(context: vscode.ExtensionContext): Promise { ZoweLogger.trace("init.initUSSProvider called."); const ussFileProvider: IZoweTree = await createUSSTree(globals.LOG); if (ussFileProvider == null) { @@ -84,11 +84,11 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise vscode.commands.registerCommand("zowe.uss.ZoweUSSNode.open", (node: IZoweUSSTreeNode): void => node.openUSS(false, true, ussFileProvider)) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.uss.removeSession", async (node: IZoweUSSTreeNode, nodeList) => { + vscode.commands.registerCommand("zowe.uss.removeSession", async (node: IZoweUSSTreeNode, nodeList, hideFromAllTrees: boolean) => { let selectedNodes = getSelectedNodeList(node, nodeList); selectedNodes = selectedNodes.filter((element) => contextuals.isUssSession(element)); for (const item of selectedNodes) { - ussFileProvider.deleteSession(item); + ussFileProvider.deleteSession(item, hideFromAllTrees); } await TreeViewUtils.fixVsCodeMultiSelect(ussFileProvider); }) @@ -191,5 +191,5 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise ); initSubscribers(context, ussFileProvider); - return ussFileProvider; + return ussFileProvider as USSTree; } diff --git a/packages/zowe-explorer/src/utils/ProfileManagement.ts b/packages/zowe-explorer/src/utils/ProfileManagement.ts index 5825a8fdac..bfb617062f 100644 --- a/packages/zowe-explorer/src/utils/ProfileManagement.ts +++ b/packages/zowe-explorer/src/utils/ProfileManagement.ts @@ -245,14 +245,45 @@ export class ProfileManagement { await vscode.commands.executeCommand("zowe.ds.deleteProfile", node); } + private static getPromptHideFromAllTreesQpItems(): vscode.QuickPickItem[] { + const qpItemAll: vscode.QuickPickItem = { + label: localize("ProfileManagement.promptHideFromAllTrees.allLbl", "Yes"), + description: localize("ProfileManagement.promptHideFromAllTrees.allDesc", "Hide for all trees"), + }; + const qpItemCurrent: vscode.QuickPickItem = { + label: localize("ProfileManagement.promptHideFromAllTrees.currentLbl", "No"), + description: localize("ProfileManagement.promptHideFromAllTrees.currentDesc", "Hide for current tree selected"), + }; + return [qpItemAll, qpItemCurrent]; + } + + private static async promptHideFromAllTrees(): Promise { + const qp = Gui.createQuickPick(); + qp.placeholder = localize("ProfileManagement.promptHideFromAllTrees.howToHide", "Do you wish to hide this profile from all trees?"); + qp.items = this.getPromptHideFromAllTreesQpItems(); + qp.activeItems = [qp.items[0]]; + qp.show(); + const selection = await Gui.resolveQuickPick(qp); + qp.hide(); + return selection; + } + private static async handleHideProfiles(node: IZoweTreeNode): Promise { + const selection = await this.promptHideFromAllTrees(); + if (!selection) { + Gui.infoMessage(localize("ProfileManagement.handleHideProfiles.cancelled", "Operation Cancelled")); + return; + } + const [all] = this.getPromptHideFromAllTreesQpItems(); + const shouldHideFromAllTrees = selection.label === all.label ? true : false; + if (isZoweDatasetTreeNode(node)) { - return vscode.commands.executeCommand("zowe.ds.removeSession", node); + return vscode.commands.executeCommand("zowe.ds.removeSession", node, null, shouldHideFromAllTrees); } if (isZoweUSSTreeNode(node)) { - return vscode.commands.executeCommand("zowe.uss.removeSession", node); + return vscode.commands.executeCommand("zowe.uss.removeSession", node, null, shouldHideFromAllTrees); } - return vscode.commands.executeCommand("zowe.jobs.removeJobsSession", node); + return vscode.commands.executeCommand("zowe.jobs.removeJobsSession", node, null, shouldHideFromAllTrees); } private static async handleEnableProfileValidation(node: IZoweTreeNode): Promise { From 99e963f63310854c6fe8d38012a47ed442eb7952 Mon Sep 17 00:00:00 2001 From: Rudy Flores <68666202+rudyflores@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:43:03 -0500 Subject: [PATCH 2/8] Add changelog and address code smell Signed-off-by: Rudy Flores <68666202+rudyflores@users.noreply.github.com> --- packages/zowe-explorer-api/CHANGELOG.md | 2 ++ packages/zowe-explorer/CHANGELOG.md | 2 ++ packages/zowe-explorer/src/utils/ProfileManagement.ts | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/zowe-explorer-api/CHANGELOG.md b/packages/zowe-explorer-api/CHANGELOG.md index e60ca4eb87..02aafa51df 100644 --- a/packages/zowe-explorer-api/CHANGELOG.md +++ b/packages/zowe-explorer-api/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to the "zowe-explorer-api" extension will be documented in t ### New features and enhancements +- Added new optional boolean parameter `hideFromAllTrees` to `IZoweTree.deleteSession` for specifying whether to hide from all trees or current tree. [#2567](https://github.com/zowe/vscode-extension-for-zowe/issues/2567) + ### Bug fixes ## `2.12.0` diff --git a/packages/zowe-explorer/CHANGELOG.md b/packages/zowe-explorer/CHANGELOG.md index dc8ce095c8..b182971d91 100644 --- a/packages/zowe-explorer/CHANGELOG.md +++ b/packages/zowe-explorer/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen ### New features and enhancements +- Added support for hiding a Zowe profile across all trees [#2567](https://github.com/zowe/vscode-extension-for-zowe/issues/2567) + ### Bug fixes ## `2.12.0` diff --git a/packages/zowe-explorer/src/utils/ProfileManagement.ts b/packages/zowe-explorer/src/utils/ProfileManagement.ts index bfb617062f..2ccd62b3dc 100644 --- a/packages/zowe-explorer/src/utils/ProfileManagement.ts +++ b/packages/zowe-explorer/src/utils/ProfileManagement.ts @@ -275,7 +275,7 @@ export class ProfileManagement { return; } const [all] = this.getPromptHideFromAllTreesQpItems(); - const shouldHideFromAllTrees = selection.label === all.label ? true : false; + const shouldHideFromAllTrees = selection.label === all.label; if (isZoweDatasetTreeNode(node)) { return vscode.commands.executeCommand("zowe.ds.removeSession", node, null, shouldHideFromAllTrees); From 62ab10bd0b8b922b2a92c252ecb7e8c65c697a8d Mon Sep 17 00:00:00 2001 From: Rudy Flores <68666202+rudyflores@users.noreply.github.com> Date: Fri, 10 Nov 2023 14:47:00 -0500 Subject: [PATCH 3/8] fix broken theia check Signed-off-by: Rudy Flores <68666202+rudyflores@users.noreply.github.com> --- .../__tests__/__theia__/theia/extension.theiaChrome.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/zowe-explorer/__tests__/__theia__/theia/extension.theiaChrome.ts b/packages/zowe-explorer/__tests__/__theia__/theia/extension.theiaChrome.ts index 239aadb46a..287c1fc772 100644 --- a/packages/zowe-explorer/__tests__/__theia__/theia/extension.theiaChrome.ts +++ b/packages/zowe-explorer/__tests__/__theia__/theia/extension.theiaChrome.ts @@ -143,6 +143,8 @@ export async function hideProfileInUss() { const manageProfile = driverChrome.wait(until.elementLocated(By.xpath(UssLocators.emptyInputBoxXpath)), WAITTIME); manageProfile.sendKeys("Hide Profile"); manageProfile.sendKeys(Key.ENTER); + manageProfile.sendKeys("No"); + manageProfile.sendKeys(Key.ENTER); } export async function hideProfileInJobs() { @@ -153,6 +155,8 @@ export async function hideProfileInJobs() { const manageProfile = driverChrome.wait(until.elementLocated(By.xpath(JobsLocators.emptyInputBoxXpath)), WAITTIME); manageProfile.sendKeys("Hide Profile"); manageProfile.sendKeys(Key.ENTER); + manageProfile.sendKeys("No"); + manageProfile.sendKeys(Key.ENTER); } export async function verifyProfileIsHideInUss() { From 9dea82a39df7a64349b95d16ebc62c9ef67b66d8 Mon Sep 17 00:00:00 2001 From: Rudy Flores <68666202+rudyflores@users.noreply.github.com> Date: Fri, 10 Nov 2023 15:14:36 -0500 Subject: [PATCH 4/8] address duplicate code Signed-off-by: Rudy Flores <68666202+rudyflores@users.noreply.github.com> --- .../zowe-explorer/src/abstract/ZoweTreeProvider.ts | 12 +++++++----- packages/zowe-explorer/src/dataset/DatasetTree.ts | 4 +--- packages/zowe-explorer/src/job/ZosJobsProvider.ts | 4 +--- packages/zowe-explorer/src/uss/USSTree.ts | 4 +--- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts b/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts index c1ba543d03..01cc0c2fcd 100644 --- a/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts +++ b/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts @@ -184,15 +184,17 @@ export class ZoweTreeProvider { return undefined; } + public deleteSessionForProvider(node: IZoweTreeNode, provider: IZoweTree): void { + provider.mSessionNodes = provider.mSessionNodes.filter((mSessionNode: IZoweTreeNode) => mSessionNode.getLabel() !== node.getLabel()); + provider.removeSession(node.getLabel() as string); + provider.refresh(); + } + public deleteSession(node: IZoweTreeNode): void { ZoweLogger.trace("ZoweTreeProvider.deleteSession called."); for (const key of Object.keys(TreeProviders.providers) as Array) { const provider = TreeProviders.providers[key]; - provider.mSessionNodes = (provider.mSessionNodes as IZoweTreeNode[]).filter( - (mSessionNode: IZoweTreeNode) => mSessionNode.getLabel() !== node.getLabel() - ); - provider.removeSession(node.getLabel() as string); - provider.refresh(); + this.deleteSessionForProvider(node, provider); } } diff --git a/packages/zowe-explorer/src/dataset/DatasetTree.ts b/packages/zowe-explorer/src/dataset/DatasetTree.ts index 39447a61f3..9e51a0923f 100644 --- a/packages/zowe-explorer/src/dataset/DatasetTree.ts +++ b/packages/zowe-explorer/src/dataset/DatasetTree.ts @@ -487,9 +487,7 @@ export class DatasetTree extends ZoweTreeProvider implements IZoweTree mSessionNode.getLabel() !== node.getLabel()); - this.removeSession(node.getLabel() as string); - this.refresh(); + super.deleteSessionForProvider(node, this); } /** diff --git a/packages/zowe-explorer/src/job/ZosJobsProvider.ts b/packages/zowe-explorer/src/job/ZosJobsProvider.ts index 67337f4ee9..d7cd4eda24 100644 --- a/packages/zowe-explorer/src/job/ZosJobsProvider.ts +++ b/packages/zowe-explorer/src/job/ZosJobsProvider.ts @@ -886,9 +886,7 @@ export class ZosJobsProvider extends ZoweTreeProvider implements IZoweTree mSessionNode.getLabel() !== node.getLabel()); - this.removeSession(node.getLabel() as string); - this.refresh(); + super.deleteSessionForProvider(node, this); } /** diff --git a/packages/zowe-explorer/src/uss/USSTree.ts b/packages/zowe-explorer/src/uss/USSTree.ts index 01bc371c75..a8469bed3c 100644 --- a/packages/zowe-explorer/src/uss/USSTree.ts +++ b/packages/zowe-explorer/src/uss/USSTree.ts @@ -368,9 +368,7 @@ export class USSTree extends ZoweTreeProvider implements IZoweTree mSessionNode.getLabel() !== node.getLabel()); - this.removeSession(node.getLabel() as string); - this.refresh(); + super.deleteSessionForProvider(node, this); } /** From 4e4ff90737b592a852d7c067eb82b294b4e0c85c Mon Sep 17 00:00:00 2001 From: Rudy Flores <68666202+rudyflores@users.noreply.github.com> Date: Fri, 10 Nov 2023 16:09:26 -0500 Subject: [PATCH 5/8] further code cleanup Signed-off-by: Rudy Flores <68666202+rudyflores@users.noreply.github.com> --- .../__mocks__/mockCreators/shared.ts | 10 ++++---- .../__unit__/dataset/DatasetTree.unit.test.ts | 19 ++++++++++----- .../__unit__/job/ZoweJobNode.unit.test.ts | 5 +++- .../__unit__/uss/USSTree.unit.test.ts | 5 +++- .../src/abstract/ZoweTreeProvider.ts | 24 +++++++++++-------- .../zowe-explorer/src/dataset/DatasetTree.ts | 5 +--- .../zowe-explorer/src/job/ZosJobsProvider.ts | 5 +--- packages/zowe-explorer/src/shared/context.ts | 15 ++++++++++++ packages/zowe-explorer/src/uss/USSTree.ts | 5 +--- 9 files changed, 59 insertions(+), 34 deletions(-) diff --git a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts index 9a3ffa5a90..213a92b69a 100644 --- a/packages/zowe-explorer/__mocks__/mockCreators/shared.ts +++ b/packages/zowe-explorer/__mocks__/mockCreators/shared.ts @@ -17,6 +17,7 @@ import { ValidProfileEnum, IZoweTreeNode } from "@zowe/zowe-explorer-api"; import { FilterDescriptor } from "../../src/utils/ProfilesUtils"; import { imperative, ZosmfSession } from "@zowe/cli"; import { SettingsConfig } from "../../src/utils/SettingsConfig"; +import * as globals from "../../src/globals"; export function createPersistentConfig() { return { @@ -549,7 +550,7 @@ export function createOutputChannel() { } as vscode.OutputChannel; } -export function createMockNode(name: string): IZoweTreeNode { +export function createMockNode(name: string, context: string): IZoweTreeNode { return { dirty: false, getLabel: jest.fn(() => name), @@ -562,25 +563,26 @@ export function createMockNode(name: string): IZoweTreeNode { setProfileToChoice: jest.fn(), setSessionToChoice: jest.fn(), label: name, + contextValue: context, }; } export function createTreeProviders() { return { ds: { - mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + mSessionNodes: [createMockNode("zosmf", globals.DS_SESSION_CONTEXT), createMockNode("zosmf2", globals.DS_SESSION_CONTEXT)], deleteSession: jest.fn(), removeSession: jest.fn(), refresh: jest.fn(), } as any, uss: { - mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + mSessionNodes: [createMockNode("zosmf", globals.USS_SESSION_CONTEXT), createMockNode("zosmf2", globals.USS_SESSION_CONTEXT)], deleteSession: jest.fn(), removeSession: jest.fn(), refresh: jest.fn(), } as any, job: { - mSessionNodes: [createMockNode("zosmf"), createMockNode("zosmf2")], + mSessionNodes: [createMockNode("zosmf", globals.JOBS_SESSION_CONTEXT), createMockNode("zosmf2", globals.JOBS_SESSION_CONTEXT)], removeSession: jest.fn(), deleteSession: jest.fn(), refresh: jest.fn(), diff --git a/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts index da0d4a9b24..09f6d5a132 100644 --- a/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/dataset/DatasetTree.unit.test.ts @@ -41,6 +41,7 @@ import { createInstanceOfProfileInfo, createGetConfigMock, createTreeProviders, + createMockNode, } from "../../../__mocks__/mockCreators/shared"; import { createDatasetSessionNode, createDatasetTree, createDatasetFavoritesNode } from "../../../__mocks__/mockCreators/datasets"; import { bindMvsApi, createMvsApi } from "../../../__mocks__/mockCreators/api"; @@ -1331,30 +1332,36 @@ describe("Dataset Tree Unit Tests - Function deleteSession", () => { } it("Checking common run of function", () => { - createGlobalMocks(); + const globalMocks = createGlobalMocks(); const blockMocks = createBlockMocks(); + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); mocked(vscode.window.createTreeView).mockReturnValueOnce(blockMocks.treeView); const testTree = new DatasetTree(); - testTree.mSessionNodes.push(blockMocks.datasetSessionNode); + testTree.mSessionNodes = globalMocks.mockTreeProviders.ds.mSessionNodes; + testTree.mSessionNodes.push(createMockNode("Favorites", globals.DS_SESSION_CONTEXT)); + testTree.deleteSession(testTree.mSessionNodes[0]); testTree.deleteSession(testTree.mSessionNodes[1]); - expect(testTree.mSessionNodes.map((node) => node.label)).toEqual(["Favorites"]); + expect(globalMocks.mockTreeProviders.ds.mSessionNodes.map((node) => node.label)).toEqual(["Favorites"]); }); - it("Checking case profile needs to be hidden for all trees", async () => { + it("Checking case profile needs to be hidden for all trees", () => { const globalMocks = createGlobalMocks(); const blockMocks = createBlockMocks(); jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); mocked(vscode.window.createTreeView).mockReturnValueOnce(blockMocks.treeView); const testTree = new DatasetTree(); - testTree.mSessionNodes.push(blockMocks.datasetSessionNode); + testTree.mSessionNodes = globalMocks.mockTreeProviders.ds.mSessionNodes; + testTree.deleteSession(testTree.mSessionNodes[0], true); testTree.deleteSession(testTree.mSessionNodes[1], true); - expect(testTree.mSessionNodes.map((node) => node.label)).toEqual(["Favorites"]); + expect(globalMocks.mockTreeProviders.ds.mSessionNodes.map((node) => node.label)).toEqual([]); + expect(globalMocks.mockTreeProviders.uss.mSessionNodes.map((node) => node.label)).toEqual([]); + expect(globalMocks.mockTreeProviders.job.mSessionNodes.map((node) => node.label)).toEqual([]); }); }); describe("Dataset Tree Unit Tests - Function flipState", () => { diff --git a/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts index 34097a5e0b..b56f9f1d9e 100644 --- a/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/job/ZoweJobNode.unit.test.ts @@ -242,10 +242,13 @@ describe("ZoweJobNode unit tests - Function deleteSession", () => { const globalMocks = await createGlobalMocks(); jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); globalMocks.testJobsProvider.mSessionNodes = globalMocks.mockTreeProviders.ds.mSessionNodes; - await globalMocks.testJobsProvider.deleteSession(globalMocks.testJobsProvider.mSessionNodes[1]); expect(globalMocks.mockTreeProviders.ds.mSessionNodes.length).toEqual(2); expect(globalMocks.mockTreeProviders.uss.mSessionNodes.length).toEqual(2); expect(globalMocks.mockTreeProviders.job.mSessionNodes.length).toEqual(2); + await globalMocks.testJobsProvider.deleteSession(globalMocks.testJobsProvider.mSessionNodes[1], true); + expect(globalMocks.mockTreeProviders.ds.mSessionNodes.length).toEqual(1); + expect(globalMocks.mockTreeProviders.uss.mSessionNodes.length).toEqual(1); + expect(globalMocks.mockTreeProviders.job.mSessionNodes.length).toEqual(1); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts index 80be9d8640..27acebaffc 100644 --- a/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/uss/USSTree.unit.test.ts @@ -523,10 +523,13 @@ describe("USSTree Unit Tests - Function USSTree.deleteSession()", () => { jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(globalMocks.mockTreeProviders); blockMocks.testTree2.mSessionNodes = globalMocks.mockTreeProviders.ds.mSessionNodes; - blockMocks.testTree2.deleteSession(globalMocks.mockTreeProviders.ds.mSessionNodes[1]); expect(globalMocks.mockTreeProviders.ds.mSessionNodes.length).toEqual(2); expect(globalMocks.mockTreeProviders.uss.mSessionNodes.length).toEqual(2); expect(globalMocks.mockTreeProviders.job.mSessionNodes.length).toEqual(2); + blockMocks.testTree2.deleteSession(globalMocks.mockTreeProviders.ds.mSessionNodes[1], true); + expect(globalMocks.mockTreeProviders.ds.mSessionNodes.length).toEqual(1); + expect(globalMocks.mockTreeProviders.uss.mSessionNodes.length).toEqual(1); + expect(globalMocks.mockTreeProviders.job.mSessionNodes.length).toEqual(1); }); }); diff --git a/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts b/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts index 01cc0c2fcd..7bb7161c4c 100644 --- a/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts +++ b/packages/zowe-explorer/src/abstract/ZoweTreeProvider.ts @@ -184,17 +184,15 @@ export class ZoweTreeProvider { return undefined; } - public deleteSessionForProvider(node: IZoweTreeNode, provider: IZoweTree): void { - provider.mSessionNodes = provider.mSessionNodes.filter((mSessionNode: IZoweTreeNode) => mSessionNode.getLabel() !== node.getLabel()); - provider.removeSession(node.getLabel() as string); - provider.refresh(); - } - - public deleteSession(node: IZoweTreeNode): void { + public deleteSession(node: IZoweTreeNode, hideFromAllTrees?: boolean): void { ZoweLogger.trace("ZoweTreeProvider.deleteSession called."); - for (const key of Object.keys(TreeProviders.providers) as Array) { - const provider = TreeProviders.providers[key]; - this.deleteSessionForProvider(node, provider); + if (hideFromAllTrees) { + for (const key of Object.keys(TreeProviders.providers) as Array) { + const currentProvider = TreeProviders.providers[key]; + this.deleteSessionForProvider(node, currentProvider); + } + } else { + this.deleteSessionForProvider(node, TreeProviders.providers[contextually.getSessionType(node)]); } } @@ -305,4 +303,10 @@ export class ZoweTreeProvider { ZoweLogger.trace("ZoweTreeProvider.createZoweSession called."); await Profiles.getInstance().createZoweSession(zoweFileProvider); } + + private deleteSessionForProvider(node: IZoweTreeNode, provider: IZoweTree): void { + provider.mSessionNodes = provider.mSessionNodes.filter((mSessionNode: IZoweTreeNode) => mSessionNode.getLabel() !== node.getLabel()); + provider.removeSession(node.getLabel() as string); + provider.refresh(); + } } diff --git a/packages/zowe-explorer/src/dataset/DatasetTree.ts b/packages/zowe-explorer/src/dataset/DatasetTree.ts index 9e51a0923f..bdd7004c75 100644 --- a/packages/zowe-explorer/src/dataset/DatasetTree.ts +++ b/packages/zowe-explorer/src/dataset/DatasetTree.ts @@ -484,10 +484,7 @@ export class DatasetTree extends ZoweTreeProvider implements IZoweTree Date: Mon, 13 Nov 2023 12:36:58 -0500 Subject: [PATCH 6/8] Address typing comment by trae for USSTree Signed-off-by: Rudy Flores <68666202+rudyflores@users.noreply.github.com> --- packages/zowe-explorer/src/uss/USSTree.ts | 1 + packages/zowe-explorer/src/uss/init.ts | 31 ++++++++++++++--------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/zowe-explorer/src/uss/USSTree.ts b/packages/zowe-explorer/src/uss/USSTree.ts index 248c09f5d2..ce76ec0e31 100644 --- a/packages/zowe-explorer/src/uss/USSTree.ts +++ b/packages/zowe-explorer/src/uss/USSTree.ts @@ -64,6 +64,7 @@ export class USSTree extends ZoweTreeProvider implements IZoweTree; + public copying: Promise; public constructor() { super( diff --git a/packages/zowe-explorer/src/uss/init.ts b/packages/zowe-explorer/src/uss/init.ts index 1dfe3658a3..496b6b455d 100644 --- a/packages/zowe-explorer/src/uss/init.ts +++ b/packages/zowe-explorer/src/uss/init.ts @@ -13,7 +13,7 @@ import * as globals from "../globals"; import * as vscode from "vscode"; import * as ussActions from "./actions"; import * as refreshActions from "../shared/refresh"; -import { IZoweUSSTreeNode, IZoweTreeNode, IZoweTree } from "@zowe/zowe-explorer-api"; +import { IZoweUSSTreeNode, IZoweTreeNode } from "@zowe/zowe-explorer-api"; import { Profiles } from "../Profiles"; import * as contextuals from "../shared/context"; import { getSelectedNodeList } from "../shared/utils"; @@ -24,7 +24,7 @@ import { TreeViewUtils } from "../utils/TreeViewUtils"; export async function initUSSProvider(context: vscode.ExtensionContext): Promise { ZoweLogger.trace("init.initUSSProvider called."); - const ussFileProvider: IZoweTree = await createUSSTree(globals.LOG); + const ussFileProvider: USSTree = await createUSSTree(globals.LOG); if (ussFileProvider == null) { return null; } @@ -75,7 +75,7 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise }) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.uss.fullPath", (node: IZoweUSSTreeNode): void => ussFileProvider.filterPrompt(node)) + vscode.commands.registerCommand("zowe.uss.fullPath", (node: IZoweUSSTreeNode): Promise => ussFileProvider.filterPrompt(node)) ); context.subscriptions.push( vscode.commands.registerCommand("zowe.uss.editSession", async (node) => ussFileProvider.editSession(node, ussFileProvider)) @@ -132,7 +132,7 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise }) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.uss.renameNode", (node: IZoweUSSTreeNode): void => ussFileProvider.rename(node)) + vscode.commands.registerCommand("zowe.uss.renameNode", (node: IZoweUSSTreeNode): Promise => ussFileProvider.rename(node)) ); context.subscriptions.push( vscode.commands.registerCommand("zowe.uss.uploadDialog", async (node: IZoweUSSTreeNode) => ussActions.uploadDialog(node, ussFileProvider)) @@ -147,13 +147,16 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise ) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.uss.saveSearch", (node: IZoweUSSTreeNode): void => ussFileProvider.saveSearch(node)) + vscode.commands.registerCommand( + "zowe.uss.saveSearch", + (node: IZoweUSSTreeNode): Promise => ussFileProvider.saveSearch(node) + ) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.uss.removeSavedSearch", (node: IZoweUSSTreeNode): void => ussFileProvider.removeFavorite(node)) + vscode.commands.registerCommand("zowe.uss.removeSavedSearch", (node: IZoweUSSTreeNode): Promise => ussFileProvider.removeFavorite(node)) ); context.subscriptions.push( - vscode.commands.registerCommand("zowe.uss.removeFavProfile", (node): void => ussFileProvider.removeFavProfile(node.label, true)) + vscode.commands.registerCommand("zowe.uss.removeFavProfile", (node): Promise => ussFileProvider.removeFavProfile(node.label, true)) ); context.subscriptions.push( vscode.commands.registerCommand("zowe.uss.disableValidation", (node) => { @@ -167,8 +170,12 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise ussFileProvider.refreshElement(node); }) ); - context.subscriptions.push(vscode.commands.registerCommand("zowe.uss.ssoLogin", (node: IZoweTreeNode): void => ussFileProvider.ssoLogin(node))); - context.subscriptions.push(vscode.commands.registerCommand("zowe.uss.ssoLogout", (node: IZoweTreeNode): void => ussFileProvider.ssoLogout(node))); + context.subscriptions.push( + vscode.commands.registerCommand("zowe.uss.ssoLogin", (node: IZoweTreeNode): Promise => ussFileProvider.ssoLogin(node)) + ); + context.subscriptions.push( + vscode.commands.registerCommand("zowe.uss.ssoLogout", (node: IZoweTreeNode): Promise => ussFileProvider.ssoLogout(node)) + ); context.subscriptions.push( vscode.commands.registerCommand("zowe.uss.pasteUssFile", async (node: IZoweUSSTreeNode) => { if (ussFileProvider.copying != null) { @@ -185,11 +192,11 @@ export async function initUSSProvider(context: vscode.ExtensionContext): Promise }) ); context.subscriptions.push( - vscode.workspace.onDidChangeConfiguration((e) => { - ussFileProvider.onDidChangeConfiguration(e); + vscode.workspace.onDidChangeConfiguration(async (e) => { + await ussFileProvider.onDidChangeConfiguration(e); }) ); initSubscribers(context, ussFileProvider); - return ussFileProvider as USSTree; + return ussFileProvider; } From 2cd636cd5db9003b1a647b9e4cd9c4b3d64721b9 Mon Sep 17 00:00:00 2001 From: Rudy Flores <68666202+rudyflores@users.noreply.github.com> Date: Tue, 14 Nov 2023 10:42:05 -0500 Subject: [PATCH 7/8] address billie's comments Signed-off-by: Rudy Flores <68666202+rudyflores@users.noreply.github.com> --- .../utils/ProfileManagement.unit.test.ts | 6 +++++- .../zowe-explorer/src/shared/TreeProviders.ts | 16 ++++++++++++++++ .../zowe-explorer/src/utils/ProfileManagement.ts | 11 ++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts index e71078dab5..f5fde8eed9 100644 --- a/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts @@ -23,6 +23,7 @@ import * as vscode from "vscode"; import { imperative } from "@zowe/cli"; import { ZoweUSSNode } from "../../../src/uss/ZoweUSSNode"; import { ZoweExplorerApiRegister } from "../../../src/ZoweExplorerApiRegister"; +import { TreeProviders } from "../../../src/shared/TreeProviders"; jest.mock("fs"); jest.mock("vscode"); @@ -54,6 +55,7 @@ describe("ProfileManagement unit tests", () => { mockDisableValidationChosen: ProfileManagement.disableProfileValildationQpItem[ProfileManagement.AuthQpLabels.disable], mockProfileInfo: { usingTeamConfig: true }, mockProfileInstance: null as any, + mockTreeProviders: sharedMock.createTreeProviders(), debugLogSpy: null as any, promptSpy: null as any, editSpy: null as any, @@ -141,11 +143,12 @@ describe("ProfileManagement unit tests", () => { value: jest.fn().mockResolvedValue(mocks.mockProfileInfo as imperative.ProfileInfo), configurable: true, }); + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(mocks.mockTreeProviders); mocks.mockResolveQp.mockResolvedValueOnce(mocks.mockHideProfChosen); mocks.mockResolveQp.mockResolvedValueOnce(ProfileManagement["getPromptHideFromAllTreesQpItems"]()[0]); await ProfileManagement.manageProfile(mocks.mockDsSessionNode); expect(mocks.debugLogSpy).toBeCalledWith(mocks.logMsg); - expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.removeSession", mocks.mockDsSessionNode, null, true); + expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.removeSession", mocks.mockDsSessionNode, null, false); }); it("profile using basic authentication should see delete commands called when Delete Profile chosen with v1 profile", async () => { const mocks = createBlockMocks(createGlobalMocks()); @@ -189,6 +192,7 @@ describe("ProfileManagement unit tests", () => { }); it("profile using token authentication should see correct command called for hiding a unix tree session node", async () => { const mocks = createBlockMocks(createGlobalMocks()); + jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(mocks.mockTreeProviders); mocks.mockResolveQp.mockResolvedValueOnce(mocks.mockHideProfChosen); mocks.mockResolveQp.mockResolvedValueOnce(ProfileManagement["getPromptHideFromAllTreesQpItems"]()[1]); await ProfileManagement.manageProfile(mocks.mockUnixSessionNode); diff --git a/packages/zowe-explorer/src/shared/TreeProviders.ts b/packages/zowe-explorer/src/shared/TreeProviders.ts index cf9bc4b93e..d6d39ebae3 100644 --- a/packages/zowe-explorer/src/shared/TreeProviders.ts +++ b/packages/zowe-explorer/src/shared/TreeProviders.ts @@ -14,6 +14,7 @@ import { IZoweProviders } from "./init"; import { DatasetTree } from "../dataset/DatasetTree"; import { USSTree } from "../uss/USSTree"; import { ZosJobsProvider } from "../job/ZosJobsProvider"; +import { IZoweNodeType } from "@zowe/zowe-explorer-api"; type ProviderFunctions = { ds: (context: vscode.ExtensionContext) => Promise; @@ -52,4 +53,19 @@ export class TreeProviders { job: TreeProviders.#job, }; } + + public static sessionIsPresentInOtherTrees(sessionName: string): boolean { + const found = []; + for (const key of Object.keys(TreeProviders.providers)) { + const provider = TreeProviders.providers[key]; + const session = provider.mSessionNodes.find((mSessionNode) => mSessionNode.label === sessionName); + if (session) { + found.push(session); + } + if (found.length > 1) { + return true; + } + } + return false; + } } diff --git a/packages/zowe-explorer/src/utils/ProfileManagement.ts b/packages/zowe-explorer/src/utils/ProfileManagement.ts index 3c23893b51..f0f2f9a064 100644 --- a/packages/zowe-explorer/src/utils/ProfileManagement.ts +++ b/packages/zowe-explorer/src/utils/ProfileManagement.ts @@ -18,6 +18,7 @@ import * as nls from "vscode-nls"; import { Profiles } from "../Profiles"; import { ZoweExplorerApiRegister } from "../ZoweExplorerApiRegister"; import { isZoweDatasetTreeNode, isZoweUSSTreeNode } from "../shared/utils"; +import { TreeProviders } from "../shared/TreeProviders"; // Set up localization nls.config({ @@ -275,10 +276,14 @@ export class ProfileManagement { return [qpItemAll, qpItemCurrent]; } - private static async promptHideFromAllTrees(): Promise { + private static async promptHideFromAllTrees(node: IZoweTreeNode): Promise { + const [qpItemAll, qpItemCurrent] = this.getPromptHideFromAllTreesQpItems(); + if (!TreeProviders.sessionIsPresentInOtherTrees(node.getLabel().toString())) { + return qpItemCurrent; + } const qp = Gui.createQuickPick(); qp.placeholder = localize("ProfileManagement.promptHideFromAllTrees.howToHide", "Do you wish to hide this profile from all trees?"); - qp.items = this.getPromptHideFromAllTreesQpItems(); + qp.items = [qpItemAll, qpItemCurrent]; qp.activeItems = [qp.items[0]]; qp.show(); const selection = await Gui.resolveQuickPick(qp); @@ -287,7 +292,7 @@ export class ProfileManagement { } private static async handleHideProfiles(node: IZoweTreeNode): Promise { - const selection = await this.promptHideFromAllTrees(); + const selection = await this.promptHideFromAllTrees(node); if (!selection) { Gui.infoMessage(localize("ProfileManagement.handleHideProfiles.cancelled", "Operation Cancelled")); return; From 2735b0cf93776c420ed1a5fb8c7cbb1f66804675 Mon Sep 17 00:00:00 2001 From: Rudy Flores <68666202+rudyflores@users.noreply.github.com> Date: Tue, 14 Nov 2023 11:50:57 -0500 Subject: [PATCH 8/8] add code coverage Signed-off-by: Rudy Flores <68666202+rudyflores@users.noreply.github.com> --- .../__unit__/shared/TreeProvider.unit.test.ts | 11 ++++++++ .../__unit__/shared/context.unit.test.ts | 19 +++++++++++++ .../utils/ProfileManagement.unit.test.ts | 27 ++++++++++++++++++- .../zowe-explorer/src/shared/TreeProviders.ts | 1 - 4 files changed, 56 insertions(+), 2 deletions(-) diff --git a/packages/zowe-explorer/__tests__/__unit__/shared/TreeProvider.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/shared/TreeProvider.unit.test.ts index 7b1f542251..61d19d652b 100644 --- a/packages/zowe-explorer/__tests__/__unit__/shared/TreeProvider.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/shared/TreeProvider.unit.test.ts @@ -41,3 +41,14 @@ describe("TreeProvider Unit Tests - Function getters", () => { expect(TreeProviders.job).toEqual(mockTree); }); }); + +describe("TreeProvider Unit Tests - Function sessionIsPresentInOtherTrees", () => { + it("should return true if session is present in another tree", async () => { + await TreeProviders.initializeProviders({} as any, { + ds: () => ({ mSessionNodes: [{ label: "test1" }, { label: "test2" }] } as any), + uss: () => ({ mSessionNodes: [{ label: "test3" }, { label: "test4" }] } as any), + job: () => ({ mSessionNodes: [{ label: "test5" }, { label: "test1" }] } as any), + }); + expect(TreeProviders.sessionIsPresentInOtherTrees("test1")).toEqual(true); + }); +}); diff --git a/packages/zowe-explorer/__tests__/__unit__/shared/context.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/shared/context.unit.test.ts index df219a63b4..bc8268721d 100644 --- a/packages/zowe-explorer/__tests__/__unit__/shared/context.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/shared/context.unit.test.ts @@ -449,4 +449,23 @@ describe("Context helper tests", () => { treeItem.contextValue = "test"; expect(contextually.getBaseContext(treeItem)).toEqual(treeItem.contextValue); }); + + it("Test getSessionType returning 'uss'", () => { + treeItem.contextValue = globals.USS_SESSION_CONTEXT; + expect(contextually.getSessionType(treeItem)).toEqual("uss"); + }); + + it("Test getSessionType returning 'job'", () => { + treeItem.contextValue = globals.JOBS_SESSION_CONTEXT; + expect(contextually.getSessionType(treeItem)).toEqual("job"); + }); + + it("Test getSessionType returning error if node has no type", () => { + treeItem.contextValue = undefined; + try { + contextually.getSessionType(treeItem); + } catch (err) { + expect(err.message).toEqual("Session node passed in does not have a type"); + } + }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts index f5fde8eed9..5a47aacfc7 100644 --- a/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/utils/ProfileManagement.unit.test.ts @@ -22,6 +22,7 @@ import { Profiles } from "../../../src/Profiles"; import * as vscode from "vscode"; import { imperative } from "@zowe/cli"; import { ZoweUSSNode } from "../../../src/uss/ZoweUSSNode"; +import { Job } from "../../../src/job/ZoweJobNode"; import { ZoweExplorerApiRegister } from "../../../src/ZoweExplorerApiRegister"; import { TreeProviders } from "../../../src/shared/TreeProviders"; @@ -42,6 +43,7 @@ describe("ProfileManagement unit tests", () => { opCancelledSpy: jest.spyOn(Gui, "infoMessage"), mockDsSessionNode: ZoweDatasetNode, mockUnixSessionNode: ZoweUSSNode, + mockJobSessionNode: Job, mockResolveQp: jest.fn(), mockCreateQp: jest.fn(), mockUpdateChosen: ProfileManagement.basicAuthUpdateQpItems[ProfileManagement.AuthQpLabels.update], @@ -143,12 +145,15 @@ describe("ProfileManagement unit tests", () => { value: jest.fn().mockResolvedValue(mocks.mockProfileInfo as imperative.ProfileInfo), configurable: true, }); + mocks.mockTreeProviders.ds.mSessionNodes.push(mocks.mockDsSessionNode); + mocks.mockTreeProviders.uss.mSessionNodes.push(mocks.mockDsSessionNode); + mocks.mockTreeProviders.job.mSessionNodes.push(mocks.mockDsSessionNode); jest.spyOn(TreeProviders, "providers", "get").mockReturnValue(mocks.mockTreeProviders); mocks.mockResolveQp.mockResolvedValueOnce(mocks.mockHideProfChosen); mocks.mockResolveQp.mockResolvedValueOnce(ProfileManagement["getPromptHideFromAllTreesQpItems"]()[0]); await ProfileManagement.manageProfile(mocks.mockDsSessionNode); expect(mocks.debugLogSpy).toBeCalledWith(mocks.logMsg); - expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.removeSession", mocks.mockDsSessionNode, null, false); + expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.removeSession", mocks.mockDsSessionNode, null, true); }); it("profile using basic authentication should see delete commands called when Delete Profile chosen with v1 profile", async () => { const mocks = createBlockMocks(createGlobalMocks()); @@ -264,6 +269,26 @@ describe("ProfileManagement unit tests", () => { expect(mocks.commandSpy).toHaveBeenLastCalledWith("zowe.ds.disableValidation", mocks.mockDsSessionNode); }); }); + + describe("handleHideProfiles unit tests", () => { + it("should display 'operation cancelled' if no option is selected for hiding a profile", async () => { + const mocks = createGlobalMocks(); + const infoMessageSpy = jest.spyOn(Gui, "infoMessage"); + jest.spyOn(ProfileManagement as any, "promptHideFromAllTrees").mockReturnValue(undefined); + await expect(ProfileManagement["handleHideProfiles"](mocks.mockDsSessionNode)).resolves.toEqual(undefined); + expect(infoMessageSpy).toBeCalledTimes(1); + }); + it("should hide the job session", async () => { + const mocks = createGlobalMocks(); + const commandSpy = jest.spyOn(vscode.commands, "executeCommand"); + jest.spyOn(ProfileManagement as any, "promptHideFromAllTrees").mockReturnValue( + ProfileManagement["getPromptHideFromAllTreesQpItems"]()[1] + ); + await expect(ProfileManagement["handleHideProfiles"](mocks.mockJobSessionNode)).resolves.toEqual(undefined); + expect(commandSpy).toHaveBeenCalledWith("zowe.jobs.removeJobsSession", mocks.mockJobSessionNode, null, false); + }); + }); + describe("getRegisteredProfileNameList unit tests", () => { function createBlockMocks(globalMocks): any { const theMocks = { diff --git a/packages/zowe-explorer/src/shared/TreeProviders.ts b/packages/zowe-explorer/src/shared/TreeProviders.ts index d6d39ebae3..c5894f9384 100644 --- a/packages/zowe-explorer/src/shared/TreeProviders.ts +++ b/packages/zowe-explorer/src/shared/TreeProviders.ts @@ -14,7 +14,6 @@ import { IZoweProviders } from "./init"; import { DatasetTree } from "../dataset/DatasetTree"; import { USSTree } from "../uss/USSTree"; import { ZosJobsProvider } from "../job/ZosJobsProvider"; -import { IZoweNodeType } from "@zowe/zowe-explorer-api"; type ProviderFunctions = { ds: (context: vscode.ExtensionContext) => Promise;