// @ts-nocheck
import { nextTick, ref } from 'vue'
import { mount } from '@vue/test-utils'
import { describe, expect, it, test } from 'vitest'
import { ElFormItem } from '@element-plus/components/form'
import Radio from '../src/radio.vue'
import RadioGroup from '../src/radio-group.vue'
import RadioButton from '../src/radio-button.vue'
describe('Radio', () => {
test('create', async () => {
const radio = ref('')
const wrapper = mount(() => )
expect(wrapper.classes()).toContain('el-radio')
await wrapper.trigger('click')
expect(wrapper.classes()).toContain('is-checked')
})
test('disabled', async () => {
const radio = ref('')
const wrapper = mount(() => (
))
await wrapper.trigger('click')
expect(radio.value).toBe('')
expect(wrapper.classes()).toContain('is-disabled')
})
test('border', () => {
const radio = ref('')
const wrapper = mount(() => (
))
expect(wrapper.classes()).toContain('is-bordered')
})
test('change event', async () => {
const radio = ref('')
const changeData = ref('')
function handleChange(val: string) {
changeData.value = val
}
const wrapper = mount(() => (
))
await wrapper.trigger('click')
await nextTick()
expect(changeData.value).toEqual('3')
})
test('change event only triggers on user input', async () => {
const radio = ref('')
const changeData = ref('')
function handleChange(val: string) {
changeData.value = val
}
mount(() => (
))
radio.value = '3'
await nextTick()
expect(changeData.value).toEqual('')
expect(radio.value).toEqual('3')
})
})
describe('Radio group', () => {
it('create', async () => {
const radio = ref(3)
const wrapper = mount(() => (
3
6
9
))
await nextTick()
const [radio1, radio2] = wrapper.findAll('.el-radio')
expect(radio1.classes()).toContain('is-checked')
await radio2.trigger('click')
expect(radio2.classes()).toContain('is-checked')
expect(radio.value).toEqual(6)
})
it('id auto derive', async () => {
const radioValue1 = ref(3)
const wrapper1 = mount(() => (
3
6
9
))
const radioValue2 = ref(3)
const wrapper2 = mount(() => (
3
6
9
))
const id1 = wrapper1.find('.el-radio').find('input').attributes('name')
const id2 = wrapper2.find('.el-radio').find('input').attributes('name')
expect(id1).not.toEqual(id2)
})
it('disabled', async () => {
const radio = ref(3)
const wrapper = mount(() => (
3
6
9
))
expect(wrapper.find('label.is-disabled').exists()).toBe(true)
const [radio1, radio2] = wrapper.findAll('.el-radio')
expect(radio1.classes()).toContain('is-checked')
await radio2.trigger('click')
expect(radio.value).toEqual(3)
expect(radio1.classes()).toContain('is-checked')
})
it('change event', async () => {
const radio = ref(3)
const data = ref(0)
function onChange(val: number) {
data.value = val
}
const wrapper = mount(() => (
3
6
9
))
const radio2 = wrapper.findAll('.el-radio').at(1)
await radio2?.trigger('click')
await nextTick()
expect(data.value).toEqual(6)
})
it('change event only triggers on user input', async () => {
const radio = ref(3)
const data = ref(0)
function onChange(val: number) {
data.value = val
}
mount(() => (
3
6
9
))
radio.value = 6
await nextTick()
expect(data.value).toEqual(0)
})
it('disabled when children is radio button', async () => {
const radio = ref(3)
const wrapper = mount(() => (
3
6
9
))
const [radio1, radio2] = wrapper.findAll('.el-radio-button')
expect(radio1.classes()).toContain('is-active')
expect(wrapper.findAll('.is-disabled').length).toBe(3)
await radio2.trigger('click')
expect(radio.value).toEqual(3)
expect(radio1.classes()).toContain('is-active')
})
})
describe('Radio Button', () => {
it('create', async () => {
const radio = ref(3)
const wrapper = mount(() => (
3
6
9
))
const [radio1, radio2] = wrapper.findAll('.el-radio-button')
expect(radio1.classes()).toContain('is-active')
await radio2.trigger('click')
expect(radio2.classes()).toContain('is-active')
expect(radio.value).toEqual(6)
})
it('custom color', () => {
const radio = ref(3)
const wrapper = mount(() => (
3
6
9
))
const radio1 = wrapper.find('.el-radio-button')
expect(radio1.find('span').attributes('style')).toContain(
'background-color: rgb(0, 0, 0); border-color: #000; box-shadow: -1px 0 0 0 #000; color: rgb(255, 255, 0);'
)
})
it('change event', async () => {
const radio = ref(3)
const data = ref(0)
function onChange(val: number) {
data.value = val
}
const wrapper = mount(() => (
3
6
9
))
const radio2 = wrapper.findAll('.el-radio-button').at(1)
await radio2?.trigger('click')
expect(radio.value).toEqual(6)
})
it('change event only triggers on user input', async () => {
const radio = ref(3)
const data = ref(0)
function onChange(val: number) {
data.value = val
}
mount(() => (
3
6
9
))
radio.value = 6
await nextTick()
expect(data.value).toEqual(0)
})
it('size', () => {
const radio = ref(3)
const wrapper = mount(() => (
3
6
9
))
expect(wrapper.findAll('.el-radio-button--large').length).toBe(3)
})
describe('form item accessibility integration', () => {
test('single radio group in form item', async () => {
const wrapper = mount(() => (
))
await nextTick()
const formItem = await wrapper.findComponent(ElFormItem)
const radioGroup = await wrapper.findComponent(RadioGroup)
const formItemLabel = formItem.find('.el-form-item__label')
expect(formItem.attributes().role).toBeFalsy()
expect(radioGroup.attributes().role).toBe('radiogroup')
expect(formItemLabel.attributes().for).toBe(radioGroup.attributes().id)
expect(formItemLabel.attributes().id).toBe(
radioGroup.attributes()['aria-labelledby']
)
})
test('single radio group in form item, override label', async () => {
const wrapper = mount(() => (
))
await nextTick()
const formItem = await wrapper.findComponent(ElFormItem)
const radioGroup = await wrapper.findComponent(RadioGroup)
const formItemLabel = formItem.find('.el-form-item__label')
expect(formItemLabel.attributes().for).toBe(radioGroup.attributes().id)
expect(radioGroup.attributes().role).toBe('radiogroup')
expect(radioGroup.attributes()['aria-label']).toBe('Foo')
expect(radioGroup.attributes()['aria-labelledby']).toBeFalsy()
})
test('multiple radio groups in form item', async () => {
const wrapper = mount(() => (
))
await nextTick()
const formItem = await wrapper.findComponent(ElFormItem)
const [radioGroup1, radioGroup2] = await wrapper.findAllComponents(
RadioGroup
)
const formItemLabel = formItem.find('.el-form-item__label')
expect(formItem.attributes().role).toBe('group')
expect(formItem.attributes()['aria-labelledby']).toBe(
formItemLabel.attributes().id
)
expect(radioGroup1.attributes().role).toBe('radiogroup')
expect(radioGroup1.attributes()['aria-label']).toBe('Foo')
expect(radioGroup1.attributes()['aria-labelledby']).toBeFalsy()
expect(radioGroup2.attributes().role).toBe('radiogroup')
expect(radioGroup2.attributes()['aria-label']).toBe('Bar')
expect(radioGroup2.attributes()['aria-labelledby']).toBeFalsy()
})
})
})