Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion generated/known_airflow_exceptions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,6 @@ providers/google/src/airflow/providers/google/leveldb/hooks/leveldb.py::4
providers/google/src/airflow/providers/google/marketing_platform/hooks/campaign_manager.py::2
providers/google/src/airflow/providers/google/marketing_platform/hooks/search_ads.py::1
providers/google/src/airflow/providers/google/marketing_platform/operators/bid_manager.py::3
providers/google/src/airflow/providers/google/marketing_platform/operators/campaign_manager.py::2
providers/google/src/airflow/providers/google/marketing_platform/sensors/display_video.py::1
providers/google/src/airflow/providers/google/suite/hooks/calendar.py::1
providers/google/src/airflow/providers/google/suite/hooks/sheets.py::1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@

from googleapiclient import http

from airflow.providers.common.compat.sdk import AirflowException
from airflow.providers.google.cloud.hooks.gcs import GCSHook
from airflow.providers.google.marketing_platform.hooks.campaign_manager import GoogleCampaignManagerHook
from airflow.providers.google.version_compat import BaseOperator
from airflow.utils.helpers import exactly_one

if TYPE_CHECKING:
from airflow.providers.common.compat.sdk import Context
Expand Down Expand Up @@ -84,11 +84,8 @@ def __init__(
**kwargs,
) -> None:
super().__init__(**kwargs)
if not (report_name or report_id):
raise AirflowException("Please provide `report_name` or `report_id`.")
if report_name and report_id:
raise AirflowException("Please provide only one parameter `report_name` or `report_id`.")

if not exactly_one(report_name is not None, report_id is not None):
raise ValueError("Please provide exactly one of `report_name` or `report_id`.")
self.profile_id = profile_id
self.report_name = report_name
self.report_id = report_id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,26 @@ def test_execute(self, mock_base_op, hook_mock):
profile_id=PROFILE_ID, report_id=REPORT_ID
)

@pytest.mark.parametrize(
("report_name", "report_id"),
[
pytest.param(None, None, id="both-missing"),
pytest.param(REPORT_NAME, REPORT_ID, id="both-provided"),
],
)
def test_missing_or_conflicting_report_params_fail_at_construction(self, report_name, report_id):
# Provision checks on templated fields stay in `__init__` (rewritten with
# `is not None` polarity) so static authoring mistakes surface at Dag parse
# time — see https://github.com/apache/airflow/issues/70296.
with pytest.raises(ValueError, match="Please provide exactly one of `report_name` or `report_id`"):
GoogleCampaignManagerDeleteReportOperator(
profile_id=PROFILE_ID,
report_name=report_name,
report_id=report_id,
api_version=API_VERSION,
task_id="test_task",
)


@pytest.mark.db_test
class TestGoogleCampaignManagerDownloadReportOperator:
Expand Down
1 change: 0 additions & 1 deletion scripts/ci/prek/validate_operators_init_exemptions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,5 @@ providers/google/src/airflow/providers/google/cloud/sensors/cloud_composer.py::C
providers/google/src/airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py::AzureFileShareToGCSOperator
providers/google/src/airflow/providers/google/cloud/transfers/bigquery_to_mssql.py::BigQueryToMsSqlOperator
providers/google/src/airflow/providers/google/cloud/transfers/gcs_to_bigquery.py::GCSToBigQueryOperator
providers/google/src/airflow/providers/google/marketing_platform/operators/campaign_manager.py::GoogleCampaignManagerDeleteReportOperator
providers/microsoft/azure/src/airflow/providers/microsoft/azure/transfers/gcs_to_wasb.py::GCSToAzureBlobStorageOperator
providers/microsoft/psrp/src/airflow/providers/microsoft/psrp/operators/psrp.py::PsrpOperator