import { TemplatePortal } from "@angular/cdk/portal"; import { Component, OnInit, TemplateRef, ViewChild, ViewContainerRef } from "@angular/core"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { By } from "@angular/platform-browser"; import { VaultCarouselContentComponent } from "./carousel-content.component"; // FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ selector: "app-test-template-ref", imports: [VaultCarouselContentComponent], template: `

Test Template Content

`, }) class TestTemplateRefComponent implements OnInit { // Test template content by creating a wrapping component and then pass a portal to the carousel content component. // FIXME(https://bitwarden.atlassian.net/browse/CL-903): Migrate to Signals // eslint-disable-next-line @angular-eslint/prefer-signals @ViewChild("template", { static: true }) template!: TemplateRef; portal!: TemplatePortal; constructor(private viewContainerRef: ViewContainerRef) {} ngOnInit() { this.portal = new TemplatePortal(this.template, this.viewContainerRef); } } describe("VaultCarouselContentComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ imports: [VaultCarouselContentComponent], }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(TestTemplateRefComponent); fixture.detectChanges(); }); it("displays content", () => { const carouselContent = fixture.debugElement.query(By.directive(VaultCarouselContentComponent)); expect(carouselContent.nativeElement.textContent).toBe("Test Template Content"); }); it("sets aria attributes for screen readers", () => { const carouselContent = fixture.debugElement.query(By.directive(VaultCarouselContentComponent)); const wrappingDiv = carouselContent.nativeElement.querySelector("div"); expect(wrappingDiv.getAttribute("aria-live")).toBe("polite"); expect(wrappingDiv.getAttribute("aria-atomic")).toBe("false"); }); });