From d4b655148e844933466a4fe4d7488331a2803996 Mon Sep 17 00:00:00 2001 From: Shane Date: Tue, 24 Feb 2026 12:09:40 -0800 Subject: [PATCH] [PM-25688] Add unit test to ensure Folder Id is never set for import request --- .../src/services/import.service.spec.ts | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/libs/importer/src/services/import.service.spec.ts b/libs/importer/src/services/import.service.spec.ts index ce87bc6ab88..8436effe6f8 100644 --- a/libs/importer/src/services/import.service.spec.ts +++ b/libs/importer/src/services/import.service.spec.ts @@ -1,4 +1,5 @@ import { mock, MockProxy } from "jest-mock-extended"; +import { of } from "rxjs"; // This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop. // eslint-disable-next-line no-restricted-imports @@ -10,13 +11,14 @@ import { import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { KeyGenerationService } from "@bitwarden/common/key-management/crypto"; import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; +import { EncString } from "@bitwarden/common/key-management/crypto/models/enc-string"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { CollectionId, OrganizationId } from "@bitwarden/common/types/guid"; +import { CollectionId, OrganizationId, UserId } from "@bitwarden/common/types/guid"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { Folder } from "@bitwarden/common/vault/models/domain/folder"; -import { FolderWithIdRequest } from "@bitwarden/common/vault/models/request/folder-with-id.request"; +import { FolderRequest } from "@bitwarden/common/vault/models/request/folder.request"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; import { RestrictedItemTypesService } from "@bitwarden/common/vault/services/restricted-item-types.service"; @@ -280,19 +282,31 @@ describe("ImportService", () => { expect(importResult.collectionRelationships.every((r) => r[1] === 0)).toBe(true); }); }); -}); -describe("FolderWithIdRequest", () => { - function makeFolder(id: string): Folder { - const folder = new Folder(); - folder.id = id; - return folder; - } + describe("handleIndividualImport", () => { + it("sends folder requests without an id property", async () => { + const importResult = new ImportResult(); + const folderView = new FolderView(); + folderView.name = "Test Folder"; + importResult.folders.push(folderView); - it("preserves a real folder id", () => { - const guid = "f1a2b3c4-d5e6-7890-abcd-ef1234567890"; - const request = new FolderWithIdRequest(makeFolder(guid)); - expect(request.id).toBe(guid); + const encryptedFolder = new Folder(); + encryptedFolder.id = ""; + encryptedFolder.name = new EncString("2.encryptedName"); + folderService.encrypt.mockResolvedValue(encryptedFolder); + + cipherService.encryptMany.mockResolvedValue([]); + keyService.userKey$.mockReturnValue(of(null)); + + const userId = "test-user-id" as UserId; + await importService["handleIndividualImport"](importResult, userId); + + const request = importApiService.postImportCiphers.mock.calls[0][0]; + expect(request.folders).toHaveLength(1); + expect(request.folders[0]).toBeInstanceOf(FolderRequest); + expect(request.folders[0].name).toBe("2.encryptedName"); + expect(request.folders[0]).not.toHaveProperty("id"); + }); }); });