import {Component, ViewChild} from '@angular/core'; import {TestBed, fakeAsync, tick, waitForAsync} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatSidenav, MatSidenavContainer, MatSidenavModule} from './index'; describe('MatSidenav', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ MatSidenavModule, NoopAnimationsModule, SidenavWithFixedPosition, IndirectDescendantSidenav, NestedSidenavContainers, ], }); })); it('should be fixed position when in fixed mode', () => { const fixture = TestBed.createComponent(SidenavWithFixedPosition); fixture.detectChanges(); const sidenavEl = fixture.debugElement.query(By.directive(MatSidenav))!.nativeElement; expect(sidenavEl.classList).toContain('mat-sidenav-fixed'); fixture.componentInstance.fixed = false; fixture.changeDetectorRef.markForCheck(); fixture.detectChanges(); expect(sidenavEl.classList).not.toContain('mat-sidenav-fixed'); }); it('should set fixed bottom and top when in fixed mode', () => { const fixture = TestBed.createComponent(SidenavWithFixedPosition); fixture.detectChanges(); const sidenavEl = fixture.debugElement.query(By.directive(MatSidenav))!.nativeElement; expect(sidenavEl.style.top).toBe('20px'); expect(sidenavEl.style.bottom).toBe('30px'); fixture.componentInstance.fixed = false; fixture.changeDetectorRef.markForCheck(); fixture.detectChanges(); expect(sidenavEl.style.top).toBeFalsy(); expect(sidenavEl.style.bottom).toBeFalsy(); }); it('should pick up sidenavs that are not direct descendants', fakeAsync(() => { const fixture = TestBed.createComponent(IndirectDescendantSidenav); fixture.detectChanges(); expect(fixture.componentInstance.sidenav.opened).toBe(false); fixture.componentInstance.container.open(); fixture.detectChanges(); tick(); fixture.detectChanges(); expect(fixture.componentInstance.sidenav.opened).toBe(true); })); it('should not pick up sidenavs from nested containers', fakeAsync(() => { const fixture = TestBed.createComponent(NestedSidenavContainers); const instance = fixture.componentInstance; fixture.detectChanges(); expect(instance.outerSidenav.opened).toBe(false); expect(instance.innerSidenav.opened).toBe(false); instance.outerContainer.open(); fixture.detectChanges(); tick(); fixture.detectChanges(); expect(instance.outerSidenav.opened).toBe(true); expect(instance.innerSidenav.opened).toBe(false); instance.innerContainer.open(); fixture.detectChanges(); tick(); fixture.detectChanges(); expect(instance.outerSidenav.opened).toBe(true); expect(instance.innerSidenav.opened).toBe(true); })); }); @Component({ template: ` Drawer. Some content. `, standalone: true, imports: [MatSidenavModule], }) class SidenavWithFixedPosition { fixed = true; fixedTop = 20; fixedBottom = 30; } @Component({ // Note that we need the `@if` so that there's an embedded // view between the container and the sidenav. template: ` @if (true) { Sidenav. } Some content. `, standalone: true, imports: [MatSidenavModule], }) class IndirectDescendantSidenav { @ViewChild('container') container: MatSidenavContainer; @ViewChild('sidenav') sidenav: MatSidenav; } @Component({ template: ` Sidenav Sidenav `, standalone: true, imports: [MatSidenavModule], }) class NestedSidenavContainers { @ViewChild('outerContainer') outerContainer: MatSidenavContainer; @ViewChild('outerSidenav') outerSidenav: MatSidenav; @ViewChild('innerContainer') innerContainer: MatSidenavContainer; @ViewChild('innerSidenav') innerSidenav: MatSidenav; }