11
11
*/
12
12
13
13
import clsx from 'clsx' ;
14
- import { mergeIds } from '../src/useId' ;
15
- import { mergeProps } from '../' ;
16
-
14
+ import { mergeIds , useId } from '../src/useId' ;
15
+ import { mergeProps } from '../src/mergeProps ' ;
16
+ import { render } from '@react-spectrum/test-utils-internal' ;
17
17
18
18
describe ( 'mergeProps' , function ( ) {
19
19
it ( 'handles one argument' , function ( ) {
20
- let onClick = ( ) => { } ;
20
+ let onClick = ( ) => { } ;
21
21
let className = 'primary' ;
22
22
let id = 'test_id' ;
23
- let mergedProps = mergeProps ( { onClick, className, id} ) ;
23
+ let mergedProps = mergeProps ( { onClick, className, id } ) ;
24
24
expect ( mergedProps . onClick ) . toBe ( onClick ) ;
25
25
expect ( mergedProps . className ) . toBe ( className ) ;
26
26
expect ( mergedProps . id ) . toBe ( id ) ;
@@ -32,9 +32,9 @@ describe('mergeProps', function () {
32
32
let message2 = 'click2' ;
33
33
let message3 = 'click3' ;
34
34
let mergedProps = mergeProps (
35
- { onClick : ( ) => mockFn ( message1 ) } ,
36
- { onClick : ( ) => mockFn ( message2 ) } ,
37
- { onClick : ( ) => mockFn ( message3 ) }
35
+ { onClick : ( ) => mockFn ( message1 ) } ,
36
+ { onClick : ( ) => mockFn ( message2 ) } ,
37
+ { onClick : ( ) => mockFn ( message3 ) }
38
38
) ;
39
39
mergedProps . onClick ( ) ;
40
40
expect ( mockFn ) . toHaveBeenNthCalledWith ( 1 , message1 ) ;
@@ -51,14 +51,15 @@ describe('mergeProps', function () {
51
51
let focus = 'focus' ;
52
52
let margin = 2 ;
53
53
const mergedProps = mergeProps (
54
- { onClick : ( ) => mockFn ( click1 ) } ,
55
- { onHover : ( ) => mockFn ( hover ) , styles : { margin} } ,
56
- { onClick : ( ) => mockFn ( click2 ) , onFocus : ( ) => mockFn ( focus ) }
54
+ { onClick : ( ) => mockFn ( click1 ) } ,
55
+ { onHover : ( ) => mockFn ( hover ) , styles : { margin } } ,
56
+ { onClick : ( ) => mockFn ( click2 ) , onFocus : ( ) => mockFn ( focus ) }
57
57
) ;
58
-
59
58
mergedProps . onClick ( ) ;
59
+ let callOrder = mockFn . mock . invocationCallOrder ;
60
60
expect ( mockFn ) . toHaveBeenNthCalledWith ( 1 , click1 ) ;
61
61
expect ( mockFn ) . toHaveBeenNthCalledWith ( 2 , click2 ) ;
62
+ expect ( callOrder [ 0 ] ) . toBeLessThan ( callOrder [ 1 ] ) ;
62
63
mergedProps . onFocus ( ) ;
63
64
expect ( mockFn ) . toHaveBeenNthCalledWith ( 3 , focus ) ;
64
65
mergedProps . onHover ( ) ;
@@ -71,7 +72,7 @@ describe('mergeProps', function () {
71
72
let className1 = 'primary' ;
72
73
let className2 = 'hover' ;
73
74
let className3 = 'focus' ;
74
- let mergedProps = mergeProps ( { className : className1 } , { className : className2 } , { className : className3 } ) ;
75
+ let mergedProps = mergeProps ( { className : className1 } , { className : className2 } , { className : className3 } ) ;
75
76
let mergedClassNames = clsx ( className1 , className2 , className3 ) ;
76
77
expect ( mergedProps . className ) . toBe ( mergedClassNames ) ;
77
78
} ) ;
@@ -80,8 +81,45 @@ describe('mergeProps', function () {
80
81
let id1 = 'id1' ;
81
82
let id2 = 'id2' ;
82
83
let id3 = 'id3' ;
83
- let mergedProps = mergeProps ( { id : id1 } , { id : id2 } , { id : id3 } ) ;
84
+ let mergedProps = mergeProps ( { id : id1 } , { id : id2 } , { id : id3 } ) ;
84
85
let mergedIds = mergeIds ( mergeIds ( id1 , id2 ) , id3 ) ;
85
86
expect ( mergedProps . id ) . toBe ( mergedIds ) ;
86
87
} ) ;
88
+
89
+ it ( 'combines ids with aria ids' , function ( ) {
90
+ let Spy = jest . fn ( ( props ) => < div { ...props } /> ) ;
91
+
92
+ const Component = ( ) => {
93
+ let id1 = 'id1' ;
94
+ let id2 = useId ( 'id2' ) ;
95
+
96
+ mergeProps ( { id : id1 } , { id : id2 } ) ;
97
+
98
+ return < Spy id = { id2 } />
99
+ } ;
100
+
101
+ render ( < Component /> ) ;
102
+
103
+ // We use stringMatching to support optional refs in React 19.
104
+ expect ( Spy ) . toHaveBeenCalledWith ( { id : 'id2' } , expect . not . stringMatching ( / \A (? ! x ) x / ) ) ;
105
+ expect ( Spy ) . toHaveBeenLastCalledWith ( { id : 'id1' } , expect . not . stringMatching ( / \A (? ! x ) x / ) ) ;
106
+ } ) ;
107
+
108
+ it ( 'combines reoccuring ids' , function ( ) {
109
+ const Component = ( ) => {
110
+ let id1 = useId ( 'id1' ) ;
111
+ let id2 = useId ( 'id2' ) ;
112
+
113
+ return < div { ...mergeProps ( { id : id1 } , { id : id2 } , { id : id1 } ) } /> ;
114
+ } ;
115
+
116
+ expect ( ( ) => render ( < Component /> ) ) . not . toThrow ( ) ;
117
+ } ) ;
118
+
119
+ it ( 'overrides other props' , function ( ) {
120
+ let id1 = 'id1' ;
121
+ let id2 = 'id2' ;
122
+ let mergedProps = mergeProps ( { data : id1 } , { data : id2 } ) ;
123
+ expect ( mergedProps . data ) . toBe ( id2 ) ;
124
+ } ) ;
87
125
} ) ;
0 commit comments