@@ -204,3 +204,129 @@ test('Matches snapshot', async () => {
204
204
const tooltip = await screen . findByRole ( 'tooltip' ) ;
205
205
expect ( tooltip ) . toMatchSnapshot ( ) ;
206
206
} ) ;
207
+
208
+ test ( 'Applies aria-describedby to triggerRef element when no children are provided' , async ( ) => {
209
+ const triggerRef = createRef < HTMLButtonElement > ( ) ;
210
+
211
+ render (
212
+ < >
213
+ < button ref = { triggerRef } > Trigger</ button >
214
+ < Tooltip id = "trigger-ref-test" triggerRef = { triggerRef } isVisible content = "Test description" />
215
+ </ >
216
+ ) ;
217
+
218
+ await screen . findByRole ( 'tooltip' ) ;
219
+ expect ( triggerRef . current ) . toHaveAccessibleDescription ( 'Test description' ) ;
220
+ } ) ;
221
+
222
+ test ( 'Applies aria-labelledby to triggerRef element when no children are provided' , async ( ) => {
223
+ const triggerRef = createRef < HTMLButtonElement > ( ) ;
224
+
225
+ render (
226
+ < >
227
+ < button ref = { triggerRef } > Trigger</ button >
228
+ < Tooltip id = "trigger-ref-test" aria = "labelledby" triggerRef = { triggerRef } isVisible content = "Test label" />
229
+ </ >
230
+ ) ;
231
+
232
+ await screen . findByRole ( 'tooltip' ) ;
233
+ expect ( triggerRef . current ) . toHaveAccessibleName ( 'Test label' ) ;
234
+ } ) ;
235
+
236
+ test ( 'Removes aria-describedby from triggerRef element when tooltip is hidden' , async ( ) => {
237
+ const triggerRef = createRef < HTMLButtonElement > ( ) ;
238
+
239
+ const TooltipTest = ( ) => {
240
+ const [ isVisible , setIsVisible ] = useState ( true ) ;
241
+
242
+ return (
243
+ < >
244
+ < button ref = { triggerRef } onClick = { ( ) => setIsVisible ( ! isVisible ) } >
245
+ Trigger
246
+ </ button >
247
+ < Tooltip id = "trigger-ref-test" triggerRef = { triggerRef } isVisible = { isVisible } content = "Test description" />
248
+ </ >
249
+ ) ;
250
+ } ;
251
+
252
+ render ( < TooltipTest /> ) ;
253
+
254
+ // Tooltip should be visible initially
255
+ await screen . findByRole ( 'tooltip' ) ;
256
+ expect ( triggerRef . current ) . toHaveAccessibleDescription ( 'Test description' ) ;
257
+
258
+ // Hide tooltip
259
+ const user = userEvent . setup ( ) ;
260
+ await user . click ( triggerRef . current ) ;
261
+
262
+ // aria-describedby should be removed
263
+ expect ( triggerRef . current ) . not . toHaveAccessibleDescription ( ) ;
264
+ } ) ;
265
+
266
+ test ( 'Removes aria-labelledby from triggerRef element when tooltip is hidden' , async ( ) => {
267
+ const triggerRef = createRef < HTMLButtonElement > ( ) ;
268
+
269
+ const TooltipTest = ( ) => {
270
+ const [ isVisible , setIsVisible ] = useState ( true ) ;
271
+
272
+ return (
273
+ < >
274
+ < button ref = { triggerRef } onClick = { ( ) => setIsVisible ( ! isVisible ) } />
275
+ < Tooltip
276
+ aria = "labelledby"
277
+ id = "trigger-ref-test"
278
+ triggerRef = { triggerRef }
279
+ isVisible = { isVisible }
280
+ content = "Test label"
281
+ />
282
+ </ >
283
+ ) ;
284
+ } ;
285
+
286
+ render ( < TooltipTest /> ) ;
287
+
288
+ // Tooltip should be visible initially
289
+ await screen . findByRole ( 'tooltip' ) ;
290
+ expect ( triggerRef . current ) . toHaveAccessibleName ( 'Test label' ) ;
291
+
292
+ // Hide tooltip
293
+ const user = userEvent . setup ( ) ;
294
+ await user . click ( triggerRef . current ) ;
295
+
296
+ // aria-describedby should be removed
297
+ expect ( triggerRef . current ) . not . toHaveAccessibleName ( ) ;
298
+ } ) ;
299
+
300
+ test ( 'Preserves existing aria-describedby on triggerRef element' , async ( ) => {
301
+ const triggerRef = createRef < HTMLButtonElement > ( ) ;
302
+
303
+ render (
304
+ < >
305
+ < div id = "existing-aria" > Existing description</ div >
306
+ < button ref = { triggerRef } aria-describedby = "existing-aria" >
307
+ Trigger
308
+ </ button >
309
+ < Tooltip id = "trigger-ref-test" triggerRef = { triggerRef } isVisible content = "Test description" />
310
+ </ >
311
+ ) ;
312
+
313
+ await screen . findByRole ( 'tooltip' ) ;
314
+ expect ( triggerRef . current ) . toHaveAccessibleDescription ( 'Existing description Test description' ) ;
315
+ } ) ;
316
+
317
+ test ( 'Preserves existing aria-labelledby on triggerRef element' , async ( ) => {
318
+ const triggerRef = createRef < HTMLButtonElement > ( ) ;
319
+
320
+ render (
321
+ < >
322
+ < div id = "existing-aria" > Existing label</ div >
323
+ < button ref = { triggerRef } aria-labelledby = "existing-aria" >
324
+ Trigger
325
+ </ button >
326
+ < Tooltip aria = "labelledby" id = "trigger-ref-test" triggerRef = { triggerRef } isVisible content = "Test label" />
327
+ </ >
328
+ ) ;
329
+
330
+ await screen . findByRole ( 'tooltip' ) ;
331
+ expect ( triggerRef . current ) . toHaveAccessibleName ( 'Existing label Test label' ) ;
332
+ } ) ;
0 commit comments