Skip to content

Commit 5d277aa

Browse files
committed
test: add test for single-radio
1 parent ee270b6 commit 5d277aa

File tree

7 files changed

+127
-4
lines changed

7 files changed

+127
-4
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<template>
2+
<div>
3+
<form-field name = "checkbox" type = "single-radio" />
4+
<form-field name = "checkbox" type = "single-radio" label = "With label" />
5+
<form-field name = "checkbox" type = "single-radio" label = "Disabled" disabled />
6+
<form-field name = "checkbox" type = "single-radio" label = "With Error" :errors = "['Some mistake']" />
7+
8+
</div>
9+
</template>
10+
11+
<script setup>
12+
import {Form, FormField} from "../../src";
13+
14+
const form = new Form();
15+
</script>
16+
17+
<style scoped>
18+
19+
</style>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { createApp } from 'vue'
2+
import App from './App.vue';
3+
createApp(App).mount('#app')

src/config/store.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ const STORE: IStore = {
4848
}
4949
}
5050

51-
type defineInputTypes = 'text' | 'select' | 'radio' | 'checkbox' | 'switch' | 'password' | 'tel' | 'number' | 'range' | 'textarea';
51+
type defineInputTypes = 'single-checkbox' | 'single-radio' | 'text' | 'select' | 'radio' | 'checkbox' | 'switch' | 'password' | 'tel' | 'number' | 'range' | 'textarea';
5252
export interface IStore {
5353
inputTypes: {
5454
[name: defineInputTypes | string]: any

src/widgets/inputs/input-single-radio/widget-input-single-radio.vue

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
<template>
22
<field-wrap :errors = "errors">
3-
<element-input-radio :model-value="!!modelValue" :disabled="disabled" :label="label" :error="!!errors.length" @input = "onInput"/>
3+
<element-input-radio
4+
:model-value="!!modelValue"
5+
:disabled="disabled"
6+
:label="label"
7+
:error="!!errors.length"
8+
:tabindex = "!disabled ? 0 : 'none'"
9+
10+
@input = "handleInput"
11+
@keyup.enter="handleInput"
12+
@keydown.space.prevent
13+
@keyup.space.prevent="handleInput"
14+
/>
415
</field-wrap>
516
</template>
617

@@ -19,7 +30,7 @@
1930
(e: 'update:modelValue', v: any): void
2031
}>()
2132
22-
function onInput() {
33+
function handleInput() {
2334
if (props.disabled) return;
2435
emit('update:modelValue', !props.modelValue)
2536
}

tests/integrations/input-checkbox.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ describe("Input checkbox", () => {
9797
defaultOptions.map(el => el.label).join('') + STORE.requiredMessage
9898
)
9999
})
100-
101100
test("Tabindex should be added for all items", () => {
102101
const items = app.findAll('.element-input-checkbox')
103102

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import {mount, VueWrapper} from "@vue/test-utils";
2+
import EmptyApp from "./components/EmptyApp.vue";
3+
import {defineComponent} from "vue";
4+
import {FormField, Form} from "./../../src/index";
5+
import STORE from "../../src/config/store";
6+
7+
const name = "color"
8+
function defineSingleRadio() {
9+
return defineComponent({
10+
template: `<div><form-field type = "single-radio" name = "${name}" label = "Select color" required/></div>`,
11+
components: {FormField}
12+
})
13+
}
14+
function defaultMount(component = defineSingleRadio()) {
15+
return mount(EmptyApp, {
16+
slots: {
17+
default: component
18+
},
19+
attachTo: document.body
20+
})
21+
}
22+
23+
describe("Input single radio", () => {
24+
let app: VueWrapper<any>
25+
let form: Form
26+
beforeEach(() => {
27+
app = defaultMount();
28+
form = (app.vm as any).form
29+
})
30+
31+
test("Single radio show display the label", () => {
32+
expect(app.text()).toBe("Select color")
33+
})
34+
test("should change value after click", async () => {
35+
await app.find('.element-input-radio').trigger('click')
36+
expect(form.getValueByName(name)).toBe(true)
37+
38+
await app.find('.element-input-radio').trigger('click')
39+
expect(form.getValueByName(name)).toBe(false)
40+
41+
await app.find('.element-input-radio').trigger('click')
42+
expect(form.getValueByName(name)).toBe(true)
43+
})
44+
test("Should show error", async () => {
45+
form.validate();
46+
await app.vm.$nextTick()
47+
expect(app.find('.element-input-radio_error').exists()).toBe(true);
48+
expect(app.text()).toBe("Select color" + STORE.requiredMessage)
49+
})
50+
test("Single radio should not trigger on click when stay in disabled status", async () => {
51+
form.setValues({
52+
[name]: true
53+
})
54+
form.disable();
55+
await app.vm.$nextTick()
56+
expect(app.find('.element-input-radio_disabled').exists()).toBe(true);
57+
58+
await app.find('.element-input-radio').trigger('click')
59+
expect(form.getValueByName(name)).toBe(true)
60+
})
61+
62+
test("Press space should toggle value", async () => {
63+
64+
const input = app.find('.element-input-radio');
65+
66+
await input.trigger('keyup.space')
67+
expect(form.getValueByName(name)).toBe(true)
68+
69+
await input.trigger('keyup.space')
70+
expect(form.getValueByName(name)).toBe(false)
71+
72+
await input.trigger('keyup.space')
73+
expect(form.getValueByName(name)).toBe(true)
74+
75+
})
76+
test("Press enter should toggle value", async () => {
77+
const input = app.find('.element-input-radio');
78+
79+
await input.trigger('keyup.enter')
80+
expect(form.getValueByName(name)).toBe(true)
81+
82+
await input.trigger('keyup.enter')
83+
expect(form.getValueByName(name)).toBe(false)
84+
85+
await input.trigger('keyup.enter')
86+
expect(form.getValueByName(name)).toBe(true)
87+
})
88+
})

vue.config.cjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ module.exports = defineConfig({
3838
},
3939
"all-inputs": {
4040
entry: "./examples/all-inputs/main.ts"
41+
},
42+
"input-single-radio": {
43+
entry: "./examples/input-single-radio/main.ts"
4144
}
4245
},
4346
configureWebpack: {

0 commit comments

Comments
 (0)