@@ -5,7 +5,7 @@ import useMergedRefs from '../src/useMergedRefs.js'
55import { render } from '@testing-library/react'
66
77describe ( 'useMergedRefs' , ( ) => {
8- it ( 'should return a function that returns mount state ' , ( ) => {
8+ it ( 'should work with forwardRef ' , ( ) => {
99 let innerRef : HTMLButtonElement
1010 const outerRef = React . createRef < HTMLButtonElement > ( )
1111
@@ -18,9 +18,80 @@ describe('useMergedRefs', () => {
1818 return < button ref = { mergedRef } { ...props } />
1919 } )
2020
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+
2187 const result = render ( < Button ref = { outerRef } /> )
2288
2389 expect ( innerRef ! . tagName ) . toEqual ( 'BUTTON' )
2490 expect ( outerRef . current ! . tagName ) . toEqual ( 'BUTTON' )
91+
92+ result . unmount ( )
93+
94+ expect ( innerRef ) . toEqual ( 'hi' )
95+ expect ( outerRef . current ) . toBeNull ( )
2596 } )
2697} )
0 commit comments