diff --git a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts index 39b9650538a..c719618b33a 100644 --- a/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts +++ b/apps/browser/src/vault/popup/components/at-risk-passwords/at-risk-passwords.component.spec.ts @@ -16,7 +16,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { ToastService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; import { ChangeLoginPasswordService, DefaultChangeLoginPasswordService, @@ -28,6 +28,7 @@ import { import { PopupHeaderComponent } from "../../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../../platform/popup/layout/popup-page.component"; +import { AtRiskCarouselDialogResult } from "../at-risk-carousel-dialog/at-risk-carousel-dialog.component"; import { AtRiskPasswordPageService } from "./at-risk-password-page.service"; import { AtRiskPasswordsComponent } from "./at-risk-passwords.component"; @@ -73,6 +74,7 @@ describe("AtRiskPasswordsComponent", () => { const mockToastService = mock(); const mockAtRiskPasswordPageService = mock(); const mockChangeLoginPasswordService = mock(); + const mockDialogService = mock(); beforeEach(async () => { mockTasks$ = new BehaviorSubject([ @@ -109,6 +111,7 @@ describe("AtRiskPasswordsComponent", () => { calloutDismissed$ = new BehaviorSubject(false); setInlineMenuVisibility.mockClear(); mockToastService.showToast.mockClear(); + mockDialogService.open.mockClear(); mockAtRiskPasswordPageService.isCalloutDismissed.mockReturnValue(calloutDismissed$); await TestBed.configureTestingModule({ @@ -162,6 +165,7 @@ describe("AtRiskPasswordsComponent", () => { providers: [ AtRiskPasswordPageService, { provide: ChangeLoginPasswordService, useClass: DefaultChangeLoginPasswordService }, + DialogService, ], }, add: { @@ -169,6 +173,7 @@ describe("AtRiskPasswordsComponent", () => { providers: [ { provide: AtRiskPasswordPageService, useValue: mockAtRiskPasswordPageService }, { provide: ChangeLoginPasswordService, useValue: mockChangeLoginPasswordService }, + { provide: DialogService, useValue: mockDialogService }, ], }, }) @@ -269,4 +274,31 @@ describe("AtRiskPasswordsComponent", () => { }); }); }); + + describe("getting started carousel", () => { + it("should open the carousel automatically if the user has not dismissed it", async () => { + mockAtRiskPasswordPageService.isGettingStartedDismissed.mockReturnValue(of(false)); + mockDialogService.open.mockReturnValue({ closed: of(undefined) } as any); + await component.ngOnInit(); + expect(mockDialogService.open).toHaveBeenCalled(); + }); + + it("should not open the carousel automatically if the user has already dismissed it", async () => { + mockDialogService.open.mockClear(); // Need to clear the mock since the component is already initialized once + mockAtRiskPasswordPageService.isGettingStartedDismissed.mockReturnValue(of(true)); + mockDialogService.open.mockReturnValue({ closed: of(undefined) } as any); + await component.ngOnInit(); + expect(mockDialogService.open).not.toHaveBeenCalled(); + }); + + it("should mark the carousel as dismissed when the user dismisses it", async () => { + mockAtRiskPasswordPageService.isGettingStartedDismissed.mockReturnValue(of(false)); + mockDialogService.open.mockReturnValue({ + closed: of(AtRiskCarouselDialogResult.Dismissed), + } as any); + await component.ngOnInit(); + expect(mockDialogService.open).toHaveBeenCalled(); + expect(mockAtRiskPasswordPageService.dismissGettingStarted).toHaveBeenCalled(); + }); + }); });