From de68e2150ae4f05736555bc5cd75eb007acac754 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Wed, 5 Feb 2025 11:12:49 +0100 Subject: [PATCH] Add tests --- libs/key-management/src/key.service.spec.ts | 49 ++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/libs/key-management/src/key.service.spec.ts b/libs/key-management/src/key.service.spec.ts index 62cdce230ea..1c7cd94a422 100644 --- a/libs/key-management/src/key.service.spec.ts +++ b/libs/key-management/src/key.service.spec.ts @@ -1,5 +1,5 @@ import { mock } from "jest-mock-extended"; -import { bufferCount, firstValueFrom, lastValueFrom, of, take, tap } from "rxjs"; +import { BehaviorSubject, bufferCount, firstValueFrom, lastValueFrom, of, take, tap } from "rxjs"; import { EncryptedOrganizationKeyData } from "@bitwarden/common/admin-console/models/data/encrypted-organization-key.data"; @@ -836,4 +836,51 @@ describe("keyService", () => { }, ); }); + + describe("userPrivateKey$", () => { + type SetupKeysParams = { + makeMasterKey: boolean; + makeUserKey: boolean; + }; + + function setupKeys({ makeMasterKey, makeUserKey }: SetupKeysParams): [UserKey, MasterKey] { + const userKeyState = stateProvider.singleUser.getFake(mockUserId, USER_KEY); + const fakeMasterKey = makeMasterKey ? makeSymmetricCryptoKey(64) : null; + masterPasswordService.masterKeySubject.next(fakeMasterKey); + userKeyState.nextState(null); + const fakeUserKey = makeUserKey ? makeSymmetricCryptoKey(64) : null; + userKeyState.nextState(fakeUserKey); + return [fakeUserKey, fakeMasterKey]; + } + + it("returns null private key is null", async () => { + setupKeys({ makeMasterKey: false, makeUserKey: false }); + + keyService.userPrivateKey$ = jest.fn().mockReturnValue(new BehaviorSubject(null)); + const key = await firstValueFrom(keyService.userEncryptionKeyPair$(mockUserId)); + expect(key).toEqual(null); + }); + + it("returns null when private key is undefined", async () => { + setupKeys({ makeUserKey: true, makeMasterKey: false }); + + keyService.userPrivateKey$ = jest.fn().mockReturnValue(new BehaviorSubject(undefined)); + const key = await firstValueFrom(keyService.userEncryptionKeyPair$(mockUserId)); + expect(key).toEqual(null); + }); + + it("returns keys when private key is defined", async () => { + setupKeys({ makeUserKey: false, makeMasterKey: true }); + + keyService.userPrivateKey$ = jest.fn().mockReturnValue(new BehaviorSubject("private key")); + cryptoFunctionService.rsaExtractPublicKey.mockResolvedValue( + Utils.fromUtf8ToArray("public key"), + ); + const key = await firstValueFrom(keyService.userEncryptionKeyPair$(mockUserId)); + expect(key).toEqual({ + privateKey: "private key", + publicKey: Utils.fromUtf8ToArray("public key"), + }); + }); + }); });