Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/material/button/testing/button-harness-filters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ export type ButtonVariant = 'basic' | 'icon' | 'fab' | 'mini-fab';
/** Possible button appearances. */
export type ButtonAppearance = 'text' | 'filled' | 'elevated' | 'outlined' | 'tonal';

/** Possible button types. */
export type ButtonType = 'button' | 'submit' | 'reset';

/** A set of criteria that can be used to filter a list of button harness instances. */
export interface ButtonHarnessFilters extends BaseHarnessFilters {
/** Only find instances whose text matches the given value. */
Expand All @@ -27,4 +30,7 @@ export interface ButtonHarnessFilters extends BaseHarnessFilters {

/** Only find instances which match the given disabled state. */
disabled?: boolean;

/** Only find instances with the specified type. */
buttonType?: ButtonType;
}
14 changes: 12 additions & 2 deletions src/material/button/testing/button-harness.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ describe('MatButtonHarness', () => {

it('should load all button harnesses', async () => {
const buttons = await loader.getAllHarnesses(MatButtonHarness);
expect(buttons.length).toBe(17);
expect(buttons.length).toBe(18);
});

it('should load button with exact text', async () => {
Expand All @@ -40,7 +40,7 @@ describe('MatButtonHarness', () => {
it('should filter by whether a button is disabled', async () => {
const enabledButtons = await loader.getAllHarnesses(MatButtonHarness.with({disabled: false}));
const disabledButtons = await loader.getAllHarnesses(MatButtonHarness.with({disabled: true}));
expect(enabledButtons.length).toBe(15);
expect(enabledButtons.length).toBe(16);
expect(disabledButtons.length).toBe(2);
});

Expand All @@ -59,6 +59,13 @@ describe('MatButtonHarness', () => {
expect(await disabledElevatedAnchor.isDisabled()).toBe(true);
});

it('should load button with type attribute', async () => {
const buttons = await loader.getAllHarnesses(MatButtonHarness.with({buttonType: 'submit'}));
expect(buttons.length).toBe(1);
expect(await buttons[0].getText()).toBe('Submit button');
expect(await buttons[0].getType()).toBe('submit');
});

it('should get button text', async () => {
const [firstButton, secondButton] = await loader.getAllHarnesses(MatButtonHarness);
expect(await firstButton.getText()).toBe('Basic button');
Expand Down Expand Up @@ -127,6 +134,7 @@ describe('MatButtonHarness', () => {
'basic',
'basic',
'basic',
'basic',
'icon',
'fab',
'mini-fab',
Expand All @@ -148,6 +156,7 @@ describe('MatButtonHarness', () => {
null,
null,
'text',
'text',
'filled',
'elevated',
'outlined',
Expand Down Expand Up @@ -199,6 +208,7 @@ describe('MatButtonHarness', () => {
</button>
<button id="fab" type="button" matFab>Fab button</button>
<button id="mini-fab" type="button" matMiniFab>Mini Fab button</button>
<button id="submit" type="submit" matButton>Submit button</button>

<a id="anchor-basic" matButton>Basic anchor</a>
<a id="anchor-flat" matButton="filled">Filled anchor</a>
Expand Down
24 changes: 22 additions & 2 deletions src/material/button/testing/button-harness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ import {
ContentContainerComponentHarness,
HarnessPredicate,
} from '@angular/cdk/testing';
import {ButtonAppearance, ButtonHarnessFilters, ButtonVariant} from './button-harness-filters';
import {
ButtonAppearance,
ButtonHarnessFilters,
ButtonType,
ButtonVariant,
} from './button-harness-filters';

/** Harness for interacting with a mat-button in tests. */
export class MatButtonHarness extends ContentContainerComponentHarness {
Expand Down Expand Up @@ -50,7 +55,10 @@ export class MatButtonHarness extends ContentContainerComponentHarness {
)
.addOption('disabled', options.disabled, async (harness, disabled) => {
return (await harness.isDisabled()) === disabled;
});
})
.addOption('buttonType', options.buttonType, (harness, buttonType) =>
HarnessPredicate.stringMatches(harness.getType(), buttonType),
);
}

/**
Expand Down Expand Up @@ -150,4 +158,16 @@ export class MatButtonHarness extends ContentContainerComponentHarness {

return null;
}

/**
* Gets the type of the button. Supported values are 'button', 'submit', and 'reset'.
*/
async getType(): Promise<ButtonType | null> {
const host = await this.host();
const buttonType = await host.getAttribute('type');
if (buttonType === 'button' || buttonType === 'submit' || buttonType === 'reset') {
return buttonType;
}
return null;
}
}
Loading