code: def testRangeXCallbackEventData(self):
      for viewport in [
          {"xaxis.range": [1, 4], "yaxis.range": [-1, 5]},
          {
              "xaxis.range[0]": 1,
              "xaxis.range[1]": 4,
              "yaxis.range[0]": -1,
              "yaxis.range[1]": 5,
          },
      ]:
          event_data = (
              RangeXCallback.get_event_data_from_property_update(
                  "viewport", viewport, self.fig_dict
              )
          )
  
          self.assertEqual(
              event_data,
              {
                  "first": {"x_range": (1, 4)},
                  "second": {"x_range": (1, 4)},
              },
          )
  
imports: import uuid
  from unittest import TestCase
  from unittest.mock import Mock
  import plotly.graph_objs
  from holoviews import Tiles
  from holoviews.plotting.plotly.callbacks import BoundsXCallback, BoundsXYCallback, BoundsYCallback, RangeXCallback, RangeXYCallback, RangeYCallback, Selection1DCallback
  from holoviews.streams import BoundsX, BoundsXY, BoundsY, RangeX, RangeXY, RangeY, Selection1D
label_desc: Use image node_id 4 for calling the TestCallbacks obj's underlying member method code with example usage: obj.testRangeXCallbackEventData() without return types