code: def test_ttip004_tooltip_applied(
      test, tooltip_data, tooltip_header, data_expected, header_expected
  ):
      props = {
          **base_props,
          "columns": [
              dict(
                  id=str(i),
                  name=[
                      "Column {}".format(math.ceil(i / 3)),
                      "Column {}".format(i),
                  ],
              )
              for i in range(1, 30)
          ],
          "merge_duplicate_headers": True,
          "tooltip_delay": 0,
          "tooltip_duration": 5000,
          "tooltip": {
              "1": "text1",
              "2": {"use_with": "data", "value": "text2"},
              "3": {"use_with": "header", "value": "text3"},
          },
          "tooltip_data": tooltip_data,
          "tooltip_header": tooltip_header,
      }
  
      app = dash.Dash(__name__)
      app.layout = DataTable(**props)
  
      test.start_server(app)
  
      target = test.table("table")
      target.is_ready()
  
      cell55 = target.cell(5, "5")
      tooltip = target.tooltip
  
      target.cell(0, "1").move_to()
      wait.until(lambda: target.tooltip.exists(), 3)
      assert tooltip.get_text().strip() == data_expected[0]
      cell55.move_to()
  
      target.cell(1, "1").move_to()
      wait.until(lambda: target.tooltip.exists(), 3)
      assert tooltip.get_text().strip() == data_expected[1]
      cell55.move_to()
  
      target.cell(0, "2").move_to()
      wait.until(lambda: target.tooltip.exists(), 3)
      assert tooltip.get_text().strip() == "text2"
      cell55.move_to()
  
      target.cell(0, "3").move_to()
      time.sleep(1)
      wait.until(lambda: target.tooltip.missing(), 3)
      cell55.move_to()
  
      target.column("1").move_to(0)
      wait.until(lambda: target.tooltip.exists(), 3)
      assert tooltip.get_text().strip() == header_expected[0]
      cell55.move_to()
  
      target.column("1").move_to(1)
      wait.until(lambda: target.tooltip.exists(), 3)
      assert tooltip.get_text().strip() == header_expected[1]
      cell55.move_to()
  
      target.column("2").move_to(1)
      time.sleep(1)
      wait.until(lambda: target.tooltip.missing(), 3)
      cell55.move_to()
  
      target.column("3").move_to(1)
      wait.until(lambda: target.tooltip.exists(), 3)
      assert tooltip.get_text().strip() == "text3"
      cell55.move_to()
  
      assert test.get_log_errors() == []
  
file_path: dash/components/dash-table/tests/selenium/test_tooltip.py
imports: import dash
  import math
  import pytest
  import time
  import dash.testing.wait
  from dash.dash_table import DataTable
label_desc: Use image node_id 5 for calling a global function with example usage: test_ttip004_tooltip_applied(test, tooltip_data, tooltip_header, data_expected, header_expected) without return types