bitwarden-estensione-browser/apps/browser/src/autofill/browser/cipher-context-menu-handler...

110 lines
3.6 KiB
TypeScript

import { mock, MockProxy } from "jest-mock-extended";
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type";
import { CipherType } from "@bitwarden/common/vault/enums/cipher-type";
import { CipherContextMenuHandler } from "./cipher-context-menu-handler";
import { MainContextMenuHandler } from "./main-context-menu-handler";
describe("CipherContextMenuHandler", () => {
let mainContextMenuHandler: MockProxy<MainContextMenuHandler>;
let authService: MockProxy<AuthService>;
let cipherService: MockProxy<CipherService>;
let sut: CipherContextMenuHandler;
beforeEach(() => {
mainContextMenuHandler = mock();
authService = mock();
cipherService = mock();
jest.spyOn(MainContextMenuHandler, "removeAll").mockResolvedValue();
sut = new CipherContextMenuHandler(mainContextMenuHandler, authService, cipherService);
});
afterEach(() => jest.resetAllMocks());
describe("update", () => {
it("locked, updates for no access", async () => {
authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Locked);
await sut.update("https://test.com");
expect(mainContextMenuHandler.noAccess).toHaveBeenCalledTimes(1);
});
it("logged out, updates for no access", async () => {
authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.LoggedOut);
await sut.update("https://test.com");
expect(mainContextMenuHandler.noAccess).toHaveBeenCalledTimes(1);
});
it("has menu disabled, does not load anything", async () => {
authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked);
await sut.update("https://test.com");
expect(mainContextMenuHandler.loadOptions).not.toHaveBeenCalled();
expect(mainContextMenuHandler.noAccess).not.toHaveBeenCalled();
expect(mainContextMenuHandler.noLogins).not.toHaveBeenCalled();
});
it("has no ciphers, add no ciphers item", async () => {
authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked);
mainContextMenuHandler.init.mockResolvedValue(true);
cipherService.getAllDecryptedForUrl.mockResolvedValue([]);
await sut.update("https://test.com");
expect(mainContextMenuHandler.noLogins).toHaveBeenCalledTimes(1);
});
it("only adds valid ciphers", async () => {
authService.getAuthStatus.mockResolvedValue(AuthenticationStatus.Unlocked);
mainContextMenuHandler.init.mockResolvedValue(true);
const realCipher = {
id: "5",
type: CipherType.Login,
reprompt: CipherRepromptType.None,
name: "Test Cipher",
login: { username: "Test Username" },
};
cipherService.getAllDecryptedForUrl.mockResolvedValue([
null,
undefined,
{ type: CipherType.Card },
{ type: CipherType.Login, reprompt: CipherRepromptType.Password },
realCipher,
] as any[]);
await sut.update("https://test.com");
expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledTimes(1);
expect(cipherService.getAllDecryptedForUrl).toHaveBeenCalledWith("https://test.com");
expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledTimes(1);
expect(mainContextMenuHandler.loadOptions).toHaveBeenCalledWith(
"Test Cipher (Test Username)",
"5",
"https://test.com",
realCipher
);
});
});
});