@@ -114,28 +114,53 @@ def new_get_type_side_effect_main(type_name):
114
114
mock_google_ads_client .get_type .side_effect = new_get_type_side_effect_main
115
115
# --- End of client.get_type mocking ---
116
116
117
- # Refined SmartCampaignSuggestService.suggest_keyword_themes mock
117
+ # --- Mock services ---
118
+ mock_suggest_service = mock_google_ads_client .get_service ("SmartCampaignSuggestService" )
119
+ mock_ktc_service = mock_google_ads_client .get_service ("KeywordThemeConstantService" ) # Define mock_ktc_service
120
+ mock_geo_service = mock_google_ads_client .get_service ("GeoTargetConstantService" )
121
+ mock_googleads_service = mock_google_ads_client .get_service ("GoogleAdsService" )
122
+
123
+ # Configure mock_suggest_service
118
124
# This is called by _get_keyword_theme_infos for free_form_keyword_text
119
125
mock_suggest_themes_response_main = MagicMock ()
120
126
free_form_theme_instance = create_mock_keyword_theme_instance_func ()
121
127
free_form_theme_instance .free_form_keyword_theme = "mocked free form text" # From free_form_keyword_text
122
128
mock_suggest_themes_response_main .keyword_themes = [free_form_theme_instance ]
123
- # The side_effect for suggest_keyword_themes needs to handle different request types if script calls it multiple ways.
124
- # For free_form_text path:
125
129
mock_suggest_service .suggest_keyword_themes .return_value = mock_suggest_themes_response_main
126
- # If suggest_keyword_themes was also called for keyword_seed (it's not, suggest_keyword_theme_constants is),
127
- # the side_effect would need to distinguish. Since it's only for free_form_text:
128
- # Simplified: if called, it's for free_form_text.
129
130
130
- # Refined KeywordThemeConstantService.suggest_keyword_theme_constants mock
131
+ # Configure mock_ktc_service
131
132
# This is called by _get_keyword_theme_auto_suggestions for keyword_text
132
133
mock_ktc_response_main = MagicMock ()
133
134
ktc_proto_mock_main = MagicMock () # Simulates KeywordThemeConstant proto
134
135
ktc_proto_mock_main .resource_name = "keywordThemeConstants/from_text_search_auto1"
135
136
mock_ktc_response_main .keyword_theme_constants = [ktc_proto_mock_main ]
136
137
mock_ktc_service .suggest_keyword_theme_constants .return_value = mock_ktc_response_main
138
+ mock_ktc_service .keyword_theme_constant_path .side_effect = lambda ktc_id : f"keywordThemeConstants/{ ktc_id } " # Path mock
139
+
140
+ # Configure mock_geo_service
141
+ mock_geo_service .geo_target_constant_path .return_value = "geoTargetConstants/2840" # USA
142
+
143
+ # Configure mock_googleads_service (paths and mutate)
144
+ mock_googleads_service .campaign_budget_path .return_value = f"customers/{ mock_customer_id } /campaignBudgets/{ _BUDGET_TEMPORARY_ID } "
145
+ mock_googleads_service .campaign_path .return_value = f"customers/{ mock_customer_id } /campaigns/{ _SMART_CAMPAIGN_TEMPORARY_ID } "
146
+ mock_googleads_service .ad_group_path .return_value = f"customers/{ mock_customer_id } /adGroups/{ _AD_GROUP_TEMPORARY_ID } "
147
+ # business_profile_location_path mock (not used in this test path as mock_business_profile_location is None)
148
+ if mock_business_profile_location : # Should be None for this test
149
+ mock_googleads_service .business_profile_location_path .return_value = f"businessProfileLocations/{ mock_business_profile_location .split ('/' )[- 1 ]} "
150
+ # Mutate call mock
151
+ mock_mutate_response = MagicMock ()
152
+ responses = []
153
+ responses .append (MagicMock (campaign_budget_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /campaignBudgets/budget1" )))
154
+ responses .append (MagicMock (campaign_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /campaigns/campaign1" )))
155
+ responses .append (MagicMock (smart_campaign_setting_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /smartCampaignSettings/scs1" )))
156
+ responses .append (MagicMock (ad_group_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /adGroups/adgroup1" )))
157
+ responses .append (MagicMock (ad_group_ad_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /adGroupAds/ad1" )))
158
+ for i in range (3 ):
159
+ responses .append (MagicMock (campaign_criterion_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /campaignCriteria/crit{ i } " )))
160
+ mock_mutate_response .mutate_operation_responses = responses
161
+ mock_googleads_service .mutate .return_value = mock_mutate_response
137
162
138
- # Suggest Budget Options (remains largely the same)
163
+ # Suggest Budget Options (remains largely the same after service inits )
139
164
mock_budget_options_response = MagicMock ()
140
165
mock_recommended_budget = MagicMock ()
141
166
mock_recommended_budget .daily_amount_micros = 50000000 # 50 units of currency
@@ -303,20 +328,49 @@ def new_get_type_side_effect_biz_func(type_name): # Unique name
303
328
mock_google_ads_client .get_type .side_effect = new_get_type_side_effect_biz_func
304
329
# --- End of client.get_type mocking for biz test ---
305
330
306
- # Refined SmartCampaignSuggestService.suggest_keyword_themes mock for biz test
331
+ # --- Mock services for biz test ---
332
+ mock_suggest_service = mock_google_ads_client .get_service ("SmartCampaignSuggestService" )
333
+ mock_ktc_service = mock_google_ads_client .get_service ("KeywordThemeConstantService" ) # Define mock_ktc_service
334
+ mock_geo_service = mock_google_ads_client .get_service ("GeoTargetConstantService" )
335
+ mock_googleads_service = mock_google_ads_client .get_service ("GoogleAdsService" )
336
+
337
+ # Configure mock_suggest_service for biz test
307
338
# free_form_keyword_text is None, so _get_keyword_theme_infos won't call suggest_keyword_themes for it.
308
339
mock_suggest_themes_response_biz = MagicMock ()
309
340
mock_suggest_themes_response_biz .keyword_themes = [] # No themes from this call path
310
341
mock_suggest_service .suggest_keyword_themes .return_value = mock_suggest_themes_response_biz
311
342
312
- # Refined KeywordThemeConstantService.suggest_keyword_theme_constants mock for biz test
343
+ # Configure mock_ktc_service for biz test
313
344
mock_ktc_response_biz = MagicMock ()
314
345
ktc_proto_mock_biz = MagicMock ()
315
346
ktc_proto_mock_biz .resource_name = "keywordThemeConstants/from_text_search_auto_biz"
316
347
mock_ktc_response_biz .keyword_theme_constants = [ktc_proto_mock_biz ]
317
348
mock_ktc_service .suggest_keyword_theme_constants .return_value = mock_ktc_response_biz
349
+ mock_ktc_service .keyword_theme_constant_path .side_effect = lambda ktc_id : f"keywordThemeConstants/{ ktc_id } " # Path mock
350
+
351
+ # Configure mock_geo_service
352
+ mock_geo_service .geo_target_constant_path .return_value = "geoTargetConstants/2840" # USA
353
+
354
+ # Configure mock_googleads_service (paths and mutate)
355
+ mock_googleads_service .campaign_budget_path .return_value = f"customers/{ mock_customer_id } /campaignBudgets/{ _BUDGET_TEMPORARY_ID } "
356
+ mock_googleads_service .campaign_path .return_value = f"customers/{ mock_customer_id } /campaigns/{ _SMART_CAMPAIGN_TEMPORARY_ID } "
357
+ mock_googleads_service .ad_group_path .return_value = f"customers/{ mock_customer_id } /adGroups/{ _AD_GROUP_TEMPORARY_ID } "
358
+ if mock_business_profile_location : # Should be set for this test
359
+ mock_googleads_service .business_profile_location_path .return_value = mock_business_profile_location
360
+ # Mutate call mock
361
+ mock_mutate_response_biz = MagicMock () # Distinct name for clarity
362
+ responses_biz = []
363
+ responses_biz .append (MagicMock (campaign_budget_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /campaignBudgets/budget_biz" )))
364
+ responses_biz .append (MagicMock (campaign_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /campaigns/campaign_biz" )))
365
+ responses_biz .append (MagicMock (smart_campaign_setting_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /smartCampaignSettings/scs_biz" )))
366
+ responses_biz .append (MagicMock (ad_group_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /adGroups/adgroup_biz" )))
367
+ responses_biz .append (MagicMock (ad_group_ad_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /adGroupAds/ad_biz" )))
368
+ for i in range (2 ):
369
+ responses_biz .append (MagicMock (campaign_criterion_result = MagicMock (resource_name = f"customers/{ mock_customer_id } /campaignCriteria/crit_biz{ i } " )))
370
+ mock_mutate_response_biz .mutate_operation_responses = responses_biz
371
+ mock_googleads_service .mutate .return_value = mock_mutate_response_biz
318
372
319
- # Suggest Budget Options (remains largely the same)
373
+ # Suggest Budget Options (remains largely the same after service inits )
320
374
mock_recommended_budget = MagicMock ()
321
375
mock_recommended_budget .daily_amount_micros = 55000000
322
376
mock_budget_options_response .recommended_daily_budget_options .high .daily_amount_micros = 65000000
0 commit comments