Skip to content

Commit 378f4cf

Browse files
committed
fix(material/menu): add filter for trigger icon name (#32188)
Adds the option to filter harnesses based on the icon in the menu trigger. Fixes #32181. (cherry picked from commit c9289b5)
1 parent d0a46ca commit 378f4cf

File tree

5 files changed

+51
-29
lines changed

5 files changed

+51
-29
lines changed

goldens/material/menu/testing/index.api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export class MatMenuItemHarness extends ContentContainerComponentHarness<string>
6262

6363
// @public
6464
export interface MenuHarnessFilters extends BaseHarnessFilters {
65+
triggerIconName?: string | RegExp;
6566
triggerText?: string | RegExp;
6667
}
6768

src/material/menu/testing/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ ts_project(
1111
deps = [
1212
"//src/cdk/coercion",
1313
"//src/cdk/testing",
14+
"//src/material/icon/testing",
1415
],
1516
)
1617

@@ -31,6 +32,7 @@ ng_project(
3132
"//src/cdk/testing",
3233
"//src/cdk/testing/private",
3334
"//src/cdk/testing/testbed",
35+
"//src/material/icon",
3436
"//src/material/menu",
3537
],
3638
)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ import {BaseHarnessFilters} from '@angular/cdk/testing';
1212
export interface MenuHarnessFilters extends BaseHarnessFilters {
1313
/** Only find instances whose trigger text matches the given value. */
1414
triggerText?: string | RegExp;
15+
16+
/** Only find instances where the trigger contains an icon whose name matches the given value. */
17+
triggerIconName?: string | RegExp;
1518
}
1619

1720
/** A set of criteria that can be used to filter a list of `MatMenuItemHarness` instances. */

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

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {Component} from '@angular/core';
22
import {ComponentFixture, TestBed} from '@angular/core/testing';
33
import {HarnessLoader} from '@angular/cdk/testing';
4+
import {MatIconModule} from '@angular/material/icon';
45
import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed';
56
import {MatMenuModule} from '../menu-module';
67
import {MatMenuHarness} from './menu-harness';
@@ -18,7 +19,7 @@ describe('MatMenuHarness', () => {
1819

1920
it('should load all menu harnesses', async () => {
2021
const menues = await loader.getAllHarnesses(MatMenuHarness);
21-
expect(menues.length).toBe(2);
22+
expect(menues.length).toBe(3);
2223
});
2324

2425
it('should load menu with exact text', async () => {
@@ -33,6 +34,12 @@ describe('MatMenuHarness', () => {
3334
expect(await menus[0].getTriggerText()).toBe('Settings');
3435
});
3536

37+
it('should load menu by icon name', async () => {
38+
const menus = await loader.getAllHarnesses(MatMenuHarness.with({triggerIconName: 'wrench'}));
39+
expect(menus.length).toBe(1);
40+
expect(await (await menus[0].host()).getAttribute('id')).toBe('with-icon');
41+
});
42+
3643
it('should get disabled state', async () => {
3744
const [enabledMenu, disabledMenu] = await loader.getAllHarnesses(MatMenuHarness);
3845
expect(await enabledMenu.isDisabled()).toBe(false);
@@ -146,39 +153,42 @@ describe('MatMenuHarness', () => {
146153

147154
@Component({
148155
template: `
149-
<button type="button" id="settings" [matMenuTriggerFor]="settingsMenu">Settings</button>
150-
<button type="button" disabled [matMenuTriggerFor]="settingsMenu">Disabled menu</button>
151-
152-
<mat-menu #settingsMenu>
153-
<menu mat-menu-item>Profile</menu>
154-
<menu mat-menu-item>Account</menu>
155-
</mat-menu>
156+
<button type="button" id="settings" [matMenuTriggerFor]="settingsMenu">Settings</button>
157+
<button type="button" disabled [matMenuTriggerFor]="settingsMenu">Disabled menu</button>
158+
<button type="button" id="with-icon" [matMenuTriggerFor]="settingsMenu">
159+
<mat-icon>wrench</mat-icon>
160+
</button>
161+
162+
<mat-menu #settingsMenu>
163+
<menu mat-menu-item>Profile</menu>
164+
<menu mat-menu-item>Account</menu>
165+
</mat-menu>
156166
`,
157-
imports: [MatMenuModule],
167+
imports: [MatMenuModule, MatIconModule],
158168
})
159169
class MenuHarnessTest {}
160170

161171
@Component({
162172
template: `
163-
<button [matMenuTriggerFor]="menu1">Menu 1</button>
173+
<button [matMenuTriggerFor]="menu1">Menu 1</button>
164174
165-
<mat-menu #menu1>
166-
<button mat-menu-item [matMenuTriggerFor]="menu2">Menu 2</button>
167-
<button mat-menu-item (click)="lastClickedLeaf = 1">Leaf Item 1</button>
168-
<button mat-menu-item [matMenuTriggerFor]="menu3">Menu 3</button>
169-
</mat-menu>
175+
<mat-menu #menu1>
176+
<button mat-menu-item [matMenuTriggerFor]="menu2">Menu 2</button>
177+
<button mat-menu-item (click)="lastClickedLeaf = 1">Leaf Item 1</button>
178+
<button mat-menu-item [matMenuTriggerFor]="menu3">Menu 3</button>
179+
</mat-menu>
170180
171-
<mat-menu #menu2>
172-
<button mat-menu-item (click)="lastClickedLeaf = 2">Leaf Item 2</button>
173-
</mat-menu>
181+
<mat-menu #menu2>
182+
<button mat-menu-item (click)="lastClickedLeaf = 2">Leaf Item 2</button>
183+
</mat-menu>
174184
175-
<mat-menu #menu3>
176-
<button mat-menu-item [matMenuTriggerFor]="menu4">Menu 4</button>
177-
</mat-menu>
185+
<mat-menu #menu3>
186+
<button mat-menu-item [matMenuTriggerFor]="menu4">Menu 4</button>
187+
</mat-menu>
178188
179-
<mat-menu #menu4>
180-
<button mat-menu-item (click)="lastClickedLeaf = 3">Leaf Item 3</button>
181-
</mat-menu>
189+
<mat-menu #menu4>
190+
<button mat-menu-item (click)="lastClickedLeaf = 3">Leaf Item 3</button>
191+
</mat-menu>
182192
`,
183193
imports: [MatMenuModule],
184194
})

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
TestElement,
1515
} from '@angular/cdk/testing';
1616
import {coerceBooleanProperty} from '@angular/cdk/coercion';
17+
import {MatIconHarness} from '@angular/material/icon/testing';
1718
import {MenuHarnessFilters, MenuItemHarnessFilters} from './menu-harness-filters';
1819

1920
/** Harness for interacting with a mat-menu in tests. */
@@ -32,11 +33,16 @@ export class MatMenuHarness extends ContentContainerComponentHarness<string> {
3233
this: ComponentHarnessConstructor<T>,
3334
options: MenuHarnessFilters = {},
3435
): HarnessPredicate<T> {
35-
return new HarnessPredicate(this, options).addOption(
36-
'triggerText',
37-
options.triggerText,
38-
(harness, text) => HarnessPredicate.stringMatches(harness.getTriggerText(), text),
39-
);
36+
return new HarnessPredicate(this, options)
37+
.addOption('triggerText', options.triggerText, (harness, text) =>
38+
HarnessPredicate.stringMatches(harness.getTriggerText(), text),
39+
)
40+
.addOption('triggerIconName', options.triggerIconName, async (harness, triggerIconName) => {
41+
const result = await harness.locatorForOptional(
42+
MatIconHarness.with({name: triggerIconName}),
43+
)();
44+
return result !== null;
45+
});
4046
}
4147

4248
/** Whether the menu is disabled. */

0 commit comments

Comments
 (0)