diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/source.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/source.py index dc20266eb346..058413428679 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/source.py +++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/source.py @@ -6,13 +6,12 @@ from typing import Any, List, Mapping, Tuple from airbyte_cdk.logger import AirbyteLogger -from airbyte_cdk.models import ConnectorSpecification from airbyte_cdk.sources import AbstractSource from airbyte_cdk.sources.streams import Stream from airbyte_cdk.sources.streams.http.auth import Oauth2Authenticator +from .constants import AmazonAdsRegion from .schemas import Profile -from .spec import AmazonAdsConfig, advanced_auth from .streams import ( Profiles, SponsoredBrandsAdGroups, @@ -45,12 +44,12 @@ def check_connection(self, logger: AirbyteLogger, config: Mapping[str, Any]) -> :param logger: logger object :return Tuple[bool, any]: (True, None) if the input config can be used to connect to the API successfully, (False, error) otherwise. """ - config = AmazonAdsConfig(**config) # Check connection by sending list of profiles request. Its most simple # request, not require additional parameters and usually has few data # in response body. # It doesnt support pagination so there is no sense of reading single # record, it would fetch all the data anyway. + self._set_defaults(config) Profiles(config, authenticator=self._make_authenticator(config)).get_all_profiles() return True, None @@ -59,7 +58,7 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: :param config: A Mapping of the user input configuration as defined in the connector spec. :return list of streams for current source """ - config = AmazonAdsConfig(**config) + self._set_defaults(config) auth = self._make_authenticator(config) stream_args = {"config": config, "authenticator": auth} # All data for individual Amazon Ads stream divided into sets of data for @@ -91,24 +90,21 @@ def streams(self, config: Mapping[str, Any]) -> List[Stream]: ] return [profiles_stream, *[stream_class(**stream_args) for stream_class in non_profile_stream_classes]] - def spec(self, *args) -> ConnectorSpecification: - return ConnectorSpecification( - documentationUrl="https://docs.airbyte.com/integrations/sources/amazon-ads", - connectionSpecification=AmazonAdsConfig.schema(), - advanced_auth=advanced_auth, - ) - @staticmethod - def _make_authenticator(config: AmazonAdsConfig): + def _make_authenticator(config: Mapping[str, Any]): return Oauth2Authenticator( token_refresh_endpoint=TOKEN_URL, - client_id=config.client_id, - client_secret=config.client_secret, - refresh_token=config.refresh_token, + client_id=config["client_id"], + client_secret=config["client_secret"], + refresh_token=config["refresh_token"], ) @staticmethod - def _choose_profiles(config: AmazonAdsConfig, profiles: List[Profile]): - if not config.profiles: + def _set_defaults(config: Mapping[str, Any]): + config["region"] = AmazonAdsRegion.NA + + @staticmethod + def _choose_profiles(config: Mapping[str, Any], profiles: List[Profile]): + if not config.get("profiles"): return profiles - return list(filter(lambda profile: profile.profileId in config.profiles, profiles)) + return list(filter(lambda profile: profile.profileId in config["profiles"], profiles)) diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.py deleted file mode 100644 index bf7a598f0791..000000000000 --- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.py +++ /dev/null @@ -1,117 +0,0 @@ -# -# Copyright (c) 2022 Airbyte, Inc., all rights reserved. -# - -from typing import List - -from airbyte_cdk.models import AdvancedAuth, AuthFlowType, OAuthConfigSpecification -from airbyte_cdk.sources.utils.schema_helpers import expand_refs -from pydantic import BaseModel, Extra, Field -from source_amazon_ads.constants import AmazonAdsRegion - - -class AmazonAdsConfig(BaseModel): - class Config: - title = "Amazon Ads Spec" - # ignore extra attributes during model initialization - # https://pydantic-docs.helpmanual.io/usage/model_config/ - extra = Extra.ignore - # it's default, but better to be more explicit - schema_extra = {"additionalProperties": True} - - auth_type: str = Field(default="oauth2.0", const=True, order=0) - - client_id: str = Field( - title="Client ID", - description='The client ID of your Amazon Ads developer application. See the docs for more information.', - order=1, - ) - - client_secret: str = Field( - title="Client Secret", - description='The client secret of your Amazon Ads developer application. See the docs for more information.', - airbyte_secret=True, - order=2, - ) - - refresh_token: str = Field( - title="Refresh Token", - description='Amazon Ads refresh token. See the docs for more information on how to obtain this token.', - airbyte_secret=True, - order=3, - ) - - region: AmazonAdsRegion = Field( - title="Region *", - description='Region to pull data from (EU/NA/FE/SANDBOX). See docs for more details.', - default=AmazonAdsRegion.NA, - order=4, - ) - - report_wait_timeout: int = Field( - title="Report Wait Timeout *", - description="Timeout duration in minutes for Reports. Default is 30 minutes.", - default=30, - examples=[30, 120], - order=5, - ) - - report_generation_max_retries: int = Field( - title="Report Generation Maximum Retries *", - description="Maximum retries Airbyte will attempt for fetching report data. Default is 5.", - default=5, - examples=[5, 10, 15], - order=6, - ) - - start_date: str = Field( - None, - title="Start Date (Optional)", - description="The Start date for collecting reports, should not be more than 60 days in the past. In YYYY-MM-DD format", - examples=["2022-10-10", "2022-10-22"], - order=7, - ) - - profiles: List[int] = Field( - None, - title="Profile IDs (Optional)", - description='Profile IDs you want to fetch data for. See docs for more details.', - order=8, - ) - - @classmethod - def schema(cls, **kwargs): - schema = super().schema(**kwargs) - expand_refs(schema) - # Transform pydantic generated enum for region - if schema["properties"]["region"].get("allOf"): - schema["properties"]["region"] = {**schema["properties"]["region"]["allOf"][0], **schema["properties"]["region"]} - schema["properties"]["region"].pop("allOf") - return schema - - -advanced_auth = AdvancedAuth( - auth_flow_type=AuthFlowType.oauth2_0, - predicate_key=["auth_type"], - predicate_value="oauth2.0", - oauth_config_specification=OAuthConfigSpecification( - complete_oauth_output_specification={ - "type": "object", - "additionalProperties": False, - "properties": {"refresh_token": {"type": "string", "path_in_connector_config": ["refresh_token"]}}, - }, - complete_oauth_server_input_specification={ - "type": "object", - "additionalProperties": False, - "properties": {"client_id": {"type": "string"}, "client_secret": {"type": "string"}}, - }, - complete_oauth_server_output_specification={ - "type": "object", - "additionalProperties": False, - "properties": { - "client_id": {"type": "string", "path_in_connector_config": ["client_id"]}, - "client_secret": {"type": "string", "path_in_connector_config": ["client_secret"]}, - }, - }, - ), -) diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.yaml b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.yaml new file mode 100644 index 000000000000..ee50f4b4e95e --- /dev/null +++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/spec.yaml @@ -0,0 +1,128 @@ +--- +documentationUrl: https://docs.airbyte.com/integrations/sources/amazon-ads +connectionSpecification: + title: Amazon Ads Spec + type: object + properties: + auth_type: + title: Auth Type + const: oauth2.0 + order: 0 + type: string + client_id: + title: Client ID + description: + The client ID of your Amazon Ads developer application. See the + docs + for more information. + order: 1 + type: string + client_secret: + title: Client Secret + description: + The client secret of your Amazon Ads developer application. See + the docs + for more information. + airbyte_secret: true + order: 2 + type: string + refresh_token: + title: Refresh Token + description: + Amazon Ads refresh token. See the docs + for more information on how to obtain this token. + airbyte_secret: true + order: 3 + type: string + region: + title: Region * + description: + Region to pull data from (EU/NA/FE/SANDBOX). See docs + for more details. + enum: + - NA + - EU + - FE + - SANDBOX + type: string + default: NA + order: 4 + report_wait_timeout: + title: Report Wait Timeout * + description: Timeout duration in minutes for Reports. Default is 30 minutes. + default: 30 + examples: + - 30 + - 120 + order: 5 + type: integer + report_generation_max_retries: + title: Report Generation Maximum Retries * + description: + Maximum retries Airbyte will attempt for fetching report data. + Default is 5. + default: 5 + examples: + - 5 + - 10 + - 15 + order: 6 + type: integer + start_date: + title: Start Date (Optional) + description: + The Start date for collecting reports, should not be more than + 60 days in the past. In YYYY-MM-DD format + examples: + - "2022-10-10" + - "2022-10-22" + order: 7 + type: string + profiles: + title: Profile IDs (Optional) + description: + Profile IDs you want to fetch data for. See docs + for more details. + order: 8 + type: array + items: + type: integer + required: + - client_id + - client_secret + - refresh_token + additionalProperties: true +advanced_auth: + auth_flow_type: oauth2.0 + predicate_key: + - auth_type + predicate_value: oauth2.0 + oauth_config_specification: + complete_oauth_output_specification: + type: object + additionalProperties: false + properties: + refresh_token: + type: string + path_in_connector_config: + - refresh_token + complete_oauth_server_input_specification: + type: object + additionalProperties: false + properties: + client_id: + type: string + client_secret: + type: string + complete_oauth_server_output_specification: + type: object + additionalProperties: false + properties: + client_id: + type: string + path_in_connector_config: + - client_id + client_secret: + type: string + path_in_connector_config: + - client_secret diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/common.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/common.py index c983af4e9587..f84b59a0f16a 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/common.py +++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/common.py @@ -14,7 +14,6 @@ from source_amazon_ads.constants import URL_MAPPING from source_amazon_ads.schemas import CatalogModel from source_amazon_ads.schemas.profile import Profile -from source_amazon_ads.spec import AmazonAdsConfig """ This class hierarchy may seem overcomplicated so here is a visualization of @@ -74,10 +73,10 @@ class BasicAmazonAdsStream(Stream, ABC): Base class for all Amazon Ads streams. """ - def __init__(self, config: AmazonAdsConfig, profiles: List[Profile] = None): + def __init__(self, config: Mapping[str, Any], profiles: List[Profile] = None): self._profiles = profiles or [] - self._client_id = config.client_id - self._url = URL_MAPPING[config.region] + self._client_id = config["client_id"] + self._url = URL_MAPPING[config["region"]] @property @abstractmethod @@ -98,7 +97,7 @@ class AmazonAdsStream(HttpStream, BasicAmazonAdsStream): Class for getting data from streams that based on single http request. """ - def __init__(self, config: AmazonAdsConfig, *args, profiles: List[Profile] = None, **kwargs): + def __init__(self, config: Mapping[str, Any], *args, profiles: List[Profile] = None, **kwargs): # Each AmazonAdsStream instance are dependant on list of profiles. BasicAmazonAdsStream.__init__(self, config, profiles=profiles) HttpStream.__init__(self, *args, **kwargs) diff --git a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py index 369137d387a5..4ebaa733978f 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py +++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/report_streams/report_streams.py @@ -22,7 +22,6 @@ from pendulum import DateTime from pydantic import BaseModel from source_amazon_ads.schemas import CatalogModel, MetricsReport, Profile -from source_amazon_ads.spec import AmazonAdsConfig from source_amazon_ads.streams.common import BasicAmazonAdsStream logger = AirbyteLogger() @@ -101,14 +100,14 @@ class ReportStream(BasicAmazonAdsStream, ABC): REPORT_DATE_FORMAT = "YYYYMMDD" cursor_field = "reportDate" - def __init__(self, config: AmazonAdsConfig, profiles: List[Profile], authenticator: Oauth2Authenticator): + def __init__(self, config: Mapping[str, Any], profiles: List[Profile], authenticator: Oauth2Authenticator): self._authenticator = authenticator self._session = requests.Session() self._model = self._generate_model() - self.report_wait_timeout = timedelta(minutes=config.report_wait_timeout).total_seconds - self.report_generation_maximum_retries = config.report_generation_max_retries + self.report_wait_timeout = timedelta(minutes=config.get("report_wait_timeout", 30)).total_seconds + self.report_generation_maximum_retries = config.get("report_generation_max_retries", 5) # Set start date from config file, should be in UTC timezone. - self._start_date = pendulum.parse(config.start_date).set(tz="UTC") if config.start_date else None + self._start_date = pendulum.parse(config.get("start_date")).set(tz="UTC") if config.get("start_date") else None super().__init__(config, profiles) @property diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/conftest.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/conftest.py index a774e5e53153..727f81d7001f 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/conftest.py +++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/conftest.py @@ -6,12 +6,13 @@ @fixture -def test_config(): +def config(): return { "client_id": "test_client_id", "client_secret": "test_client_secret", "scope": "test_scope", "refresh_token": "test_refresh", + "region": "NA", } diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py index 07d3b51b7c10..3edac2ffabc5 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py +++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_report_streams.py @@ -13,7 +13,6 @@ from pytest import raises from requests.exceptions import ConnectionError from source_amazon_ads.schemas.profile import AccountInfo, Profile -from source_amazon_ads.spec import AmazonAdsConfig from source_amazon_ads.streams import ( SponsoredBrandsReportStream, SponsoredBrandsVideoReportStream, @@ -105,14 +104,13 @@ def make_profiles(profile_type="seller"): @responses.activate -def test_display_report_stream(test_config): +def test_display_report_stream(config): setup_responses( init_response=REPORT_INIT_RESPONSE, status_response=REPORT_STATUS_RESPONSE, metric_response=METRIC_RESPONSE, ) - config = AmazonAdsConfig(**test_config) profiles = make_profiles() stream = SponsoredDisplayReportStream(config, profiles, authenticator=mock.MagicMock()) @@ -130,14 +128,13 @@ def test_display_report_stream(test_config): @responses.activate -def test_products_report_stream(test_config): +def test_products_report_stream(config): setup_responses( init_response_products=REPORT_INIT_RESPONSE, status_response=REPORT_STATUS_RESPONSE, metric_response=METRIC_RESPONSE, ) - config = AmazonAdsConfig(**test_config) profiles = make_profiles(profile_type="vendor") stream = SponsoredProductsReportStream(config, profiles, authenticator=mock.MagicMock()) @@ -147,14 +144,13 @@ def test_products_report_stream(test_config): @responses.activate -def test_brands_report_stream(test_config): +def test_brands_report_stream(config): setup_responses( init_response_brands=REPORT_INIT_RESPONSE, status_response=REPORT_STATUS_RESPONSE, metric_response=METRIC_RESPONSE, ) - config = AmazonAdsConfig(**test_config) profiles = make_profiles() stream = SponsoredBrandsReportStream(config, profiles, authenticator=mock.MagicMock()) @@ -164,14 +160,13 @@ def test_brands_report_stream(test_config): @responses.activate -def test_brands_video_report_stream(test_config): +def test_brands_video_report_stream(config): setup_responses( init_response_brands=REPORT_INIT_RESPONSE, status_response=REPORT_STATUS_RESPONSE, metric_response=METRIC_RESPONSE, ) - config = AmazonAdsConfig(**test_config) profiles = make_profiles() stream = SponsoredBrandsVideoReportStream(config, profiles, authenticator=mock.MagicMock()) @@ -181,8 +176,7 @@ def test_brands_video_report_stream(test_config): @responses.activate -def test_display_report_stream_init_failure(mocker, test_config): - config = AmazonAdsConfig(**test_config) +def test_display_report_stream_init_failure(mocker, config): profiles = make_profiles() stream = SponsoredDisplayReportStream(config, profiles, authenticator=mock.MagicMock()) stream_slice = {"reportDate": "20210725"} @@ -199,9 +193,8 @@ def test_display_report_stream_init_failure(mocker, test_config): @responses.activate -def test_display_report_stream_init_http_exception(mocker, test_config): +def test_display_report_stream_init_http_exception(mocker, config): mocker.patch("time.sleep", lambda x: None) - config = AmazonAdsConfig(**test_config) profiles = make_profiles() stream = SponsoredDisplayReportStream(config, profiles, authenticator=mock.MagicMock()) stream_slice = {"reportDate": "20210725"} @@ -213,9 +206,8 @@ def test_display_report_stream_init_http_exception(mocker, test_config): @responses.activate -def test_display_report_stream_init_too_many_requests(mocker, test_config): +def test_display_report_stream_init_too_many_requests(mocker, config): mocker.patch("time.sleep", lambda x: None) - config = AmazonAdsConfig(**test_config) profiles = make_profiles() stream = SponsoredDisplayReportStream(config, profiles, authenticator=mock.MagicMock()) stream_slice = {"reportDate": "20210725"} @@ -269,7 +261,7 @@ def test_display_report_stream_init_too_many_requests(mocker, test_config): ], ) @responses.activate -def test_display_report_stream_backoff(mocker, test_config, modifiers, expected): +def test_display_report_stream_backoff(mocker, config, modifiers, expected): mocker.patch("time.sleep") setup_responses(init_response=REPORT_INIT_RESPONSE, metric_response=METRIC_RESPONSE) @@ -292,7 +284,6 @@ def __call__(self, request): callback = StatusCallback() responses.add_callback(responses.GET, re.compile(r"https://advertising-api.amazon.com/v2/reports/[^/]+$"), callback=callback) - config = AmazonAdsConfig(**test_config) profiles = make_profiles() stream = SponsoredDisplayReportStream(config, profiles, authenticator=mock.MagicMock()) stream_slice = {"reportDate": "20210725"} @@ -307,8 +298,7 @@ def __call__(self, request): @freeze_time("2021-07-30 04:26:08") @responses.activate -def test_display_report_stream_slices_full_refresh(test_config): - config = AmazonAdsConfig(**test_config) +def test_display_report_stream_slices_full_refresh(config): stream = SponsoredDisplayReportStream(config, None, authenticator=mock.MagicMock()) slices = stream.stream_slices(SyncMode.full_refresh, cursor_field=stream.cursor_field) assert slices == [{"reportDate": "20210730"}] @@ -316,8 +306,7 @@ def test_display_report_stream_slices_full_refresh(test_config): @freeze_time("2021-07-30 04:26:08") @responses.activate -def test_display_report_stream_slices_incremental(test_config): - config = AmazonAdsConfig(**test_config) +def test_display_report_stream_slices_incremental(config): stream = SponsoredDisplayReportStream(config, None, authenticator=mock.MagicMock()) stream_state = {"reportDate": "20210726"} slices = stream.stream_slices(SyncMode.incremental, cursor_field=stream.cursor_field, stream_state=stream_state) diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_source.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_source.py index 812cd676dca7..52876c71b9f7 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_source.py @@ -22,35 +22,35 @@ def setup_responses(): @responses.activate -def test_discover(test_config): +def test_discover(config): setup_responses() source = SourceAmazonAds() - catalog = source.discover(None, test_config) + catalog = source.discover(None, config) catalog = AirbyteMessage(type=Type.CATALOG, catalog=catalog).dict(exclude_unset=True) schemas = [stream["json_schema"] for stream in catalog["catalog"]["streams"]] for schema in schemas: Draft4Validator.check_schema(schema) -def test_spec(test_config): +def test_spec(): source = SourceAmazonAds() - spec = source.spec() + spec = source.spec(None) assert isinstance(spec, ConnectorSpecification) @responses.activate -def test_check(test_config): +def test_check(config): setup_responses() source = SourceAmazonAds() - assert source.check(None, test_config) == AirbyteConnectionStatus(status=Status.SUCCEEDED) + assert source.check(None, config) == AirbyteConnectionStatus(status=Status.SUCCEEDED) assert len(responses.calls) == 2 @responses.activate -def test_source_streams(test_config): +def test_source_streams(config): setup_responses() source = SourceAmazonAds() - streams = source.streams(test_config) + streams = source.streams(config) assert len(streams) == 18 actual_stream_names = {stream.name for stream in streams} expected_stream_names = set( diff --git a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_streams.py b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_streams.py index 2de4fe0a5611..43400b76a9f7 100644 --- a/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_streams.py +++ b/airbyte-integrations/connectors/source-amazon-ads/unit_tests/test_streams.py @@ -78,11 +78,11 @@ def get_stream_by_name(streams, stream_name): @responses.activate -def test_streams_profile(test_config, profiles_response): +def test_streams_profile(config, profiles_response): setup_responses(profiles_response=profiles_response) source = SourceAmazonAds() - streams = source.streams(test_config) + streams = source.streams(config) profile_stream = get_stream_by_name(streams, "profiles") schema = profile_stream.get_json_schema() @@ -97,7 +97,7 @@ def test_streams_profile(test_config, profiles_response): @responses.activate -def test_streams_campaigns_4_vendors(test_config, profiles_response, campaigns_response): +def test_streams_campaigns_4_vendors(config, profiles_response, campaigns_response): profiles_response = json.loads(profiles_response) for profile in profiles_response: profile["accountInfo"]["type"] = "vendor" @@ -105,7 +105,7 @@ def test_streams_campaigns_4_vendors(test_config, profiles_response, campaigns_r setup_responses(profiles_response=profiles_response, campaigns_response=campaigns_response) source = SourceAmazonAds() - streams = source.streams(test_config) + streams = source.streams(config) profile_stream = get_stream_by_name(streams, "profiles") campaigns_stream = get_stream_by_name(streams, "sponsored_display_campaigns") profile_records = get_all_stream_records(profile_stream) @@ -118,7 +118,7 @@ def test_streams_campaigns_4_vendors(test_config, profiles_response, campaigns_r [1, 2, 5, 1000000], ) @responses.activate -def test_streams_campaigns_pagination(mocker, test_config, profiles_response, campaigns_response, page_size): +def test_streams_campaigns_pagination(mocker, config, profiles_response, campaigns_response, page_size): mocker.patch("source_amazon_ads.streams.common.SubProfilesStream.page_size", page_size) profiles_response = json.loads(profiles_response) for profile in profiles_response: @@ -127,7 +127,7 @@ def test_streams_campaigns_pagination(mocker, test_config, profiles_response, ca setup_responses(profiles_response=profiles_response) source = SourceAmazonAds() - streams = source.streams(test_config) + streams = source.streams(config) profile_stream = get_stream_by_name(streams, "profiles") campaigns_stream = get_stream_by_name(streams, "sponsored_display_campaigns") campaigns = json.loads(campaigns_response) @@ -153,7 +153,7 @@ def campaigns_paginated_response_cb(request): @pytest.mark.parametrize(("status_code"), [HTTPStatus.FORBIDDEN, HTTPStatus.UNAUTHORIZED]) @responses.activate -def test_streams_campaigns_pagination_403_error(mocker, status_code, test_config, profiles_response, campaigns_response): +def test_streams_campaigns_pagination_403_error(mocker, status_code, config, profiles_response, campaigns_response): setup_responses(profiles_response=profiles_response) responses.add( responses.GET, @@ -162,7 +162,7 @@ def test_streams_campaigns_pagination_403_error(mocker, status_code, test_config status=status_code, ) source = SourceAmazonAds() - streams = source.streams(test_config) + streams = source.streams(config) campaigns_stream = get_stream_by_name(streams, "sponsored_display_campaigns") with pytest.raises(requests.exceptions.HTTPError): @@ -170,7 +170,7 @@ def test_streams_campaigns_pagination_403_error(mocker, status_code, test_config @responses.activate -def test_streams_campaigns_pagination_403_error_expected(mocker, test_config, profiles_response, campaigns_response): +def test_streams_campaigns_pagination_403_error_expected(mocker, config, profiles_response, campaigns_response): setup_responses(profiles_response=profiles_response) responses.add( responses.GET, @@ -179,7 +179,7 @@ def test_streams_campaigns_pagination_403_error_expected(mocker, test_config, pr status=403, ) source = SourceAmazonAds() - streams = source.streams(test_config) + streams = source.streams(config) campaigns_stream = get_stream_by_name(streams, "sponsored_display_campaigns") campaigns_records = get_all_stream_records(campaigns_stream) @@ -196,7 +196,7 @@ def test_streams_campaigns_pagination_403_error_expected(mocker, test_config, pr ) @responses.activate def test_streams_displays( - test_config, + config, stream_name, endpoint, profiles_response, @@ -212,7 +212,7 @@ def test_streams_displays( ) source = SourceAmazonAds() - streams = source.streams(test_config) + streams = source.streams(config) test_stream = get_stream_by_name(streams, stream_name) records = get_all_stream_records(test_stream) @@ -238,11 +238,11 @@ def test_streams_displays( ], ) @responses.activate -def test_streams_brands_and_products(test_config, stream_name, endpoint, profiles_response): +def test_streams_brands_and_products(config, stream_name, endpoint, profiles_response): setup_responses(profiles_response=profiles_response, generic_response=endpoint) source = SourceAmazonAds() - streams = source.streams(test_config) + streams = source.streams(config) test_stream = get_stream_by_name(streams, stream_name) records = get_all_stream_records(test_stream)