From 5a89af4469a0496c49b30f591140ccecc4a9a2b3 Mon Sep 17 00:00:00 2001 From: Marcin Date: Sat, 21 Dec 2024 23:38:01 +0100 Subject: [PATCH] feat: add toBePressed matcher (#203) --- README.md | 39 +++++++++++++++ src/__tests__/to-be-pressed.js | 87 ++++++++++++++++++++++++++++++++++ src/matchers.js | 1 + src/to-be-pressed.js | 56 ++++++++++++++++++++++ types/matchers.d.ts | 30 ++++++++++++ 5 files changed, 213 insertions(+) create mode 100644 src/__tests__/to-be-pressed.js create mode 100644 src/to-be-pressed.js diff --git a/README.md b/README.md index 7a3e06f..c7df104 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ clear to read and to maintain. - [`toHaveRole`](#tohaverole) - [`toHaveErrorMessage`](#tohaveerrormessage) - [`toHaveSelection`](#tohaveselection) + - [`toBePressed`](#tobepressed) - [Deprecated matchers](#deprecated-matchers) - [`toBeEmpty`](#tobeempty) - [`toBeInTheDOM`](#tobeinthedom) @@ -1306,6 +1307,44 @@ expect(timeInput).toHaveErrorMessage(expect.stringContaining('Invalid time')) // expect(timeInput).not.toHaveErrorMessage('Pikachu!') ``` +
+ +### `toBePressed` + +This allows to check whether given element has been [pressed](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-pressed). + +It accepts elements with explicit or implicit `button` role and valid `aria-pressed` attribute of `"true"` or `"false"`. + +```typescript +toBePressed() +``` + +#### Examples + +```html + + + + + + +Pressed span +Released span +``` + +##### Using DOM Testing Library + +```javascript +screen.getByRole('button', { name: 'Pressed' }).toBePressed(); +screen.getByRole('button', { name: 'Released' }).not.toBePressed(); + +screen.getByRole('button', { name: 'Pressed input button' }).toBePressed(); +screen.getByRole('button', { name: 'Released input button' }).not.toBePressed(); + +screen.getByRole('button', { name: 'Pressed span' }).toBePressed(); +screen.getByRole('button', { name: 'Released span' }).not.toBePressed(); +``` + ## Deprecated matchers ### `toBeEmpty` diff --git a/src/__tests__/to-be-pressed.js b/src/__tests__/to-be-pressed.js new file mode 100644 index 0000000..3969fd8 --- /dev/null +++ b/src/__tests__/to-be-pressed.js @@ -0,0 +1,87 @@ +import {render} from './helpers/test-utils' + +describe('.toBePressed', () => { + test('handles button element', () => { + const {queryByTestId} = render(` + + * + * + * + * + * + * Pressed span + * Released span + * + * screen.getByRole('button', { name: 'Pressed' }).toBePressed(); + * screen.getByRole('button', { name: 'Released' }).not.toBePressed(); + * + * screen.getByRole('button', { name: 'Pressed input button' }).toBePressed(); + * screen.getByRole('button', { name: 'Released input button' }).not.toBePressed(); + * + * screen.getByRole('button', { name: 'Pressed span' }).toBePressed(); + * screen.getByRole('button', { name: 'Released span' }).not.toBePressed(); + * + * @see + * [testing-library/jest-dom#tobepressed](https://github.com/testing-library/jest-dom#tobepressed) + */ + toBePressed(): R } }