@@ -59,23 +59,7 @@ describe('rc-tooltip', () => {
59
59
verifyContent ( container , 'Tooltip content' ) ;
60
60
} ) ;
61
61
62
- // https://github.com/ant-design/ant-design/pull/23155
63
- it ( 'using style inner style' , ( ) => {
64
- const { container } = render (
65
- < Tooltip
66
- trigger = { [ 'click' ] }
67
- placement = "left"
68
- overlay = { ( ) => < strong className = "x-content" > Tooltip content</ strong > }
69
- overlayInnerStyle = { { background : 'red' } }
70
- >
71
- < div className = "target" > Click this</ div >
72
- </ Tooltip > ,
73
- ) ;
74
- fireEvent . click ( container . querySelector ( '.target' ) ) ;
75
- expect (
76
- ( container . querySelector ( '.rc-tooltip-body' ) as HTMLElement ) . style . background ,
77
- ) . toEqual ( 'red' ) ;
78
- } ) ;
62
+
79
63
80
64
it ( 'access of ref' , ( ) => {
81
65
const domRef = React . createRef < TooltipRef > ( ) ;
@@ -216,6 +200,87 @@ describe('rc-tooltip', () => {
216
200
) ;
217
201
expect ( container . querySelector ( '.rc-tooltip-arrow' ) ) . toBeFalsy ( ) ;
218
202
} ) ;
203
+
204
+ it ( 'should merge arrow className from showArrow and classNames.arrow' , ( ) => {
205
+ const { container } = render (
206
+ < Tooltip
207
+ trigger = { [ 'click' ] }
208
+ placement = "left"
209
+ overlay = { < strong className = "x-content" > Tooltip content</ strong > }
210
+ showArrow = { {
211
+ className : 'from-showArrow' ,
212
+ } }
213
+ classNames = { {
214
+ arrow : 'from-classNames' ,
215
+ } }
216
+ visible
217
+ >
218
+ < div className = "target" > Click this</ div >
219
+ </ Tooltip > ,
220
+ ) ;
221
+
222
+ const arrowElement = container . querySelector ( '.rc-tooltip-arrow' ) ;
223
+ expect ( arrowElement ) . toHaveClass ( 'from-showArrow' ) ;
224
+ expect ( arrowElement ) . toHaveClass ( 'from-classNames' ) ;
225
+ } ) ;
226
+
227
+ it ( 'should use arrowContent from showArrow object' , ( ) => {
228
+ const { container } = render (
229
+ < Tooltip
230
+ trigger = { [ 'click' ] }
231
+ placement = "left"
232
+ overlay = { < strong className = "x-content" > Tooltip content</ strong > }
233
+ showArrow = { {
234
+ content : < span className = "custom-arrow-content" > ↑</ span > ,
235
+ } }
236
+ visible
237
+ >
238
+ < div className = "target" > Click this</ div >
239
+ </ Tooltip > ,
240
+ ) ;
241
+
242
+ expect ( container . querySelector ( '.custom-arrow-content' ) ) . toBeTruthy ( ) ;
243
+ expect ( container . querySelector ( '.custom-arrow-content' ) . textContent ) . toBe ( '↑' ) ;
244
+ } ) ;
245
+
246
+ it ( 'should use arrowContent prop when showArrow has no content' , ( ) => {
247
+ const { container } = render (
248
+ < Tooltip
249
+ trigger = { [ 'click' ] }
250
+ placement = "left"
251
+ overlay = { < strong className = "x-content" > Tooltip content</ strong > }
252
+ showArrow
253
+ arrowContent = { < span className = "prop-arrow-content" > →</ span > }
254
+ visible
255
+ >
256
+ < div className = "target" > Click this</ div >
257
+ </ Tooltip > ,
258
+ ) ;
259
+
260
+ expect ( container . querySelector ( '.prop-arrow-content' ) ) . toBeTruthy ( ) ;
261
+ expect ( container . querySelector ( '.prop-arrow-content' ) . textContent ) . toBe ( '→' ) ;
262
+ } ) ;
263
+
264
+ it ( 'should prioritize showArrow.content over arrowContent prop' , ( ) => {
265
+ const { container } = render (
266
+ < Tooltip
267
+ trigger = { [ 'click' ] }
268
+ placement = "left"
269
+ overlay = { < strong className = "x-content" > Tooltip content</ strong > }
270
+ showArrow = { {
271
+ content : < span className = "showArrow-content" > ↑</ span > ,
272
+ } }
273
+ arrowContent = { < span className = "prop-content" > →</ span > }
274
+ visible
275
+ >
276
+ < div className = "target" > Click this</ div >
277
+ </ Tooltip > ,
278
+ ) ;
279
+
280
+ expect ( container . querySelector ( '.showArrow-content' ) ) . toBeTruthy ( ) ;
281
+ expect ( container . querySelector ( '.prop-content' ) ) . toBeFalsy ( ) ;
282
+ expect ( container . querySelector ( '.showArrow-content' ) . textContent ) . toBe ( '↑' ) ;
283
+ } ) ;
219
284
} ) ;
220
285
221
286
it ( 'visible' , ( ) => {
@@ -251,33 +316,175 @@ describe('rc-tooltip', () => {
251
316
252
317
expect ( nodeRef . current . nativeElement ) . toBe ( container . querySelector ( 'button' ) ) ;
253
318
} ) ;
254
- it ( 'should apply custom styles to Tooltip' , ( ) => {
255
- const customClassNames = {
256
- body : 'custom-body' ,
257
- root : 'custom-root' ,
258
- } ;
319
+ describe ( 'classNames and styles' , ( ) => {
320
+ it ( 'should apply custom classNames to all semantic elements' , ( ) => {
321
+ const customClassNames = {
322
+ root : 'custom-root' ,
323
+ body : 'custom-body' ,
324
+ arrow : 'custom-arrow' ,
325
+ } ;
259
326
260
- const customStyles = {
261
- body : { color : 'red' } ,
262
- root : { backgroundColor : 'blue' } ,
263
- } ;
327
+ const { container } = render (
328
+ < Tooltip
329
+ classNames = { customClassNames }
330
+ overlay = { < div > Tooltip content</ div > }
331
+ visible
332
+ showArrow
333
+ >
334
+ < button > Trigger</ button >
335
+ </ Tooltip > ,
336
+ ) ;
264
337
265
- const { container } = render (
266
- < Tooltip classNames = { customClassNames } overlay = { < div /> } styles = { customStyles } visible >
267
- < button />
268
- </ Tooltip > ,
269
- ) ;
338
+ const tooltipElement = container . querySelector ( '.rc-tooltip' ) as HTMLElement ;
339
+ const tooltipBodyElement = container . querySelector ( '.rc-tooltip-body' ) as HTMLElement ;
340
+ const tooltipArrowElement = container . querySelector ( '.rc-tooltip-arrow' ) as HTMLElement ;
341
+
342
+ // 验证 classNames
343
+ expect ( tooltipElement ) . toHaveClass ( 'custom-root' ) ;
344
+ expect ( tooltipBodyElement ) . toHaveClass ( 'custom-body' ) ;
345
+ expect ( tooltipArrowElement ) . toHaveClass ( 'custom-arrow' ) ;
346
+ } ) ;
347
+
348
+ it ( 'should apply custom styles to all semantic elements' , ( ) => {
349
+ const customStyles = {
350
+ root : { backgroundColor : 'blue' , zIndex : 1000 } ,
351
+ body : { color : 'red' , fontSize : '14px' } ,
352
+ arrow : { borderColor : 'green' } ,
353
+ } ;
354
+
355
+ const { container } = render (
356
+ < Tooltip
357
+ styles = { customStyles }
358
+ overlay = { < div > Tooltip content</ div > }
359
+ visible
360
+ showArrow
361
+ >
362
+ < button > Trigger</ button >
363
+ </ Tooltip > ,
364
+ ) ;
365
+
366
+ const tooltipElement = container . querySelector ( '.rc-tooltip' ) as HTMLElement ;
367
+ const tooltipBodyElement = container . querySelector ( '.rc-tooltip-body' ) as HTMLElement ;
368
+ const tooltipArrowElement = container . querySelector ( '.rc-tooltip-arrow' ) as HTMLElement ;
369
+
370
+ // 验证 styles
371
+ expect ( tooltipElement . style . backgroundColor ) . toBe ( 'blue' ) ;
372
+ expect ( tooltipElement . style . zIndex ) . toBe ( '1000' ) ;
373
+ expect ( tooltipBodyElement . style . color ) . toBe ( 'red' ) ;
374
+ expect ( tooltipBodyElement . style . fontSize ) . toBe ( '14px' ) ;
375
+ expect ( tooltipArrowElement . style . borderColor ) . toBe ( 'green' ) ;
376
+ } ) ;
270
377
271
- const tooltipElement = container . querySelector ( '.rc-tooltip' ) as HTMLElement ;
272
- const tooltipBodyElement = container . querySelector ( '.rc-tooltip-body' ) as HTMLElement ;
378
+ it ( 'should apply both classNames and styles simultaneously' , ( ) => {
379
+ const customClassNames = {
380
+ root : 'custom-root' ,
381
+ body : 'custom-body' ,
382
+ arrow : 'custom-arrow' ,
383
+ } ;
273
384
274
- // 验证 classNames
275
- expect ( tooltipElement ) . toHaveClass ( 'custom-root' ) ;
276
- expect ( tooltipBodyElement ) . toHaveClass ( 'custom-body' ) ;
385
+ const customStyles = {
386
+ root : { backgroundColor : 'blue' } ,
387
+ body : { color : 'red' } ,
388
+ arrow : { borderColor : 'green' } ,
389
+ } ;
277
390
278
- // 验证 styles
279
- expect ( tooltipElement . style . backgroundColor ) . toBe ( 'blue' ) ;
280
- expect ( tooltipBodyElement . style . color ) . toBe ( 'red' ) ;
391
+ const { container } = render (
392
+ < Tooltip
393
+ classNames = { customClassNames }
394
+ styles = { customStyles }
395
+ overlay = { < div > Tooltip content</ div > }
396
+ visible
397
+ showArrow
398
+ >
399
+ < button > Trigger</ button >
400
+ </ Tooltip > ,
401
+ ) ;
402
+
403
+ const tooltipElement = container . querySelector ( '.rc-tooltip' ) as HTMLElement ;
404
+ const tooltipBodyElement = container . querySelector ( '.rc-tooltip-body' ) as HTMLElement ;
405
+ const tooltipArrowElement = container . querySelector ( '.rc-tooltip-arrow' ) as HTMLElement ;
406
+
407
+ // 验证 classNames 和 styles 同时生效
408
+ expect ( tooltipElement ) . toHaveClass ( 'custom-root' ) ;
409
+ expect ( tooltipElement . style . backgroundColor ) . toBe ( 'blue' ) ;
410
+ expect ( tooltipBodyElement ) . toHaveClass ( 'custom-body' ) ;
411
+ expect ( tooltipBodyElement . style . color ) . toBe ( 'red' ) ;
412
+ expect ( tooltipArrowElement ) . toHaveClass ( 'custom-arrow' ) ;
413
+ expect ( tooltipArrowElement . style . borderColor ) . toBe ( 'green' ) ;
414
+ } ) ;
415
+
416
+ it ( 'should work with partial classNames and styles' , ( ) => {
417
+ const partialClassNames = {
418
+ body : 'custom-body' ,
419
+ } ;
420
+
421
+ const partialStyles = {
422
+ root : { backgroundColor : 'blue' } ,
423
+ } ;
424
+
425
+ const { container } = render (
426
+ < Tooltip
427
+ classNames = { partialClassNames }
428
+ styles = { partialStyles }
429
+ overlay = { < div > Tooltip content</ div > }
430
+ visible
431
+ showArrow
432
+ >
433
+ < button > Trigger</ button >
434
+ </ Tooltip > ,
435
+ ) ;
436
+
437
+ const tooltipElement = container . querySelector ( '.rc-tooltip' ) as HTMLElement ;
438
+ const tooltipBodyElement = container . querySelector ( '.rc-tooltip-body' ) as HTMLElement ;
439
+ const tooltipArrowElement = container . querySelector ( '.rc-tooltip-arrow' ) as HTMLElement ;
440
+
441
+ // 验证部分配置生效
442
+ expect ( tooltipElement . style . backgroundColor ) . toBe ( 'blue' ) ;
443
+ expect ( tooltipBodyElement ) . toHaveClass ( 'custom-body' ) ;
444
+
445
+ // 验证未配置的不会有自定义类名或样式
446
+ expect ( tooltipElement ) . not . toHaveClass ( 'custom-root' ) ;
447
+ expect ( tooltipArrowElement ) . not . toHaveClass ( 'custom-arrow' ) ;
448
+ } ) ;
449
+
450
+ it ( 'should not break when showArrow is false' , ( ) => {
451
+ const customClassNames = {
452
+ root : 'custom-root' ,
453
+ body : 'custom-body' ,
454
+ arrow : 'custom-arrow' , // 即使配置了arrow,但不显示箭头时不应该报错
455
+ } ;
456
+
457
+ const customStyles = {
458
+ root : { backgroundColor : 'blue' } ,
459
+ body : { color : 'red' } ,
460
+ arrow : { borderColor : 'green' } ,
461
+ } ;
462
+
463
+ const { container } = render (
464
+ < Tooltip
465
+ classNames = { customClassNames }
466
+ styles = { customStyles }
467
+ overlay = { < div > Tooltip content</ div > }
468
+ visible
469
+ showArrow = { false }
470
+ >
471
+ < button > Trigger</ button >
472
+ </ Tooltip > ,
473
+ ) ;
474
+
475
+ const tooltipElement = container . querySelector ( '.rc-tooltip' ) as HTMLElement ;
476
+ const tooltipBodyElement = container . querySelector ( '.rc-tooltip-body' ) as HTMLElement ;
477
+ const tooltipArrowElement = container . querySelector ( '.rc-tooltip-arrow' ) ;
478
+
479
+ // 验证没有箭头时
480
+ expect ( tooltipArrowElement ) . toBeFalsy ( ) ;
481
+
482
+ // 其他样式仍然生效
483
+ expect ( tooltipElement ) . toHaveClass ( 'custom-root' ) ;
484
+ expect ( tooltipElement . style . backgroundColor ) . toBe ( 'blue' ) ;
485
+ expect ( tooltipBodyElement ) . toHaveClass ( 'custom-body' ) ;
486
+ expect ( tooltipBodyElement . style . color ) . toBe ( 'red' ) ;
487
+ } ) ;
281
488
} ) ;
282
489
283
490
describe ( 'children handling' , ( ) => {
0 commit comments