props.spec.js
4.05 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { mount } from '@vue/test-utils'
import { setConfig } from './config-set'
import { copyProps, makeProp, makePropsConfigurable } from './props'
describe('utils/props', () => {
it('copyProps() works with array props', async () => {
const props = ['a', 'b', 'c']
expect(copyProps(props)).toEqual(props)
// Should be a new array reference
expect(copyProps(props)).not.toBe(props)
})
it('copyProps() works with object props', async () => {
const props = {
a: { type: String, default: 'foobar' },
b: { type: [Object, Array], default: null },
c: 'c'
}
expect(copyProps(props)).toEqual(props)
// Should be a new object reference
expect(copyProps(props)).not.toBe(props)
// Properties should be new object references
expect(copyProps(props).a).not.toBe(props.a)
expect(copyProps(props).a).toEqual(props.a)
expect(copyProps(props).b).not.toBe(props.b)
expect(copyProps(props).b).toEqual(props.b)
// Except for primatives
expect(copyProps(props).c).toBe(props.c)
expect(copyProps(props).c).toEqual(props.c)
})
it('makeProp() works', async () => {
expect(makeProp()).toEqual({})
expect(makeProp(undefined)).toEqual({})
expect(makeProp(null)).toEqual({})
expect(makeProp('')).toEqual({})
expect(makeProp(Array)).toEqual({ type: Array })
expect(makeProp(Boolean)).toEqual({ type: Boolean })
expect(makeProp(Function)).toEqual({ type: Function })
expect(makeProp(Number)).toEqual({ type: Number })
expect(makeProp(Object)).toEqual({ type: Object })
expect(makeProp(String)).toEqual({ type: String })
expect(makeProp(Array, null)).toEqual({ type: Array, default: null })
expect(makeProp(Boolean, false)).toEqual({ type: Boolean, default: false })
expect(makeProp(Function, null)).toEqual({ type: Function, default: null })
expect(makeProp(Number, 0)).toEqual({ type: Number, default: 0 })
expect(makeProp(Object, null)).toEqual({ type: Object, default: null })
expect(makeProp(String, '')).toEqual({ type: String, default: '' })
expect(typeof makeProp(Array, []).default).toEqual('function')
expect(makeProp(Array, []).default()).toEqual([])
const fn = () => {}
expect(typeof makeProp(Function, fn).default).toEqual('function')
expect(makeProp(Function, fn).default).toEqual(fn)
expect(typeof makeProp(Object, {}).default).toEqual('function')
expect(makeProp(Object, {}).default()).toEqual({})
expect(makeProp(Array, undefined, true)).toEqual({ type: Array, required: true })
expect(makeProp(Boolean, undefined, true)).toEqual({ type: Boolean, required: true })
expect(makeProp(Function, undefined, true)).toEqual({ type: Function, required: true })
expect(makeProp(Number, undefined, true)).toEqual({ type: Number, required: true })
expect(makeProp(Object, undefined, true)).toEqual({ type: Object, required: true })
expect(makeProp(String, undefined, true)).toEqual({ type: String, required: true })
const validator = value => !!value
expect(makeProp(String, '', undefined)).toEqual({ type: String, default: '' })
expect(makeProp(String, '', validator)).toEqual({ type: String, default: '', validator })
expect(makeProp(String, undefined, validator)).toEqual({ type: String, validator })
expect(makeProp(String, '', true, validator)).toEqual({
type: String,
required: true,
validator
})
})
it('makePropsConfigurable() works', async () => {
const NAME = 'MyComponent'
const props = {
text: {
type: String,
default: 'foo'
}
}
const config = {
[NAME]: { text: 'bar' }
}
const ConfigurableComponent = {
name: NAME,
props: makePropsConfigurable(props, NAME),
render(h) {
return h('div', this.text)
}
}
setConfig(config)
const wrapper = mount(ConfigurableComponent)
expect(wrapper.vm).toBeDefined()
expect(wrapper.element.tagName).toBe('DIV')
expect(wrapper.text()).toBe('bar')
await wrapper.setProps({ text: 'baz' })
expect(wrapper.text()).toBe('baz')
})
})