-
-
Notifications
You must be signed in to change notification settings - Fork 8.6k
/
Copy pathcomponentVModel.spec.ts
85 lines (74 loc) · 2 KB
/
componentVModel.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import Vue from '@vue/compat'
import type { ComponentOptions } from '../../runtime-core/src/component'
import { nextTick } from '../../runtime-core/src/scheduler'
import {
DeprecationTypes,
deprecationData,
toggleDeprecationWarning,
} from '../../runtime-core/src/compat/compatConfig'
import { triggerEvent } from './utils'
beforeEach(() => {
toggleDeprecationWarning(true)
Vue.configureCompat({
MODE: 2,
GLOBAL_MOUNT: 'suppress-warning',
})
})
afterEach(() => {
toggleDeprecationWarning(false)
Vue.configureCompat({ MODE: 3 })
})
describe('COMPONENT_V_MODEL', () => {
async function runTest(CustomInput: ComponentOptions) {
const vm = new Vue({
data() {
return {
text: 'foo',
}
},
components: { CustomInput },
template: `
<div>
<span>{{ text }}</span>
<custom-input v-model="text"></custom-input>
</div>
`,
}).$mount() as any
const input = vm.$el.querySelector('input')
const span = vm.$el.querySelector('span')
expect(input.value).toBe('foo')
expect(span.textContent).toBe('foo')
expect(
(deprecationData[DeprecationTypes.COMPONENT_V_MODEL].message as Function)(
CustomInput,
),
).toHaveBeenWarned()
input.value = 'bar'
triggerEvent(input, 'input')
await nextTick()
expect(input.value).toBe('bar')
expect(span.textContent).toBe('bar')
vm.text = 'baz'
await nextTick()
expect(input.value).toBe('baz')
expect(span.textContent).toBe('baz')
}
test('basic usage', async () => {
await runTest({
name: 'CustomInput',
props: ['value'],
template: `<input :value="value" @input="$emit('input', $event.target.value)">`,
})
})
test('with model option', async () => {
await runTest({
name: 'CustomInput',
props: ['input'],
model: {
prop: 'input',
event: 'update',
},
template: `<input :value="input" @input="$emit('update', $event.target.value)">`,
})
})
})