From 2662e5d2d87b8456430315b38e13c0845c789316 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 | 43 +++++++++++++++- src/__tests__/to-be-pressed.js | 89 ++++++++++++++++++++++++++++++++++ src/matchers.js | 1 + src/to-be-pressed.js | 50 +++++++++++++++++++ types/matchers.d.ts | 30 ++++++++++++ 5 files changed, 212 insertions(+), 1 deletion(-) 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..92174d8 100644 --- a/README.md +++ b/README.md @@ -81,11 +81,12 @@ clear to read and to maintain. - [`toBePartiallyChecked`](#tobepartiallychecked) - [`toHaveRole`](#tohaverole) - [`toHaveErrorMessage`](#tohaveerrormessage) - - [`toHaveSelection`](#tohaveselection) + - [`toBePressed`](#tobepressed) - [Deprecated matchers](#deprecated-matchers) - [`toBeEmpty`](#tobeempty) - [`toBeInTheDOM`](#tobeinthedom) - [`toHaveDescription`](#tohavedescription) + - [`toHaveSelection`](#tohaveselection) - [Inspiration](#inspiration) - [Other Solutions](#other-solutions) - [Guiding Principles](#guiding-principles) @@ -1306,6 +1307,46 @@ expect(timeInput).toHaveErrorMessage(expect.stringContaining('Invalid time')) // expect(timeInput).not.toHaveErrorMessage('Pikachu!') ``` +
+ +### `toBePressed` + +This allows to check whether given element is +[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..fc9649e --- /dev/null +++ b/src/__tests__/to-be-pressed.js @@ -0,0 +1,89 @@ +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 } }