Skip to content

Commit 8162115

Browse files
astorijegnapse
andauthored
fix: add custom element support to toBeDisabled (#368)
* fix: add custom element support to `toBeDisabled` * Custom elements cannot be self-closing Co-authored-by: Ernesto García <gnapse@gmail.com>
1 parent 3094eb1 commit 8162115

File tree

3 files changed

+54
-2
lines changed

3 files changed

+54
-2
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ toBeDisabled()
160160
This allows you to check whether an element is disabled from the user's
161161
perspective. According to the specification, the following elements can be
162162
[disabled](https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements):
163-
`button`, `input`, `select`, `textarea`, `optgroup`, `option`, `fieldset`.
163+
`button`, `input`, `select`, `textarea`, `optgroup`, `option`, `fieldset`, and
164+
custom elements.
164165

165166
This custom matcher considers an element as disabled if the element is among the
166167
types of elements that can be disabled (listed above), and the `disabled`

src/__tests__/to-be-disabled.js

+42
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1+
import document from './helpers/document'
12
import {render} from './helpers/test-utils'
23

4+
const window = document.defaultView
5+
6+
window.customElements.define(
7+
'custom-element',
8+
class extends window.HTMLElement {},
9+
)
10+
311
test('.toBeDisabled', () => {
412
const {queryByTestId} = render(`
513
<div>
@@ -109,6 +117,23 @@ test('.toBeDisabled fieldset>legend', () => {
109117
expect(queryByTestId('outer-fieldset-element')).toBeDisabled()
110118
})
111119

120+
test('.toBeDisabled custom element', () => {
121+
const {queryByTestId} = render(`
122+
<custom-element data-testid="disabled-custom-element" disabled=""></custom-element>
123+
<custom-element data-testid="enabled-custom-element"></custom-element>
124+
`)
125+
126+
expect(queryByTestId('disabled-custom-element')).toBeDisabled()
127+
expect(() => {
128+
expect(queryByTestId('disabled-custom-element')).not.toBeDisabled()
129+
}).toThrowError('element is disabled')
130+
131+
expect(queryByTestId('enabled-custom-element')).not.toBeDisabled()
132+
expect(() => {
133+
expect(queryByTestId('enabled-custom-element')).toBeDisabled()
134+
}).toThrowError('element is not disabled')
135+
})
136+
112137
test('.toBeEnabled', () => {
113138
const {queryByTestId} = render(`
114139
<div>
@@ -241,3 +266,20 @@ test('.toBeEnabled fieldset>legend', () => {
241266
expect(queryByTestId('outer-fieldset-element')).toBeEnabled()
242267
}).toThrowError()
243268
})
269+
270+
test('.toBeEnabled custom element', () => {
271+
const {queryByTestId} = render(`
272+
<custom-element data-testid="disabled-custom-element" disabled=""></custom-element>
273+
<custom-element data-testid="enabled-custom-element"></custom-element>
274+
`)
275+
276+
expect(queryByTestId('disabled-custom-element')).not.toBeEnabled()
277+
expect(() => {
278+
expect(queryByTestId('disabled-custom-element')).toBeEnabled()
279+
}).toThrowError('element is not enabled')
280+
281+
expect(queryByTestId('enabled-custom-element')).toBeEnabled()
282+
expect(() => {
283+
expect(queryByTestId('enabled-custom-element')).not.toBeEnabled()
284+
}).toThrowError('element is enabled')
285+
})

src/to-be-disabled.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,17 @@ function isElementDisabledByParent(element, parent) {
3636
)
3737
}
3838

39+
function isCustomElement(tag) {
40+
return tag.includes('-')
41+
}
42+
43+
/*
44+
* Only certain form elements and custom elements can actually be disabled:
45+
* https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements
46+
*/
3947
function canElementBeDisabled(element) {
40-
return FORM_TAGS.includes(getTag(element))
48+
const tag = getTag(element)
49+
return FORM_TAGS.includes(tag) || isCustomElement(tag)
4150
}
4251

4352
function isElementDisabled(element) {

0 commit comments

Comments
 (0)