Skip to content

Commit 4a5e952

Browse files
crisbetojelbourn
authored andcommitted
test(material-experimental): harness tests leaking overlay containers (#17007)
Fixes the `cdk-overlay-container` nodes not being cleaned up between test harness tests.
1 parent a6bff55 commit 4a5e952

File tree

7 files changed

+45
-4
lines changed

7 files changed

+45
-4
lines changed

src/material-experimental/mdc-autocomplete/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ ng_test_library(
6767
":mdc-autocomplete",
6868
"//src/cdk-experimental/testing",
6969
"//src/cdk-experimental/testing/testbed",
70+
"//src/cdk/overlay",
7071
"//src/cdk/platform",
7172
"//src/cdk/testing",
7273
"//src/material/autocomplete",

src/material-experimental/mdc-autocomplete/harness/autocomplete-harness.spec.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import {HarnessLoader} from '@angular/cdk-experimental/testing';
22
import {TestbedHarnessEnvironment} from '@angular/cdk-experimental/testing/testbed';
33
import {Component} from '@angular/core';
4-
import {ComponentFixture, TestBed} from '@angular/core/testing';
4+
import {ComponentFixture, TestBed, inject} from '@angular/core/testing';
55
import {MatAutocompleteModule} from '@angular/material/autocomplete';
6+
import {OverlayContainer} from '@angular/cdk/overlay';
67
import {MatAutocompleteModule as MatMdcAutocompleteModule} from '../index';
78
import {MatAutocompleteHarness} from './autocomplete-harness';
89
import {MatAutocompleteHarness as MatMdcAutocompleteHarness} from './mdc-autocomplete-harness';
910

1011
let fixture: ComponentFixture<AutocompleteHarnessTest>;
1112
let loader: HarnessLoader;
1213
let harness: typeof MatAutocompleteHarness;
14+
let overlayContainer: OverlayContainer;
1315

1416
describe('MatAutocompleteHarness', () => {
1517
describe('non-MDC-based', () => {
@@ -23,6 +25,9 @@ describe('MatAutocompleteHarness', () => {
2325
fixture.detectChanges();
2426
loader = TestbedHarnessEnvironment.loader(fixture);
2527
harness = MatAutocompleteHarness;
28+
inject([OverlayContainer], (oc: OverlayContainer) => {
29+
overlayContainer = oc;
30+
})();
2631
});
2732

2833
runTests();
@@ -50,6 +55,11 @@ describe('MatAutocompleteHarness', () => {
5055

5156
/** Shared tests to run on both the original and MDC-based autocomplete. */
5257
function runTests() {
58+
afterEach(() => {
59+
// Angular won't call this for us so we need to do it ourselves to avoid leaks.
60+
overlayContainer.ngOnDestroy();
61+
});
62+
5363
it('should load all autocomplete harnesses', async () => {
5464
const inputs = await loader.getAllHarnesses(harness);
5565
expect(inputs.length).toBe(5);

src/material-experimental/mdc-dialog/harness/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ ng_test_library(
2121
":harness",
2222
"//src/cdk-experimental/testing",
2323
"//src/cdk-experimental/testing/testbed",
24+
"//src/cdk/overlay",
2425
"//src/material/dialog",
2526
"@npm//@angular/platform-browser",
2627
],

src/material-experimental/mdc-dialog/harness/dialog-harness.spec.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import {HarnessLoader} from '@angular/cdk-experimental/testing';
22
import {TestbedHarnessEnvironment} from '@angular/cdk-experimental/testing/testbed';
33
import {Component, TemplateRef, ViewChild} from '@angular/core';
4-
import {ComponentFixture, TestBed} from '@angular/core/testing';
4+
import {ComponentFixture, TestBed, inject} from '@angular/core/testing';
55
import {MatDialog, MatDialogConfig, MatDialogModule} from '@angular/material/dialog';
66
import {NoopAnimationsModule} from '@angular/platform-browser/animations';
7+
import {OverlayContainer} from '@angular/cdk/overlay';
78
import {MatDialogHarness} from './dialog-harness';
89

910
let fixture: ComponentFixture<DialogHarnessTest>;
1011
let loader: HarnessLoader;
1112
let dialogHarness: typeof MatDialogHarness;
13+
let overlayContainer: OverlayContainer;
1214

1315
describe('MatDialogHarness', () => {
1416
describe('non-MDC-based', () => {
@@ -24,6 +26,9 @@ describe('MatDialogHarness', () => {
2426
fixture.detectChanges();
2527
loader = new TestbedHarnessEnvironment(document.body, fixture);
2628
dialogHarness = MatDialogHarness;
29+
inject([OverlayContainer], (oc: OverlayContainer) => {
30+
overlayContainer = oc;
31+
})();
2732
});
2833

2934
runTests();
@@ -44,6 +49,9 @@ function runTests() {
4449
// dialogs are left in the DOM.
4550
fixture.componentInstance.dialog.closeAll();
4651
fixture.detectChanges();
52+
53+
// Angular won't call this for us so we need to do it ourselves to avoid leaks.
54+
overlayContainer.ngOnDestroy();
4755
});
4856

4957
it('should load harness for dialog', async () => {

src/material-experimental/mdc-menu/harness/menu-harness.spec.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import {HarnessLoader} from '@angular/cdk-experimental/testing';
22
import {TestbedHarnessEnvironment} from '@angular/cdk-experimental/testing/testbed';
33
import {Component} from '@angular/core';
4-
import {ComponentFixture, TestBed} from '@angular/core/testing';
4+
import {ComponentFixture, TestBed, inject} from '@angular/core/testing';
55
import {MatMenuModule} from '@angular/material/menu';
6+
import {OverlayContainer} from '@angular/cdk/overlay';
67
import {MatMenuModule as MatMdcMenuModule} from '../index';
78
import {MatMenuHarness as MatMdcMenuHarness} from './mdc-menu-harness';
89
import {MatMenuHarness} from './menu-harness';
910

1011
let fixture: ComponentFixture<MenuHarnessTest>;
1112
let loader: HarnessLoader;
1213
let menuHarness: typeof MatMenuHarness;
14+
let overlayContainer: OverlayContainer;
1315

1416
describe('MatMenuHarness', () => {
1517
describe('non-MDC-based', () => {
@@ -23,6 +25,9 @@ describe('MatMenuHarness', () => {
2325
fixture.detectChanges();
2426
loader = TestbedHarnessEnvironment.loader(fixture);
2527
menuHarness = MatMenuHarness;
28+
inject([OverlayContainer], (oc: OverlayContainer) => {
29+
overlayContainer = oc;
30+
})();
2631
});
2732

2833
runTests();
@@ -49,6 +54,11 @@ describe('MatMenuHarness', () => {
4954

5055
/** Shared tests to run on both the original and MDC-based menues. */
5156
function runTests() {
57+
afterEach(() => {
58+
// Angular won't call this for us so we need to do it ourselves to avoid leaks.
59+
overlayContainer.ngOnDestroy();
60+
});
61+
5262
it('should load all menu harnesses', async () => {
5363
const menues = await loader.getAllHarnesses(menuHarness);
5464
expect(menues.length).toBe(2);

src/material-experimental/mdc-select/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ ng_test_library(
6666
":mdc-select",
6767
"//src/cdk-experimental/testing",
6868
"//src/cdk-experimental/testing/testbed",
69+
"//src/cdk/overlay",
6970
"//src/cdk/platform",
7071
"//src/cdk/testing",
7172
"//src/material/form-field",

src/material-experimental/mdc-select/harness/select-harness.spec.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import {HarnessLoader} from '@angular/cdk-experimental/testing';
22
import {TestbedHarnessEnvironment} from '@angular/cdk-experimental/testing/testbed';
33
import {Component} from '@angular/core';
4-
import {ComponentFixture, TestBed} from '@angular/core/testing';
4+
import {ComponentFixture, TestBed, inject} from '@angular/core/testing';
55
import {NoopAnimationsModule} from '@angular/platform-browser/animations';
66
import {ReactiveFormsModule, FormControl, Validators} from '@angular/forms';
7+
import {OverlayContainer} from '@angular/cdk/overlay';
78
import {MatFormFieldModule} from '@angular/material/form-field';
89
import {MatSelectModule} from '@angular/material/select';
910
import {MatSelectModule as MatMdcSelectModule} from '../index';
@@ -13,6 +14,7 @@ import {MatSelectHarness as MatMdcSelectHarness} from './mdc-select-harness';
1314
let fixture: ComponentFixture<SelectHarnessTest>;
1415
let loader: HarnessLoader;
1516
let harness: typeof MatSelectHarness;
17+
let overlayContainer: OverlayContainer;
1618

1719
describe('MatSelectHarness', () => {
1820
describe('non-MDC-based', () => {
@@ -31,6 +33,9 @@ describe('MatSelectHarness', () => {
3133
fixture.detectChanges();
3234
loader = TestbedHarnessEnvironment.loader(fixture);
3335
harness = MatSelectHarness;
36+
inject([OverlayContainer], (oc: OverlayContainer) => {
37+
overlayContainer = oc;
38+
})();
3439
});
3540

3641
runTests();
@@ -63,6 +68,11 @@ describe('MatSelectHarness', () => {
6368

6469
/** Shared tests to run on both the original and MDC-based select. */
6570
function runTests() {
71+
afterEach(() => {
72+
// Angular won't call this for us so we need to do it ourselves to avoid leaks.
73+
overlayContainer.ngOnDestroy();
74+
});
75+
6676
it('should load all select harnesses', async () => {
6777
const selects = await loader.getAllHarnesses(harness);
6878
expect(selects.length).toBe(4);

0 commit comments

Comments
 (0)