checkbox.test.tsx 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. import { nextTick, ref } from 'vue'
  2. import { mount } from '@vue/test-utils'
  3. import { describe, expect, test } from 'vitest'
  4. import { ElFormItem } from '@element-plus/components/form'
  5. import Checkbox from '../src/checkbox.vue'
  6. import CheckboxButton from '../src/checkbox-button.vue'
  7. import CheckboxGroup from '../src/checkbox-group.vue'
  8. import type { CheckboxValueType } from '../src/checkbox'
  9. describe('Checkbox', () => {
  10. test('create', async () => {
  11. const checked = ref(false)
  12. const wrapper = mount(() => <Checkbox v-model={checked.value} label="a" />)
  13. expect(wrapper.classes()).toContain('el-checkbox')
  14. expect(wrapper.classes()).not.toContain('is-disabled')
  15. await wrapper.trigger('click')
  16. expect(wrapper.classes()).toContain('is-checked')
  17. await wrapper.trigger('click')
  18. expect(wrapper.classes('is-checked')).toBe(false)
  19. })
  20. describe('no v-model', () => {
  21. test('checkbox without label', async () => {
  22. const checked = ref(false)
  23. const wrapper = mount(() => <Checkbox checked={checked.value} />)
  24. expect(wrapper.classes('is-checked')).toBe(false)
  25. })
  26. test('checkbox with label attribute', async () => {
  27. const checked = ref(false)
  28. const wrapper = mount(() => (
  29. <Checkbox checked={checked.value} label="a" />
  30. ))
  31. expect(wrapper.classes('is-checked')).toBe(false)
  32. })
  33. })
  34. describe('disabled', () => {
  35. test('checkbox without label', async () => {
  36. const checked = ref(false)
  37. const wrapper = mount(() => (
  38. <ElFormItem label="test">
  39. <Checkbox v-model={checked.value} disabled />
  40. </ElFormItem>
  41. ))
  42. const checkbox = wrapper.findComponent(Checkbox)
  43. expect(checkbox.classes()).toContain('is-disabled')
  44. expect(checked.value).toBe(false)
  45. await checkbox.trigger('click')
  46. await nextTick()
  47. expect(checkbox.classes()).toContain('is-disabled')
  48. expect(checked.value).toBe(false)
  49. })
  50. test('checkbox with label attribute', async () => {
  51. const checked = ref(false)
  52. const wrapper = mount(() => (
  53. <Checkbox v-model={checked.value} disabled label="a" />
  54. ))
  55. expect(wrapper.classes()).toContain('is-disabled')
  56. expect(checked.value).toBe(false)
  57. await wrapper.trigger('click')
  58. await nextTick()
  59. expect(wrapper.classes()).toContain('is-disabled')
  60. expect(checked.value).toBe(false)
  61. })
  62. })
  63. describe('change event', () => {
  64. test('checkbox without label', async () => {
  65. const checked = ref(false)
  66. const data = ref()
  67. const onChange = (val: CheckboxValueType) => (data.value = val)
  68. const wrapper = mount(() => (
  69. <ElFormItem label="test">
  70. <Checkbox v-model={checked.value} onChange={onChange} />
  71. </ElFormItem>
  72. ))
  73. await wrapper.findComponent(Checkbox).trigger('click')
  74. expect(data.value).toBe(true)
  75. })
  76. test('checkbox with label attribute', async () => {
  77. const checked = ref(false)
  78. const data = ref()
  79. const onChange = (val: CheckboxValueType) => (data.value = val)
  80. const wrapper = mount(() => (
  81. <Checkbox v-model={checked.value} onChange={onChange} label="Foobar" />
  82. ))
  83. await wrapper.trigger('click')
  84. expect(data.value).toBe(true)
  85. })
  86. test('checkbox with label as slot content', async () => {
  87. const checked = ref(false)
  88. const data = ref()
  89. const onChange = (val: CheckboxValueType) => (data.value = val)
  90. const wrapper = mount(() => (
  91. <Checkbox v-model={checked.value} onChange={onChange}>
  92. Foobar
  93. </Checkbox>
  94. ))
  95. await wrapper.trigger('click')
  96. expect(data.value).toBe(true)
  97. })
  98. test('checkbox is wrapped in label', async () => {
  99. const checked = ref(true)
  100. const data = ref()
  101. const onChange = (val: CheckboxValueType) => (data.value = val)
  102. const wrapper = mount(() => (
  103. <ElFormItem label="test">
  104. <label>
  105. <Checkbox v-model={checked.value} onChange={onChange} />
  106. </label>
  107. </ElFormItem>
  108. ))
  109. await wrapper.findComponent(Checkbox).trigger('click')
  110. expect(data.value).toBe(false)
  111. })
  112. })
  113. test('checkbox group', async () => {
  114. const checkList = ref([])
  115. const wrapper = mount({
  116. setup() {
  117. return () => (
  118. <CheckboxGroup v-model={checkList.value}>
  119. <Checkbox label="a" ref="a" />
  120. <Checkbox label="b" ref="b" />
  121. <Checkbox label="c" ref="c" />
  122. <Checkbox label="d" ref="d" />
  123. </CheckboxGroup>
  124. )
  125. },
  126. })
  127. expect(checkList.value.length).toBe(0)
  128. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  129. expect(checkList.value.length).toBe(1)
  130. expect(checkList.value).toContain('a')
  131. await wrapper.findComponent({ ref: 'b' }).trigger('click')
  132. expect(checkList.value.length).toBe(2)
  133. expect(checkList.value).toContain('a')
  134. expect(checkList.value).toContain('b')
  135. })
  136. test('checkbox group without modelValue', async () => {
  137. const checkList = ref([])
  138. const wrapper = mount({
  139. setup() {
  140. return () => (
  141. <CheckboxGroup v-model={checkList.value}>
  142. <Checkbox label="a" ref="a" />
  143. <Checkbox label="b" ref="b" />
  144. <Checkbox label="c" ref="c" />
  145. <Checkbox label="d" ref="d" />
  146. </CheckboxGroup>
  147. )
  148. },
  149. })
  150. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  151. expect(checkList.value.length).toBe(1)
  152. expect(checkList.value).toContain('a')
  153. })
  154. test('checkbox group change', async () => {
  155. const checkList = ref([])
  156. const data = ref<CheckboxValueType[]>([])
  157. const onChange = (val: CheckboxValueType[]) => (data.value = val)
  158. const wrapper = mount({
  159. setup() {
  160. return () => (
  161. <CheckboxGroup v-model={checkList.value} onChange={onChange}>
  162. <Checkbox label="a" ref="a" />
  163. <Checkbox label="b" ref="b" />
  164. </CheckboxGroup>
  165. )
  166. },
  167. })
  168. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  169. await nextTick()
  170. expect(data.value.length).toBe(1)
  171. expect(data.value).toEqual(['a'])
  172. })
  173. test('nested group', async () => {
  174. const checkList = ref([])
  175. const wrapper = mount({
  176. setup() {
  177. return () => (
  178. <CheckboxGroup v-model={checkList.value}>
  179. <Checkbox label="a" ref="a" />
  180. <Checkbox label="b" ref="b" />
  181. <Checkbox label="c" ref="c" />
  182. <Checkbox label="d" ref="d" />
  183. </CheckboxGroup>
  184. )
  185. },
  186. })
  187. expect(checkList.value.length).toBe(0)
  188. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  189. expect(checkList.value).toEqual(['a'])
  190. })
  191. describe('true false label', () => {
  192. test('without label', async () => {
  193. const checked = ref('a')
  194. const wrapper = mount(() => (
  195. <ElFormItem label="test">
  196. <Checkbox true-label="a" false-label={3} v-model={checked.value} />
  197. </ElFormItem>
  198. ))
  199. const checkbox = wrapper.findComponent(Checkbox)
  200. await checkbox.trigger('click')
  201. await nextTick()
  202. expect(checked.value).toBe(3)
  203. await checkbox.trigger('click')
  204. await nextTick()
  205. expect(checked.value).toBe('a')
  206. })
  207. test('with label attribute', async () => {
  208. const checked = ref('a')
  209. const wrapper = mount(() => (
  210. <Checkbox
  211. label="Foobar"
  212. true-label="a"
  213. false-label={3}
  214. v-model={checked.value}
  215. />
  216. ))
  217. await wrapper.trigger('click')
  218. await nextTick()
  219. expect(checked.value).toBe(3)
  220. await wrapper.trigger('click')
  221. await nextTick()
  222. expect(checked.value).toBe('a')
  223. })
  224. test('with label as slot content', async () => {
  225. const checked = ref('a')
  226. const wrapper = mount(() => (
  227. <Checkbox true-label="a" false-label={3} v-model={checked.value}>
  228. Foobar
  229. </Checkbox>
  230. ))
  231. await wrapper.trigger('click')
  232. await nextTick()
  233. expect(checked.value).toBe(3)
  234. await wrapper.trigger('click')
  235. await nextTick()
  236. expect(checked.value).toBe('a')
  237. })
  238. })
  239. test('check', () => {
  240. const checked = ref(false)
  241. const checklist = ref([])
  242. mount(() => (
  243. <div>
  244. <Checkbox v-model={checked.value} checked />
  245. <CheckboxGroup v-model={checklist.value}>
  246. <Checkbox checked label="a" />
  247. </CheckboxGroup>
  248. </div>
  249. ))
  250. expect(checked.value).toBe(true)
  251. expect(checklist.value).toEqual(['a'])
  252. })
  253. test('label', async () => {
  254. const checklist = ref([])
  255. const wrapper = mount(() => (
  256. <CheckboxGroup v-model={checklist.value}>
  257. <Checkbox label="">all</Checkbox>
  258. <Checkbox label="a">a</Checkbox>
  259. <Checkbox label="b">b</Checkbox>
  260. </CheckboxGroup>
  261. ))
  262. const checkbox = wrapper.find('.el-checkbox')
  263. await checkbox.trigger('click')
  264. expect(checklist.value[0]).toEqual('')
  265. })
  266. test('label is object', async () => {
  267. const checklist = ref([])
  268. const wrapper = mount(() => (
  269. <CheckboxGroup v-model={checklist.value}>
  270. <Checkbox label={{ a: 1 }}>all</Checkbox>
  271. <Checkbox label={{ a: 2 }}>a</Checkbox>
  272. <Checkbox label={{ b: 1 }}>b</Checkbox>
  273. </CheckboxGroup>
  274. ))
  275. const checkbox = wrapper.find('.el-checkbox')
  276. await checkbox.trigger('click')
  277. expect(checklist.value[0]).toEqual({ a: 1 })
  278. expect(checkbox.classes()).contains('is-checked')
  279. })
  280. test('label is object with initial values', async () => {
  281. const checklist = ref([{ a: 1 }])
  282. const wrapper = mount({
  283. setup() {
  284. return () => (
  285. <CheckboxGroup v-model={checklist.value}>
  286. <Checkbox label={{ a: 1 }} ref="a1">
  287. a1
  288. </Checkbox>
  289. <Checkbox label={{ a: 2 }} ref="a2">
  290. a2
  291. </Checkbox>
  292. <Checkbox label={{ b: 1 }} ref="b1">
  293. b1
  294. </Checkbox>
  295. </CheckboxGroup>
  296. )
  297. },
  298. })
  299. expect(checklist.value.length).toBe(1)
  300. const checkboxA1 = wrapper.findComponent({ ref: 'a1' })
  301. const checkboxA2 = wrapper.findComponent({ ref: 'a2' })
  302. await checkboxA2.trigger('click')
  303. expect(checklist.value).toEqual([{ a: 1 }, { a: 2 }])
  304. expect(checkboxA1.classes()).contains('is-checked')
  305. expect(checkboxA2.classes()).contains('is-checked')
  306. await checkboxA1.trigger('click')
  307. expect(checklist.value).toEqual([{ a: 2 }])
  308. expect(checkboxA1.classes()).not.contains('is-checked')
  309. })
  310. })
  311. describe('check-button', () => {
  312. test('create', async () => {
  313. const checked = ref(false)
  314. const wrapper = mount(() => (
  315. <CheckboxButton v-model={checked.value} label="a" />
  316. ))
  317. expect(wrapper.classes()).toContain('el-checkbox-button')
  318. await wrapper.trigger('click')
  319. expect(wrapper.classes()).toContain('is-checked')
  320. await wrapper.trigger('click')
  321. expect(wrapper.classes('is-checked')).toBe(false)
  322. })
  323. test('disabled', async () => {
  324. const checked = ref(false)
  325. const wrapper = mount(() => (
  326. <CheckboxButton v-model={checked.value} disabled label="a" />
  327. ))
  328. expect(wrapper.classes()).toContain('is-disabled')
  329. await wrapper.trigger('click')
  330. expect(wrapper.classes()).toContain('is-disabled')
  331. })
  332. test('change event', async () => {
  333. const checked = ref(false)
  334. const data = ref()
  335. const onChange = (val: CheckboxValueType) => (data.value = val)
  336. const wrapper = mount(() => (
  337. <CheckboxButton v-model={checked.value} onChange={onChange} />
  338. ))
  339. await wrapper.trigger('click')
  340. expect(data.value).toBe(true)
  341. })
  342. test('button group change', async () => {
  343. const checkList = ref([])
  344. const data = ref<CheckboxValueType[]>([])
  345. const onChange = (val: CheckboxValueType[]) => (data.value = val)
  346. const wrapper = mount({
  347. setup() {
  348. return () => (
  349. <CheckboxGroup v-model={checkList.value} onChange={onChange}>
  350. <CheckboxButton label="a" ref="a" />
  351. <CheckboxButton label="b" ref="b" />
  352. <CheckboxButton label="c" ref="c" />
  353. <CheckboxButton label="d" ref="d" />
  354. </CheckboxGroup>
  355. )
  356. },
  357. })
  358. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  359. expect(data.value).toEqual(['a'])
  360. await wrapper.findComponent({ ref: 'b' }).trigger('click')
  361. expect(data.value).toEqual(['a', 'b'])
  362. })
  363. test('button group props', () => {
  364. const checkList = ref(['a', 'b'])
  365. const wrapper = mount({
  366. setup() {
  367. return () => (
  368. <CheckboxGroup
  369. v-model={checkList.value}
  370. size="large"
  371. fill="#ff0000"
  372. text-color="#000"
  373. >
  374. <CheckboxButton label="a" ref="a" />
  375. <CheckboxButton label="b" ref="b" />
  376. <CheckboxButton label="c" ref="c" />
  377. <CheckboxButton label="d" ref="d" />
  378. </CheckboxGroup>
  379. )
  380. },
  381. })
  382. const checkbox = wrapper.findComponent({ ref: 'a' })
  383. expect(checkList.value.length).toBe(2)
  384. expect(checkbox.classes()).contains('is-checked')
  385. expect(
  386. checkbox.find('.el-checkbox-button__inner').attributes('style')
  387. ).contains('border-color: #ff0000;')
  388. })
  389. test('button group tag', () => {
  390. const checkList = ref(['a', 'b'])
  391. const wrapper = mount(() => (
  392. <CheckboxGroup v-model={checkList.value} tag="tr">
  393. <CheckboxButton label="a" ref="a" />
  394. <CheckboxButton label="b" ref="b" />
  395. <CheckboxButton label="c" ref="c" />
  396. <CheckboxButton label="d" ref="d" />
  397. </CheckboxGroup>
  398. ))
  399. expect(wrapper.find('tr').classes('el-checkbox-group')).toBeTruthy()
  400. })
  401. test('button group min and max', async () => {
  402. const checkList = ref(['a', 'b'])
  403. const wrapper = mount({
  404. setup() {
  405. return () => (
  406. <CheckboxGroup v-model={checkList.value} min={2} max={3}>
  407. <CheckboxButton label="a" ref="a" />
  408. <CheckboxButton label="b" ref="b" />
  409. <CheckboxButton label="c" ref="c" />
  410. <CheckboxButton label="d" ref="d" />
  411. <CheckboxButton label="e" ref="e" />
  412. </CheckboxGroup>
  413. )
  414. },
  415. })
  416. expect(checkList.value.length).toBe(2)
  417. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  418. expect(checkList.value.length).toBe(2)
  419. await wrapper.findComponent({ ref: 'c' }).trigger('click')
  420. expect(checkList.value.length).toBe(3)
  421. expect(checkList.value).toEqual(['a', 'b', 'c'])
  422. expect(wrapper.findComponent({ ref: 'd' }).vm.isDisabled).toBe(true)
  423. expect(wrapper.findComponent({ ref: 'e' }).vm.isDisabled).toBe(true)
  424. checkList.value = []
  425. await nextTick()
  426. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  427. await wrapper.findComponent({ ref: 'd' }).trigger('click')
  428. expect(checkList.value).toEqual(['a', 'd'])
  429. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  430. expect(checkList.value).toEqual(['a', 'd'])
  431. expect(wrapper.findComponent({ ref: 'a' }).vm.isDisabled).toBe(true)
  432. })
  433. test('nested group', async () => {
  434. const checkList = ref([])
  435. const wrapper = mount({
  436. setup() {
  437. return () => (
  438. <CheckboxGroup v-model={checkList.value}>
  439. <CheckboxButton label="a" ref="a" />
  440. <CheckboxButton label="b" ref="b" />
  441. <CheckboxButton label="c" ref="c" />
  442. <CheckboxButton label="d" ref="d" />
  443. </CheckboxGroup>
  444. )
  445. },
  446. })
  447. expect(checkList.value.length).toBe(0)
  448. await wrapper.findComponent({ ref: 'a' }).trigger('click')
  449. expect(checkList.value).toEqual(['a'])
  450. })
  451. describe('checked prop', () => {
  452. test('check', () => {
  453. const checked = ref(false)
  454. const checklist = ref([])
  455. mount(() => (
  456. <div>
  457. <Checkbox v-model={checked.value} checked />
  458. <CheckboxGroup v-model={checklist.value}>
  459. <CheckboxButton checked label="a" />
  460. </CheckboxGroup>
  461. </div>
  462. ))
  463. expect(checked.value).toBe(true)
  464. expect(checklist.value).toEqual(['a'])
  465. })
  466. test('checked', () => {
  467. const wrapper = mount(() => <Checkbox checked />)
  468. expect(wrapper.find('.el-checkbox').classes()).contains('is-checked')
  469. })
  470. })
  471. describe('form item accessibility integration', () => {
  472. test('checkbox, no label, automatic label attachment', async () => {
  473. const wrapper = mount(() => (
  474. <ElFormItem label="test">
  475. <Checkbox />
  476. </ElFormItem>
  477. ))
  478. const formItem = await wrapper.findComponent(ElFormItem)
  479. const checkbox = await wrapper.findComponent(Checkbox)
  480. const formItemLabel = formItem.find('.el-form-item__label')
  481. const checkboxInput = checkbox.find('.el-checkbox__original')
  482. expect(checkboxInput.attributes('id')).toBe(
  483. formItemLabel.attributes('for')
  484. )
  485. })
  486. test('checkbox with label, form item is group', async () => {
  487. const wrapper = mount(() => (
  488. <ElFormItem label="test">
  489. <Checkbox label="Foo" />
  490. </ElFormItem>
  491. ))
  492. const formItem = await wrapper.findComponent(ElFormItem)
  493. const checkbox = await wrapper.findComponent(Checkbox)
  494. const checkboxLabel = checkbox.find('.el-checkbox__label')
  495. const checkboxInput = checkbox.find('.el-checkbox__original')
  496. expect(checkboxLabel.element.textContent).toBe('Foo')
  497. expect(checkboxInput.attributes('id')).toBeFalsy()
  498. expect(formItem.attributes('role')).toBe('group')
  499. })
  500. test('single checkbox group in form item', async () => {
  501. const wrapper = mount(() => (
  502. <ElFormItem label="test">
  503. <CheckboxGroup>
  504. <Checkbox label="Foo" />
  505. <Checkbox label="Bar" />
  506. </CheckboxGroup>
  507. </ElFormItem>
  508. ))
  509. const formItem = await wrapper.findComponent(ElFormItem)
  510. const checkboxGroup = await wrapper.findComponent(CheckboxGroup)
  511. const formItemLabel = formItem.find('.el-form-item__label')
  512. expect(formItem.attributes('role')).toBeFalsy()
  513. expect(checkboxGroup.attributes('role')).toBe('group')
  514. expect(formItemLabel.attributes('for')).toBe(
  515. checkboxGroup.attributes('id')
  516. )
  517. expect(formItemLabel.attributes('id')).toBe(
  518. checkboxGroup.attributes('aria-labelledby')
  519. )
  520. })
  521. test('single checkbox group in form item, override label', async () => {
  522. const wrapper = mount(() => (
  523. <ElFormItem label="test">
  524. <CheckboxGroup label="Foo">
  525. <Checkbox label="Foo" />
  526. <Checkbox label="Bar" />
  527. </CheckboxGroup>
  528. </ElFormItem>
  529. ))
  530. const formItem = await wrapper.findComponent(ElFormItem)
  531. const checkboxGroup = await wrapper.findComponent(CheckboxGroup)
  532. const formItemLabel = formItem.find('.el-form-item__label')
  533. expect(formItemLabel.attributes('for')).toBe(
  534. checkboxGroup.attributes('id')
  535. )
  536. expect(checkboxGroup.attributes('role')).toBe('group')
  537. expect(checkboxGroup.attributes()['aria-label']).toBe('Foo')
  538. expect(checkboxGroup.attributes()['aria-labelledby']).toBeFalsy()
  539. })
  540. test('multiple checkbox groups in form item', async () => {
  541. const wrapper = mount({
  542. setup() {
  543. return () => (
  544. <ElFormItem label="test">
  545. <CheckboxGroup label="Foo" ref="checkboxGroup1">
  546. <Checkbox label="Foo" />
  547. <Checkbox label="Bar" />
  548. </CheckboxGroup>
  549. <CheckboxGroup label="Bar" ref="checkboxGroup2">
  550. <Checkbox label="Foo" />
  551. <Checkbox label="Bar" />
  552. </CheckboxGroup>
  553. </ElFormItem>
  554. )
  555. },
  556. })
  557. const formItem = await wrapper.findComponent(ElFormItem)
  558. const checkboxGroup1 = await wrapper.findComponent({
  559. ref: 'checkboxGroup1',
  560. })
  561. const checkboxGroup2 = await wrapper.findComponent({
  562. ref: 'checkboxGroup2',
  563. })
  564. const formItemLabel = formItem.find('.el-form-item__label')
  565. expect(formItem.attributes('role')).toBe('group')
  566. expect(formItem.attributes()['aria-labelledby']).toBe(
  567. formItemLabel.attributes('id')
  568. )
  569. expect(checkboxGroup1.attributes('role')).toBe('group')
  570. expect(checkboxGroup1.attributes()['aria-label']).toBe('Foo')
  571. expect(checkboxGroup1.attributes()['aria-labelledby']).toBeFalsy()
  572. expect(checkboxGroup2.attributes('role')).toBe('group')
  573. expect(checkboxGroup2.attributes()['aria-label']).toBe('Bar')
  574. expect(checkboxGroup2.attributes()['aria-labelledby']).toBeFalsy()
  575. })
  576. })
  577. })