UNPKG

jenesius-vue-form

Version:

Heavy form system for Vue.js

135 lines (115 loc) 4.29 kB
import {defineComponent} from "vue"; import {InputField, Form} from "../../src/index"; import {DOMWrapper, mount} from "@vue/test-utils"; import EmptyApp from "./components/EmptyApp.vue"; const defaultOptions = [ { label: "Red", value: 'r' }, { label: "Green", value: 'g' }, { label: "Yellow", value: 'y' } ] const name = 'color'; function defineRadioComponent(options: any = defaultOptions) { return defineComponent({ data: () => ({ options }), template: `<div><input-field type = "radio" name = "${name}" :options = "options" required /></div>`, components: {InputField} }) } function defaultMount(component = defineRadioComponent()) { return mount(EmptyApp, { slots: { default: component }, attachTo: document.body }) } describe("Testing radio button", () => { test("Значение устанавливает, как в форме", async () => { const app = defaultMount(); const form = (app.vm as any).form as Form; const selectedItem = defaultOptions[0] form.setValues({ [name]: selectedItem.value }) await app.vm.$nextTick(); const activeItem = app.find('.element-input-radio_active'); expect(activeItem.exists()).toBe(true); expect(activeItem.text()).toBe(selectedItem.label); }) test("Labels отображаются как часть элемента", () => { const app = defaultMount(); const form = (app.vm as any).form as Form; expect(app.text()).toBe(defaultOptions.map(item => item.label).join('')); }) test("Значение меняется по клику", async () => { const app = defaultMount(); const form = (app.vm as any).form as Form; const radioItems = app.findAll('.element-input-radio'); expect(radioItems.length).toBe(defaultOptions.length) async function checkClickChange(items: DOMWrapper<Element>[], index: number) { await items[index].trigger('click'); expect(form.getValueByName(name)).toBe(defaultOptions[index].value) } await checkClickChange(radioItems, 1) await checkClickChange(radioItems, 2) await checkClickChange(radioItems, 0) }) test("Значение меняется по нажатию на стрелки. Вверх/Вниз/ Переход",async () => { const app = defaultMount(); const form = (app.vm as any).form as Form; function triggerKey(this: {items: DOMWrapper<HTMLElement>[]}, index: number, dir: 'up' | 'down') { return this.items[index].trigger('keydown.' + dir) ; } const obj = { items: app.findAll<HTMLElement>('.element-input-radio') } await triggerKey.call(obj, 0, 'down'); expect(form.getValueByName(name)).toBe('g') await triggerKey.call(obj, 1, 'down'); expect(form.getValueByName(name)).toBe('y') await triggerKey.call(obj, 2, 'down'); expect(form.getValueByName(name)).toBe('r') }) test("Элемент должен быть активным для Tab процессе", async () => { const app = defaultMount(); const form = (app.vm as any).form as Form; const firstItem = app.find<HTMLElement>('.element-input-radio'); expect(firstItem.element.tabIndex).toBe(0) }) test("Если значение имеется, то tabindex должен быть активный элемент", async () => { const app = defaultMount(); const form = (app.vm as any).form as Form; form.setValues({ color: defaultOptions[1].value }) await app.vm.$nextTick() const items = app.findAll<HTMLElement>('.element-input-radio'); expect(items[0].element.getAttribute('tabindex')).toBe('none') expect(items[1].element.getAttribute('tabindex')).toBe('0') expect(items[2].element.getAttribute('tabindex')).toBe('none') }) test("Элемент должен реагировать на disabled", async () => { const app = defaultMount(); const form = (app.vm as any).form as Form; form.disable() await app.vm.$nextTick() }) test("Элемент должен реагировать на errors", async () => { const app = defaultMount(); const form = (app.vm as any).form as Form; form.validate() await app.vm.$nextTick() expect(app.findAll('.element-input-radio_error').length).toBe(3) }) })