Skip to content

Commit 21cf573

Browse files
committed
refactor(cdk/testing): simplify harnesses extending ContentContainerComponentHarness with a different root element
We have some test harnesses that extend `ContentContainerComponentHarness`, but have to override all methods, because their content is in a different element. These changes clean up such usages by having a protected method for retrieving the harness root element that can be overwritten when necessary.
1 parent 4ef3d3f commit 21cf573

File tree

9 files changed

+30
-115
lines changed

9 files changed

+30
-115
lines changed

src/cdk/testing/component-harness.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -384,20 +384,28 @@ export abstract class ComponentHarness {
384384
export abstract class ContentContainerComponentHarness<S extends string = string>
385385
extends ComponentHarness implements HarnessLoader {
386386

387-
getChildLoader(selector: S): Promise<HarnessLoader> {
388-
return this.locatorFactory.harnessLoaderFor(selector);
387+
async getChildLoader(selector: S): Promise<HarnessLoader> {
388+
return (await this._getRootHarnessLoader()).getChildLoader(selector);
389389
}
390390

391-
getAllChildLoaders(selector: S): Promise<HarnessLoader[]> {
392-
return this.locatorFactory.harnessLoaderForAll(selector);
391+
async getAllChildLoaders(selector: S): Promise<HarnessLoader[]> {
392+
return (await this._getRootHarnessLoader()).getAllChildLoaders(selector);
393393
}
394394

395-
getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T> {
396-
return this.locatorFor(query)();
395+
async getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T> {
396+
return (await this._getRootHarnessLoader()).getHarness(query);
397397
}
398398

399-
getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]> {
400-
return this.locatorForAll(query)();
399+
async getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]> {
400+
return (await this._getRootHarnessLoader()).getAllHarnesses(query);
401+
}
402+
403+
/**
404+
* Gets the root harness loader from which to start
405+
* searching for content contained by this harness.
406+
*/
407+
protected async _getRootHarnessLoader(): Promise<HarnessLoader> {
408+
return this.locatorFactory.rootHarnessLoader();
401409
}
402410
}
403411

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

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
ContentContainerComponentHarness,
1212
HarnessLoader,
1313
HarnessPredicate,
14-
HarnessQuery,
1514
TestElement,
1615
TestKey,
1716
} from '@angular/cdk/testing';
@@ -127,24 +126,7 @@ export class MatMenuHarness extends ContentContainerComponentHarness<string> {
127126
return menu.clickItem(...subItemFilters as [Omit<MenuItemHarnessFilters, 'ancestor'>]);
128127
}
129128

130-
async getChildLoader(selector: string): Promise<HarnessLoader> {
131-
return (await this._getPanelLoader()).getChildLoader(selector);
132-
}
133-
134-
async getAllChildLoaders(selector: string): Promise<HarnessLoader[]> {
135-
return (await this._getPanelLoader()).getAllChildLoaders(selector);
136-
}
137-
138-
async getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T> {
139-
return (await this._getPanelLoader()).getHarness(query);
140-
}
141-
142-
async getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]> {
143-
return (await this._getPanelLoader()).getAllHarnesses(query);
144-
}
145-
146-
/** Gets the element id for the content of the current step. */
147-
private async _getPanelLoader(): Promise<HarnessLoader> {
129+
protected async _getRootHarnessLoader(): Promise<HarnessLoader> {
148130
const panelId = await this._getPanelId();
149131
return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);
150132
}

src/material-experimental/mdc-tabs/testing/tab-harness.ts

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
*/
88

99
import {
10-
ComponentHarness,
1110
ContentContainerComponentHarness,
1211
HarnessLoader,
1312
HarnessPredicate,
14-
HarnessQuery,
1513
} from '@angular/cdk/testing';
1614
import {TabHarnessFilters} from './tab-harness-filters';
1715

@@ -78,24 +76,12 @@ export class MatTabHarness extends ContentContainerComponentHarness<string> {
7876
* @breaking-change 12.0.0
7977
*/
8078
async getHarnessLoaderForContent(): Promise<HarnessLoader> {
81-
const contentId = await this._getContentId();
82-
return this.documentRootLocatorFactory().harnessLoaderFor(`#${contentId}`);
83-
}
84-
85-
async getChildLoader(selector: string): Promise<HarnessLoader> {
86-
return (await this.getHarnessLoaderForContent()).getChildLoader(selector);
87-
}
88-
89-
async getAllChildLoaders(selector: string): Promise<HarnessLoader[]> {
90-
return (await this.getHarnessLoaderForContent()).getAllChildLoaders(selector);
91-
}
92-
93-
async getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T> {
94-
return (await this.getHarnessLoaderForContent()).getHarness(query);
79+
return this._getRootHarnessLoader();
9580
}
9681

97-
async getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]> {
98-
return (await this.getHarnessLoaderForContent()).getAllHarnesses(query);
82+
protected async _getRootHarnessLoader(): Promise<HarnessLoader> {
83+
const contentId = await this._getContentId();
84+
return this.documentRootLocatorFactory().harnessLoaderFor(`#${contentId}`);
9985
}
10086

10187
/** Gets the element id for the content of the current tab. */

src/material/menu/testing/menu-harness.ts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
*/
88

99
import {
10-
ComponentHarness,
1110
ContentContainerComponentHarness,
1211
HarnessLoader,
1312
HarnessPredicate,
14-
HarnessQuery,
1513
TestElement,
1614
TestKey,
1715
} from '@angular/cdk/testing';
@@ -127,24 +125,7 @@ export class MatMenuHarness extends ContentContainerComponentHarness<string> {
127125
return menu.clickItem(...subItemFilters as [Omit<MenuItemHarnessFilters, 'ancestor'>]);
128126
}
129127

130-
async getChildLoader(selector: string): Promise<HarnessLoader> {
131-
return (await this._getPanelLoader()).getChildLoader(selector);
132-
}
133-
134-
async getAllChildLoaders(selector: string): Promise<HarnessLoader[]> {
135-
return (await this._getPanelLoader()).getAllChildLoaders(selector);
136-
}
137-
138-
async getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T> {
139-
return (await this._getPanelLoader()).getHarness(query);
140-
}
141-
142-
async getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]> {
143-
return (await this._getPanelLoader()).getAllHarnesses(query);
144-
}
145-
146-
/** Gets the element id for the content of the current step. */
147-
private async _getPanelLoader(): Promise<HarnessLoader> {
128+
protected async _getRootHarnessLoader(): Promise<HarnessLoader> {
148129
const panelId = await this._getPanelId();
149130
return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);
150131
}

src/material/stepper/testing/step-harness.ts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import {
1010
ContentContainerComponentHarness,
1111
HarnessPredicate,
1212
HarnessLoader,
13-
ComponentHarness,
14-
HarnessQuery,
1513
} from '@angular/cdk/testing';
1614
import {StepHarnessFilters} from './step-harness-filters';
1715

@@ -91,24 +89,7 @@ export class MatStepHarness extends ContentContainerComponentHarness<string> {
9189
await (await this.host()).click();
9290
}
9391

94-
async getChildLoader(selector: string): Promise<HarnessLoader> {
95-
return (await this._getContentLoader()).getChildLoader(selector);
96-
}
97-
98-
async getAllChildLoaders(selector: string): Promise<HarnessLoader[]> {
99-
return (await this._getContentLoader()).getAllChildLoaders(selector);
100-
}
101-
102-
async getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T> {
103-
return (await this._getContentLoader()).getHarness(query);
104-
}
105-
106-
async getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]> {
107-
return (await this._getContentLoader()).getAllHarnesses(query);
108-
}
109-
110-
/** Gets the harness loader for the content of the current step. */
111-
private async _getContentLoader(): Promise<HarnessLoader> {
92+
protected async _getRootHarnessLoader(): Promise<HarnessLoader> {
11293
const contentId = await (await this.host()).getAttribute('aria-controls');
11394
return this.documentRootLocatorFactory().harnessLoaderFor(`#${contentId}`);
11495
}

src/material/tabs/testing/tab-harness.ts

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77
*/
88

99
import {
10-
ComponentHarness,
1110
ContentContainerComponentHarness,
1211
HarnessLoader,
1312
HarnessPredicate,
14-
HarnessQuery,
1513
} from '@angular/cdk/testing';
1614
import {TabHarnessFilters} from './tab-harness-filters';
1715

@@ -78,24 +76,12 @@ export class MatTabHarness extends ContentContainerComponentHarness<string> {
7876
* @breaking-change 12.0.0
7977
*/
8078
async getHarnessLoaderForContent(): Promise<HarnessLoader> {
81-
const contentId = await this._getContentId();
82-
return this.documentRootLocatorFactory().harnessLoaderFor(`#${contentId}`);
83-
}
84-
85-
async getChildLoader(selector: string): Promise<HarnessLoader> {
86-
return (await this.getHarnessLoaderForContent()).getChildLoader(selector);
87-
}
88-
89-
async getAllChildLoaders(selector: string): Promise<HarnessLoader[]> {
90-
return (await this.getHarnessLoaderForContent()).getAllChildLoaders(selector);
91-
}
92-
93-
async getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T> {
94-
return (await this.getHarnessLoaderForContent()).getHarness(query);
79+
return this._getRootHarnessLoader();
9580
}
9681

97-
async getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]> {
98-
return (await this.getHarnessLoaderForContent()).getAllHarnesses(query);
82+
protected async _getRootHarnessLoader(): Promise<HarnessLoader> {
83+
const contentId = await this._getContentId();
84+
return this.documentRootLocatorFactory().harnessLoaderFor(`#${contentId}`);
9985
}
10086

10187
/** Gets the element id for the content of the current tab. */

tools/public_api_guard/material/menu/testing.d.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
export declare class MatMenuHarness extends ContentContainerComponentHarness<string> {
2+
protected _getRootHarnessLoader(): Promise<HarnessLoader>;
23
blur(): Promise<void>;
34
clickItem(itemFilter: Omit<MenuItemHarnessFilters, 'ancestor'>, ...subItemFilters: Omit<MenuItemHarnessFilters, 'ancestor'>[]): Promise<void>;
45
close(): Promise<void>;
56
focus(): Promise<void>;
6-
getAllChildLoaders(selector: string): Promise<HarnessLoader[]>;
7-
getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]>;
8-
getChildLoader(selector: string): Promise<HarnessLoader>;
9-
getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T>;
107
getItems(filters?: Omit<MenuItemHarnessFilters, 'ancestor'>): Promise<MatMenuItemHarness[]>;
118
getTriggerText(): Promise<string>;
129
isDisabled(): Promise<boolean>;

tools/public_api_guard/material/stepper/testing.d.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
export declare class MatStepHarness extends ContentContainerComponentHarness<string> {
2-
getAllChildLoaders(selector: string): Promise<HarnessLoader[]>;
3-
getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]>;
2+
protected _getRootHarnessLoader(): Promise<HarnessLoader>;
43
getAriaLabel(): Promise<string | null>;
54
getAriaLabelledby(): Promise<string | null>;
6-
getChildLoader(selector: string): Promise<HarnessLoader>;
7-
getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T>;
85
getLabel(): Promise<string>;
96
hasErrors(): Promise<boolean>;
107
isCompleted(): Promise<boolean>;

tools/public_api_guard/material/tabs/testing.d.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,9 @@ export declare class MatTabGroupHarness extends ComponentHarness {
77
}
88

99
export declare class MatTabHarness extends ContentContainerComponentHarness<string> {
10-
getAllChildLoaders(selector: string): Promise<HarnessLoader[]>;
11-
getAllHarnesses<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T[]>;
10+
protected _getRootHarnessLoader(): Promise<HarnessLoader>;
1211
getAriaLabel(): Promise<string | null>;
1312
getAriaLabelledby(): Promise<string | null>;
14-
getChildLoader(selector: string): Promise<HarnessLoader>;
15-
getHarness<T extends ComponentHarness>(query: HarnessQuery<T>): Promise<T>;
1613
getHarnessLoaderForContent(): Promise<HarnessLoader>;
1714
getLabel(): Promise<string>;
1815
getTextContent(): Promise<string>;

0 commit comments

Comments
 (0)