diff --git a/goldens/material/button/testing/index.api.md b/goldens/material/button/testing/index.api.md index c6ea75d18022..c57ebcb1c0d9 100644 --- a/goldens/material/button/testing/index.api.md +++ b/goldens/material/button/testing/index.api.md @@ -17,6 +17,7 @@ export interface ButtonHarnessFilters extends BaseHarnessFilters { appearance?: ButtonAppearance; buttonType?: ButtonType; disabled?: boolean; + iconName?: string | RegExp; text?: string | RegExp; variant?: ButtonVariant; } diff --git a/src/material/button/testing/BUILD.bazel b/src/material/button/testing/BUILD.bazel index 2490bd856547..c71f12a1082e 100644 --- a/src/material/button/testing/BUILD.bazel +++ b/src/material/button/testing/BUILD.bazel @@ -11,6 +11,7 @@ ts_project( deps = [ "//:node_modules/@angular/core", "//src/cdk/testing", + "//src/material/icon/testing", ], ) diff --git a/src/material/button/testing/button-harness-filters.ts b/src/material/button/testing/button-harness-filters.ts index c88e9a122b12..eb490a364773 100644 --- a/src/material/button/testing/button-harness-filters.ts +++ b/src/material/button/testing/button-harness-filters.ts @@ -33,4 +33,7 @@ export interface ButtonHarnessFilters extends BaseHarnessFilters { /** Only find instances with the specified type. */ buttonType?: ButtonType; + + /** Only find instances that contain an icon whose name matches the given value. */ + iconName?: string | RegExp; } diff --git a/src/material/button/testing/button-harness.spec.ts b/src/material/button/testing/button-harness.spec.ts index cc0485eea71e..e63fd6bec0f8 100644 --- a/src/material/button/testing/button-harness.spec.ts +++ b/src/material/button/testing/button-harness.spec.ts @@ -115,6 +115,13 @@ describe('MatButtonHarness', () => { expect(await favIcon.getName()).toBe('favorite'); }); + it('should be able to filter buttons containing a named icon', async () => { + const favBtn = await loader.getHarness(MatButtonHarness.with({iconName: 'favorite'})); + + expect(await (await favBtn.host()).getAttribute('id')).toBe('favorite-icon'); + expect(await (await favBtn.getHarness(MatIconHarness)).getName()).toBe('favorite'); + }); + it('should be able to ge the type variant of the button', async () => { const buttons = await loader.getAllHarnesses(MatButtonHarness); const variants = await parallel(() => buttons.map(button => button.getVariant())); diff --git a/src/material/button/testing/button-harness.ts b/src/material/button/testing/button-harness.ts index 34caf427620d..49edebcb25ce 100644 --- a/src/material/button/testing/button-harness.ts +++ b/src/material/button/testing/button-harness.ts @@ -12,6 +12,7 @@ import { ContentContainerComponentHarness, HarnessPredicate, } from '@angular/cdk/testing'; +import {MatIconHarness} from '@angular/material/icon/testing'; import { ButtonAppearance, ButtonHarnessFilters, @@ -58,7 +59,10 @@ export class MatButtonHarness extends ContentContainerComponentHarness { }) .addOption('buttonType', options.buttonType, (harness, buttonType) => HarnessPredicate.stringMatches(harness.getType(), buttonType), - ); + ) + .addOption('iconName', options.iconName, (harness, iconName) => { + return harness.hasHarness(MatIconHarness.with({name: iconName})); + }); } /**