Skip to content

Commit 9f2d717

Browse files
✨ Source Facebook Marketing: remove testing deleted records from integration test, move it to mock server tests (#37095)
1 parent f3a3b98 commit 9f2d717

File tree

7 files changed

+421
-183
lines changed

7 files changed

+421
-183
lines changed

airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py

-182
This file was deleted.

airbyte-integrations/connectors/source-facebook-marketing/unit_tests/integration/config.py

+12
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,17 @@ def with_end_date(self, end_date: datetime) -> ConfigBuilder:
5151
self._config["end_date"] = end_date.strftime(DATE_TIME_FORMAT)
5252
return self
5353

54+
def with_ad_statuses(self, statuses: List[str]) -> ConfigBuilder:
55+
self._config["ad_statuses"] = statuses
56+
return self
57+
58+
def with_campaign_statuses(self, statuses: List[str]) -> ConfigBuilder:
59+
self._config["campaign_statuses"] = statuses
60+
return self
61+
62+
def with_ad_set_statuses(self, statuses: List[str]) -> ConfigBuilder:
63+
self._config["adset_statuses"] = statuses
64+
return self
65+
5466
def build(self) -> MutableMapping[str, Any]:
5567
return self._config

airbyte-integrations/connectors/source-facebook-marketing/unit_tests/integration/request_builder.py

+54-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from __future__ import annotations
77

8-
from typing import Any, List, Mapping, Optional, Union
8+
from typing import Any, Dict, List, Mapping, Optional, Union
99

1010
from airbyte_cdk.test.mock_http.request import HttpRequest
1111

@@ -16,7 +16,30 @@ def get_account_request(account_id: Optional[str] = ACCOUNT_ID) -> RequestBuilde
1616
return RequestBuilder.get_account_endpoint(access_token=ACCESS_TOKEN, account_id=account_id)
1717

1818

19+
def get_ads_request(account_id: Optional[str] = ACCOUNT_ID) -> RequestBuilder:
20+
return RequestBuilder.get_ad_endpoint(access_token=ACCESS_TOKEN, account_id=account_id)
21+
22+
23+
def get_campaigns_request(account_id: Optional[str] = ACCOUNT_ID) -> RequestBuilder:
24+
return RequestBuilder.get_campaign_endpoint(access_token=ACCESS_TOKEN, account_id=account_id)
25+
26+
27+
def get_ad_sets_request(account_id: Optional[str] = ACCOUNT_ID) -> RequestBuilder:
28+
return RequestBuilder.get_ad_sets_endpoint(access_token=ACCESS_TOKEN, account_id=account_id)
29+
30+
1931
class RequestBuilder:
32+
@classmethod
33+
def get_ad_endpoint(cls, access_token: str, account_id: str) -> RequestBuilder:
34+
return cls(access_token=access_token, resource="ads").with_account_id(account_id)
35+
36+
@classmethod
37+
def get_campaign_endpoint(cls, access_token: str, account_id: str) -> RequestBuilder:
38+
return cls(access_token=access_token, resource="campaigns").with_account_id(account_id)
39+
40+
@classmethod
41+
def get_ad_sets_endpoint(cls, access_token: str, account_id: str) -> RequestBuilder:
42+
return cls(access_token=access_token, resource="adsets").with_account_id(account_id)
2043

2144
@classmethod
2245
def get_account_endpoint(cls, access_token: str, account_id: str) -> RequestBuilder:
@@ -68,6 +91,10 @@ def with_body(self, body: Union[str, bytes, Mapping[str, Any]]) -> RequestBuilde
6891
self._body = body
6992
return self
7093

94+
def with_filtering(self, filters: List[Dict[str, Any]]):
95+
self._query_params["filtering"] = self._get_formatted_filters(filters)
96+
return self
97+
7198
def build(self) -> HttpRequest:
7299
return HttpRequest(
73100
url=f"https://graph.facebook.com/v19.0/{self._account_sub_path()}{self._resource}",
@@ -81,3 +108,29 @@ def _account_sub_path(self) -> str:
81108
@staticmethod
82109
def _get_formatted_fields(fields: List[str]) -> str:
83110
return ",".join(fields)
111+
112+
@staticmethod
113+
def _get_formatted_filters(filters: List[Dict[str, Any]]) -> str:
114+
"""
115+
Used to create an acceptable by fb query param from list of dict filters in string format
116+
From:
117+
[{"field": "ad.effective_status", "operator": "IN", "value": ["ACTIVE", "ARCHIVED"]}, {"field": "ad.updated_time", "operator": "GREATER_THAN", "value": 1672531200}]
118+
To:
119+
'[{"field":"ad.effective_status","operator":"IN","value":["ACTIVE","ARCHIVED"]},' '{"field":"ad.updated_time","operator":"GREATER_THAN","value":1672531200}]'
120+
"""
121+
field_filter = []
122+
field_filters = []
123+
for f in filters:
124+
for key, value in f.items():
125+
if isinstance(value, list):
126+
value = ",".join([f'"{s}"' for s in value])
127+
field_filter.append(f'"{key}":[{value}]')
128+
elif isinstance(value, int):
129+
field_filter.append(f'"{key}":{value}')
130+
else:
131+
field_filter.append(f'"{key}":"{value}"')
132+
field_filters.append("{" + f'{",".join(field_filter)}' + "}")
133+
field_filter = []
134+
135+
field_filters_str = f'[{",".join(field_filters)}]'
136+
return field_filters_str

0 commit comments

Comments
 (0)