From 6c5a1a57482200ba0d12b4d881e4b97eeec79b92 Mon Sep 17 00:00:00 2001 From: Cesar Gonzalez Date: Wed, 5 Jun 2024 13:04:37 -0500 Subject: [PATCH] [PM-5189] Implementing jest tests for the OverlayBackground --- .../background/overlay.background.spec.ts | 77 ++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index ab01b6e721..834b3322af 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -40,7 +40,7 @@ import { createPortSpyMock, createFocusedFieldDataMock, } from "../spec/autofill-mocks"; -import { flushPromises, sendMockExtensionMessage } from "../spec/testing-utils"; +import { flushPromises, sendMockExtensionMessage, sendPortMessage } from "../spec/testing-utils"; import { FocusedFieldData, @@ -76,10 +76,13 @@ describe("OverlayBackground", () => { let subFrameOffsetsSpy: SubFrameOffsetsForTab; let getFrameDetailsSpy: jest.SpyInstance; let tabsSendMessageSpy: jest.SpyInstance; + let tabSendMessageDataSpy: jest.SpyInstance; let sendMessageSpy: jest.SpyInstance; let getTabFromCurrentWindowIdSpy: jest.SpyInstance; let buttonPortSpy: chrome.runtime.Port; + let buttonMessageConnectorSpy: chrome.runtime.Port; let listPortSpy: chrome.runtime.Port; + let listMessageConnectorSpy: chrome.runtime.Port; let getFrameCounter: number = 2; async function initOverlayElementPorts(options = { initList: true, initButton: true }) { @@ -87,11 +90,17 @@ describe("OverlayBackground", () => { if (initButton) { await overlayBackground["handlePortOnConnect"](createPortSpyMock(AutofillOverlayPort.Button)); buttonPortSpy = overlayBackground["inlineMenuButtonPort"]; + + buttonMessageConnectorSpy = createPortSpyMock(AutofillOverlayPort.ButtonMessageConnector); + await overlayBackground["handlePortOnConnect"](buttonMessageConnectorSpy); } if (initList) { await overlayBackground["handlePortOnConnect"](createPortSpyMock(AutofillOverlayPort.List)); listPortSpy = overlayBackground["inlineMenuListPort"]; + + listMessageConnectorSpy = createPortSpyMock(AutofillOverlayPort.ListMessageConnector); + await overlayBackground["handlePortOnConnect"](listMessageConnectorSpy); } return { buttonPortSpy, listPortSpy }; @@ -149,6 +158,7 @@ describe("OverlayBackground", () => { }); }); tabsSendMessageSpy = jest.spyOn(BrowserApi, "tabSendMessage"); + tabSendMessageDataSpy = jest.spyOn(BrowserApi, "tabSendMessageData"); sendMessageSpy = jest.spyOn(BrowserApi, "sendMessage"); getTabFromCurrentWindowIdSpy = jest.spyOn(BrowserApi, "getTabFromCurrentWindowId"); @@ -1253,7 +1263,70 @@ describe("OverlayBackground", () => { }); }); - describe("inline menu button message handlers", () => {}); + describe("inline menu button message handlers", () => { + let sender: chrome.runtime.MessageSender; + const portKey = "inlineMenuButtonPort"; + let openUnlockPopoutSpy: jest.SpyInstance; + + beforeEach(async () => { + sender = mock({ tab: { id: 1 } }); + portKeyForTabSpy[sender.tab.id] = portKey; + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); + await initOverlayElementPorts(); + buttonMessageConnectorSpy.sender = sender; + openUnlockPopoutSpy = jest + .spyOn(overlayBackground as any, "openUnlockPopout") + .mockImplementation(); + }); + + describe("autofillInlineMenuButtonClicked message handler", () => { + it("opens the unlock vault popout if the user auth status is not unlocked", async () => { + activeAccountStatusMock$.next(AuthenticationStatus.Locked); + tabsSendMessageSpy.mockImplementation(); + + sendPortMessage(buttonMessageConnectorSpy, { + command: "autofillInlineMenuButtonClicked", + portKey, + }); + await flushPromises(); + + expect(tabsSendMessageSpy).toHaveBeenCalledWith( + sender.tab, + { command: "closeInlineMenu", overlayElement: undefined }, + { frameId: 0 }, + ); + expect(tabSendMessageDataSpy).toBeCalledWith( + sender.tab, + "addToLockedVaultPendingNotifications", + { + commandToRetry: { message: { command: "openAutofillInlineMenu" }, sender }, + target: "overlay.background", + }, + ); + expect(openUnlockPopoutSpy).toHaveBeenCalled(); + }); + + it("opens the inline menu if the user auth status is unlocked", async () => { + getTabFromCurrentWindowIdSpy.mockResolvedValueOnce(sender.tab); + sendPortMessage(buttonMessageConnectorSpy, { + command: "autofillInlineMenuButtonClicked", + portKey, + }); + await flushPromises(); + + expect(tabsSendMessageSpy).toHaveBeenCalledWith( + sender.tab, + { + command: "openAutofillInlineMenu", + isFocusingFieldElement: false, + isOpeningFullAutofillInlineMenu: true, + authStatus: AuthenticationStatus.Unlocked, + }, + { frameId: 0 }, + ); + }); + }); + }); describe("inline menu list message handlers", () => {}); });