diff --git a/packages/zowe-explorer-api/src/utils/ErrorCorrelator.ts b/packages/zowe-explorer-api/src/utils/ErrorCorrelator.ts index 062ce4d43..893807be3 100644 --- a/packages/zowe-explorer-api/src/utils/ErrorCorrelator.ts +++ b/packages/zowe-explorer-api/src/utils/ErrorCorrelator.ts @@ -194,7 +194,7 @@ export class ErrorCorrelator extends Singleton { } for (const apiError of [ - ...this.errorMatches.get(profileType)[api], + ...(this.errorMatches.get(profileType)?.[api] ?? []), ...(api === ZoweExplorerApiType.All ? [] : this.errorMatches.get(profileType)[ZoweExplorerApiType.All] ?? []), ]) { for (const match of Array.isArray(apiError.matches) ? apiError.matches : [apiError.matches]) { diff --git a/packages/zowe-explorer/__tests__/__unit__/commands/MvsCommandHandler.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/commands/MvsCommandHandler.unit.test.ts index 66ac72ebb..64bff921f 100644 --- a/packages/zowe-explorer/__tests__/__unit__/commands/MvsCommandHandler.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/commands/MvsCommandHandler.unit.test.ts @@ -280,7 +280,7 @@ describe("mvsCommandActions unit testing", () => { }); expect(showInputBox.mock.calls.length).toBe(1); expect(showErrorMessage.mock.calls.length).toBe(1); - expect(showErrorMessage.mock.calls[0][0]).toEqual("Error: fake testError"); + expect(showErrorMessage.mock.calls[0][0]).toEqual("fake testError"); }); it("tests the issueMvsCommand function user escapes the quick pick box", async () => { diff --git a/packages/zowe-explorer/__tests__/__unit__/commands/TsoCommandHandler.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/commands/TsoCommandHandler.unit.test.ts index 88d79146f..98beadfa3 100644 --- a/packages/zowe-explorer/__tests__/__unit__/commands/TsoCommandHandler.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/commands/TsoCommandHandler.unit.test.ts @@ -279,7 +279,7 @@ describe("TsoCommandHandler unit testing", () => { }); expect(showInputBox.mock.calls.length).toBe(1); expect(showErrorMessage.mock.calls.length).toBe(1); - expect(showErrorMessage.mock.calls[0][0]).toEqual("Error: fake testError"); + expect(showErrorMessage.mock.calls[0][0]).toEqual("fake testError"); }); it("tests the issueTsoCommand function user escapes the quick pick box", async () => { diff --git a/packages/zowe-explorer/__tests__/__unit__/commands/UnixCommandHandler.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/commands/UnixCommandHandler.unit.test.ts index 76faf5128..f1a0830b7 100644 --- a/packages/zowe-explorer/__tests__/__unit__/commands/UnixCommandHandler.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/commands/UnixCommandHandler.unit.test.ts @@ -406,7 +406,7 @@ describe("UnixCommand Actions Unit Testing", () => { }); expect(showInputBox.mock.calls.length).toBe(2); expect(showErrorMessage.mock.calls.length).toBe(1); - expect(showErrorMessage.mock.calls[0][0]).toEqual("Error: fake testError"); + expect(showErrorMessage.mock.calls[0][0]).toEqual("fake testError"); }); it("If nothing is entered in the inputbox of path", async () => { diff --git a/packages/zowe-explorer/__tests__/__unit__/commands/ZoweCommandProvider.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/commands/ZoweCommandProvider.unit.test.ts index e9f787026..733d2a601 100644 --- a/packages/zowe-explorer/__tests__/__unit__/commands/ZoweCommandProvider.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/commands/ZoweCommandProvider.unit.test.ts @@ -10,7 +10,7 @@ */ import * as vscode from "vscode"; -import { ProfilesCache, ZoweTreeNode } from "@zowe/zowe-explorer-api"; +import { ProfilesCache, ZoweExplorerApiType, ZoweTreeNode } from "@zowe/zowe-explorer-api"; import { createIProfile, createISession } from "../../__mocks__/mockCreators/shared"; import { ZoweCommandProvider } from "../../../src/commands/ZoweCommandProvider"; import { Profiles } from "../../../src/configuration/Profiles"; @@ -85,7 +85,8 @@ describe("ZoweCommandProvider Unit Tests - function checkCurrentProfile", () => expect(errorHandlingSpy).toHaveBeenCalledWith( "Profile Name " + globalMocks.testProfile.name + - " is inactive. Please check if your Zowe server is active or if the URL and port in your profile is correct." + " is inactive. Please check if your Zowe server is active or if the URL and port in your profile is correct.", + { apiType: ZoweExplorerApiType.Command, profile: globalMocks.testProfile } ); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/configuration/Profiles.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/configuration/Profiles.unit.test.ts index 813d265b7..4ffd55400 100644 --- a/packages/zowe-explorer/__tests__/__unit__/configuration/Profiles.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/configuration/Profiles.unit.test.ts @@ -891,13 +891,14 @@ describe("Profiles Unit Tests - function validateProfile", () => { throw testError; }); const errorHandlingSpy = jest.spyOn(AuthUtils, "errorHandling"); - await Profiles.getInstance().validateProfiles({ + const profile = { name: "test1", message: "", type: "", failNotFound: false, - }); - expect(errorHandlingSpy).toHaveBeenCalledWith(testError, "test1"); + }; + await Profiles.getInstance().validateProfiles(profile); + expect(errorHandlingSpy).toHaveBeenCalledWith(testError, { profile }); }); it("should return an object with profile validation status of 'unverified' from session status if validated profiles doesn't exist", async () => { createBlockMocks(); diff --git a/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetActions.extended.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetActions.extended.unit.test.ts index dc3bb0048..4fca29287 100644 --- a/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetActions.extended.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetActions.extended.unit.test.ts @@ -19,6 +19,7 @@ import { SharedActions } from "../../../../src/trees/shared/SharedActions"; import { Profiles } from "../../../../src/configuration/Profiles"; import { ZoweDatasetNode } from "../../../../src/trees/dataset/ZoweDatasetNode"; import { AuthUtils } from "../../../../src/utils/AuthUtils"; +import { ZoweExplorerApiType } from "@zowe/zowe-explorer-api"; async function createGlobalMocks() { const newMocks = { @@ -241,8 +242,7 @@ describe("mvsNodeActions", () => { jest.spyOn(mockMvsApi2, "putContents").mockRejectedValue(testError); const errHandlerSpy = jest.spyOn(AuthUtils, "errorHandling").mockImplementation(); await DatasetActions.uploadDialog(node, testTree); - - expect(errHandlerSpy).toHaveBeenCalledWith(testError, "sestest"); + expect(errHandlerSpy).toHaveBeenCalledWith(testError, { apiType: ZoweExplorerApiType.Mvs, profile: globalMocks.profileOne }); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetActions.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetActions.unit.test.ts index dcfa23e15..633b3bd42 100644 --- a/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetActions.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetActions.unit.test.ts @@ -11,7 +11,7 @@ import * as vscode from "vscode"; import * as zosfiles from "@zowe/zos-files-for-zowe-sdk"; -import { Gui, imperative, Validation, Types } from "@zowe/zowe-explorer-api"; +import { Gui, imperative, Validation, Types, ZoweExplorerApiType } from "@zowe/zowe-explorer-api"; import { DatasetFSProvider } from "../../../../src/trees/dataset/DatasetFSProvider"; import { bindMvsApi, createMvsApi } from "../../../__mocks__/mockCreators/api"; import { @@ -206,7 +206,7 @@ describe("Dataset Actions Unit Tests - Function createMember", () => { }); mocked(vscode.window.showInputBox).mockResolvedValue("testMember"); - mocked(zosfiles.Upload.bufferToDataSet).mockRejectedValueOnce(Error("test")); + mocked(zosfiles.Upload.bufferToDataSet).mockRejectedValueOnce(Error("Error when uploading to data set")); try { await DatasetActions.createMember(parent, blockMocks.testDatasetTree); @@ -214,7 +214,7 @@ describe("Dataset Actions Unit Tests - Function createMember", () => { // Prevent exception from failing test } - expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("Unable to create member. Error: test"); + expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("Error when uploading to data set", { items: ["More info"] }); mocked(zosfiles.Upload.bufferToDataSet).mockReset(); }); it("Checking of attempt to create member without name", async () => { @@ -769,9 +769,9 @@ describe("Dataset Actions Unit Tests - Function deleteDataset", () => { }); mocked(vscode.window.showQuickPick).mockResolvedValueOnce("Delete" as any); - jest.spyOn(DatasetFSProvider.instance, "delete").mockRejectedValueOnce(Error("")); + jest.spyOn(DatasetFSProvider.instance, "delete").mockRejectedValueOnce(Error("Deletion error")); await expect(DatasetActions.deleteDataset(node, blockMocks.testDatasetTree)).rejects.toThrow(""); - expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("Error"); + expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("Deletion error", { items: ["More info"] }); }); it("Checking Favorite PDS dataset deletion", async () => { createGlobalMocks(); @@ -1123,9 +1123,9 @@ describe("Dataset Actions Unit Tests - Function showAttributes", () => { await expect(DatasetActions.showAttributes(node, blockMocks.testDatasetTree)).rejects.toEqual( Error("No matching names found for query: AUSER.A1557332.A996850.TEST1") ); - expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith( - "Unable to list attributes. Error: No matching names found for query: AUSER.A1557332.A996850.TEST1" - ); + expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("No matching names found for query: AUSER.A1557332.A996850.TEST1", { + items: ["More info"], + }); expect(mocked(vscode.window.createWebviewPanel)).not.toHaveBeenCalled(); }); }); @@ -2395,7 +2395,7 @@ describe("Dataset Actions Unit Tests - Function createFile", () => { // do nothing } - expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("Error encountered when creating data set. Error: Generic Error"); + expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("Generic Error", { items: ["More info"] }); expect(mocked(vscode.workspace.getConfiguration)).toHaveBeenLastCalledWith(Constants.SETTINGS_DS_DEFAULT_PS); expect(createDataSetSpy).toHaveBeenCalledWith(zosfiles.CreateDataSetTypeEnum.DATA_SET_SEQUENTIAL, "TEST", { alcunit: "CYL", @@ -2897,7 +2897,10 @@ describe("Dataset Actions Unit Tests - Function allocateLike", () => { } expect(errorHandlingSpy).toHaveBeenCalledTimes(1); - expect(errorHandlingSpy).toHaveBeenCalledWith(errorMessage, "test", "Unable to create data set."); + expect(errorHandlingSpy).toHaveBeenCalledWith( + errorMessage, + expect.objectContaining({ apiType: ZoweExplorerApiType.Mvs, scenario: "Unable to create data set." }) + ); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/trees/dataset/ZoweDatasetNode.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/trees/dataset/ZoweDatasetNode.unit.test.ts index db0ca1f12..ba20a0e39 100644 --- a/packages/zowe-explorer/__tests__/__unit__/trees/dataset/ZoweDatasetNode.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/trees/dataset/ZoweDatasetNode.unit.test.ts @@ -516,7 +516,7 @@ describe("ZoweDatasetNode Unit Tests - Function node.openDs()", () => { // do nothing } - expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("Error: testError"); + expect(mocked(Gui.errorMessage)).toHaveBeenCalledWith("testError", { items: ["More info"] }); }); it("Checking of opening for PDS Member", async () => { diff --git a/packages/zowe-explorer/__tests__/__unit__/trees/job/JobActions.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/trees/job/JobActions.unit.test.ts index ee043a6f0..c9ba0a76c 100644 --- a/packages/zowe-explorer/__tests__/__unit__/trees/job/JobActions.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/trees/job/JobActions.unit.test.ts @@ -41,6 +41,7 @@ import { JobActions } from "../../../../src/trees/job/JobActions"; import { DatasetActions } from "../../../../src/trees/dataset/DatasetActions"; import { Definitions } from "../../../../src/configuration/Definitions"; import { SpoolUtils } from "../../../../src/utils/SpoolUtils"; +import { AuthUtils } from "../../../../src/utils/AuthUtils"; const activeTextEditorDocument = jest.fn(); @@ -415,8 +416,14 @@ describe("Jobs Actions Unit Tests - Function downloadJcl", () => { }); it("Checking failed attempt to download Job JCL", async () => { createGlobalMocks(); - await JobActions.downloadJcl(undefined as any); - expect(mocked(Gui.errorMessage)).toHaveBeenCalled(); + const showTextDocumentMock = jest.spyOn(vscode.workspace, "openTextDocument").mockImplementationOnce(() => { + throw new Error(); + }); + const errorHandlingMock = jest.spyOn(AuthUtils, "errorHandling").mockImplementation(); + await JobActions.downloadJcl({ getProfile: jest.fn(), job: createIJobObject() } as any); + expect(showTextDocumentMock).toHaveBeenCalled(); + expect(errorHandlingMock).toHaveBeenCalled(); + errorHandlingMock.mockRestore(); }); }); @@ -1043,6 +1050,7 @@ describe("focusing on a job in the tree view", () => { const existingJobSession = createJobSessionNode(session, profile); const datasetSessionName = existingJobSession.label as string; const jobTree = createTreeView(); + const errorHandlingMock = jest.spyOn(AuthUtils, "errorHandling").mockImplementation(); const jobTreeProvider = createJobsTree(session, submittedJob, profile, jobTree); jobTreeProvider.mSessionNodes.push(existingJobSession); const testError = new Error("focusOnJob failed"); @@ -1053,8 +1061,7 @@ describe("focusing on a job in the tree view", () => { await JobActions.focusOnJob(jobTreeProvider, datasetSessionName, submittedJob.jobid); // assert expect(mocked(jobTreeProvider.refreshElement)).toHaveBeenCalledWith(existingJobSession); - expect(mocked(Gui.errorMessage)).toHaveBeenCalled(); - expect(mocked(Gui.errorMessage).mock.calls[0][0]).toContain(testError.message); + expect(errorHandlingMock).toHaveBeenCalled(); }); it("should handle error adding a new tree view session", async () => { // arrange @@ -1064,6 +1071,7 @@ describe("focusing on a job in the tree view", () => { const newJobSession = createJobSessionNode(session, profile); const datasetSessionName = newJobSession.label as string; const jobTree = createTreeView(); + const errorHandlingMock = jest.spyOn(AuthUtils, "errorHandling").mockImplementation(); const jobTreeProvider = createJobsTree(session, submittedJob, profile, jobTree); const testError = new Error("focusOnJob failed"); jest.spyOn(jobTreeProvider, "addSession").mockRejectedValueOnce(testError); @@ -1071,8 +1079,7 @@ describe("focusing on a job in the tree view", () => { await JobActions.focusOnJob(jobTreeProvider, datasetSessionName, submittedJob.jobid); // assert expect(mocked(jobTreeProvider.addSession)).toHaveBeenCalledWith({ sessionName: datasetSessionName }); - expect(mocked(Gui.errorMessage)).toHaveBeenCalled(); - expect(mocked(Gui.errorMessage).mock.calls[0][0]).toContain(testError.message); + expect(errorHandlingMock).toHaveBeenCalled(); }); }); diff --git a/packages/zowe-explorer/__tests__/__unit__/trees/uss/ZoweUSSNode.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/trees/uss/ZoweUSSNode.unit.test.ts index 34e76bc09..7ca12bfab 100644 --- a/packages/zowe-explorer/__tests__/__unit__/trees/uss/ZoweUSSNode.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/trees/uss/ZoweUSSNode.unit.test.ts @@ -856,9 +856,7 @@ describe("ZoweUSSNode Unit Tests - Function node.getChildren()", () => { await blockMocks.childNode.getChildren(); expect(globalMocks.showErrorMessage.mock.calls.length).toEqual(1); - expect(globalMocks.showErrorMessage.mock.calls[0][0]).toEqual( - "Retrieving response from USS list API Error: Throwing an error to check error handling for unit tests!" - ); + expect(globalMocks.showErrorMessage.mock.calls[0][0]).toEqual("Throwing an error to check error handling for unit tests!"); }); it("Tests that when passing a session node that is not dirty the node.getChildren() method is exited early", async () => { diff --git a/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts index c276a01e3..bb1fdefb2 100644 --- a/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/utils/ProfilesUtils.unit.test.ts @@ -91,12 +91,11 @@ describe("ProfilesUtils unit tests", () => { it("should log error details", async () => { createBlockMocks(); const errorDetails = new Error("i haz error"); - const label = "test"; - const moreInfo = "Task failed successfully"; - await AuthUtils.errorHandling(errorDetails, label, moreInfo); - expect(Gui.errorMessage).toHaveBeenCalledWith(moreInfo + ` Error: ${errorDetails.message}`); + const scenario = "Task failed successfully"; + await AuthUtils.errorHandling(errorDetails, { scenario }); + expect(Gui.errorMessage).toHaveBeenCalledWith(errorDetails.message, { items: ["More info"] }); expect(ZoweLogger.error).toHaveBeenCalledWith( - `${errorDetails.toString()}\n` + util.inspect({ errorDetails, label, moreInfo }, { depth: null }) + `${errorDetails.toString()}\n` + util.inspect({ errorDetails, moreInfo: { scenario } }, { depth: null }) ); }); @@ -108,13 +107,12 @@ describe("ProfilesUtils unit tests", () => { msg: "Circular reference", causeErrors: errorJson, }); - const label = "test"; - const moreInfo = "Task failed successfully"; - await AuthUtils.errorHandling(errorDetails, label, moreInfo as unknown as string); + const scenario = "Task failed successfully"; + await AuthUtils.errorHandling(errorDetails, { scenario }); // eslint-disable-next-line @typescript-eslint/restrict-plus-operands - expect(Gui.errorMessage).toHaveBeenCalledWith((`${moreInfo} ` + errorDetails) as any); + expect(Gui.errorMessage).toHaveBeenCalledWith(errorDetails.message, { items: ["More info"] }); expect(ZoweLogger.error).toHaveBeenCalledWith( - `Error: ${errorDetails.message}\n` + util.inspect({ errorDetails, label, moreInfo }, { depth: null }) + `Error: ${errorDetails.message}\n` + util.inspect({ errorDetails, moreInfo: { scenario } }, { depth: null }) ); }); @@ -123,9 +121,8 @@ describe("ProfilesUtils unit tests", () => { msg: "Invalid hostname", errorCode: 404 as unknown as string, }); - const label = "test"; - const moreInfo = "Task failed successfully"; - const spyOpenConfigFile = jest.fn(); + const scenario = "Task failed successfully"; + const openConfigForMissingHostnameMock = jest.spyOn(AuthUtils, "openConfigForMissingHostname"); Object.defineProperty(Constants, "PROFILES_CACHE", { value: { getProfileInfo: () => ({ @@ -139,12 +136,12 @@ describe("ProfilesUtils unit tests", () => { }, ], }), - openConfigFile: spyOpenConfigFile, + openConfigFile: jest.fn(), }, configurable: true, }); - await AuthUtils.errorHandling(errorDetails, label, moreInfo); - expect(spyOpenConfigFile).toHaveBeenCalledTimes(1); + await AuthUtils.errorHandling(errorDetails, { scenario }); + expect(openConfigForMissingHostnameMock).toHaveBeenCalled(); }); it("should handle error for invalid credentials and prompt for authentication", async () => { @@ -153,21 +150,21 @@ describe("ProfilesUtils unit tests", () => { errorCode: 401 as unknown as string, additionalDetails: "Authentication is not valid or expired.", }); - const label = "test"; - const moreInfo = "Task failed successfully"; + const scenario = "Task failed successfully"; const showMessageSpy = jest.spyOn(Gui, "errorMessage").mockImplementation(() => Promise.resolve("Update Credentials")); const promptCredsSpy = jest.fn(); + const profile = { type: "zosmf" } as any; Object.defineProperty(Constants, "PROFILES_CACHE", { value: { promptCredentials: promptCredsSpy, getProfileInfo: profileInfoMock, - getLoadedProfConfig: () => ({ type: "zosmf" }), + getLoadedProfConfig: () => profile, getDefaultProfile: () => ({}), getSecurePropsForProfile: () => [], }, configurable: true, }); - await AuthUtils.errorHandling(errorDetails, label, moreInfo); + await AuthUtils.errorHandling(errorDetails, { profile, scenario }); expect(showMessageSpy).toHaveBeenCalledTimes(1); expect(promptCredsSpy).toHaveBeenCalledTimes(1); showMessageSpy.mockClear(); @@ -176,25 +173,25 @@ describe("ProfilesUtils unit tests", () => { it("should handle token error and proceed to login", async () => { const errorDetails = new imperative.ImperativeError({ msg: "Invalid credentials", - errorCode: 401 as unknown as string, + errorCode: "401", additionalDetails: "Token is not valid or expired.", }); - const label = "test"; - const moreInfo = "Task failed successfully"; + const scenario = "Task failed successfully"; const showErrorSpy = jest.spyOn(Gui, "errorMessage"); const showMessageSpy = jest.spyOn(Gui, "showMessage").mockImplementation(() => Promise.resolve("selection")); const ssoLoginSpy = jest.fn(); + const profile = { type: "zosmf" } as any; Object.defineProperty(Constants, "PROFILES_CACHE", { value: { getProfileInfo: profileInfoMock, - getLoadedProfConfig: () => ({ type: "zosmf" }), + getLoadedProfConfig: () => profile, getDefaultProfile: () => ({}), getSecurePropsForProfile: () => ["tokenValue"], ssoLogin: ssoLoginSpy, }, configurable: true, }); - await AuthUtils.errorHandling(errorDetails, label, moreInfo); + await AuthUtils.errorHandling(errorDetails, { profile, scenario }); expect(showMessageSpy).toHaveBeenCalledTimes(1); expect(ssoLoginSpy).toHaveBeenCalledTimes(1); expect(showErrorSpy).not.toHaveBeenCalled(); @@ -205,10 +202,9 @@ describe("ProfilesUtils unit tests", () => { it("should handle credential error and no selection made for update", async () => { const errorDetails = new imperative.ImperativeError({ msg: "Invalid credentials", - errorCode: String(401), - additionalDetails: "Authentication failed.", + errorCode: "401", + additionalDetails: "All configured authentication methods failed", }); - const label = "test"; const moreInfo = "Task failed successfully"; Object.defineProperty(vscode, "env", { value: { @@ -219,20 +215,21 @@ describe("ProfilesUtils unit tests", () => { const showErrorSpy = jest.spyOn(Gui, "errorMessage").mockResolvedValue(undefined); const showMsgSpy = jest.spyOn(Gui, "showMessage"); const promptCredentialsSpy = jest.fn(); + const profile = { type: "zosmf" } as any; Object.defineProperty(Constants, "PROFILES_CACHE", { value: { promptCredentials: promptCredentialsSpy, getProfileInfo: profileInfoMock, - getLoadedProfConfig: () => ({ type: "zosmf" }), + getLoadedProfConfig: () => profile, getDefaultProfile: () => ({}), getSecurePropsForProfile: () => [], }, configurable: true, }); - await AuthUtils.errorHandling(errorDetails, label, moreInfo); + await AuthUtils.errorHandling(errorDetails, { profile, scenario: moreInfo }); expect(showErrorSpy).toHaveBeenCalledTimes(1); expect(promptCredentialsSpy).not.toHaveBeenCalled(); - expect(showMsgSpy).toHaveBeenCalledWith("Operation Cancelled"); + expect(showMsgSpy).not.toHaveBeenCalledWith("Operation Cancelled"); showErrorSpy.mockClear(); showMsgSpy.mockClear(); promptCredentialsSpy.mockClear(); @@ -680,7 +677,7 @@ describe("ProfilesUtils unit tests", () => { await ProfilesUtils.initializeZoweProfiles((msg) => ZoweExplorerExtender.showZoweConfigError(msg)); expect(initZoweFolderSpy).toHaveBeenCalledTimes(1); expect(readConfigFromDiskSpy).toHaveBeenCalledTimes(1); - expect(Gui.errorMessage).toHaveBeenCalledWith(expect.stringContaining(testError.message)); + expect(Gui.errorMessage).toHaveBeenCalledWith(testError.message, { items: ["More info"] }); }); it("should handle JSON parse error thrown on read config from disk", async () => { diff --git a/packages/zowe-explorer/src/trees/job/JobActions.ts b/packages/zowe-explorer/src/trees/job/JobActions.ts index 10e364095..83140dd79 100644 --- a/packages/zowe-explorer/src/trees/job/JobActions.ts +++ b/packages/zowe-explorer/src/trees/job/JobActions.ts @@ -137,7 +137,7 @@ export class JobActions { try { await jobsProvider.addSession({ sessionName: sessionName.trim() }); } catch (error) { - await AuthUtils.errorHandling(error, { apiType: ZoweExplorerApiType.Jes, profile: sessionNode.getProfile() }); + await AuthUtils.errorHandling(error, { apiType: ZoweExplorerApiType.Jes, profile: sessionName }); return; } sessionNode = jobsProvider.mSessionNodes.find((jobNode) => jobNode.label.toString().trim() === sessionName.trim()); @@ -145,7 +145,7 @@ export class JobActions { try { jobsProvider.refreshElement(sessionNode); } catch (error) { - await AuthUtils.errorHandling(error, { apiType: ZoweExplorerApiType.Jes, profile: sessionNode.getProfile() }); + await AuthUtils.errorHandling(error, { apiType: ZoweExplorerApiType.Jes, profile: sessionName }); return; } sessionNode.searchId = jobId; diff --git a/packages/zowe-explorer/src/utils/AuthUtils.ts b/packages/zowe-explorer/src/utils/AuthUtils.ts index 3a86da0d4..05c45fe45 100644 --- a/packages/zowe-explorer/src/utils/AuthUtils.ts +++ b/packages/zowe-explorer/src/utils/AuthUtils.ts @@ -49,7 +49,6 @@ export class AuthUtils { vsCodeOpts: { modal: true }, }).then(async (selection) => { if (selection !== checkCredsButton) { - Gui.showMessage(vscode.l10n.t("Operation Cancelled")); return; } return Constants.PROFILES_CACHE.promptCredentials(profile.name, true);