- 
                Notifications
    You must be signed in to change notification settings 
- Fork 411
Description
- @testing-library/jest-domversion: 5.12.0
- @testing-library/reactversion: 11.2.7
- nodeversion: 14.16.1
- yarnversion: 1.22.5
Relevant code or config:
I used @cds/core (Clarity) which is a library of web components + @cds/react which is a bunch of React wrappers for said web components. Pretty much everything else is default config.
What you did:
This is the failing test:
  render(<CdsButton disabled>Foo</CdsButton>);
  expect(await screen.findByText("Foo")).toBeDisabled();CdsButton under the hood renders a cds-button web component. It uses an async test because Clarity fills a bunch of props asynchronously, including disabled, aria-disabled, role, etc.
What happened:
Text version
FAIL  ./index.test.tsx
  ✕ should make sure the button is disabled (43 ms)
  ● should make sure the button is disabled
    expect(element).toBeDisabled()
    Received element is not disabled:
      <cds-button _nfg="" action="solid" aria-disabled="true" disabled="" loading-state="default" role="button" size="md" status="primary" tabindex="-1" />
      5 | test("should make sure the button is disabled", async () => {
      6 |   render(<CdsButton disabled>Foo</CdsButton>);
    > 7 |   expect(await screen.findByText("Foo")).toBeDisabled();
        |                                          ^
      8 | });
      9 |
      at index.test.tsx:7:42
      at step (index.test.tsx:33:23)
      at Object.next (index.test.tsx:14:53)
      at fulfilled (index.test.tsx:5:58)
Reproduction:
A minimal reproduction repo can be found at https://github.com/astorije/repro-web-component-tobedisabled.
Steps to reproduce:
- Clone the repo
- Run yarn install
- Run yarn test
- The error above will be thrown
Problem description:
I scratched my head for a bit as I initially thought Clarity was doing something unwanted, but as soon as I opened the toBeDisabled source, I realized that it filters again a hardcoded list).
Since no web components would ever be found in this list, toBeDisabled would not support them.
Suggested solution:
The doc says:
According to the specification, the following elements can be actually disabled: button, input, select, textarea, optgroup, option, fieldset.
However, that WHATWG spec lists an extra bullet point that is missing from that list:
a form-associated custom element that is disabled
So the hardcoded list needs to support web components aka custom elements.
According to MDN:
A DOMString representing the name you are giving to the element. Note that custom element names require a dash to be used in them (kebab-case); they can't be single words.
So my suggested solution is to add elements whose tags contain a hyphen to the list of elements that can actually be disabled.
