1
1
import { getComponentMetaInfo } from '../../src/shared/getComponentOption'
2
2
import _getMetaInfo from '../../src/shared/getMetaInfo'
3
+ import { triggerUpdate , batchUpdate } from '../../src/client/update'
3
4
import { mount , createWrapper , loadVueMetaPlugin , vmTick , clearClientAttributeMap } from '../utils'
4
5
import { defaultOptions } from '../../src/shared/constants'
5
6
@@ -10,6 +11,7 @@ import Changed from '../components/changed.vue'
10
11
11
12
const getMetaInfo = component => _getMetaInfo ( defaultOptions , getComponentMetaInfo ( defaultOptions , component ) )
12
13
14
+ jest . mock ( '../../src/client/update' )
13
15
jest . mock ( '../../src/utils/window' , ( ) => ( {
14
16
hasGlobalWindow : false
15
17
} ) )
@@ -48,6 +50,8 @@ describe('components', () => {
48
50
} )
49
51
50
52
afterEach ( ( ) => {
53
+ jest . clearAllMocks ( )
54
+
51
55
elements . html . getAttributeNames ( ) . forEach ( name => elements . html . removeAttribute ( name ) )
52
56
elements . head . childNodes . forEach ( child => child . remove ( ) )
53
57
elements . head . getAttributeNames ( ) . forEach ( name => elements . head . removeAttribute ( name ) )
@@ -209,6 +213,10 @@ describe('components', () => {
209
213
} )
210
214
211
215
test ( 'changed function is called' , async ( ) => {
216
+ const update = jest . requireActual ( '../../src/client/update' )
217
+ triggerUpdate . mockImplementation ( update . triggerUpdate )
218
+ batchUpdate . mockImplementation ( update . batchUpdate )
219
+
212
220
let context
213
221
const changed = jest . fn ( function ( ) {
214
222
context = this
@@ -226,6 +234,9 @@ describe('components', () => {
226
234
227
235
expect ( changed ) . toHaveBeenCalledTimes ( 2 )
228
236
expect ( context . _uid ) . toBe ( wrapper . vm . _uid )
237
+
238
+ triggerUpdate . mockRestore ( )
239
+ batchUpdate . mockRestore ( )
229
240
} )
230
241
231
242
test ( 'afterNavigation function is called with refreshOnce: true' , async ( ) => {
@@ -299,6 +310,10 @@ describe('components', () => {
299
310
} )
300
311
301
312
test ( 'changes before hydration initialization trigger an update' , async ( ) => {
313
+ const update = jest . requireActual ( '../../src/client/update' )
314
+ triggerUpdate . mockImplementation ( update . triggerUpdate )
315
+ batchUpdate . mockImplementation ( update . batchUpdate )
316
+
302
317
const { html } = elements
303
318
html . setAttribute ( defaultOptions . ssrAttribute , 'true' )
304
319
@@ -342,9 +357,16 @@ describe('components', () => {
342
357
343
358
expect ( html . getAttribute ( 'theme' ) ) . toBe ( 'dark' )
344
359
wrapper . destroy ( )
360
+
361
+ triggerUpdate . mockRestore ( )
362
+ batchUpdate . mockRestore ( )
345
363
} )
346
364
347
365
test ( 'changes during hydration initialization trigger an update' , async ( ) => {
366
+ const update = jest . requireActual ( '../../src/client/update' )
367
+ triggerUpdate . mockImplementation ( update . triggerUpdate )
368
+ batchUpdate . mockImplementation ( update . batchUpdate )
369
+
348
370
const { html } = elements
349
371
html . setAttribute ( defaultOptions . ssrAttribute , 'true' )
350
372
@@ -386,6 +408,9 @@ describe('components', () => {
386
408
387
409
expect ( html . getAttribute ( 'theme' ) ) . toBe ( 'dark' )
388
410
wrapper . destroy ( )
411
+
412
+ triggerUpdate . mockRestore ( )
413
+ batchUpdate . mockRestore ( )
389
414
} )
390
415
391
416
test ( 'can add/remove meta info from additional app ' , ( ) => {
@@ -504,13 +529,34 @@ describe('components', () => {
504
529
expect ( guards . after ) . not . toBeUndefined ( )
505
530
} )
506
531
507
- test ( 'can set option debounceWait runtime' , ( ) => {
508
- const wrapper = mount ( HelloWorld , { localVue : Vue } )
532
+ test ( 'destroyed hook calls triggerUpdate delayed' , async ( ) => {
533
+ jest . useFakeTimers ( )
534
+ const wrapper = mount ( HelloWorld , { localVue : Vue , parentComponent : { render : h => h ( 'div' ) } } )
535
+ const spy = jest . spyOn ( wrapper . vm . $el , 'offsetParent' , 'get' ) . mockReturnValue ( true )
509
536
510
- expect ( wrapper . vm . $meta ( ) . getOptions ( ) . debounceWait ) . toBe ( 10 )
537
+ wrapper . destroy ( )
511
538
512
- wrapper . vm . $meta ( ) . setOptions ( { debounceWait : 69420 } )
539
+ await vmTick ( wrapper . vm )
540
+
541
+ expect ( triggerUpdate ) . toHaveBeenCalledTimes ( 1 )
542
+ spy . mockRestore ( )
543
+
544
+ jest . advanceTimersByTime ( 51 )
545
+
546
+ expect ( triggerUpdate ) . toHaveBeenCalledTimes ( 2 )
547
+ expect ( triggerUpdate ) . toHaveBeenCalledWith ( expect . any ( Object ) , expect . any ( Object ) , 'destroyed' )
548
+ } )
549
+
550
+ test ( 'destroyed hook calls triggerUpdate immediately when waitOnDestroyed: false' , async ( ) => {
551
+ jest . useFakeTimers ( )
552
+
553
+ const wrapper = mount ( HelloWorld , { localVue : Vue , parentComponent : { render : h => h ( 'div' ) } } )
554
+ wrapper . vm . $meta ( ) . setOptions ( { waitOnDestroyed : false } )
555
+ wrapper . destroy ( )
556
+
557
+ await vmTick ( wrapper . vm )
513
558
514
- expect ( wrapper . vm . $meta ( ) . getOptions ( ) . debounceWait ) . toBe ( 69420 )
559
+ expect ( triggerUpdate ) . toHaveBeenCalledTimes ( 2 )
560
+ expect ( triggerUpdate ) . toHaveBeenCalledWith ( expect . any ( Object ) , expect . any ( Object ) , 'destroyed' )
515
561
} )
516
562
} )
0 commit comments