@@ -98,6 +98,15 @@ describe('directives', () => {
98
98
expect ( prevVNode ) . toBe ( null )
99
99
} ) as DirectiveHook )
100
100
101
+ const dir = {
102
+ beforeMount,
103
+ mounted,
104
+ beforeUpdate,
105
+ updated,
106
+ beforeUnmount,
107
+ unmounted
108
+ }
109
+
101
110
let _instance : ComponentInternalInstance | null = null
102
111
let _vnode : VNode | null = null
103
112
let _prevVnode : VNode | null = null
@@ -109,14 +118,7 @@ describe('directives', () => {
109
118
_prevVnode = _vnode
110
119
_vnode = withDirectives ( h ( 'div' , count . value ) , [
111
120
[
112
- {
113
- beforeMount,
114
- mounted,
115
- beforeUpdate,
116
- updated,
117
- beforeUnmount,
118
- unmounted
119
- } ,
121
+ dir ,
120
122
// value
121
123
count . value ,
122
124
// argument
@@ -132,17 +134,17 @@ describe('directives', () => {
132
134
const root = nodeOps . createElement ( 'div' )
133
135
render ( h ( Comp ) , root )
134
136
135
- expect ( beforeMount ) . toHaveBeenCalled ( )
136
- expect ( mounted ) . toHaveBeenCalled ( )
137
+ expect ( beforeMount ) . toHaveBeenCalledTimes ( 1 )
138
+ expect ( mounted ) . toHaveBeenCalledTimes ( 1 )
137
139
138
140
count . value ++
139
141
await nextTick ( )
140
- expect ( beforeUpdate ) . toHaveBeenCalled ( )
141
- expect ( updated ) . toHaveBeenCalled ( )
142
+ expect ( beforeUpdate ) . toHaveBeenCalledTimes ( 1 )
143
+ expect ( updated ) . toHaveBeenCalledTimes ( 1 )
142
144
143
145
render ( null , root )
144
- expect ( beforeUnmount ) . toHaveBeenCalled ( )
145
- expect ( unmounted ) . toHaveBeenCalled ( )
146
+ expect ( beforeUnmount ) . toHaveBeenCalledTimes ( 1 )
147
+ expect ( unmounted ) . toHaveBeenCalledTimes ( 1 )
146
148
} )
147
149
148
150
it ( 'should work with a function directive' , async ( ) => {
@@ -198,4 +200,144 @@ describe('directives', () => {
198
200
await nextTick ( )
199
201
expect ( fn ) . toHaveBeenCalledTimes ( 2 )
200
202
} )
203
+
204
+ it ( 'should work on component vnode' , async ( ) => {
205
+ const count = ref ( 0 )
206
+
207
+ function assertBindings ( binding : DirectiveBinding ) {
208
+ expect ( binding . value ) . toBe ( count . value )
209
+ expect ( binding . arg ) . toBe ( 'foo' )
210
+ expect ( binding . instance ) . toBe ( _instance && _instance . proxy )
211
+ expect ( binding . modifiers && binding . modifiers . ok ) . toBe ( true )
212
+ }
213
+
214
+ const beforeMount = jest . fn ( ( ( el , binding , vnode , prevVNode ) => {
215
+ expect ( el . tag ) . toBe ( 'div' )
216
+ // should not be inserted yet
217
+ expect ( el . parentNode ) . toBe ( null )
218
+ expect ( root . children . length ) . toBe ( 0 )
219
+
220
+ assertBindings ( binding )
221
+
222
+ expect ( vnode . type ) . toBe ( _vnode ! . type )
223
+ expect ( prevVNode ) . toBe ( null )
224
+ } ) as DirectiveHook )
225
+
226
+ const mounted = jest . fn ( ( ( el , binding , vnode , prevVNode ) => {
227
+ expect ( el . tag ) . toBe ( 'div' )
228
+ // should be inserted now
229
+ expect ( el . parentNode ) . toBe ( root )
230
+ expect ( root . children [ 0 ] ) . toBe ( el )
231
+
232
+ assertBindings ( binding )
233
+
234
+ expect ( vnode . type ) . toBe ( _vnode ! . type )
235
+ expect ( prevVNode ) . toBe ( null )
236
+ } ) as DirectiveHook )
237
+
238
+ const beforeUpdate = jest . fn ( ( ( el , binding , vnode , prevVNode ) => {
239
+ expect ( el . tag ) . toBe ( 'div' )
240
+ expect ( el . parentNode ) . toBe ( root )
241
+ expect ( root . children [ 0 ] ) . toBe ( el )
242
+
243
+ // node should not have been updated yet
244
+ // expect(el.children[0].text).toBe(`${count.value - 1}`)
245
+
246
+ assertBindings ( binding )
247
+
248
+ expect ( vnode . type ) . toBe ( _vnode ! . type )
249
+ expect ( prevVNode ! . type ) . toBe ( _prevVnode ! . type )
250
+ } ) as DirectiveHook )
251
+
252
+ const updated = jest . fn ( ( ( el , binding , vnode , prevVNode ) => {
253
+ expect ( el . tag ) . toBe ( 'div' )
254
+ expect ( el . parentNode ) . toBe ( root )
255
+ expect ( root . children [ 0 ] ) . toBe ( el )
256
+
257
+ // node should have been updated
258
+ expect ( el . children [ 0 ] . text ) . toBe ( `${ count . value } ` )
259
+
260
+ assertBindings ( binding )
261
+
262
+ expect ( vnode . type ) . toBe ( _vnode ! . type )
263
+ expect ( prevVNode ! . type ) . toBe ( _prevVnode ! . type )
264
+ } ) as DirectiveHook )
265
+
266
+ const beforeUnmount = jest . fn ( ( ( el , binding , vnode , prevVNode ) => {
267
+ expect ( el . tag ) . toBe ( 'div' )
268
+ // should be removed now
269
+ expect ( el . parentNode ) . toBe ( root )
270
+ expect ( root . children [ 0 ] ) . toBe ( el )
271
+
272
+ assertBindings ( binding )
273
+
274
+ expect ( vnode . type ) . toBe ( _vnode ! . type )
275
+ expect ( prevVNode ) . toBe ( null )
276
+ } ) as DirectiveHook )
277
+
278
+ const unmounted = jest . fn ( ( ( el , binding , vnode , prevVNode ) => {
279
+ expect ( el . tag ) . toBe ( 'div' )
280
+ // should have been removed
281
+ expect ( el . parentNode ) . toBe ( null )
282
+ expect ( root . children . length ) . toBe ( 0 )
283
+
284
+ assertBindings ( binding )
285
+
286
+ expect ( vnode . type ) . toBe ( _vnode ! . type )
287
+ expect ( prevVNode ) . toBe ( null )
288
+ } ) as DirectiveHook )
289
+
290
+ const dir = {
291
+ beforeMount,
292
+ mounted,
293
+ beforeUpdate,
294
+ updated,
295
+ beforeUnmount,
296
+ unmounted
297
+ }
298
+
299
+ let _instance : ComponentInternalInstance | null = null
300
+ let _vnode : VNode | null = null
301
+ let _prevVnode : VNode | null = null
302
+
303
+ const Child = ( props : { count : number } ) => {
304
+ _prevVnode = _vnode
305
+ _vnode = h ( 'div' , props . count )
306
+ return _vnode
307
+ }
308
+
309
+ const Comp = {
310
+ setup ( ) {
311
+ _instance = currentInstance
312
+ } ,
313
+ render ( ) {
314
+ return withDirectives ( h ( Child , { count : count . value } ) , [
315
+ [
316
+ dir ,
317
+ // value
318
+ count . value ,
319
+ // argument
320
+ 'foo' ,
321
+ // modifiers
322
+ { ok : true }
323
+ ]
324
+ ] )
325
+ }
326
+ }
327
+
328
+ const root = nodeOps . createElement ( 'div' )
329
+ render ( h ( Comp ) , root )
330
+
331
+ expect ( beforeMount ) . toHaveBeenCalledTimes ( 1 )
332
+ expect ( mounted ) . toHaveBeenCalledTimes ( 1 )
333
+
334
+ count . value ++
335
+ await nextTick ( )
336
+ expect ( beforeUpdate ) . toHaveBeenCalledTimes ( 1 )
337
+ expect ( updated ) . toHaveBeenCalledTimes ( 1 )
338
+
339
+ render ( null , root )
340
+ expect ( beforeUnmount ) . toHaveBeenCalledTimes ( 1 )
341
+ expect ( unmounted ) . toHaveBeenCalledTimes ( 1 )
342
+ } )
201
343
} )
0 commit comments