Skip to content

Commit d83bc92

Browse files
fix(tests): Resolve AttributeError for pb method in ad group bid modifier tests
I've updated `test_get_ad_group_bid_modifiers.py` to fix the `AttributeError: type object 'MagicMock' has no attribute 'pb'`. This was achieved by: 1. Defining a `MockAdGroupBidModifierModel` class at the module level. This class includes a `pb` class method that returns a mock configured with a `WhichOneof` method, simulating the behavior of the Google Ads library's model objects. 2. Initializing instances of `MockAdGroupBidModifierModel` to represent the `ad_group_bid_modifier` objects in the mocked search results provided by the `GoogleAdsService`. 3. Ensuring that the mock enum values (e.g., `DeviceEnum.MOBILE`) accessed via `mock_google_ads_client.enums` are themselves `MagicMock` instances with a `.name` attribute, as required by the script's print statements. 4. Setting the `_active_criterion_field` on `MockAdGroupBidModifierModel` instances and configuring their specific criterion attributes (e.g., `device.type_`) using the mocked enums.
1 parent e979752 commit d83bc92

16 files changed

+137
-129
lines changed

examples/advanced_operations/tests/conftest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ def mock_google_ads_client():
2020
# For now, we'll make it a MagicMock. If specific enums are needed,
2121
# they can be added as properties to this mock_enums object.
2222
mock_enums = MagicMock()
23-
23+
2424
# Example of mocking a specific enum if needed for a test:
2525
# mock_campaign_status_enum = MagicMock()
2626
# mock_campaign_status_enum.PAUSED = "PAUSED_ENUM_VALUE" # Or an int if that's what the API uses
2727
# type(mock_enums).CampaignStatusEnum = PropertyMock(return_value=mock_campaign_status_enum)
28-
28+
2929
mock_client.enums = mock_enums
3030

3131
return mock_client

examples/advanced_operations/tests/test_add_ad_customizer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_main_runs_successfully(mock_google_ads_client: MagicMock) -> None:
3030
mock_ad_group_customizer_result.resource_name = "mock_resource_name_ad_group_customizer"
3131
mock_mutate_ad_group_customizers_response.results = [mock_ad_group_customizer_result]
3232
mock_ad_group_customizer_service.mutate_ad_group_customizers.return_value = mock_mutate_ad_group_customizers_response
33-
33+
3434
mock_googleads_service = mock_google_ads_client.get_service("GoogleAdsService")
3535
mock_googleads_service.ad_group_path.return_value = "mock/ad_group/path"
3636

@@ -40,7 +40,7 @@ def test_main_runs_successfully(mock_google_ads_client: MagicMock) -> None:
4040
mock_ad_group_ad_result.resource_name = "mock_resource_name_ad_group_ad"
4141
mock_mutate_ad_group_ads_response.results = [mock_ad_group_ad_result]
4242
mock_ad_group_ad_service.mutate_ad_group_ads.return_value = mock_mutate_ad_group_ads_response
43-
43+
4444
# Mock enums used by the script
4545
mock_enums = mock_google_ads_client.enums
4646
mock_enums.CustomizerAttributeTypeEnum.TEXT = "TEXT"

examples/advanced_operations/tests/test_add_ad_group_bid_modifier.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def test_main_runs_successfully(mock_google_ads_client: MagicMock) -> None:
2424
mock_device_enum = MagicMock()
2525
mock_device_enum.MOBILE = "MOBILE_DEVICE" # Or actual enum value if known/needed
2626
mock_google_ads_client.enums.DeviceEnum = mock_device_enum
27-
27+
2828
# Mock types
2929
# The get_type method in conftest returns a MagicMock by default.
3030
# We can configure its "create" attribute if necessary, but often not needed

examples/advanced_operations/tests/test_add_app_campaign.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def test_main_runs_successfully(mock_uuid4: MagicMock, mock_google_ads_client: M
4646
mock_criterion_result_lang2 = MagicMock()
4747
mock_criterion_result_lang2.resource_name = "criterion_lang2"
4848
mock_criterion_response.results = [
49-
mock_criterion_result_loc1,
49+
mock_criterion_result_loc1,
5050
mock_criterion_result_loc2,
5151
mock_criterion_result_lang1,
5252
mock_criterion_result_lang2
@@ -79,7 +79,7 @@ def test_main_runs_successfully(mock_uuid4: MagicMock, mock_google_ads_client: M
7979
mock_enums.AppCampaignBiddingStrategyGoalTypeEnum.OPTIMIZE_INSTALLS_TARGET_INSTALL_COST = "OPTIMIZE_INSTALLS_TARGET_INSTALL_COST"
8080
mock_enums.AdGroupStatusEnum.ENABLED = "ENABLED"
8181
mock_enums.AdGroupAdStatusEnum.ENABLED = "ENABLED"
82-
82+
8383
# --- Mock types ---
8484
# Most types are simple containers, MagicMock default behavior is often sufficient.
8585
# For AdTextAsset, it's created and then its `text` attribute is set.

examples/advanced_operations/tests/test_add_bidding_data_exclusion.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def test_main_runs_successfully(mock_uuid4: MagicMock, mock_google_ads_client: M
2323
mock_enums.SeasonalityEventScopeEnum.CHANNEL = "CHANNEL"
2424
mock_enums.AdvertisingChannelTypeEnum.SEARCH = "SEARCH"
2525
# The script also uses DeviceEnum, but it's commented out, so not strictly needed for this test pass
26-
# mock_enums.DeviceEnum.MOBILE = "MOBILE"
26+
# mock_enums.DeviceEnum.MOBILE = "MOBILE"
2727

2828
try:
2929
main(

examples/advanced_operations/tests/test_add_demand_gen_campaign.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def test_main_runs_successfully(
4848
mock_mutate_response.mutate_operation_responses.append(MagicMock(campaign_criterion_result=MagicMock(resource_name="campaign_criterion_1"))) # Campaign Criterion
4949

5050
mock_googleads_service.mutate.return_value = mock_mutate_response
51-
51+
5252
# Mock SearchStream for finding existing assets (assumed not found for simplicity of this test)
5353
mock_search_response = MagicMock()
5454
mock_search_response.results = [] # No existing assets found

examples/advanced_operations/tests/test_add_display_upload_ad.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def test_main_runs_successfully(mock_requests_get: MagicMock, mock_google_ads_cl
2525
# Mock AdGroupService for ad_group_path
2626
mock_ad_group_service_path_helper = mock_google_ads_client.get_service("AdGroupService")
2727
mock_ad_group_service_path_helper.ad_group_path.return_value = f"customers/{mock_customer_id}/adGroups/{mock_ad_group_id}"
28-
28+
2929
# Mock AdGroupAdService
3030
mock_ad_group_ad_service = mock_google_ads_client.get_service("AdGroupAdService")
3131
mock_ad_mutate_response = MagicMock()
@@ -39,7 +39,7 @@ def test_main_runs_successfully(mock_requests_get: MagicMock, mock_google_ads_cl
3939
mock_enums.AssetTypeEnum.MEDIA_BUNDLE = "MEDIA_BUNDLE"
4040
mock_enums.AdGroupAdStatusEnum.PAUSED = "PAUSED"
4141
mock_enums.DisplayUploadProductTypeEnum.HTML5_UPLOAD_AD = "HTML5_UPLOAD_AD"
42-
42+
4343
# Mock types
4444
# mock_asset_operation = mock_google_ads_client.get_type("AssetOperation")
4545
# mock_ad_group_ad_operation = mock_google_ads_client.get_type("AdGroupAdOperation")

examples/advanced_operations/tests/test_add_dynamic_page_feed_asset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def test_main_runs_successfully(mock_get_printable_datetime: MagicMock, mock_goo
4949
mock_campaign_asset_set_result.resource_name = "customers/123/campaignAssetSets/campaign_asset_set123"
5050
mock_campaign_asset_set_response.results = [mock_campaign_asset_set_result]
5151
mock_campaign_asset_set_service.mutate_campaign_asset_sets.return_value = mock_campaign_asset_set_response
52-
52+
5353
# Mock AdGroupCriterionService
5454
mock_ad_group_criterion_service = mock_google_ads_client.get_service("AdGroupCriterionService")
5555
mock_ad_group_criterion_response = MagicMock()

examples/advanced_operations/tests/test_add_dynamic_search_ads.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def test_main_runs_successfully(mock_uuid4: MagicMock, mock_google_ads_client: M
4747
mock_criterion_result.resource_name = f"customers/{mock_customer_id}/adGroupCriteria/criterion_testuuid"
4848
mock_criterion_response.results = [mock_criterion_result]
4949
mock_ad_group_criterion_service.mutate_ad_group_criteria.return_value = mock_criterion_response
50-
50+
5151
# Mock GoogleAdsService for campaign_path (used in _create_campaign_level_targeting)
5252
mock_googleads_service = mock_google_ads_client.get_service("GoogleAdsService")
5353
mock_googleads_service.campaign_path.return_value = f"customers/{mock_customer_id}/campaigns/campaign_testuuid"

examples/advanced_operations/tests/test_add_performance_max_campaign.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def test_main_runs_successfully(
3636

3737
# Mock CampaignService (similar to budget service, paths are via GoogleAdsService)
3838
# mock_campaign_service = mock_google_ads_client.get_service("CampaignService")
39-
39+
4040
# Mock AssetGroupService (paths via GoogleAdsService)
4141
# mock_asset_group_service = mock_google_ads_client.get_service("AssetGroupService")
4242

0 commit comments

Comments
 (0)