@@ -5,7 +5,7 @@ import useMergedRefs from '../src/useMergedRefs.js'
5
5
import { render } from '@testing-library/react'
6
6
7
7
describe ( 'useMergedRefs' , ( ) => {
8
- it ( 'should return a function that returns mount state ' , ( ) => {
8
+ it ( 'should work with forwardRef ' , ( ) => {
9
9
let innerRef : HTMLButtonElement
10
10
const outerRef = React . createRef < HTMLButtonElement > ( )
11
11
@@ -18,9 +18,80 @@ describe('useMergedRefs', () => {
18
18
return < button ref = { mergedRef } { ...props } />
19
19
} )
20
20
21
+ render ( < Button ref = { outerRef } /> )
22
+
23
+ expect ( innerRef ! . tagName ) . toEqual ( 'BUTTON' )
24
+ expect ( outerRef . current ! . tagName ) . toEqual ( 'BUTTON' )
25
+ } )
26
+
27
+ it ( 'should work with plain function component' , ( ) => {
28
+ let innerRef : HTMLButtonElement
29
+ const outerRef = React . createRef < HTMLButtonElement > ( )
30
+
31
+ const Button = ( { ref } : { ref : React . Ref < HTMLButtonElement > } ) => {
32
+ const [ buttonEl , attachRef ] = useCallbackRef < HTMLButtonElement > ( )
33
+ innerRef = buttonEl !
34
+
35
+ const mergedRef = useMergedRefs ( ref , attachRef )
36
+
37
+ return < button ref = { mergedRef } />
38
+ }
39
+
40
+ render ( < Button ref = { outerRef } /> )
41
+
42
+ expect ( innerRef ! . tagName ) . toEqual ( 'BUTTON' )
43
+ expect ( outerRef . current ! . tagName ) . toEqual ( 'BUTTON' )
44
+ } )
45
+
46
+ it ( 'should call refs with null when unmounting' , ( ) => {
47
+ let innerRef : HTMLButtonElement | null = null
48
+
49
+ const outerRef = React . createRef < HTMLButtonElement > ( )
50
+
51
+ function Button ( { ref } : { ref : React . Ref < HTMLButtonElement > } ) {
52
+ const mergedRef = useMergedRefs ( ref , ( value ) => {
53
+ innerRef = value
54
+ } )
55
+
56
+ return < button ref = { mergedRef } />
57
+ }
58
+
59
+ const result = render ( < Button ref = { outerRef } /> )
60
+
61
+ expect ( innerRef ! . tagName ) . toEqual ( 'BUTTON' )
62
+ expect ( outerRef . current ! . tagName ) . toEqual ( 'BUTTON' )
63
+
64
+ result . unmount ( )
65
+
66
+ expect ( innerRef ) . toBeNull ( )
67
+ expect ( outerRef . current ) . toBeNull ( )
68
+ } )
69
+
70
+ it ( 'should call refs cleanup functions' , ( ) => {
71
+ let innerRef : HTMLButtonElement | null = null
72
+
73
+ const outerRef = React . createRef < HTMLButtonElement > ( )
74
+
75
+ function Button ( { ref } : { ref : React . Ref < HTMLButtonElement > } ) {
76
+ const mergedRef = useMergedRefs ( ref , ( value ) => {
77
+ innerRef = value
78
+
79
+ return ( ) => {
80
+ innerRef = 'hi' as any
81
+ }
82
+ } )
83
+
84
+ return < button ref = { mergedRef } />
85
+ }
86
+
21
87
const result = render ( < Button ref = { outerRef } /> )
22
88
23
89
expect ( innerRef ! . tagName ) . toEqual ( 'BUTTON' )
24
90
expect ( outerRef . current ! . tagName ) . toEqual ( 'BUTTON' )
91
+
92
+ result . unmount ( )
93
+
94
+ expect ( innerRef ) . toEqual ( 'hi' )
95
+ expect ( outerRef . current ) . toBeNull ( )
25
96
} )
26
97
} )
0 commit comments