Skip to content

Commit 57c73b5

Browse files
authored
Merge pull request #535 from Turbo87/aria-checked
isChecked: Add support for `aria-checked="true/false"`
2 parents dc1619e + aec772a commit 57c73b5

File tree

5 files changed

+152
-4
lines changed

5 files changed

+152
-4
lines changed

lib/__tests__/is-checked.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,66 @@ describe('assert.dom(...).isChecked()', () => {
115115
});
116116
});
117117

118+
describe('aria-checked', () => {
119+
test('succeeds if element is checked', () => {
120+
document.body.innerHTML = '<button role="checkbox" aria-checked="true">';
121+
122+
assert.dom('button').isChecked();
123+
124+
expect(assert.results).toEqual([
125+
{
126+
actual: 'checked',
127+
expected: 'checked',
128+
message: 'Element button is checked',
129+
result: true,
130+
},
131+
]);
132+
});
133+
134+
test('fails if element is not checked', () => {
135+
document.body.innerHTML = '<button role="checkbox" aria-checked="false">';
136+
137+
assert.dom('button').isChecked();
138+
139+
expect(assert.results).toEqual([
140+
{
141+
actual: 'not checked',
142+
expected: 'checked',
143+
message: 'Element button is checked',
144+
result: false,
145+
},
146+
]);
147+
});
148+
149+
test('fails if element does not have `aria-checked` attribute', () => {
150+
document.body.innerHTML = '<button role="checkbox">';
151+
152+
assert.dom('button').isChecked();
153+
154+
expect(assert.results).toEqual([
155+
{
156+
actual: 'not checked',
157+
expected: 'checked',
158+
message: 'Element button is checked',
159+
result: false,
160+
},
161+
]);
162+
});
163+
164+
test('fails for missing element', () => {
165+
document.body.innerHTML = '';
166+
167+
assert.dom('button').isChecked();
168+
169+
expect(assert.results).toEqual([
170+
{
171+
message: 'Element button should exist',
172+
result: false,
173+
},
174+
]);
175+
});
176+
});
177+
118178
test('throws for unexpected parameter types', () => {
119179
expect(() => assert.dom(5).isChecked()).toThrow('Unexpected Parameter: 5');
120180
expect(() => assert.dom(true).isChecked()).toThrow('Unexpected Parameter: true');

lib/__tests__/is-not-checked.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,66 @@ describe('assert.dom(...).isNotChecked()', () => {
115115
});
116116
});
117117

118+
describe('aria-checked', () => {
119+
test('succeeds if element is not checked', () => {
120+
document.body.innerHTML = '<button role="checkbox" aria-checked="false">';
121+
122+
assert.dom('button').isNotChecked();
123+
124+
expect(assert.results).toEqual([
125+
{
126+
actual: 'not checked',
127+
expected: 'not checked',
128+
message: 'Element button is not checked',
129+
result: true,
130+
},
131+
]);
132+
});
133+
134+
test('fails if element is checked', () => {
135+
document.body.innerHTML = '<button role="checkbox" aria-checked="true">';
136+
137+
assert.dom('button').isNotChecked();
138+
139+
expect(assert.results).toEqual([
140+
{
141+
actual: 'checked',
142+
expected: 'not checked',
143+
message: 'Element button is not checked',
144+
result: false,
145+
},
146+
]);
147+
});
148+
149+
test('succeeds if element does not have `aria-checked` attribute', () => {
150+
document.body.innerHTML = '<button role="checkbox">';
151+
152+
assert.dom('button').isNotChecked();
153+
154+
expect(assert.results).toEqual([
155+
{
156+
actual: 'not checked',
157+
expected: 'not checked',
158+
message: 'Element button is not checked',
159+
result: true,
160+
},
161+
]);
162+
});
163+
164+
test('fails for missing element', () => {
165+
document.body.innerHTML = '';
166+
167+
assert.dom('button').isNotChecked();
168+
169+
expect(assert.results).toEqual([
170+
{
171+
message: 'Element button should exist',
172+
result: false,
173+
},
174+
]);
175+
});
176+
});
177+
118178
test('throws for unexpected parameter types', () => {
119179
expect(() => assert.dom(5).isNotChecked()).toThrow('Unexpected Parameter: 5');
120180
expect(() => assert.dom(true).isNotChecked()).toThrow('Unexpected Parameter: true');

lib/assertions.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ export default class DOMAssertions {
8080
* Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the
8181
* `selector` is currently checked.
8282
*
83+
* Note: This also supports `aria-checked="true/false"`.
84+
*
8385
* @param {string?} message
8486
*
8587
* @example
@@ -95,6 +97,8 @@ export default class DOMAssertions {
9597
* Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the
9698
* `selector` is currently unchecked.
9799
*
100+
* Note: This also supports `aria-checked="true/false"`.
101+
*
98102
* @param {string?} message
99103
*
100104
* @example

lib/assertions/is-checked.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,20 @@ export default function checked(message) {
44
let element = this.findTargetElement();
55
if (!element) return;
66

7-
let result = element.checked === true;
8-
let actual = element.checked === true ? 'checked' : 'not checked';
7+
let isChecked = element.checked === true;
8+
let isNotChecked = element.checked === false;
9+
10+
let result = isChecked;
11+
12+
let hasCheckedProp = isChecked || isNotChecked;
13+
if (!hasCheckedProp) {
14+
let ariaChecked = element.getAttribute('aria-checked');
15+
if (ariaChecked !== null) {
16+
result = ariaChecked === 'true';
17+
}
18+
}
19+
20+
let actual = result ? 'checked' : 'not checked';
921
let expected = 'checked';
1022

1123
if (!message) {

lib/assertions/is-not-checked.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,20 @@ export default function notChecked(message) {
44
let element = this.findTargetElement();
55
if (!element) return;
66

7-
let result = element.checked === false;
8-
let actual = element.checked === true ? 'checked' : 'not checked';
7+
let isChecked = element.checked === true;
8+
let isNotChecked = element.checked === false;
9+
10+
let result = !isChecked;
11+
12+
let hasCheckedProp = isChecked || isNotChecked;
13+
if (!hasCheckedProp) {
14+
let ariaChecked = element.getAttribute('aria-checked');
15+
if (ariaChecked !== null) {
16+
result = ariaChecked !== 'true';
17+
}
18+
}
19+
20+
let actual = result ? 'not checked' : 'checked';
921
let expected = 'not checked';
1022

1123
if (!message) {

0 commit comments

Comments
 (0)