code: def test_ttbs001_canonical_behavior(dash_dcc):
      lock = Lock()
  
      loading_text = "Waiting for Godot"
  
      fig = dict(
          data=[
              dict(
                  x=[11, 22, 33],
                  y=[333, 222, 111],
                  mode="markers",
                  marker=dict(size=40),
              )
          ],
          layout=dict(
              width=400,
              height=400,
              margin=dict(l=100, r=100, t=100, b=100),
          ),
      )
      app = Dash(__name__)
  
      app.layout = html.Div(
          className="container",
          children=[
              dcc.Graph(id="graph", figure=fig, clear_on_unhover=True),
              dcc.Tooltip(
                  id="graph-tooltip", loading_text=loading_text
              ),
          ],
          style=dict(position="relative"),
      )
  
      # This callback is executed very quickly
      app.clientside_callback(
          """
          function show_tooltip(hoverData) {
              if(!hoverData) {
                  return [false, dash_clientside.no_update];
              }
              var pt = hoverData.points[0];
              return [true, pt.bbox];
          }
          """,
          Output("graph-tooltip", "show"),
          Output("graph-tooltip", "bbox"),
          Input("graph", "hoverData"),
      )
  
      # This callback is executed after 1s to simulate a long-running process
      @app.callback(
          Output("graph-tooltip", "children"),
          Input("graph", "hoverData"),
      )
      def update_tooltip_content(hoverData):
          if hoverData is None:
              return no_update
  
          with lock:
              # Display the x0 and y0 coordinate
              bbox = hoverData["points"][0]["bbox"]
              return [
                  html.P(f"x0={bbox['x0']}, y0={bbox['y0']}"),
              ]
  
      dash_dcc.start_server(app)
  
      until(
          lambda: not dash_dcc.find_element(
              "#graph-tooltip"
          ).is_displayed(),
          3,
      )
  
      elem = dash_dcc.find_element("#graph .nsewdrag")
  
      with lock:
          # hover on the center of the graph
          ActionChains(dash_dcc.driver).move_to_element_with_offset(
              elem, elem.size["width"] / 2, elem.size["height"] / 2
          ).click().perform()
          dash_dcc.wait_for_text_to_equal(
              "#graph-tooltip", loading_text
          )
  
      dash_dcc.wait_for_contains_text("#graph-tooltip", "x0=")
      tt_text = dash_dcc.find_element("#graph-tooltip").text
      coords = [
          float(part.split("=")[1]) for part in tt_text.split(",")
      ]
      assert (
          175 < coords[0] < 185
      ), "x0 is about 200 minus half a marker size"
      assert (
          175 < coords[1] < 185
      ), "y0 is about 200 minus half a marker size"
  
      elem = dash_dcc.find_element("#graph .nsewdrag")
  
      ActionChains(dash_dcc.driver).move_to_element_with_offset(
          elem, 5, elem.size["height"] - 5
      ).perform()
  
      until(
          lambda: not dash_dcc.find_element(
              "#graph-tooltip"
          ).is_displayed(),
          3,
      )
  
imports: from multiprocessing import Lock
  from selenium.webdriver.common.action_chains import ActionChains
  from dash.testing.wait import until
  from dash import Dash, Input, Output, dcc, html, no_update
label_desc: Use image node_id 1 for calling a global function with example usage: test_ttbs001_canonical_behavior(dash_dcc) and returns: no_update, list