Skip to content

Commit d9a3733

Browse files
crisbetommalerba
authored andcommitted
test(sidenav): refactor flaky tests in Edge (#16625)
Refactors some tests to (hopefully) be less flaky in Edge. In two of them I've replaced calls to `getComputedStyle` to a check against a class in the DOM. On other one I've changed the assertions for IE and Edge to something that is less accurate, but also less likely to flake. (cherry picked from commit 8e321ae)
1 parent 8e6ff7e commit d9a3733

File tree

1 file changed

+28
-20
lines changed

1 file changed

+28
-20
lines changed

src/material/sidenav/drawer.spec.ts

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import {
66
TestBed,
77
discardPeriodicTasks,
88
flush,
9+
inject,
910
} from '@angular/core/testing';
1011
import {Component, ElementRef, ViewChild} from '@angular/core';
1112
import {By} from '@angular/platform-browser';
1213
import {BrowserAnimationsModule, NoopAnimationsModule} from '@angular/platform-browser/animations';
1314
import {MatDrawer, MatSidenavModule, MatDrawerContainer} from './index';
1415
import {Direction} from '@angular/cdk/bidi';
1516
import {A11yModule} from '@angular/cdk/a11y';
16-
import {PlatformModule} from '@angular/cdk/platform';
17+
import {PlatformModule, Platform} from '@angular/cdk/platform';
1718
import {ESCAPE} from '@angular/cdk/keycodes';
1819
import {dispatchKeyboardEvent, createKeyboardEvent, dispatchEvent} from '@angular/cdk/testing';
1920
import {CdkScrollable} from '@angular/cdk/scrolling';
@@ -41,40 +42,34 @@ describe('MatDrawer', () => {
4142
describe('methods', () => {
4243
it('should be able to open', fakeAsync(() => {
4344
const fixture = TestBed.createComponent(BasicTestApp);
44-
4545
fixture.detectChanges();
4646

4747
const testComponent: BasicTestApp = fixture.debugElement.componentInstance;
48-
const drawer = fixture.debugElement.query(By.directive(MatDrawer));
49-
const drawerBackdropElement = fixture.debugElement.query(By.css('.mat-drawer-backdrop'));
48+
const container = fixture.debugElement.query(By.css('mat-drawer-container')).nativeElement;
5049

51-
drawerBackdropElement.nativeElement.style.transition = 'none';
5250
fixture.debugElement.query(By.css('.open')).nativeElement.click();
5351
fixture.detectChanges();
5452

5553
expect(testComponent.openCount).toBe(0);
5654
expect(testComponent.openStartCount).toBe(0);
55+
expect(container.classList).not.toContain('mat-drawer-opened');
5756

5857
tick();
5958
expect(testComponent.openStartCount).toBe(1);
6059
fixture.detectChanges();
6160

6261
expect(testComponent.openCount).toBe(1);
6362
expect(testComponent.openStartCount).toBe(1);
64-
expect(getComputedStyle(drawer.nativeElement).visibility).toBe('visible');
65-
expect(getComputedStyle(drawerBackdropElement.nativeElement).visibility).toBe('visible');
63+
expect(container.classList).toContain('mat-drawer-opened');
6664
}));
6765

6866
it('should be able to close', fakeAsync(() => {
6967
const fixture = TestBed.createComponent(BasicTestApp);
70-
7168
fixture.detectChanges();
7269

7370
const testComponent: BasicTestApp = fixture.debugElement.componentInstance;
74-
const drawer = fixture.debugElement.query(By.directive(MatDrawer));
75-
const drawerBackdropElement = fixture.debugElement.query(By.css('.mat-drawer-backdrop'));
71+
const container = fixture.debugElement.query(By.css('mat-drawer-container')).nativeElement;
7672

77-
drawerBackdropElement.nativeElement.style.transition = 'none';
7873
fixture.debugElement.query(By.css('.open')).nativeElement.click();
7974
fixture.detectChanges();
8075
flush();
@@ -85,15 +80,15 @@ describe('MatDrawer', () => {
8580

8681
expect(testComponent.closeCount).toBe(0);
8782
expect(testComponent.closeStartCount).toBe(0);
83+
expect(container.classList).toContain('mat-drawer-opened');
8884

8985
flush();
9086
expect(testComponent.closeStartCount).toBe(1);
9187
fixture.detectChanges();
9288

9389
expect(testComponent.closeCount).toBe(1);
9490
expect(testComponent.closeStartCount).toBe(1);
95-
expect(getComputedStyle(drawer.nativeElement).visibility).toBe('hidden');
96-
expect(getComputedStyle(drawerBackdropElement.nativeElement).visibility).toBe('hidden');
91+
expect(container.classList).not.toContain('mat-drawer-opened');
9792
}));
9893

9994
it('should resolve the open method promise with the new state of the drawer', fakeAsync(() => {
@@ -642,7 +637,7 @@ describe('MatDrawerContainer', () => {
642637
expect(parseInt(contentElement.style.marginRight)).toBe(margin);
643638
}));
644639

645-
it('should not animate when the sidenav is open on load ', fakeAsync(() => {
640+
it('should not animate when the sidenav is open on load', fakeAsync(() => {
646641
TestBed
647642
.resetTestingModule()
648643
.configureTestingModule({
@@ -662,7 +657,7 @@ describe('MatDrawerContainer', () => {
662657
}));
663658

664659
it('should recalculate the margin if a drawer changes size while open in autosize mode',
665-
fakeAsync(() => {
660+
fakeAsync(inject([Platform], (platform: Platform) => {
666661
const fixture = TestBed.createComponent(AutosizeDrawer);
667662

668663
fixture.detectChanges();
@@ -671,19 +666,31 @@ describe('MatDrawerContainer', () => {
671666
tick();
672667
fixture.detectChanges();
673668

669+
// IE and Edge are flaky in when they update the styles.
670+
// For them we fall back to checking whether the proper method was called.
671+
const isFlaky = platform.EDGE || platform.TRIDENT;
674672
const contentEl = fixture.debugElement.nativeElement.querySelector('.mat-drawer-content');
675673
const initialMargin = parseInt(contentEl.style.marginLeft);
676674

677-
expect(initialMargin).toBeGreaterThan(0);
675+
if (isFlaky) {
676+
spyOn(fixture.componentInstance.drawerContainer, 'updateContentMargins');
677+
} else {
678+
expect(initialMargin).toBeGreaterThan(0);
679+
}
678680

679681
fixture.componentInstance.fillerWidth = 200;
680682
fixture.detectChanges();
681683
tick(10);
682684
fixture.detectChanges();
683685

684-
expect(parseInt(contentEl.style.marginLeft)).toBeGreaterThan(initialMargin);
686+
if (isFlaky) {
687+
expect(fixture.componentInstance.drawerContainer.updateContentMargins).toHaveBeenCalled();
688+
} else {
689+
expect(parseInt(contentEl.style.marginLeft)).toBeGreaterThan(initialMargin);
690+
}
691+
685692
discardPeriodicTasks();
686-
}));
693+
})));
687694

688695
it('should not set a style property if it would be zero', fakeAsync(() => {
689696
const fixture = TestBed.createComponent(AutosizeDrawer);
@@ -945,15 +952,16 @@ class DrawerContainerStateChangesTestApp {
945952

946953
@Component({
947954
template: `
948-
<mat-drawer-container autosize>
955+
<mat-drawer-container autosize style="min-height: 200px;">
949956
<mat-drawer mode="push" [position]="drawer1Position">
950957
Text
951-
<div [style.width.px]="fillerWidth"></div>
958+
<div [style.width.px]="fillerWidth" style="height: 200px; background: red;"></div>
952959
</mat-drawer>
953960
</mat-drawer-container>`,
954961
})
955962
class AutosizeDrawer {
956963
@ViewChild(MatDrawer, {static: false}) drawer: MatDrawer;
964+
@ViewChild(MatDrawerContainer, {static: false}) drawerContainer: MatDrawerContainer;
957965
fillerWidth = 0;
958966
}
959967

0 commit comments

Comments
 (0)