@@ -204,3 +204,129 @@ test('Matches snapshot', async () => {
204204 const tooltip = await screen . findByRole ( 'tooltip' ) ;
205205 expect ( tooltip ) . toMatchSnapshot ( ) ;
206206} ) ;
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