| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  | import Vue from 'vue' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-18 02:03:19 +08:00
										 |  |  | describe('ref', () => { | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |   const components = { | 
					
						
							|  |  |  |     test: { | 
					
						
							| 
									
										
										
										
											2016-08-15 11:46:52 +08:00
										 |  |  |       id: 'test', | 
					
						
							|  |  |  |       template: '<div>test</div>' | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     test2: { | 
					
						
							| 
									
										
										
										
											2016-08-15 11:46:52 +08:00
										 |  |  |       id: 'test2', | 
					
						
							|  |  |  |       template: '<div>test2</div>' | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-18 02:03:19 +08:00
										 |  |  |   it('should work', () => { | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |     const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											2016-06-18 02:03:19 +08:00
										 |  |  |       data: { | 
					
						
							|  |  |  |         value: 'bar' | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |       template: `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-18 02:03:19 +08:00
										 |  |  |         <test ref="foo"></test> | 
					
						
							|  |  |  |         <test2 :ref="value"></test2> | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |       </div>`, | 
					
						
							|  |  |  |       components | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     vm.$mount() | 
					
						
							| 
									
										
										
										
											2016-06-18 02:03:19 +08:00
										 |  |  |     expect(vm.$refs.foo).toBeTruthy() | 
					
						
							|  |  |  |     expect(vm.$refs.foo.$options.id).toBe('test') | 
					
						
							|  |  |  |     expect(vm.$refs.bar).toBeTruthy() | 
					
						
							|  |  |  |     expect(vm.$refs.bar.$options.id).toBe('test2') | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-18 02:11:09 +08:00
										 |  |  |   it('should dynamically update refs', done => { | 
					
						
							|  |  |  |     const vm = new Vue({ | 
					
						
							|  |  |  |       data: { | 
					
						
							|  |  |  |         value: 'foo' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       template: '<div :ref="value"></div>' | 
					
						
							|  |  |  |     }).$mount() | 
					
						
							|  |  |  |     expect(vm.$refs.foo).toBe(vm.$el) | 
					
						
							|  |  |  |     vm.value = 'bar' | 
					
						
							|  |  |  |     waitForUpdate(() => { | 
					
						
							|  |  |  |       expect(vm.$refs.foo).toBeUndefined() | 
					
						
							|  |  |  |       expect(vm.$refs.bar).toBe(vm.$el) | 
					
						
							|  |  |  |     }).then(done) | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-02 07:52:42 +08:00
										 |  |  |   it('should work as a hyperscript prop', () => { | 
					
						
							|  |  |  |     const vm = new Vue({ | 
					
						
							|  |  |  |       components, | 
					
						
							| 
									
										
										
										
											2016-06-17 23:29:22 +08:00
										 |  |  |       render (h) { | 
					
						
							| 
									
										
										
										
											2016-06-02 07:52:42 +08:00
										 |  |  |         return h('div', null, [ | 
					
						
							|  |  |  |           h('test', { ref: 'test' }) | 
					
						
							|  |  |  |         ]) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     vm.$mount() | 
					
						
							|  |  |  |     expect(vm.$refs.test).toBeTruthy() | 
					
						
							|  |  |  |     expect(vm.$refs.test.$options.id).toBe('test') | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |   it('should accept HOC component', () => { | 
					
						
							|  |  |  |     const vm = new Vue({ | 
					
						
							| 
									
										
										
										
											2016-06-18 02:03:19 +08:00
										 |  |  |       template: '<test ref="test"></test>', | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |       components | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     vm.$mount() | 
					
						
							|  |  |  |     expect(vm.$refs.test).toBeTruthy() | 
					
						
							|  |  |  |     expect(vm.$refs.test.$options.id).toBe('test') | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should accept dynamic component', done => { | 
					
						
							|  |  |  |     const vm = new Vue({ | 
					
						
							|  |  |  |       template: `<div>
 | 
					
						
							| 
									
										
										
										
											2016-06-18 02:03:19 +08:00
										 |  |  |         <component :is="test" ref="test"></component> | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  |       </div>`, | 
					
						
							|  |  |  |       components, | 
					
						
							|  |  |  |       data: { test: 'test' } | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     vm.$mount() | 
					
						
							|  |  |  |     expect(vm.$refs.test.$options.id).toBe('test') | 
					
						
							|  |  |  |     vm.test = 'test2' | 
					
						
							|  |  |  |     waitForUpdate(() => { | 
					
						
							|  |  |  |       expect(vm.$refs.test.$options.id).toBe('test2') | 
					
						
							|  |  |  |       vm.test = '' | 
					
						
							|  |  |  |     }).then(() => { | 
					
						
							|  |  |  |       expect(vm.$refs.test).toBeUndefined() | 
					
						
							|  |  |  |     }).then(done) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2016-06-02 03:02:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should register as Array when used with v-for', done => { | 
					
						
							|  |  |  |     const vm = new Vue({ | 
					
						
							|  |  |  |       data: { | 
					
						
							|  |  |  |         items: [1, 2, 3] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       template: `
 | 
					
						
							|  |  |  |         <div> | 
					
						
							| 
									
										
										
										
											2016-06-18 02:03:19 +08:00
										 |  |  |           <div v-for="n in items" ref="list">{{n}}</div> | 
					
						
							| 
									
										
										
										
											2016-06-02 03:02:55 +08:00
										 |  |  |         </div> | 
					
						
							|  |  |  |       `
 | 
					
						
							|  |  |  |     }).$mount() | 
					
						
							|  |  |  |     assertRefs() | 
					
						
							|  |  |  |     // updating
 | 
					
						
							|  |  |  |     vm.items.push(4) | 
					
						
							|  |  |  |     waitForUpdate(assertRefs) | 
					
						
							|  |  |  |       .then(() => { vm.items = [] }) | 
					
						
							|  |  |  |       .then(assertRefs) | 
					
						
							|  |  |  |       .then(done) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function assertRefs () { | 
					
						
							|  |  |  |       expect(Array.isArray(vm.$refs.list)).toBe(true) | 
					
						
							|  |  |  |       expect(vm.$refs.list.length).toBe(vm.items.length) | 
					
						
							|  |  |  |       expect(vm.$refs.list.every((item, i) => item.textContent === String(i + 1))).toBe(true) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('should register as Array when used with v-for (components)', done => { | 
					
						
							|  |  |  |     const vm = new Vue({ | 
					
						
							|  |  |  |       data: { | 
					
						
							|  |  |  |         items: [1, 2, 3] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       template: `
 | 
					
						
							|  |  |  |         <div> | 
					
						
							| 
									
										
										
										
											2017-01-25 05:04:14 +08:00
										 |  |  |           <test v-for="n in items" ref="list" :key="n" :n="n"></test> | 
					
						
							| 
									
										
										
										
											2016-06-02 03:02:55 +08:00
										 |  |  |         </div> | 
					
						
							|  |  |  |       `,
 | 
					
						
							|  |  |  |       components: { | 
					
						
							|  |  |  |         test: { | 
					
						
							|  |  |  |           props: ['n'], | 
					
						
							|  |  |  |           template: '<div>{{ n }}</div>' | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }).$mount() | 
					
						
							|  |  |  |     assertRefs() | 
					
						
							|  |  |  |     // updating
 | 
					
						
							|  |  |  |     vm.items.push(4) | 
					
						
							|  |  |  |     waitForUpdate(assertRefs) | 
					
						
							|  |  |  |       .then(() => { vm.items = [] }) | 
					
						
							|  |  |  |       .then(assertRefs) | 
					
						
							|  |  |  |       .then(done) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function assertRefs () { | 
					
						
							|  |  |  |       expect(Array.isArray(vm.$refs.list)).toBe(true) | 
					
						
							|  |  |  |       expect(vm.$refs.list.length).toBe(vm.items.length) | 
					
						
							|  |  |  |       expect(vm.$refs.list.every((comp, i) => comp.$el.textContent === String(i + 1))).toBe(true) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2016-08-16 22:27:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('should register on component with empty roots', () => { | 
					
						
							|  |  |  |     const vm = new Vue({ | 
					
						
							|  |  |  |       template: '<child ref="test"></child>', | 
					
						
							|  |  |  |       components: { | 
					
						
							|  |  |  |         child: { | 
					
						
							|  |  |  |           template: '<div v-if="false"></div>' | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }).$mount() | 
					
						
							|  |  |  |     expect(vm.$refs.test).toBe(vm.$children[0]) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2016-05-20 23:36:29 +08:00
										 |  |  | }) |