code: def test_search(self, mock_client, mock_hook):
      service = (
          mock_client.load_from_dict.return_value.get_service.return_value
      )
      mock_client.load_from_dict.return_value.get_type.side_effect = [
          PropertyMock(),
          PropertyMock(),
      ]
      client_ids = ["1", "2"]
      rows = ["row1", "row2"]
      service.search.side_effects = rows
  
      # Here we mock _extract_rows to assert calls and
      # avoid additional __iter__ calls
      mock_hook._extract_rows = list
      query = "QUERY"
      mock_hook.search(client_ids=client_ids, query=query, page_size=2)
      for i, client_id in enumerate(client_ids):
          name, args, kwargs = service.search.mock_calls[i]
          assert kwargs["request"]["customer_id"] == client_id
          assert kwargs["request"]["query"] == query
          assert kwargs["request"]["page_size"] == 2
  
file_path: airflow/tests/providers/google/ads/hooks/test_ads.py
imports: from __future__ import annotations
  from unittest import mock
  from unittest.mock import PropertyMock
  import pytest
  from airflow.providers.google.ads.hooks.ads import GoogleAdsHook
label_desc: Use image node_id 3 for calling the TestGoogleAdsHook obj's underlying member method code with example usage: obj.test_search(mock_client, mock_hook) without return types