From c95f9e8b8210183edda3e69e5339ba6e387a1414 Mon Sep 17 00:00:00 2001 From: Trae Yelovich Date: Tue, 22 Oct 2024 15:03:54 -0400 Subject: [PATCH] fix(ds): Call remoteLookupForResource when entry doesn't exist locally Signed-off-by: Trae Yelovich --- packages/zowe-explorer/CHANGELOG.md | 1 + .../trees/dataset/DatasetFSProvider.unit.test.ts | 14 +++++--------- .../src/trees/dataset/DatasetFSProvider.ts | 7 ++----- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/zowe-explorer/CHANGELOG.md b/packages/zowe-explorer/CHANGELOG.md index edfb1d543..ec856e059 100644 --- a/packages/zowe-explorer/CHANGELOG.md +++ b/packages/zowe-explorer/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to the "vscode-extension-for-zowe" extension will be documen - `DatasetFSProvider.stat()` will now throw a `FileNotFound` error for extenders trying to fetch an MVS resource that does not exist. [#3252](https://github.com/zowe/zowe-explorer-vscode/issues/3252) - Fixed an issue where renaming or deleting a USS file or data set did not update the opened editor. [#3260](https://github.com/zowe/zowe-explorer-vscode/issues/3260) +- Fixed an issue where calling `vscode.workspace.fs.readFile` with a PDS member URI would throw an error when the PDS already existed as a filesystem entry. [#3267](https://github.com/zowe/zowe-explorer-vscode/issues/3267) ## `3.0.2` diff --git a/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetFSProvider.unit.test.ts b/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetFSProvider.unit.test.ts index a48da93bb..3bfacb4d3 100644 --- a/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetFSProvider.unit.test.ts +++ b/packages/zowe-explorer/__tests__/__unit__/trees/dataset/DatasetFSProvider.unit.test.ts @@ -348,7 +348,7 @@ describe("readFile", () => { _getInfoFromUriMock.mockRestore(); }); - it("checks if parent dir exists when lookup fails & calls remoteLookupForResource if parent dir doesn't exist", async () => { + it("calls remoteLookupForResource if entry does not exist locally", async () => { const _lookupAsFileMock = jest .spyOn(DatasetFSProvider.instance as any, "_lookupAsFile") .mockImplementationOnce(() => { @@ -357,7 +357,6 @@ describe("readFile", () => { .mockReturnValue(testEntries.pdsMember); const fetchDatasetAtUriMock = jest.spyOn(DatasetFSProvider.instance, "fetchDatasetAtUri").mockImplementation(); - const _lookupParentDirectoryMock = jest.spyOn(DatasetFSProvider.instance as any, "_lookupParentDirectory").mockReturnValueOnce(null); const _getInfoFromUriMock = jest.spyOn(DatasetFSProvider.instance as any, "_getInfoFromUri").mockReturnValueOnce({ profile: testProfile, path: "/USER.DATA.PS", @@ -368,7 +367,6 @@ describe("readFile", () => { await DatasetFSProvider.instance.readFile(testUris.pdsMember); expect(_lookupAsFileMock).toHaveBeenCalledWith(testUris.pdsMember); - expect(_lookupParentDirectoryMock).toHaveBeenCalledWith(testUris.pdsMember, true); expect(remoteLookupForResourceMock).toHaveBeenCalledWith(testUris.pdsMember); expect(fetchDatasetAtUriMock).toHaveBeenCalledWith(testUris.pdsMember, { isConflict: false }); _getInfoFromUriMock.mockRestore(); @@ -378,9 +376,6 @@ describe("readFile", () => { const _lookupAsFileMock = jest.spyOn(DatasetFSProvider.instance as any, "_lookupAsFile").mockImplementationOnce(() => { throw FileSystemError.FileNotFound(testUris.pdsMember); }); - const _lookupParentDirectoryMock = jest - .spyOn(DatasetFSProvider.instance as any, "_lookupParentDirectory") - .mockReturnValueOnce(testEntries.pds); const _getInfoFromUriMock = jest.spyOn(DatasetFSProvider.instance as any, "_getInfoFromUri").mockReturnValueOnce({ profile: testProfile, path: "/USER.DATA.PS", @@ -388,13 +383,14 @@ describe("readFile", () => { const remoteLookupForResourceMock = jest .spyOn(DatasetFSProvider.instance, "remoteLookupForResource") .mockReset() - .mockResolvedValue(testEntries.pdsMember); + .mockResolvedValueOnce(null as any); await expect(DatasetFSProvider.instance.readFile(testUris.pdsMember)).rejects.toThrow(); expect(_lookupAsFileMock).toHaveBeenCalledWith(testUris.pdsMember); - expect(_lookupParentDirectoryMock).toHaveBeenCalledWith(testUris.pdsMember, true); - expect(remoteLookupForResourceMock).not.toHaveBeenCalledWith(testUris.pdsMember); + expect(remoteLookupForResourceMock).toHaveBeenCalledWith(testUris.pdsMember); _getInfoFromUriMock.mockRestore(); + _lookupAsFileMock.mockRestore(); + remoteLookupForResourceMock.mockRestore(); }); it("returns the data for an entry", async () => { diff --git a/packages/zowe-explorer/src/trees/dataset/DatasetFSProvider.ts b/packages/zowe-explorer/src/trees/dataset/DatasetFSProvider.ts index a853471ad..a9c3849bf 100644 --- a/packages/zowe-explorer/src/trees/dataset/DatasetFSProvider.ts +++ b/packages/zowe-explorer/src/trees/dataset/DatasetFSProvider.ts @@ -390,11 +390,8 @@ export class DatasetFSProvider extends BaseProvider implements vscode.FileSystem throw err; } - // check if parent directory exists; if not, do a remote lookup - const parent = this._lookupParentDirectory(uri, true); - if (parent == null) { - ds = await this.remoteLookupForResource(uri); - } + // do a remote lookup if the entry does not yet exist locally + ds = await this.remoteLookupForResource(uri); } if (ds == null) {