Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🎉 Source facebook-marketing: add activities stream #10655

Merged
merged 13 commits into from
Mar 1, 2022
Merged

🎉 Source facebook-marketing: add activities stream #10655

merged 13 commits into from
Mar 1, 2022

Conversation

PhilipCorr
Copy link
Contributor

@PhilipCorr PhilipCorr commented Feb 25, 2022

What

Add a source for Activities to the facebook-marketing-source integration.

Closes #10705

How

Activities has been added as a FBMarketingIncrementalStream stream.

I had to override read_records because the facebook_business.adobjects.adactivity object doesn't have an api_get method. This is because the data is returned from the first call rather than returning an object with an id to be further queried using api_get.

I also had to override _state_filter because the filter uses since which is different to how the insights filters work.
It is also possible to set a parameter called until. I have left this out for now as the end date isn't used in the other streams either as far as I can see.

Recommended reading order

  1. configured_catalog_without_insights.json
  2. activities.json
  3. source.py
  4. streams.py

Pre-merge Checklist

Updating a connector

Community member or Airbyter

  • Grant edit access to maintainers (instructions)
  • Secrets in the connector's spec are annotated with airbyte_secret
  • Unit & integration tests added and passing. Community members, please provide proof of success locally e.g: screenshot or copy-paste unit, integration, and acceptance test output. To run acceptance tests for a Python connector, follow instructions in the README. For java connectors run ./gradlew :airbyte-integrations:connectors:<name>:integrationTest.
  • Code reviews completed
  • Documentation updated
    • Connector's README.md
    • Connector's bootstrap.md. See description and examples
    • Changelog updated in docs/integrations/<source or destination>/<name>.md including changelog. See changelog example
  • PR name follows PR naming conventions

Airbyter

If this is a community PR, the Airbyte engineer reviewing this PR is responsible for the below items.

  • Create a non-forked branch based on this PR and test the below items on it
  • Build is successful
  • Credentials added to Github CI. Instructions.
  • /test connector=connectors/<name> command is passing
  • New Connector version released on Dockerhub by running the /publish command described here
  • After the new connector version is published, connector version bumped in the seed directory as described here
  • Seed specs have been re-generated by building the platform and committing the changes to the seed spec files, as described here

Tests

The unit tests are all passing.

A few integration tests are failing but these are not related to my changes and are tests that expect a specific number of results to be returned. I expect a special airbyte account is needed to get these to pass?

A few of the acceptance tests are failing. Again, these are unrelated to my changes and are failing even when I run the acceptance tests against the master branch.

Unit
(virtualenv) ➜  source-facebook-marketing git:(phil/add-facebook-marketing-activities-stream) python -m pytest unit_tests
Test session starts (platform: darwin, Python 3.8.7, pytest 6.2.5, pytest-sugar 0.9.4)
cachedir: .pytest_cache
rootdir: /Users/phil/Repos/airbyte, configfile: pytest.ini
plugins: sugar-0.9.4, requests-mock-1.9.3, mock-3.7.0, timeout-1.4.2
collecting ... {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495048512'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestUpdateInBatch.test_less_jobs ✓                                                                                                                                                                                                                                                                                        1% ▎         {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495891088'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestUpdateInBatch.test_more_jobs ✓                                                                                                                                                                                                                                                                                        3% ▍         {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496263056'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestUpdateInBatch.test_failed_execution ✓                                                                                                                                                                                                                                                                                 4% ▌         {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495808736'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_start ✓                                                                                                                                                                                                                                                                                          6% ▋         {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496360976'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_start_already_started ✓                                                                                                                                                                                                                                                                          7% ▊         {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496103264'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496103264'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 0 complete (Job Failed)"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496103264'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): has status Job Failed after 0 seconds."}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496103264'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496103264'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): restarted."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_restart ✓                                                                                                                                                                                                                                                                                        9% ▉         {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496502112'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_restart_when_job_not_failed ✓                                                                                                                                                                                                                                                                   10% █         
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_restart_when_job_not_started ✓                                                                                                                                                                                                                                                                  12% █▎        
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_update_job_not_started ✓                                                                                                                                                                                                                                                                        13% █▍        {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496559888'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496559888'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 100 complete (Job Completed)"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496559888'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 100 complete (Job Completed)"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_update_job_on_completed_job ✓                                                                                                                                                                                                                                                                   14% █▌        {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496361072'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496361072'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 0 complete (Job Running)"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_update_job ✓                                                                                                                                                                                                                                                                                    16% █▋        {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495812016'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495812016'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 0 complete (Job Running)"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495812016'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): run more than maximum allowed time 0 microseconds."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_update_job_expired ✓                                                                                                                                                                                                                                                                            17% █▊        {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496595840'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496595840'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 100 complete (Job Completed)"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496595840'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): Request failed with response: Some error."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_update_job_with_batch ✓                                                                                                                                                                                                                                                                         19% █▉        {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496719984'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496719984'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 0 complete (Job Completed)"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_elapsed_time ✓                                                                                                                                                                                                                                                                                  20% ██        
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_completed_without_start ✓                                                                                                                                                                                                                                                                       22% ██▎       {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495821072'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495821072'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 100 complete (Job Completed)"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_completed_ok ✓                                                                                                                                                                                                                                                                                  23% ██▍       {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495841840'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495841840'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 0 complete (Job Failed)"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4495841840'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): has status Job Failed after 0 seconds."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_completed_failed ✓                                                                                                                                                                                                                                                                              25% ██▌       {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496625040'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496625040'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 0 complete (Job Failed)"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496625040'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): has status Job Failed after 0 seconds."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_completed_skipped ✓                                                                                                                                                                                                                                                                             26% ██▋       
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_failed_no ✓                                                                                                                                                                                                                                                                                     28% ██▊       {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496029392'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496029392'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 0 complete (Job Failed)"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496029392'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): has status Job Failed after 0 seconds."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_failed_yes ✓                                                                                                                                                                                                                                                                                    29% ██▉       
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_str ✓                                                                                                                                                                                                                                                                                           30% ███▏      {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496657040'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_get_result ✓                                                                                                                                                                                                                                                                                    32% ███▎      
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_get_result_when_job_is_not_started ✓                                                                                                                                                                                                                                                            33% ███▍      {"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496385360'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): created AdReportRun"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496385360'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): is 0 complete (Job Failed)"}}
{"type": "LOG", "log": {"level": "INFO", "message": "InsightAsyncJob(id=123, <Mock spec='AdAccount' id='4496385360'>, time_range=<Period [2019-01-01 -> 2019-01-01]>, breakdowns=[]): has status Job Failed after 0 seconds."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_get_result_when_job_is_failed ✓                                                                                                                                                                                                                                                                 35% ███▌      {"type": "LOG", "log": {"level": "INFO", "message": "Got 3 campaign_ids for period <Period [2010-01-01 -> 2010-01-10]>: {1, 2, 3}"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_split_job[AdAccount-Campaign-campaign_id] ✓                                                                                                                                                                                                                                                     36% ███▋      {"type": "LOG", "log": {"level": "INFO", "message": "Got 3 adset_ids for period <Period [2010-01-01 -> 2010-01-10]>: {1, 2, 3}"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_split_job[Campaign-AdSet-adset_id] ✓                                                                                                                                                                                                                                                            38% ███▊      {"type": "LOG", "log": {"level": "INFO", "message": "Got 3 ad_ids for period <Period [2010-01-01 -> 2010-01-10]>: {1, 2, 3}"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_split_job[AdSet-Ad-ad_id] ✓                                                                                                                                                                                                                                                                     39% ███▉      
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestInsightAsyncJob.test_split_job_smallest ✓                                                                                                                                                                                                                                                                            41% ████▏     
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestParentAsyncJob.test_start ✓                                                                                                                                                                                                                                                                                          42% ████▎     
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestParentAsyncJob.test_restart ✓                                                                                                                                                                                                                                                                                        43% ████▍     
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestParentAsyncJob.test_completed ✓                                                                                                                                                                                                                                                                                      45% ████▌     
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestParentAsyncJob.test_update_job ✓                                                                                                                                                                                                                                                                                     46% ████▋     
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestParentAsyncJob.test_get_result ✓                                                                                                                                                                                                                                                                                     48% ████▊     
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestParentAsyncJob.test_split_job ✓                                                                                                                                                                                                                                                                                      49% ████▉     
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py::TestParentAsyncJob.test_str ✓                                                                                                                                                                                                                                                                                            51% █████▏    {"type": "LOG", "log": {"level": "INFO", "message": "Added: 0 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 0/100 job(s) in queue"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job_manager.py::TestInsightAsyncManager.test_jobs_empty ✓                                                                                                                                                                                                                                                                        52% █████▎    {"type": "LOG", "log": {"level": "INFO", "message": "Added: 2 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 2/100 job(s) in queue"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Completed jobs: 2, Failed jobs: 0, Running jobs: 0"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Added: 0 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 0/100 job(s) in queue"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job_manager.py::TestInsightAsyncManager.test_jobs_completed_immediately ✓                                                                                                                                                                                                                                                        54% █████▍    {"type": "LOG", "log": {"level": "INFO", "message": "Added: 2 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 2/100 job(s) in queue"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Completed jobs: 1, Failed jobs: 0, Running jobs: 1"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Completed jobs: 0, Failed jobs: 0, Running jobs: 1"}}
{"type": "LOG", "log": {"level": "INFO", "message": "No jobs ready to be consumed, wait for 30 seconds"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Completed jobs: 1, Failed jobs: 0, Running jobs: 0"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Added: 0 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 0/100 job(s) in queue"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job_manager.py::TestInsightAsyncManager.test_jobs_wait ✓                                                                                                                                                                                                                                                                         55% █████▌    {"type": "LOG", "log": {"level": "INFO", "message": "Added: 2 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 2/100 job(s) in queue"}}
{"type": "LOG", "log": {"level": "INFO", "message": "<Mock spec='InsightAsyncJob' id='4496553536'>: failed, restarting"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Completed jobs: 1, Failed jobs: 1, Running jobs: 1"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Completed jobs: 1, Failed jobs: 0, Running jobs: 0"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Added: 0 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 0/100 job(s) in queue"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job_manager.py::TestInsightAsyncManager.test_job_restarted ✓                                                                                                                                                                                                                                                                     57% █████▋    {"type": "LOG", "log": {"level": "INFO", "message": "Added: 2 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 2/100 job(s) in queue"}}
{"type": "LOG", "log": {"level": "INFO", "message": "<Mock spec='InsightAsyncJob' id='4495812448'>: failed second time, trying to split job into smaller jobs."}}
{"type": "LOG", "log": {"level": "INFO", "message": "Completed jobs: 1, Failed jobs: 1, Running jobs: 1"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Completed jobs: 1, Failed jobs: 0, Running jobs: 0"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Added: 0 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 0/100 job(s) in queue"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job_manager.py::TestInsightAsyncManager.test_job_split ✓                                                                                                                                                                                                                                                                         58% █████▊    {"type": "LOG", "log": {"level": "INFO", "message": "Added: 2 jobs. Current throttle limit is MyFacebookAdsApi.Throttle(per_application=0, per_account=0), 2/100 job(s) in queue"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job_manager.py::TestInsightAsyncManager.test_job_failed_too_many_times ✓                                                                                                                                                                                                                                                         59% █████▉    {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_init ✓                                                                                                                                                                                                                                                                            61% ██████▏   {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_init_override ✓                                                                                                                                                                                                                                                                   62% ██████▎   {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_read_records_all ✓                                                                                                                                                                                                                                                                64% ██████▍   {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_read_records_random_order ✓                                                                                                                                                                                                                                                       65% ██████▌   {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}
{"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_state[state0] ✓                                                                                                                                                                                                                                                                   67% ██████▋   {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}
{"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_state[state1] ✓                                                                                                                                                                                                                                                                   68% ██████▊   {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}
{"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_state[state2] ✓                                                                                                                                                                                                                                                                   70% ██████▉   
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_stream_slices_no_state ✓                                                                                                                                                                                                                                                          71% ███████▏  
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_stream_slices_no_state_close_to_now ✓                                                                                                                                                                                                                                             72% ███████▎  
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_stream_slices_with_state ✓                                                                                                                                                                                                                                                        74% ███████▍  {"type": "LOG", "log": {"level": "INFO", "message": "The cursor value within refresh period (4 weeks), start sync from 2022-01-31 instead."}}
{"type": "LOG", "log": {"level": "WARN", "message": "Ignore provided state and start sync from start_date (2022-02-18)."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_stream_slices_with_state_close_to_now ✓                                                                                                                                                                                                                                           75% ███████▋  
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_stream_slices_with_state_and_slices ✓                                                                                                                                                                                                                                             77% ███████▊  {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_get_json_schema ✓                                                                                                                                                                                                                                                                 78% ███████▉  {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_get_json_schema_custom ✓                                                                                                                                                                                                                                                          80% ████████  {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_fields ✓                                                                                                                                                                                                                                                                          81% ████████▎ {"type": "LOG", "log": {"level": "WARN", "message": "Loading insights older then 37 months is not possible. Start sync from 2019-01-28."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_base_insight_streams.py::TestBaseInsightsStream.test_fields_custom ✓                                                                                                                                                                                                                                                                   83% ████████▍ {"type": "LOG", "log": {"level": "INFO", "message": "Backing off call(...) for 5.0s (facebook_business.exceptions.FacebookRequestError: \n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_unknown_account/campaigns\n  Params:  {'limit': 100, 'filtering': '[{\"field\":\"campaign.updated_time\",\"operator\":\"GREATER_THAN\",\"value\":1646062301}]', 'summary': 'true'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"(#80000) There have been too many calls from this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting.\",\n        \"type\": \"OAuthException\",\n        \"code\": 80000,\n        \"error_subcode\": 2446079,\n        \"fbtrace_id\": \"this_is_fake_response\"\n      }\n    })"}}
{"type": "LOG", "log": {"level": "INFO", "message": "\n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_unknown_account/campaigns\n  Params:  {'limit': 100, 'filtering': '[{\"field\":\"campaign.updated_time\",\"operator\":\"GREATER_THAN\",\"value\":1646062301}]', 'summary': 'true'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"(#80000) There have been too many calls from this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting.\",\n        \"type\": \"OAuthException\",\n        \"code\": 80000,\n        \"error_subcode\": 2446079,\n        \"fbtrace_id\": \"this_is_fake_response\"\n      }\n    }\n"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Caught retryable error after 1 tries. Waiting 5 more seconds then retrying..."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_client.py::TestBackoff.test_limit_reached ✓                                                                                                                                                                                                                                                                                            84% ████████▌ {"type": "LOG", "log": {"level": "INFO", "message": "Backing off call(...) for 5.0s (facebook_business.exceptions.FacebookRequestError: \n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_unknown_account/adcreatives\n  Params:  {'limit': 100, 'summary': 'true'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"(#80000) There have been too many calls from this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting.\",\n        \"type\": \"OAuthException\",\n        \"code\": 80000,\n        \"error_subcode\": 2446079,\n        \"fbtrace_id\": \"this_is_fake_response\"\n      }\n    })"}}
{"type": "LOG", "log": {"level": "INFO", "message": "\n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_unknown_account/adcreatives\n  Params:  {'limit': 100, 'summary': 'true'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"(#80000) There have been too many calls from this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting.\",\n        \"type\": \"OAuthException\",\n        \"code\": 80000,\n        \"error_subcode\": 2446079,\n        \"fbtrace_id\": \"this_is_fake_response\"\n      }\n    }\n"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Caught retryable error after 1 tries. Waiting 5 more seconds then retrying..."}}
{"type": "LOG", "log": {"level": "INFO", "message": "Backing off call(...) for 5.0s (facebook_business.exceptions.FacebookRequestError: \n\n  Message: Call was not successful\n  Method:  POST\n  Path:    https://graph.facebook.com/v12.0/\n  Params:  {'batch': '[{\"method\":\"GET\",\"relative_url\":\"123/?fields=body%2Cobject_story_id%2Cimage_url%2Cid%2Caccount_id%2Cactor_id%2Cadlabels%2Capplink_treatment%2Casset_feed_spec%2Ccall_to_action_type%2Ceffective_instagram_story_id%2Ceffective_object_story_id%2Ctitle%2Cname%2Cimage_crops%2Cinstagram_actor_id%2Cinstagram_permalink_url%2Cinstagram_story_id%2Clink_og_id%2Cobject_id%2Cobject_story_spec%2Cobject_type%2Cobject_url%2Cproduct_set_id%2Cstatus%2Ctemplate_url%2Ctemplate_url_spec%2Cthumbnail_url%2Cimage_hash%2Curl_tags%2Cvideo_id%2Clink_url\"},{\"method\":\"GET\",\"relative_url\":\"1234/?fields=body%2Cobject_story_id%2Cimage_url%2Cid%2Caccount_id%2Cactor_id%2Cadlabels%2Capplink_treatment%2Casset_feed_spec%2Ccall_to_action_type%2Ceffective_instagram_story_id%2Ceffective_object_story_id%2Ctitle%2Cname%2Cimage_crops%2Cinstagram_actor_id%2Cinstagram_permalink_url%2Cinstagram_story_id%2Clink_og_id%2Cobject_id%2Cobject_story_spec%2Cobject_type%2Cobject_url%2Cproduct_set_id%2Cstatus%2Ctemplate_url%2Ctemplate_url_spec%2Cthumbnail_url%2Cimage_hash%2Curl_tags%2Cvideo_id%2Clink_url\"}]'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"(#80000) There have been too many calls from this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting.\",\n        \"type\": \"OAuthException\",\n        \"code\": 80000,\n        \"error_subcode\": 2446079,\n        \"fbtrace_id\": \"this_is_fake_response\"\n      }\n    })"}}
{"type": "LOG", "log": {"level": "INFO", "message": "\n\n  Message: Call was not successful\n  Method:  POST\n  Path:    https://graph.facebook.com/v12.0/\n  Params:  {'batch': '[{\"method\":\"GET\",\"relative_url\":\"123/?fields=body%2Cobject_story_id%2Cimage_url%2Cid%2Caccount_id%2Cactor_id%2Cadlabels%2Capplink_treatment%2Casset_feed_spec%2Ccall_to_action_type%2Ceffective_instagram_story_id%2Ceffective_object_story_id%2Ctitle%2Cname%2Cimage_crops%2Cinstagram_actor_id%2Cinstagram_permalink_url%2Cinstagram_story_id%2Clink_og_id%2Cobject_id%2Cobject_story_spec%2Cobject_type%2Cobject_url%2Cproduct_set_id%2Cstatus%2Ctemplate_url%2Ctemplate_url_spec%2Cthumbnail_url%2Cimage_hash%2Curl_tags%2Cvideo_id%2Clink_url\"},{\"method\":\"GET\",\"relative_url\":\"1234/?fields=body%2Cobject_story_id%2Cimage_url%2Cid%2Caccount_id%2Cactor_id%2Cadlabels%2Capplink_treatment%2Casset_feed_spec%2Ccall_to_action_type%2Ceffective_instagram_story_id%2Ceffective_object_story_id%2Ctitle%2Cname%2Cimage_crops%2Cinstagram_actor_id%2Cinstagram_permalink_url%2Cinstagram_story_id%2Clink_og_id%2Cobject_id%2Cobject_story_spec%2Cobject_type%2Cobject_url%2Cproduct_set_id%2Cstatus%2Ctemplate_url%2Ctemplate_url_spec%2Cthumbnail_url%2Cimage_hash%2Curl_tags%2Cvideo_id%2Clink_url\"}]'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"(#80000) There have been too many calls from this ad-account. Wait a bit and try again. For more info, please refer to https://developers.facebook.com/docs/graph-api/overview/rate-limiting.\",\n        \"type\": \"OAuthException\",\n        \"code\": 80000,\n        \"error_subcode\": 2446079,\n        \"fbtrace_id\": \"this_is_fake_response\"\n      }\n    }\n"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Caught retryable error after 1 tries. Waiting 5 more seconds then retrying..."}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_client.py::TestBackoff.test_batch_limit_reached ✓                                                                                                                                                                                                                                                                                      86% ████████▋ {"type": "LOG", "log": {"level": "ERROR", "message": "Giving up call(...) after 1 tries (facebook_business.exceptions.FacebookRequestError: \n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_unknown_account/campaigns\n  Params:  {'limit': 100, 'filtering': '[{\"field\":\"campaign.updated_time\",\"operator\":\"GREATER_THAN\",\"value\":1646062301}]', 'summary': 'true'}\n\n  Status:  500\n  Response:\n    {\n      \"error\": {}\n    })"}}

 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_client.py::TestBackoff.test_server_error ✓                                                                                                                                                                                                                                                                                             87% ████████▊ 
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_deep_merge.py::test_return_new_object ✓                                                                                                                                                                                                                                                                                                88% ████████▉ 
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_deep_merge.py::test_sets ✓                                                                                                                                                                                                                                                                                                             90% █████████ 
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_deep_merge.py::test_lists ✓                                                                                                                                                                                                                                                                                                            91% █████████▎
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_source.py::TestSourceFacebookMarketing.test_check_connection_ok ✓                                                                                                                                                                                                                                                                      93% █████████▍
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_source.py::TestSourceFacebookMarketing.test_check_connection_end_date_before_start_date ✓                                                                                                                                                                                                                                              94% █████████▌
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_source.py::TestSourceFacebookMarketing.test_check_connection_invalid_config ✓                                                                                                                                                                                                                                                          96% █████████▋
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_source.py::TestSourceFacebookMarketing.test_check_connection_exception ✓                                                                                                                                                                                                                                                               97% █████████▊
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_source.py::TestSourceFacebookMarketing.test_streams ✓                                                                                                                                                                                                                                                                                  99% █████████▉
 airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_source.py::TestSourceFacebookMarketing.test_spec ✓                                                                                                                                                                                                                                                                                    100% ██████████

Results (7.08s):
      69 passed
Integration
(virtualenv) ➜  source-facebook-marketing git:(phil/add-facebook-marketing-activities-stream) python -m pytest integration_tests
Test session starts (platform: darwin, Python 3.8.7, pytest 6.2.5, pytest-sugar 0.9.4)
cachedir: .pytest_cache
rootdir: /Users/phil/Repos/airbyte, configfile: pytest.ini
plugins: sugar-0.9.4, requests-mock-1.9.3, mock-3.7.0, timeout-1.4.2
collecting ... {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}


――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestFacebookMarketingSource.test_streams_with_include_deleted[ads-23846756820320398] ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <integration_tests.test_streams.TestFacebookMarketingSource object at 0x108549f40>, stream_name = 'ads', deleted_id = '23846756820320398', config_with_include_deleted = {'access_token': 'EAAvdxUrzEX8BAEd70F1hWS2IIoguqnLhRUMq61w4PGUNIObxUX0gSZC8ZAc7rmrWIR2szqV4EdcIllLnaZCKPpWwynvgclWojZC...cMnSAcnCeZALZA6lAZDZD', 'account_id': '559161321983625', 'include_deleted': True, 'start_date': '2022-02-25T00:00:00Z'}
configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='images', json_schema={}, supporte...emental'>, cursor_field=['date_start'], destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=[])])

    @pytest.mark.parametrize(
        "stream_name, deleted_id", [("ads", "23846756820320398"), ("campaigns", "23846541919710398"), ("ad_sets", "23846541706990398")]
    )
    def test_streams_with_include_deleted(self, stream_name, deleted_id, config_with_include_deleted, configured_catalog):
        catalog = self.slice_catalog(configured_catalog, {stream_name})
        records, states = self._read_records(config_with_include_deleted, catalog)
        deleted_records = list(filter(self._deleted_record, records))
        is_specific_deleted_pulled = deleted_id in list(map(self._object_id, records))
    
>       assert states, "incremental read should produce states"
E       AssertionError: incremental read should produce states
E       assert []

integration_tests/test_streams.py:49: AssertionError
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Captured log call -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INFO     airbyte:abstract_source.py:97 Starting syncing SourceFacebookMarketing
INFO     airbyte:abstract_source.py:129 Finished syncing SourceFacebookMarketing

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted[ads-23846756820320398] ⨯                                                                                                                                                                                                                              11% █▎        {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}


―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestFacebookMarketingSource.test_streams_with_include_deleted[campaigns-23846541919710398] ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <integration_tests.test_streams.TestFacebookMarketingSource object at 0x108713040>, stream_name = 'campaigns', deleted_id = '23846541919710398'
config_with_include_deleted = {'access_token': 'EAAvdxUrzEX8BAEd70F1hWS2IIoguqnLhRUMq61w4PGUNIObxUX0gSZC8ZAc7rmrWIR2szqV4EdcIllLnaZCKPpWwynvgclWojZC...cMnSAcnCeZALZA6lAZDZD', 'account_id': '559161321983625', 'include_deleted': True, 'start_date': '2022-02-25T00:00:00Z'}
configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='images', json_schema={}, supporte...emental'>, cursor_field=['date_start'], destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=[])])

    @pytest.mark.parametrize(
        "stream_name, deleted_id", [("ads", "23846756820320398"), ("campaigns", "23846541919710398"), ("ad_sets", "23846541706990398")]
    )
    def test_streams_with_include_deleted(self, stream_name, deleted_id, config_with_include_deleted, configured_catalog):
        catalog = self.slice_catalog(configured_catalog, {stream_name})
        records, states = self._read_records(config_with_include_deleted, catalog)
        deleted_records = list(filter(self._deleted_record, records))
        is_specific_deleted_pulled = deleted_id in list(map(self._object_id, records))
    
>       assert states, "incremental read should produce states"
E       AssertionError: incremental read should produce states
E       assert []

integration_tests/test_streams.py:49: AssertionError
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Captured log call -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INFO     airbyte:abstract_source.py:97 Starting syncing SourceFacebookMarketing
INFO     airbyte:abstract_source.py:129 Finished syncing SourceFacebookMarketing

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted[campaigns-23846541919710398] ⨯                                                                                                                                                                                                                        22% ██▎       {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}


――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestFacebookMarketingSource.test_streams_with_include_deleted[ad_sets-23846541706990398] ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <integration_tests.test_streams.TestFacebookMarketingSource object at 0x108713130>, stream_name = 'ad_sets', deleted_id = '23846541706990398'
config_with_include_deleted = {'access_token': 'EAAvdxUrzEX8BAEd70F1hWS2IIoguqnLhRUMq61w4PGUNIObxUX0gSZC8ZAc7rmrWIR2szqV4EdcIllLnaZCKPpWwynvgclWojZC...cMnSAcnCeZALZA6lAZDZD', 'account_id': '559161321983625', 'include_deleted': True, 'start_date': '2022-02-25T00:00:00Z'}
configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='images', json_schema={}, supporte...emental'>, cursor_field=['date_start'], destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=[])])

    @pytest.mark.parametrize(
        "stream_name, deleted_id", [("ads", "23846756820320398"), ("campaigns", "23846541919710398"), ("ad_sets", "23846541706990398")]
    )
    def test_streams_with_include_deleted(self, stream_name, deleted_id, config_with_include_deleted, configured_catalog):
        catalog = self.slice_catalog(configured_catalog, {stream_name})
        records, states = self._read_records(config_with_include_deleted, catalog)
        deleted_records = list(filter(self._deleted_record, records))
        is_specific_deleted_pulled = deleted_id in list(map(self._object_id, records))
    
>       assert states, "incremental read should produce states"
E       AssertionError: incremental read should produce states
E       assert []

integration_tests/test_streams.py:49: AssertionError
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Captured log call -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INFO     airbyte:abstract_source.py:97 Starting syncing SourceFacebookMarketing
INFO     airbyte:abstract_source.py:129 Finished syncing SourceFacebookMarketing

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted[ad_sets-23846541706990398] ⨯                                                                                                                                                                                                                          33% ███▍      {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}


―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[ads-2] ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <integration_tests.test_streams.TestFacebookMarketingSource object at 0x108738460>, stream_name = 'ads', deleted_num = 2, config_with_include_deleted = {'access_token': 'EAAvdxUrzEX8BAEd70F1hWS2IIoguqnLhRUMq61w4PGUNIObxUX0gSZC8ZAc7rmrWIR2szqV4EdcIllLnaZCKPpWwynvgclWojZC...cMnSAcnCeZALZA6lAZDZD', 'account_id': '559161321983625', 'include_deleted': True, 'start_date': '2022-02-25T00:00:00Z'}
configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='images', json_schema={}, supporte...emental'>, cursor_field=['date_start'], destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=[])])
state = {'ad_sets': {'updated_time': '2021-02-19T10:42:40-0800'}, 'ads': {'updated_time': '2021-02-19T10:42:40-0800'}, 'campaigns': {'updated_time': '2021-02-19T10:42:40-0800'}}

    @pytest.mark.parametrize("stream_name, deleted_num", [("ads", 2), ("campaigns", 3), ("ad_sets", 1)])
    def test_streams_with_include_deleted_and_state(self, stream_name, deleted_num, config_with_include_deleted, configured_catalog, state):
        """Should ignore state because of include_deleted enabled"""
        catalog = self.slice_catalog(configured_catalog, {stream_name})
        records, states = self._read_records(config_with_include_deleted, catalog, state=state)
        deleted_records = list(filter(self._deleted_record, records))
    
>       assert len(deleted_records) == deleted_num, f"{stream_name} should have {deleted_num} deleted records returned"
E       AssertionError: ads should have 2 deleted records returned
E       assert 0 == 2
E         +0
E         -2

integration_tests/test_streams.py:63: AssertionError
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Captured log call -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INFO     airbyte:abstract_source.py:97 Starting syncing SourceFacebookMarketing
INFO     airbyte:abstract_source.py:129 Finished syncing SourceFacebookMarketing

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[ads-2] ⨯                                                                                                                                                                                                                                    44% ████▌     {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}


――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[campaigns-3] ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <integration_tests.test_streams.TestFacebookMarketingSource object at 0x1086f7040>, stream_name = 'campaigns', deleted_num = 3, config_with_include_deleted = {'access_token': 'EAAvdxUrzEX8BAEd70F1hWS2IIoguqnLhRUMq61w4PGUNIObxUX0gSZC8ZAc7rmrWIR2szqV4EdcIllLnaZCKPpWwynvgclWojZC...cMnSAcnCeZALZA6lAZDZD', 'account_id': '559161321983625', 'include_deleted': True, 'start_date': '2022-02-25T00:00:00Z'}
configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='images', json_schema={}, supporte...emental'>, cursor_field=['date_start'], destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=[])])
state = {'ad_sets': {'updated_time': '2021-02-19T10:42:40-0800'}, 'ads': {'updated_time': '2021-02-19T10:42:40-0800'}, 'campaigns': {'updated_time': '2021-02-19T10:42:40-0800'}}

    @pytest.mark.parametrize("stream_name, deleted_num", [("ads", 2), ("campaigns", 3), ("ad_sets", 1)])
    def test_streams_with_include_deleted_and_state(self, stream_name, deleted_num, config_with_include_deleted, configured_catalog, state):
        """Should ignore state because of include_deleted enabled"""
        catalog = self.slice_catalog(configured_catalog, {stream_name})
        records, states = self._read_records(config_with_include_deleted, catalog, state=state)
        deleted_records = list(filter(self._deleted_record, records))
    
>       assert len(deleted_records) == deleted_num, f"{stream_name} should have {deleted_num} deleted records returned"
E       AssertionError: campaigns should have 3 deleted records returned
E       assert 0 == 3
E         +0
E         -3

integration_tests/test_streams.py:63: AssertionError
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Captured log call -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INFO     airbyte:abstract_source.py:97 Starting syncing SourceFacebookMarketing
INFO     airbyte:abstract_source.py:129 Finished syncing SourceFacebookMarketing

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[campaigns-3] ⨯                                                                                                                                                                                                                              56% █████▋    {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}


―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[ad_sets-1] ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <integration_tests.test_streams.TestFacebookMarketingSource object at 0x108713ee0>, stream_name = 'ad_sets', deleted_num = 1, config_with_include_deleted = {'access_token': 'EAAvdxUrzEX8BAEd70F1hWS2IIoguqnLhRUMq61w4PGUNIObxUX0gSZC8ZAc7rmrWIR2szqV4EdcIllLnaZCKPpWwynvgclWojZC...cMnSAcnCeZALZA6lAZDZD', 'account_id': '559161321983625', 'include_deleted': True, 'start_date': '2022-02-25T00:00:00Z'}
configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='images', json_schema={}, supporte...emental'>, cursor_field=['date_start'], destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=[])])
state = {'ad_sets': {'updated_time': '2021-02-19T10:42:40-0800'}, 'ads': {'updated_time': '2021-02-19T10:42:40-0800'}, 'campaigns': {'updated_time': '2021-02-19T10:42:40-0800'}}

    @pytest.mark.parametrize("stream_name, deleted_num", [("ads", 2), ("campaigns", 3), ("ad_sets", 1)])
    def test_streams_with_include_deleted_and_state(self, stream_name, deleted_num, config_with_include_deleted, configured_catalog, state):
        """Should ignore state because of include_deleted enabled"""
        catalog = self.slice_catalog(configured_catalog, {stream_name})
        records, states = self._read_records(config_with_include_deleted, catalog, state=state)
        deleted_records = list(filter(self._deleted_record, records))
    
>       assert len(deleted_records) == deleted_num, f"{stream_name} should have {deleted_num} deleted records returned"
E       AssertionError: ad_sets should have 1 deleted records returned
E       assert 0 == 1
E         +0
E         -1

integration_tests/test_streams.py:63: AssertionError
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Captured log call -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INFO     airbyte:abstract_source.py:97 Starting syncing SourceFacebookMarketing
INFO     airbyte:abstract_source.py:129 Finished syncing SourceFacebookMarketing

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[ad_sets-1] ⨯                                                                                                                                                                                                                                67% ██████▋   {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted_and_state_with_included_deleted[ads-0] ✓                                                                                                                                                                                                              78% ███████▊  {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted_and_state_with_included_deleted[campaigns-0] ✓                                                                                                                                                                                                        89% ████████▉ {"type": "LOG", "log": {"level": "INFO", "message": "Starting syncing SourceFacebookMarketing"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceFacebookMarketing"}}

 airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py::TestFacebookMarketingSource.test_streams_with_include_deleted_and_state_with_included_deleted[ad_sets-0] ✓                                                                                                                                                                                                         100% ██████████
=================================================================================================================================================================================================== short test summary info ====================================================================================================================================================================================================
FAILED integration_tests/test_streams.py::TestFacebookMarketingSource::test_streams_with_include_deleted[ads-23846756820320398] - AssertionError: incremental read should produce states
FAILED integration_tests/test_streams.py::TestFacebookMarketingSource::test_streams_with_include_deleted[campaigns-23846541919710398] - AssertionError: incremental read should produce states
FAILED integration_tests/test_streams.py::TestFacebookMarketingSource::test_streams_with_include_deleted[ad_sets-23846541706990398] - AssertionError: incremental read should produce states
FAILED integration_tests/test_streams.py::TestFacebookMarketingSource::test_streams_with_include_deleted_and_state[ads-2] - AssertionError: ads should have 2 deleted records returned
FAILED integration_tests/test_streams.py::TestFacebookMarketingSource::test_streams_with_include_deleted_and_state[campaigns-3] - AssertionError: campaigns should have 3 deleted records returned
FAILED integration_tests/test_streams.py::TestFacebookMarketingSource::test_streams_with_include_deleted_and_state[ad_sets-1] - AssertionError: ad_sets should have 1 deleted records returned

Results (1.23s):
       3 passed
       6 failed
         - airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py:40 TestFacebookMarketingSource.test_streams_with_include_deleted[ads-23846756820320398]
         - airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py:40 TestFacebookMarketingSource.test_streams_with_include_deleted[campaigns-23846541919710398]
         - airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py:40 TestFacebookMarketingSource.test_streams_with_include_deleted[ad_sets-23846541706990398]
         - airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py:56 TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[ads-2]
         - airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py:56 TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[campaigns-3]
         - airbyte-integrations/connectors/source-facebook-marketing/integration_tests/test_streams.py:56 TestFacebookMarketingSource.test_streams_with_include_deleted_and_state[ad_sets-1]
Acceptance
(virtualenv) ➜  source-facebook-marketing git:(phil/add-facebook-marketing-activities-stream) 
docker build . --no-cache -t airbyte/source-facebook-marketing:dev \                                                                                                                                                                                                                                                                                                                                                            
&& python -m pytest -p source_acceptance_test.plugin
(virtualenv) ➜  source-facebook-marketing git:(phil/add-facebook-marketing-activities-stream) docker build . --no-cache -t airbyte/source-facebook-marketing:dev \
> && python -m pytest -p source_acceptance_test.plugin
[+] Building 38.7s (12/12) FINISHED                                                                                                                                                                                                                                                                                                                                                                                             
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                                                                                                                                                       0.0s
 => => transferring dockerfile: 554B                                                                                                                                                                                                                                                                                                                                                                                       0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                                                                                                                                                                          0.0s
 => => transferring context: 88B                                                                                                                                                                                                                                                                                                                                                                                           0.0s
 => [internal] load metadata for docker.io/library/python:3.7-slim                                                                                                                                                                                                                                                                                                                                                         2.2s
 => CACHED [1/7] FROM docker.io/library/python:3.7-slim@sha256:b552cd87ce4bfa0df15d1813da74c7176ced198a69408ad36925580b2373a180                                                                                                                                                                                                                                                                                            0.0s
 => [internal] load build context                                                                                                                                                                                                                                                                                                                                                                                          0.0s
 => => transferring context: 30.09kB                                                                                                                                                                                                                                                                                                                                                                                       0.0s
 => [2/7] RUN apt-get update && apt-get install -y bash && rm -rf /var/lib/apt/lists/*                                                                                                                                                                                                                                                                                                                                     4.6s
 => [3/7] WORKDIR /airbyte/integration_code                                                                                                                                                                                                                                                                                                                                                                                0.0s
 => [4/7] COPY source_facebook_marketing ./source_facebook_marketing                                                                                                                                                                                                                                                                                                                                                       0.1s 
 => [5/7] COPY main.py ./                                                                                                                                                                                                                                                                                                                                                                                                  0.0s 
 => [6/7] COPY setup.py ./                                                                                                                                                                                                                                                                                                                                                                                                 0.0s 
 => [7/7] RUN pip install .                                                                                                                                                                                                                                                                                                                                                                                               30.1s 
 => exporting to image                                                                                                                                                                                                                                                                                                                                                                                                     1.6s 
 => => exporting layers                                                                                                                                                                                                                                                                                                                                                                                                    1.6s
 => => writing image sha256:71063a012b602bc4ba0c140d0a46daff882e5ed744de6adcb3691585b36a2923                                                                                                                                                                                                                                                                                                                               0.0s 
 => => naming to docker.io/airbyte/source-facebook-marketing:dev                                                                                                                                                                                                                                                                                                                                                           0.0s 
                                                                                                                                                                                                                                                                                                                                                                                                                                
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them                                                                                                                                                                                                                                                                                                                            
Test session starts (platform: darwin, Python 3.8.7, pytest 6.2.5, pytest-sugar 0.9.4)
cachedir: .pytest_cache
rootdir: /Users/phil/Repos/airbyte, configfile: pytest.ini
plugins: sugar-0.9.4, requests-mock-1.9.3, mock-3.7.0, timeout-1.4.2
collecting ... 
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_config_match_spec[inputs0] ✓                                                                                                                                                                                                                                                                           5% ▌         
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_match_expected[inputs0] ✓                                                                                                                                                                                                                                                                              9% ▉         
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_docker_env[inputs0] ✓                                                                                                                                                                                                                                                                                 14% █▍        
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_oneof_usage[inputs0] ✓                                                                                                                                                                                                                                                                                18% █▊        
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_required[inputs0] ✓                                                                                                                                                                                                                                                                                   23% ██▍       
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_optional[inputs0] ✓                                                                                                                                                                                                                                                                                   27% ██▊       
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_has_secret[inputs0] ✓                                                                                                                                                                                                                                                                                 32% ███▎      
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_secret_never_in_the_output[inputs0] ✓                                                                                                                                                                                                                                                                 36% ███▋      
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_defined_refs_exist_in_json_spec_file[inputs0] ✓                                                                                                                                                                                                                                                       41% ████▏     
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_oauth_flow_parameters[inputs0] ✓                                                                                                                                                                                                                                                                      45% ████▋     
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestConnection.test_check[inputs0] ✓                                                                                                                                                                                                                                                                                50% █████     
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestConnection.test_check[inputs1] ✓                                                                                                                                                                                                                                                                                55% █████▌    
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_discover[inputs0] ✓                                                                                                                                                                                                                                                                              59% █████▉    
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_cursors_exist_in_schema[inputs0] ✓                                                                                                                                                                                                                                                       64% ██████▍   
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_refs_exist_in_schema[inputs0] ✓                                                                                                                                                                                                                                                          68% ██████▊   
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_keyword_exist_in_schema[inputs0-allOf] ✓                                                                                                                                                                                                                                                 73% ███████▍  
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_keyword_exist_in_schema[inputs0-not] ✓                                                                                                                                                                                                                                                   77% ███████▊  
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_primary_keys_exist_in_schema[inputs0] ✓                                                                                                                                                                                                                                                          82% ████████▎ {"type": "LOG", "log": {"level": "ERROR", "message": "Docker container was failed, code 1, error:\n{\"type\": \"LOG\", \"log\": {\"level\": \"FATAL\", \"message\": \"\\n\\n  Message: Call was not successful\\n  Method:  GET\\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\\n\\n  Status:  400\\n  Response:\\n    {\\n      \\\"error\\\": {\\n        \\\"message\\\": \\\"Unsupported request - method type: get\\\",\\n        \\\"type\\\": \\\"GraphMethodException\\\",\\n        \\\"code\\\": 100,\\n        \\\"fbtrace_id\\\": \\\"AjUjqFuI-ZT4XH8SYIVbmDu\\\"\\n      }\\n    }\\nTraceback (most recent call last):\\n  File \\\"/airbyte/integration_code/main.py\\\", line 13, in <module>\\n    launch(source, sys.argv[1:])\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\\\", line 127, in launch\\n    for message in source_entrypoint.run(parsed_args):\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\\\", line 118, in run\\n    for message in generator:\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\\\", line 123, in read\\n    raise e\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\\\", line 119, in read\\n    internal_config=internal_config,\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\\\", line 159, in _read_stream\\n    for record in record_iterator:\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\\\", line 248, in _read_full_refresh\\n    for record in records:\\n  File \\\"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\\\", line 94, in read_records\\n    for record in loaded_records_iter:\\n  File \\\"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\\\", line 90, in <genexpr>\\n    loaded_records_iter = (record.api_get(fields=self.fields, pending=self.use_batch) for record in records_iter)\\n  File \\\"/usr/local/lib/python3.7/site-packages/facebook_business/adobjects/adaccount.py\\\", line 249, in api_get\\n    return request.execute()\\n  File \\\"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\\\", line 687, in execute\\n    api_version=self._api_version,\\n  File \\\"/usr/local/lib/python3.7/site-packages/backoff/_sync.py\\\", line 94, in retry\\n    ret = target(*args, **kwargs)\\n  File \\\"/airbyte/integration_code/source_facebook_marketing/api.py\\\", line 140, in call\\n    response = super().call(method, path, params, headers, files, url_override, api_version)\\n  File \\\"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\\\", line 350, in call\\n    raise fb_response.error()\\nfacebook_business.exceptions.FacebookRequestError: \\n\\n  Message: Call was not successful\\n  Method:  GET\\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\\n\\n  Status:  400\\n  Response:\\n    {\\n      \\\"error\\\": {\\n        \\\"message\\\": \\\"Unsupported request - method type: get\\\",\\n        \\\"type\\\": \\\"GraphMethodException\\\",\\n        \\\"code\\\": 100,\\n        \\\"fbtrace_id\\\": \\\"AjUjqFuI-ZT4XH8SYIVbmDu\\\"\\n      }\\n    }\\n\"}}\n"}}


――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestBasicRead.test_read[inputs0] ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <source_acceptance_test.tests.test_core.TestBasicRead object at 0x102f28790>, connector_config = SecretDict(******), configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='ad_account', json_schema={'type':...fresh'>, cursor_field=['event_time'], destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=None)])
inputs = BasicReadTestConfig(config_path='secrets/config.json', configured_catalog_path=None, empty_streams={'videos'}, expect_records=None, validate_schema=True, validate_data_points=False, timeout_seconds=None), expected_records = [], docker_runner = <source_acceptance_test.utils.connector_runner.ConnectorRunner object at 0x102f3ee80>
detailed_logger = <Logger detailed_logger acceptance_tests_logs/test_core.py__TestBasicRead__test_read[inputs0].txt (DEBUG)>

    def test_read(
        self,
        connector_config,
        configured_catalog,
        inputs: BasicReadTestConfig,
        expected_records: List[AirbyteRecordMessage],
        docker_runner: ConnectorRunner,
        detailed_logger,
    ):
>       output = docker_runner.call_read(connector_config, configured_catalog)

../../bases/source-acceptance-test/source_acceptance_test/tests/test_core.py:364: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py:83: in call_read
    output = list(self.run(cmd=cmd, config=config, catalog=catalog, **kwargs))
../../bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py:106: in run
    for line in self.read(container, command=cmd):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'source_acceptance_test.utils.connector_runner.ConnectorRunner'>, container = <Container: b5319a0d6d>, command = 'read --config tap_config.json --catalog catalog.json', with_ext = True

    @classmethod
    def read(cls, container: Container, command: str = None, with_ext: bool = True) -> Iterable[str]:
        """Reads connector's logs per line"""
        buffer = b""
        exception = ""
        line = ""
        for chunk in container.logs(stdout=True, stderr=True, stream=True, follow=True):
    
            buffer += chunk
            while True:
                # every chunk can include several lines
                found = buffer.find(b"\n")
                if found <= -1:
                    break
    
                line = buffer[: found + 1].decode("utf-8")
                if len(exception) > 0 or line.startswith("Traceback (most recent call last)"):
                    exception += line
                else:
                    yield line
                buffer = buffer[found + 1 :]
    
        if buffer:
            # send the latest chunk if exists
            line = buffer.decode("utf-8")
            if exception:
                exception += line
            else:
                yield line
        try:
            exit_status = container.wait()
            container.remove()
        except NotFound as err:
            logging.error(f"Waiting error: {err}, logs: {exception or line}")
            raise
        if exit_status["StatusCode"]:
            error = exit_status["Error"] or exception or line
            logging.error(f"Docker container was failed, " f'code {exit_status["StatusCode"]}, error:\n{error}')
            if with_ext:
>               raise ContainerError(
                    container=container,
                    exit_status=exit_status["StatusCode"],
                    command=command,
                    image=container.image,
                    stderr=error,
                )
E               docker.errors.ContainerError: Command 'read --config tap_config.json --catalog catalog.json' in image '<Image: 'airbyte/source-facebook-marketing:dev'>' returned non-zero exit status 1: {"type": "LOG", "log": {"level": "FATAL", "message": "\n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"Unsupported request - method type: get\",\n        \"type\": \"GraphMethodException\",\n        \"code\": 100,\n        \"fbtrace_id\": \"AjUjqFuI-ZT4XH8SYIVbmDu\"\n      }\n    }\nTraceback (most recent call last):\n  File \"/airbyte/integration_code/main.py\", line 13, in <module>\n    launch(source, sys.argv[1:])\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\", line 127, in launch\n    for message in source_entrypoint.run(parsed_args):\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\", line 118, in run\n    for message in generator:\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 123, in read\n    raise e\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 119, in read\n    internal_config=internal_config,\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 159, in _read_stream\n    for record in record_iterator:\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 248, in _read_full_refresh\n    for record in records:\n  File \"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\", line 94, in read_records\n    for record in loaded_records_iter:\n  File \"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\", line 90, in <genexpr>\n    loaded_records_iter = (record.api_get(fields=self.fields, pending=self.use_batch) for record in records_iter)\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/adobjects/adaccount.py\", line 249, in api_get\n    return request.execute()\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\", line 687, in execute\n    api_version=self._api_version,\n  File \"/usr/local/lib/python3.7/site-packages/backoff/_sync.py\", line 94, in retry\n    ret = target(*args, **kwargs)\n  File \"/airbyte/integration_code/source_facebook_marketing/api.py\", line 140, in call\n    response = super().call(method, path, params, headers, files, url_override, api_version)\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\", line 350, in call\n    raise fb_response.error()\nfacebook_business.exceptions.FacebookRequestError: \n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"Unsupported request - method type: get\",\n        \"type\": \"GraphMethodException\",\n        \"code\": 100,\n        \"fbtrace_id\": \"AjUjqFuI-ZT4XH8SYIVbmDu\"\n      }\n    }\n"}}

../../bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py:152: ContainerError
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Captured log call -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ERROR    root:connector_runner.py:150 Docker container was failed, code 1, error:
{"type": "LOG", "log": {"level": "FATAL", "message": "\n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"Unsupported request - method type: get\",\n        \"type\": \"GraphMethodException\",\n        \"code\": 100,\n        \"fbtrace_id\": \"AjUjqFuI-ZT4XH8SYIVbmDu\"\n      }\n    }\nTraceback (most recent call last):\n  File \"/airbyte/integration_code/main.py\", line 13, in <module>\n    launch(source, sys.argv[1:])\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\", line 127, in launch\n    for message in source_entrypoint.run(parsed_args):\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\", line 118, in run\n    for message in generator:\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 123, in read\n    raise e\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 119, in read\n    internal_config=internal_config,\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 159, in _read_stream\n    for record in record_iterator:\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 248, in _read_full_refresh\n    for record in records:\n  File \"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\", line 94, in read_records\n    for record in loaded_records_iter:\n  File \"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\", line 90, in <genexpr>\n    loaded_records_iter = (record.api_get(fields=self.fields, pending=self.use_batch) for record in records_iter)\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/adobjects/adaccount.py\", line 249, in api_get\n    return request.execute()\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\", line 687, in execute\n    api_version=self._api_version,\n  File \"/usr/local/lib/python3.7/site-packages/backoff/_sync.py\", line 94, in retry\n    ret = target(*args, **kwargs)\n  File \"/airbyte/integration_code/source_facebook_marketing/api.py\", line 140, in call\n    response = super().call(method, path, params, headers, files, url_override, api_version)\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\", line 350, in call\n    raise fb_response.error()\nfacebook_business.exceptions.FacebookRequestError: \n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"Unsupported request - method type: get\",\n        \"type\": \"GraphMethodException\",\n        \"code\": 100,\n        \"fbtrace_id\": \"AjUjqFuI-ZT4XH8SYIVbmDu\"\n      }\n    }\n"}}

 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestBasicRead.test_read[inputs0] ⨯                                                                                                                                                                                                                                                                                  86% ████████▋ {"type": "LOG", "log": {"level": "ERROR", "message": "Docker container was failed, code 1, error:\n{\"type\": \"LOG\", \"log\": {\"level\": \"FATAL\", \"message\": \"\\n\\n  Message: Call was not successful\\n  Method:  GET\\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\\n\\n  Status:  400\\n  Response:\\n    {\\n      \\\"error\\\": {\\n        \\\"message\\\": \\\"Unsupported request - method type: get\\\",\\n        \\\"type\\\": \\\"GraphMethodException\\\",\\n        \\\"code\\\": 100,\\n        \\\"fbtrace_id\\\": \\\"ABjxhQx8-heY7uuhOcPUM61\\\"\\n      }\\n    }\\nTraceback (most recent call last):\\n  File \\\"/airbyte/integration_code/main.py\\\", line 13, in <module>\\n    launch(source, sys.argv[1:])\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\\\", line 127, in launch\\n    for message in source_entrypoint.run(parsed_args):\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\\\", line 118, in run\\n    for message in generator:\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\\\", line 123, in read\\n    raise e\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\\\", line 119, in read\\n    internal_config=internal_config,\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\\\", line 159, in _read_stream\\n    for record in record_iterator:\\n  File \\\"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\\\", line 248, in _read_full_refresh\\n    for record in records:\\n  File \\\"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\\\", line 94, in read_records\\n    for record in loaded_records_iter:\\n  File \\\"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\\\", line 90, in <genexpr>\\n    loaded_records_iter = (record.api_get(fields=self.fields, pending=self.use_batch) for record in records_iter)\\n  File \\\"/usr/local/lib/python3.7/site-packages/facebook_business/adobjects/adaccount.py\\\", line 249, in api_get\\n    return request.execute()\\n  File \\\"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\\\", line 687, in execute\\n    api_version=self._api_version,\\n  File \\\"/usr/local/lib/python3.7/site-packages/backoff/_sync.py\\\", line 94, in retry\\n    ret = target(*args, **kwargs)\\n  File \\\"/airbyte/integration_code/source_facebook_marketing/api.py\\\", line 140, in call\\n    response = super().call(method, path, params, headers, files, url_override, api_version)\\n  File \\\"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\\\", line 350, in call\\n    raise fb_response.error()\\nfacebook_business.exceptions.FacebookRequestError: \\n\\n  Message: Call was not successful\\n  Method:  GET\\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\\n\\n  Status:  400\\n  Response:\\n    {\\n      \\\"error\\\": {\\n        \\\"message\\\": \\\"Unsupported request - method type: get\\\",\\n        \\\"type\\\": \\\"GraphMethodException\\\",\\n        \\\"code\\\": 100,\\n        \\\"fbtrace_id\\\": \\\"ABjxhQx8-heY7uuhOcPUM61\\\"\\n      }\\n    }\\n\"}}\n"}}


―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestFullRefresh.test_sequential_reads[inputs0] ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <source_acceptance_test.tests.test_full_refresh.TestFullRefresh object at 0x1030cf130>, inputs = FullRefreshConfig(config_path='secrets/config.json', configured_catalog_path=None, timeout_seconds=None, ignored_fields=None), connector_config = SecretDict(******)
configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='ad_account', json_schema={'type':...fresh'>, cursor_field=['event_time'], destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=None)]), docker_runner = <source_acceptance_test.utils.connector_runner.ConnectorRunner object at 0x1036619d0>
detailed_logger = <Logger detailed_logger acceptance_tests_logs/test_full_refresh.py__TestFullRefresh__test_sequential_reads[inputs0].txt (DEBUG)>

    def test_sequential_reads(
        self,
        inputs: ConnectionTestConfig,
        connector_config: SecretDict,
        configured_catalog: ConfiguredAirbyteCatalog,
        docker_runner: ConnectorRunner,
        detailed_logger: Logger,
    ):
        ignored_fields = getattr(inputs, "ignored_fields") or {}
        configured_catalog = full_refresh_only_catalog(configured_catalog)
>       output = docker_runner.call_read(connector_config, configured_catalog)

../../bases/source-acceptance-test/source_acceptance_test/tests/test_full_refresh.py:49: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../../bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py:83: in call_read
    output = list(self.run(cmd=cmd, config=config, catalog=catalog, **kwargs))
../../bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py:106: in run
    for line in self.read(container, command=cmd):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = <class 'source_acceptance_test.utils.connector_runner.ConnectorRunner'>, container = <Container: 7e6c18e0c2>, command = 'read --config tap_config.json --catalog catalog.json', with_ext = True

    @classmethod
    def read(cls, container: Container, command: str = None, with_ext: bool = True) -> Iterable[str]:
        """Reads connector's logs per line"""
        buffer = b""
        exception = ""
        line = ""
        for chunk in container.logs(stdout=True, stderr=True, stream=True, follow=True):
    
            buffer += chunk
            while True:
                # every chunk can include several lines
                found = buffer.find(b"\n")
                if found <= -1:
                    break
    
                line = buffer[: found + 1].decode("utf-8")
                if len(exception) > 0 or line.startswith("Traceback (most recent call last)"):
                    exception += line
                else:
                    yield line
                buffer = buffer[found + 1 :]
    
        if buffer:
            # send the latest chunk if exists
            line = buffer.decode("utf-8")
            if exception:
                exception += line
            else:
                yield line
        try:
            exit_status = container.wait()
            container.remove()
        except NotFound as err:
            logging.error(f"Waiting error: {err}, logs: {exception or line}")
            raise
        if exit_status["StatusCode"]:
            error = exit_status["Error"] or exception or line
            logging.error(f"Docker container was failed, " f'code {exit_status["StatusCode"]}, error:\n{error}')
            if with_ext:
>               raise ContainerError(
                    container=container,
                    exit_status=exit_status["StatusCode"],
                    command=command,
                    image=container.image,
                    stderr=error,
                )
E               docker.errors.ContainerError: Command 'read --config tap_config.json --catalog catalog.json' in image '<Image: 'airbyte/source-facebook-marketing:dev'>' returned non-zero exit status 1: {"type": "LOG", "log": {"level": "FATAL", "message": "\n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"Unsupported request - method type: get\",\n        \"type\": \"GraphMethodException\",\n        \"code\": 100,\n        \"fbtrace_id\": \"ABjxhQx8-heY7uuhOcPUM61\"\n      }\n    }\nTraceback (most recent call last):\n  File \"/airbyte/integration_code/main.py\", line 13, in <module>\n    launch(source, sys.argv[1:])\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\", line 127, in launch\n    for message in source_entrypoint.run(parsed_args):\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\", line 118, in run\n    for message in generator:\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 123, in read\n    raise e\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 119, in read\n    internal_config=internal_config,\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 159, in _read_stream\n    for record in record_iterator:\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 248, in _read_full_refresh\n    for record in records:\n  File \"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\", line 94, in read_records\n    for record in loaded_records_iter:\n  File \"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\", line 90, in <genexpr>\n    loaded_records_iter = (record.api_get(fields=self.fields, pending=self.use_batch) for record in records_iter)\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/adobjects/adaccount.py\", line 249, in api_get\n    return request.execute()\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\", line 687, in execute\n    api_version=self._api_version,\n  File \"/usr/local/lib/python3.7/site-packages/backoff/_sync.py\", line 94, in retry\n    ret = target(*args, **kwargs)\n  File \"/airbyte/integration_code/source_facebook_marketing/api.py\", line 140, in call\n    response = super().call(method, path, params, headers, files, url_override, api_version)\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\", line 350, in call\n    raise fb_response.error()\nfacebook_business.exceptions.FacebookRequestError: \n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"Unsupported request - method type: get\",\n        \"type\": \"GraphMethodException\",\n        \"code\": 100,\n        \"fbtrace_id\": \"ABjxhQx8-heY7uuhOcPUM61\"\n      }\n    }\n"}}

../../bases/source-acceptance-test/source_acceptance_test/utils/connector_runner.py:152: ContainerError
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Captured log call -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ERROR    root:connector_runner.py:150 Docker container was failed, code 1, error:
{"type": "LOG", "log": {"level": "FATAL", "message": "\n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"Unsupported request - method type: get\",\n        \"type\": \"GraphMethodException\",\n        \"code\": 100,\n        \"fbtrace_id\": \"ABjxhQx8-heY7uuhOcPUM61\"\n      }\n    }\nTraceback (most recent call last):\n  File \"/airbyte/integration_code/main.py\", line 13, in <module>\n    launch(source, sys.argv[1:])\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\", line 127, in launch\n    for message in source_entrypoint.run(parsed_args):\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/entrypoint.py\", line 118, in run\n    for message in generator:\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 123, in read\n    raise e\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 119, in read\n    internal_config=internal_config,\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 159, in _read_stream\n    for record in record_iterator:\n  File \"/usr/local/lib/python3.7/site-packages/airbyte_cdk/sources/abstract_source.py\", line 248, in _read_full_refresh\n    for record in records:\n  File \"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\", line 94, in read_records\n    for record in loaded_records_iter:\n  File \"/airbyte/integration_code/source_facebook_marketing/streams/base_streams.py\", line 90, in <genexpr>\n    loaded_records_iter = (record.api_get(fields=self.fields, pending=self.use_batch) for record in records_iter)\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/adobjects/adaccount.py\", line 249, in api_get\n    return request.execute()\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\", line 687, in execute\n    api_version=self._api_version,\n  File \"/usr/local/lib/python3.7/site-packages/backoff/_sync.py\", line 94, in retry\n    ret = target(*args, **kwargs)\n  File \"/airbyte/integration_code/source_facebook_marketing/api.py\", line 140, in call\n    response = super().call(method, path, params, headers, files, url_override, api_version)\n  File \"/usr/local/lib/python3.7/site-packages/facebook_business/api.py\", line 350, in call\n    raise fb_response.error()\nfacebook_business.exceptions.FacebookRequestError: \n\n  Message: Call was not successful\n  Method:  GET\n  Path:    https://graph.facebook.com/v12.0/act_559161321983625/\n  Params:  {'fields': 'account_id,account_status,age,amount_spent,balance,business,business_city,business_country_code,business_name,business_state,business_street,business_street2,business_zip,can_create_brand_lift_study,capabilities,created_time,currency,disable_reason,end_advertiser,end_advertiser_name,extended_credit_invoice_group,failed_delivery_checks,fb_entity,funding_source,funding_source_details,has_advertiser_opted_in_odax,has_migrated_permissions,id,io_number,is_attribution_spec_system_default,is_direct_deals_enabled,is_in_3ds_authorization_enabled_market,is_notifications_enabled,is_personal,is_prepay_account,is_tax_id_required,line_numbers,media_agency,min_campaign_group_spend_cap,min_daily_budget,name,offsite_pixels_tos_accepted,owner,partner,rf_spec,spend_cap,tax_id,tax_id_status,tax_id_type,timezone_id,timezone_name,timezone_offset_hours_utc,tos_accepted,user_tasks,user_tos_accepted'}\n\n  Status:  400\n  Response:\n    {\n      \"error\": {\n        \"message\": \"Unsupported request - method type: get\",\n        \"type\": \"GraphMethodException\",\n        \"code\": 100,\n        \"fbtrace_id\": \"ABjxhQx8-heY7uuhOcPUM61\"\n      }\n    }\n"}}

 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_full_refresh.py::TestFullRefresh.test_sequential_reads[inputs0] ⨯                                                                                                                                                                                                                                                            91% █████████▏
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_incremental.py::TestIncremental.test_two_sequential_reads[inputs0] ✓                                                                                                                                                                                                                                                         95% █████████▋

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestIncremental.test_state_with_abnormally_large_values[inputs0] ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <source_acceptance_test.tests.test_incremental.TestIncremental object at 0x1033ab0d0>, connector_config = SecretDict(******), configured_catalog = ConfiguredAirbyteCatalog(streams=[ConfiguredAirbyteStream(stream=AirbyteStream(name='campaigns', json_schema={'propert...l: 'incremental'>, cursor_field=None, destination_sync_mode=<DestinationSyncMode.append: 'append'>, primary_key=None)])
future_state = {'ad_creatives': {'include_deleted': True, 'updated_time': '2121-07-25T13:34:26Z'}, 'ad_sets': {'include_deleted': Tru...d_time': '2121-07-25T13:34:26Z'}, 'ads_insights': {'date_start': '2121-07-25T13:34:26Z', 'include_deleted': True}, ...}, docker_runner = <source_acceptance_test.utils.connector_runner.ConnectorRunner object at 0x1033ab6d0>

    def test_state_with_abnormally_large_values(self, connector_config, configured_catalog, future_state, docker_runner: ConnectorRunner):
        configured_catalog = incremental_only_catalog(configured_catalog)
        output = docker_runner.call_read_with_state(config=connector_config, catalog=configured_catalog, state=future_state)
        records = filter_output(output, type_=Type.RECORD)
        states = filter_output(output, type_=Type.STATE)
    
>       assert not records, "The sync should produce no records when run with the state with abnormally large values"
E       AssertionError: The sync should produce no records when run with the state with abnormally large values
E       assert not [AirbyteMessage(type=<Type.RECORD: 'RECORD'>, log=None, spec=None, connectionStatus=None, catalog=None, record=Airbyte...ype': 'ADGROUP', 'translated_event_type': 'Ad delivered'}, emitted_at=1646062754903, namespace=None), state=None), ...]

../../bases/source-acceptance-test/source_acceptance_test/tests/test_incremental.py:111: AssertionError

 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_incremental.py::TestIncremental.test_state_with_abnormally_large_values[inputs0] ⨯                                                                                                                                                                                                                                          100% ██████████
=================================================================================================================================================================================================== short test summary info ====================================================================================================================================================================================================
FAILED ../../bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestBasicRead::test_read[inputs0] - docker.errors.ContainerError: Command 'read --config tap_config.json --catalog catalog.json' in image '<Image: 'airbyte/source-facebook-marketing:dev'>' returned non-zero exit status 1: {"type": "LOG", "log": {"level": "FATAL", "message": "\n\n  Message: Call was not successful\n  Method:  G...
FAILED ../../bases/source-acceptance-test/source_acceptance_test/tests/test_full_refresh.py::TestFullRefresh::test_sequential_reads[inputs0] - docker.errors.ContainerError: Command 'read --config tap_config.json --catalog catalog.json' in image '<Image: 'airbyte/source-facebook-marketing:dev'>' returned non-zero exit status 1: {"type": "LOG", "log": {"level": "FATAL", "message": "\n\n  Message: Call was not su...
FAILED ../../bases/source-acceptance-test/source_acceptance_test/tests/test_incremental.py::TestIncremental::test_state_with_abnormally_large_values[inputs0] - AssertionError: The sync should produce no records when run with the state with abnormally large values

Results (43.06s):
      19 passed
       3 failed
         - airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py:355 TestBasicRead.test_read[inputs0]
         - airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_full_refresh.py:39 TestFullRefresh.test_sequential_reads[inputs0]
         - airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_incremental.py:105 TestIncremental.test_state_with_abnormally_large_values[inputs0]

@github-actions github-actions bot added the area/connectors Connector related issues label Feb 25, 2022
@PhilipCorr PhilipCorr marked this pull request as draft February 25, 2022 09:56
@CLAassistant
Copy link

CLAassistant commented Feb 25, 2022

CLA assistant check
All committers have signed the CLA.

@github-actions github-actions bot added the area/documentation Improvements or additions to documentation label Feb 28, 2022
@PhilipCorr PhilipCorr marked this pull request as ready for review February 28, 2022 15:53
@alafanechere alafanechere changed the title add facebook marketing activities stream 🎉 Source facebook-marketing: add activities stream Mar 1, 2022
…b.com:PhilipCorr/airbyte into marcos/test-pr-10655
@alafanechere alafanechere self-assigned this Mar 1, 2022
@marcosmarxm marcosmarxm self-assigned this Mar 1, 2022
@alafanechere alafanechere removed their assignment Mar 1, 2022
Copy link
Member

@marcosmarxm marcosmarxm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @PhilipCorr

@PhilipCorr PhilipCorr requested a review from a team as a code owner March 1, 2022 18:33
@github-actions github-actions bot added area/api Related to the api area/frontend area/platform issues related to the platform area/scheduler area/server area/worker Related to worker labels Mar 1, 2022
@github-actions github-actions bot added CDK Connector Development Kit kubernetes labels Mar 1, 2022
@marcosmarxm marcosmarxm removed the request for review from a team March 1, 2022 18:34
@github-actions github-actions bot removed area/api Related to the api area/platform issues related to the platform area/frontend area/worker Related to worker area/server area/scheduler kubernetes CDK Connector Development Kit labels Mar 1, 2022
@marcosmarxm marcosmarxm temporarily deployed to more-secrets March 1, 2022 18:37 Inactive
@marcosmarxm marcosmarxm temporarily deployed to more-secrets March 1, 2022 18:38 Inactive
@marcosmarxm marcosmarxm merged commit a8f7365 into airbytehq:master Mar 1, 2022
etsybaev pushed a commit that referenced this pull request Mar 5, 2022
* add facebook marketing activities stream

* update incremental test

* add overrides for activities specific logic

* formatting

* update readme docs

* remove test limitation

* update dockerfile airbyte version

* correct tests

* bump connector version in config module

Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>
etsybaev added a commit that referenced this pull request Mar 25, 2022
…1093)

* [10033] Destination-Snowflake: added basic part for support oauth login mode

* added basic logic for token refresh

* Fixed code to support pooled connections

* Hide DBT transformations in cloud (#10583)

* Bump Airbyte version from 0.35.35-alpha to 0.35.36-alpha (#10584)

Co-authored-by: timroes <timroes@users.noreply.github.com>

* 🐛 Source Shopify: fix wrong field type for tax_exemptions (#10419)

* fix(shopify): wrong type for tax_exemptions

abandoned_checkouts customer tax_exemptions had the wrong field type

* fix(shopify): wrong type for tax_exemptions

abandoned_checkouts customer tax_exemptions had the wrong field type

* bump connector version

Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>

* Remove storybook-addon-styled-component-theme (#10574)

* Helm Chart: Secure chart for best practices (#10000)

* 🐛 Source FB Marketing: fix `execute_in_batch` when batch is bigger than 50 (#10588)

* fix execute_in_batch

* add tests

* fix pre-commit config

Co-authored-by: Sherif A. Nada <snadalive@gmail.com>
Co-authored-by: Eugene Kulak <kulak.eugene@gmail.com>
Co-authored-by: Sherif A. Nada <snadalive@gmail.com>

* Bmoric/move flag check to handler (#10469)

Move the feature flag checks to the handler instead of the configuration API. This could have avoid some bug related to the missing flag check in the cloud project.

* Documented product release stages (#10596)

* Set resource limits for connector definitions: api layer (#10482)

* Updated link to product release stages doc (#10599)

* Change the block logic and block after the job creation (#10597)

This is changing the check to see if a connection exist in order to make it more performant and more accurate. It makes sure that the workflow is reachable by trying to query it.

* Add timeout to connector pod init container command (#10592)

* add timeout to init container command

* add disk usage check into init command

* fix up disk usage checking and logs from init entrypoint

* run format

* fix orchestrator restart problem for cloud (#10565)

* test time ranges for cancellations

* try with wait

* fix cancellation on worker restart

* revert for CI testing that the test fails without the retry policy

* revert testing change

* matrix test the different possible cases

* re-enable new retry policy

* switch to no_retry

* switch back to new retry

* paramaterize correctly

* revert to no-retry

* re-enable new retry policy

* speed up test + fixees

* significantly speed up test

* fix ordering

* use multiple task queues in connection manager test

* use versioning for task queue change

* remove sync workflow registration for the connection manager queue

* use more specific example

* respond to parker's comments

* Fix the toggle design (#10612)

* Source Hubspot: cast timestamp to date/datetime (#10576)

* cast timestamp to date

* change test name

* fix corner cases

* fix corner cases 2

* format code

* changed method name

* add return typing

* bump version

* updated spec and def yaml

Co-authored-by: auganbay <auganenu@gmail.com>

* Update _helpers.tpl (#10617)

as helm templates integers as float64, when using %d, it renders the value of external airbyte.minio.endpoint to "S3_MINIO_ENDPOINT: "http://minio-service:%!d(float64=9000)", therefore needed to be changed to %g

* 🎉 Source Survey Monkey: add option to filter survey IDs (#8768)

* Add custom survey_ids

* bump version

* Update survey_question schema

* Add changelog

* Allow null objects

* merge master and format

* Make all types safe with NULL and add survey_ids to all streams

* Make additional types safe with NULL

* Make additional types safe with NULL

* One last safe NULL type

* small fixes

* solve conflic

* small fixes

* revert fb wrong commit

* small fb correction

* bump connector version

Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>

* Fix doc links/loading (#10621)

* Allow frontmatter in rendered markdown (#10624)

* Adjust to new normalization name (#10626)

* sweep pods from end time not start time (#10614)

* Source Pinterest: fix typo in schema fields (#10223)

* 🎉 add associations companies to deals, ticket and contacts stream (from PR 9027) (#10631)

* Added associations to some CRM Object streams in Hubspot connector

* Added associations in the relevant schemas

* fix eof

* bump connector version

Co-authored-by: ksoenandar <kevin.soenandar@gmail.com>

* Source Chargebee: add transaction stream (#10312)

* added transactions model

* changes

* fix

* few changes

* fix

* added new stream in configured_catalog*.json

* changes

* removed new stream in configured_catalog*.json

* solve small schema issues

* add eof

* bump connector version

Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>
Co-authored-by: Marcos Marx <marcosmarxm@users.noreply.github.com>

* Add missing continue as new (#10636)

* Bump Airbyte version from 0.35.36-alpha to 0.35.37-alpha (#10640)

Co-authored-by: benmoriceau <benmoriceau@users.noreply.github.com>

* exclude workers test from connectors builds on CI (#10615)

* 🎉 Source Google Workspace Admin Reports: add support for Google Meet Audit Activity Events (#10244)

* source(google-workspace-admin-reports): add support for Google Meet Audit activity events

Signed-off-by: Michele Zuccala <michele@zuccala.com>

* remove required fields

* bump connector version

* run format

Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>

* stabilize connection manager tests (#10606)

* stabilize connection manager tests

* just call shutdown once

* another run just so we can see if it's passing

* another run just so we can see if it's passing

* re-disable test

* run another test

* run another test

* run another test

* run another test

* Log pod state if init pod wait condition times out (for debugging transient test issue) (#10639)

* log pod state if init pod search times out

* increase test timeout from 5 to 6 minutes to give kube pod process timeout time to trigger

* format

* upgrade gradle from 7.3.3 -> 7.4 (#10645)

* upgrade temporal sdk to 1.8.1 (#10648)

* upgrade temporal from mostly 1.6.0 to 1.8.1

* try bumping GSM to get newer grpc dep

* Revert "try bumping GSM to get newer grpc dep"

This reverts commit d837650.

* upgrade temporal-testing as well

* don't change version for temporal-testing-junit5

* 🎉 Source Google Ads: add network fields to click view stream

* Google Ads #8331 - add network fields to click_view stream schema

* Google Ads #8331 - add segments.ad_network_type to click_view pk according to PR review

* Google Ads #8331 - bump version

* Google Ads #8331 - update definition

* Cloud Dashboard 1 (#10628)

Publish metrics for:
- created jobs tagged by release stage
- failed jobs tagged by release stage
- cancelled jobs tagged by release stage
- succeed jobs tagged by release stage

* Correct cancelled job metric name. (#10658)

* Add attempt status by release stage metrics. (#10659)

Add,

- attempt_created_by_release_stage
- attempt_failed_by_release_stage
- attempt_succeeded_by_release_stage

* 🐛 Source CockroachDB: fix connector replication failure due to multiple open portals error (#10235)

* fix cockroachdb connector replication failure due to multiple open portals error

* bump connector version

Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>

* 🐙 octavia-cli: implement `generate` command (#10132)

* Add try catch to make sure all handlers are closed (#10627)

* Add try catch to make sure all handlers are closed

* Handle exceptions while initializing writers

* Bumpversion of connectors

* bumpversion in seed

* Fix bigquery denormalized tests

* bumpversion seed of destination bigquery denormalized

* Fix links in onboarding page (#10656)

* Fix missing key inside map

* Fix onboarding progress links

* Add use-case links to onboarding (#10657)

* Add use-case links to onboarding

* Add new onboarding links

* Set resource limits for connector definitions: expose in worker (#10483)

* pipe through to worker

* wip

* pass source and dest def resource reqs to job client

* fix test

* use resource requirements utils to get resource reqs for legacy and new impls

* undo changes to pass sync input to container launcher worker factory

* remove import

* fix hierarchy order of resource requirements

* add nullable annotations

* undo change to test

* format

* use destination resource reqs for normalization and make resource req utils more flexible

* format

* refactor resource requirements utils and add tests

* switch to storing source/dest resource requirements directly on job sync config

* fix tests and javadocs

* use sync input resource requirements for container orchestrator pod

* do not set connection resource reqs to worker reqs

* add overrident requirement utils method + test + comment

Co-authored-by: lmossman <lake@airbyte.io>

* add mocks to tests

* Bump Airbyte version from 0.35.37-alpha to 0.35.38-alpha (#10668)

Co-authored-by: lmossman <lmossman@users.noreply.github.com>

* 🎉 Source Salesforce: speed up discovery >20x by leveraging parallel API calls (#10516)

* 📖  improve salesforce docs & reorder properties in the spec (#10679)

* Bump Airbyte version from 0.35.38-alpha to 0.35.39-alpha (#10680)

Co-authored-by: sherifnada <sherifnada@users.noreply.github.com>

* Improve note in salesforce docs about creating a RO user

* Upgrade plop in connector generators (#10578)

* Upgrade plop

* Remove scaffolded code

* Build fixes

* Remove scaffolded code

* Revert "Remove scaffolded code"

This reverts commit 3911f52.

* Revert "Remove scaffolded code"

This reverts commit 549f790.

* Remove .gitignore changes

* Remove .gitignore changes

* Update scaffold generated code

* Replace titleCase with capitalCase (#10654)

* Add capitalCase helper

* Replace titleCase with capitalCase

* Update generated scaffold files

Co-authored-by: LiRen Tu <tuliren.git@outlook.com>

* 🐛 Fix toggle styling (#10684)

* Fix error NPE in metrics emission. (#10675)

* Fix missing type=button (#10683)

* close ssh in case of exception during check in Postgres connector (#10620)

* close ssh in case of exception

* remove unwanted change

* remove comment

* format

* do not close scanner

* fix semi-colon

* format

* Refactor to enable support for optional JDBC parameters for all JDBC destinations (#10421)

* refactoring to allow testing

* MySQLDestination uses connection property map instead of url arguments

* Update jdbc destinations

* A little more generic

* reset to master

* reset to master

* move to jdbcutils

* Align when multiline

* Align when multiline

* Update postgres to use property map

* Move tests to AbstractJdbcDestinationTest

* clean

* Align when multiline

* return property map

* Add postgres tests

* update clickhouse

* reformat

* reset

* reformat

* fix test

* reformat

* fix bug

* Add mssql tests

* refactor test

* fix oracle destination test

* oracle tests

* fix redshift acceptance test

* Pass string

* Revert "Pass string"

This reverts commit 6978217.

* Double deserialization

* Revert "Double deserialization"

This reverts commit ee8d752.

* try updating json_operations

* Revert "try updating json_operations"

This reverts commit c8022c2.

* json parse

* Revert "json parse"

This reverts commit 11a6725.

* Revert "Revert "Double deserialization""

This reverts commit 213f47a.

* Revert "Revert "Revert "Double deserialization"""

This reverts commit 6682245.

* move to constant

* Add comment

* map can be constant

* Add comment

* move map

* hide in method

* no need to create new map

* no need to create new map

* no need to create new map

* enably mysql test

* Update changelogs

* Update changelog

* update changelog

* Bump versions

* bump version

* disable dbt support

* update spec

* update other oracle tests

* update doc

* bump seed

* fix source test

* update seed spec file

* fix expected spec

* Fix trial period time frame (#10714)

* Bmoric/restore update with temporal (#10713)

Restore the missing update call to temporal.

It was making the update of a schedule to not be effective immediately.

* Bump Airbyte version from 0.35.39-alpha to 0.35.40-alpha (#10716)

Co-authored-by: benmoriceau <benmoriceau@users.noreply.github.com>

* Fix CockroachDbSource compilation error (#10731)

* Fix CockroachDbSource compilation error

* fix test too

* 🎉 Source Zendesk: sync rate improvement (#9456)

* Update Source Zendesk request execution with future requests.

* Revert "Update Source Zendesk request execution with future requests."

This reverts commit 2a3c1f8.

* Add futures stream logics.

* Fix stream

* Fix full refresh streams.

* Update streams.py.
Fix all streams.
Updated schema.

* Add future request unit tests

* Post review fixes.

* Fix broken incremental streams.
Fix SAT.
Remove odd unit tests.

* Comment few unit tests

* Bump docker version

* CDK: Ensure AirbyteLogger is thread-safe using Lock (#9943)

* Ensure AirbyteLogger is thread-safe

- Introduce a global lock to ensure `AirbyteLogger` is thread-safe.
- The `logging` module is thread-safe, however `print` is not, and is currently used. This means that messages sent to stdout can clash if connectors use threading. This is obviously a huge problem when the IPC between the source/destination is stdout!
- A `multiprocessing.Lock` could have been introduced however given that `logging` module is not multiprocess-safe I thought that thread-safety should be first goal.
- IMO the `AirbyteLogger` should be a subclass of the `logging.Logger` so you have thread-safety automatically, however I didn't want to make a huge wholesale change here.

* Revert lock and add deprecation warning instead

* remove --cpu-shares flag (#10738)

* Bump Airbyte version from 0.35.40-alpha to 0.35.41-alpha (#10740)

Co-authored-by: jrhizor <jrhizor@users.noreply.github.com>

* Add Scylla destination to index (#10741)

* Add scylla to destination_definitions

* Add woocommerce source

* Update definition id

* Add icon

* update docker repository

* reset to master

* fix version

* generate spec

* Update builds.md

* run gradle format (#10746)

* Bump Airbyte version from 0.35.41-alpha to 0.35.42-alpha (#10747)

Co-authored-by: girarda <girarda@users.noreply.github.com>

* Change offer amount

* Fix back link on signup page (#10732)

* Fix back link on signup page

* Add and correct uiConfig links

* 🎉 Source redshift: implement privileges check (#9744)

* update postgres source version (#10696)

* update postgres source version

* update spec

* fix[api]: nullable connection schedule (#10107)

* fix[api] inconsistent casing on OperationID for Operations API  (#10464)

* #10307 Fixes inconsistent casing on OperationID for Operations API

* update generated doc

Co-authored-by: alafanechere <augustin.lafanechere@gmail.com>

* Display numbers in usage per connection table (#10757)

* Add connector stage to dropdown value (#10677)

* Add connector stage to dropdown value

* Remove line break from i18n message

* Update snowflake destination docs for correct host (#10673)

* Update snowflake destination docs for correct host

* Update snowflake.md

* Update README.md

* Update spec.json

* Update README.md

* Update spec.json

* Update README.md

* Update snowflake.md

* Update spec.json

* Update spec.json

* 📕 source salesforce: fix broken page anchor in spec.json & add guide for adding read only user (#10751)

* 🎉  Source Facebook Marketing: add activities stream (#10655)

* add facebook marketing activities stream

* update incremental test

* add overrides for activities specific logic

* formatting

* update readme docs

* remove test limitation

* update dockerfile airbyte version

* correct tests

* bump connector version in config module

Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>

* Add a note about running only in dev mode on M1 (#10772)

Macs with M1 chip can run Airbyte only in dev mode right now, so to make it clear, I added a note about it and moved the hint about M1 chips to the top of the section.

* push failures to segment (#10715)

* test: new failures metadata for segment tracking

* new failures metadata for segment tracking

failure_reasons: array of all failures (as json objects) for a job
- for general analytics on failures
main_failure_reason: main failure reason (as json object) for this job
- for operational usage (for Intercom)
- currently this is just the first failure reason chronologically
    - we'll probably to change this when we have more data on how to
determine failure reasons more intelligently

- added an attempt_id to failures so we can group failures by attempt
- removed stacktrace from failures since it's not clear how we'd use
these in an analytics use case (and because segment has a 32kb size
limit for events)

* remove attempt_id

attempt info is already in failure metadata

* explicitly sort failures array chronologically

* replace "unknown" enums with null

note: ImmutableMaps don't allow nulls

* move sorting to the correct place

* Update temporal retention TTL from 7 to 30 days (#10635)

Increase the temporal retention to 30 days instead of 7. It will help with on call investigation.

* Add count connection functions (#10568)

* Add count connection functions

* Fix new configRepository queries

- Remove unnecessary joins
- Fix countConnection

* Use existing mock data for tests

* Adds default sidecar cpu request and limit and add resources to the init container (#10759)

* close ssh tunnel in case of exception in destination consumer (#10686)

* close ssh tunnel in case of exception

* format

* fix salesforce docs markdown formatting

* Fix typo in salesforce docs

* Extract event from the temporal worker run factory (#10739)

Extract of different events that can happen to a sync into a non temporal related interface.

* Bump Airbyte version from 0.35.42-alpha to 0.35.43-alpha (#10778)

Co-authored-by: sherifnada <sherifnada@users.noreply.github.com>

* Added a note about running in dev mode on M1 macs (#10776)

Currently, Macs with M1 chips can run Airbyte only in dev mode. I added a note about that.

* Destination Snowflake: add missing version in changelog (#10779)

* Hide shopify in Cloud (#10783)

* Metrics Reporter Queries Part 1 (#10663)

Add all the simpler queries from https://docs.google.com/document/d/11pEUsHyKUhh4CtV3aReau3SUG-ncEvy6ROJRVln6YB4/edit?usp=sharing.

- Num Pending Jobs
- Num Concurrent Jobs
- Oldest Pending Job
- Oldest Running Job

* Bump Airbyte version from 0.35.43-alpha to 0.35.44-alpha (#10789)

* Bump Airbyte version from 0.35.43-alpha to 0.35.44-alpha

* Commit.

* Add exception block.

* Why would having try catch work?

* Add logging to figure out.

* Undo all debugging changes.

* Better comments.

Co-authored-by: davinchia <davinchia@users.noreply.github.com>
Co-authored-by: Davin Chia <davinchia@gmail.com>

* Update api-documentation.md

* jdbc build fixes (#10799)

* Update api-documentation.md

* Exclude package.json from codeowners (#10805)

* 🎉 Source Chargebee: add credit note model (#10795)

* feat(chargebee) add credit note model

* fix(airbyte): update version Dockerfile

* fix(airbyte): update version Dockerfile v2

* Source Chargebee: run format and correct unit test (#10811)

* feat(chargebee) add credit note model

* fix(airbyte): update version Dockerfile

* fix(airbyte): update version Dockerfile v2

* correct unit test

Co-authored-by: Koen Sengers <k.sengers@gynzy.com>

* 🎉 Source Chartmogul: Add CustomerCount stream (#10756)

* 🎉 Source Chartmogul: Add CustomerCount stream

* Update description

* address comments

* update changelog

* format source file

* run seed file

Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>

* default to no resource limits for OSS (#10800)

* Add autoformat (#10808)

* Bump Airbyte version from 0.35.44-alpha to 0.35.45-alpha (#10818)

Co-authored-by: lmossman <lmossman@users.noreply.github.com>

* Set default values as current values in editMode (#10486)

* Set default values as current values in editMode

* Fix unit tests

* Save signup fields (#10768)

* Temporary save signup fields into firebase_user.displayName

* Use default values if no displayName was stored before

* Move regsiter to localStorage

* Address PR comments

* Source Woocommerce: fixes (#10529)

* fixed issues

* Fix: multiple issues

* modify configured catalog

* Fix: remove unused variables

* Fix: orders request with parameters

* Fix: add new line in configured catalogs

* Fix: remove unused imports

* Fix: catalog changes

* Source woocommerce: publishing connector (#10791)

* fixed issues

* Fix: multiple issues

* modify configured catalog

* Fix: remove unused variables

* Fix: orders request with parameters

* Fix: add new line in configured catalogs

* Fix: remove unused imports

* Fix: catalog changes

* fix: change schema for meta_data

Co-authored-by: Manoj <saimanoj58@gmail.com>

* Surface any active child thread of dying connectors  (#10660)

* Interrupt child thread of dying connectors to avoid getting stuck

* Catch and print stacktrace

* Add test on interrupt/kill time outs

* Send message to sentry too

* Add another token to alleviate API limit pressure. (#10826)

We are running into Github API rate limits.

This PR:
- introduces another token as a temp solution.
- reorganises the workflow file.

* Add caching to all jobs in the main build. (#10801)

Add build dependency caching to all jobs in the main build.

This speeds things up by 5 mins over the previously uncached time.

* 🐛 Handle try/catch in BigQuery destination consumers (#10755)

* Handle try/catch in BigQuery destination consumers

* Remove parallelStream

* Bumpversion of connector

* update changelogs

* update seeds

* Format code (#10837)

* Regenerate MySQL outputs from normalization tests

* format

* Use cypress dashboard and stabilize e2e tests (#10807)

* Record e2e tests to cypress dashboard

* Make env variable accessible in script

* Improve e2e_test script

* Properly wait for server to be ready

* Isolate test suites better

* More test isolation

* Revert baseUrl for development

* 🐛 Source Github: add new streams `Deployments`, `ProjectColumns`, `PullRequestCommits` (#10385)

Signed-off-by: Sergey Chvalyuk <grubberr@gmail.com>

* Remove the use of ConfigPersistence for ActorCatalog operation (#10387)

* Skip ConfigPersistence for ActorCatalog operations

* Fix catalog insertion logic

- ActorCatalog and ActorCatalogFetchEvent are stored within the same
  transation.
- The function writing catalog now automatically handles deduplication.
- Fixed function visibility: helper function to handle ActorCatalog
  insertion are now private.

* Fix fetch catalog query

take the catalog associated with the latest fetch event in case where
multiple event are present for the same config, actorId, actor version.

* Fix name of columns used for insert

* Add testing on deduplication of catalogs

* Add javadoc for actor catalog functions

* Rename sourceId to actorId

* Fix formatting

* Update integrations README.md (#10851)

Updated verbiage from grades to stages
Updated connector stages to match cloud stage tags
Added connectors missing on README.md that appear on cloud drop down

* [10033] Destination-Snowflake: added basic part for support oauth login mode

* added basic logic for token refresh

* Updated spec to support DBT normalization and OAuth

* snowflake oauth

Signed-off-by: Sergey Chvalyuk <grubberr@gmail.com>

* test_transform_snowflake_oauth added

Signed-off-by: Sergey Chvalyuk <grubberr@gmail.com>

* [4654] Added backward compatibility

* Added test to check a backward compatibility

* fixed oauth connection

* Updated doc, fixed code as per comments in PR

* to be more explicit

Signed-off-by: Sergey Chvalyuk <grubberr@gmail.com>

* Added executor service

* Fixed merge conflict

* Updated doc and bumped version

* Bumped version

* bump 0.1.71 -> 0.1.72

Signed-off-by: Sergey Chvalyuk <grubberr@gmail.com>

* Updated doc

* fix version in basic-normalization.md

Signed-off-by: Sergey Chvalyuk <grubberr@gmail.com>

* Added explicit re-set property, but even now it already works

* dummy bumping version

* updated spec

Co-authored-by: ievgeniit <etsybaev@gmail.com>
Co-authored-by: Tim Roes <tim@airbyte.io>
Co-authored-by: Octavia Squidington III <90398440+octavia-squidington-iii@users.noreply.github.com>
Co-authored-by: timroes <timroes@users.noreply.github.com>
Co-authored-by: Philippe Boyd <philippeboyd@users.noreply.github.com>
Co-authored-by: marcosmarxm <marcosmarxm@gmail.com>
Co-authored-by: Álvaro Torres Cogollo <atorrescogollo@gmail.com>
Co-authored-by: Eugene Kulak <widowmakerreborn@gmail.com>
Co-authored-by: Sherif A. Nada <snadalive@gmail.com>
Co-authored-by: Eugene Kulak <kulak.eugene@gmail.com>
Co-authored-by: Benoit Moriceau <benoit@airbyte.io>
Co-authored-by: Amruta Ranade <11484018+Amruta-Ranade@users.noreply.github.com>
Co-authored-by: Charles <charles@airbyte.io>
Co-authored-by: Parker Mossman <parker@airbyte.io>
Co-authored-by: Jared Rhizor <me@jaredrhizor.com>
Co-authored-by: augan-rymkhan <93112548+augan-rymkhan@users.noreply.github.com>
Co-authored-by: auganbay <auganenu@gmail.com>
Co-authored-by: keterslayter <32784192+keterslayter@users.noreply.github.com>
Co-authored-by: Daniel Diamond <33811744+danieldiamond@users.noreply.github.com>
Co-authored-by: Ronald Fortmann <72810611+rfortmann-ewolff@users.noreply.github.com>
Co-authored-by: Marcos Marx <marcosmarxm@users.noreply.github.com>
Co-authored-by: ksoenandar <kevin.soenandar@gmail.com>
Co-authored-by: Aaditya Sinha <75474786+aadityasinha-dotcom@users.noreply.github.com>
Co-authored-by: benmoriceau <benmoriceau@users.noreply.github.com>
Co-authored-by: Michele Zuccala <michele@zuccala.com>
Co-authored-by: vitaliizazmic <75620293+vitaliizazmic@users.noreply.github.com>
Co-authored-by: Davin Chia <davinchia@gmail.com>
Co-authored-by: Lakshmikant Shrinivas <lakshmikant@gmail.com>
Co-authored-by: Augustin <augustin.lafanechere@gmail.com>
Co-authored-by: Christophe Duong <christophe.duong@gmail.com>
Co-authored-by: lmossman <lake@airbyte.io>
Co-authored-by: lmossman <lmossman@users.noreply.github.com>
Co-authored-by: Maksym Pavlenok <antixar@gmail.com>
Co-authored-by: sherifnada <sherifnada@users.noreply.github.com>
Co-authored-by: LiRen Tu <tuliren.git@outlook.com>
Co-authored-by: Subodh Kant Chaturvedi <subodh1810@gmail.com>
Co-authored-by: girarda <alexandre@airbyte.io>
Co-authored-by: Vadym Hevlich <vege1wgw@gmail.com>
Co-authored-by: jdclarke5 <jdclarke5@gmail.com>
Co-authored-by: jrhizor <jrhizor@users.noreply.github.com>
Co-authored-by: girarda <girarda@users.noreply.github.com>
Co-authored-by: Azhar Dewji <azhardewji@gmail.com>
Co-authored-by: Alasdair Brown <sdairs@users.noreply.github.com>
Co-authored-by: Julia <julia.chvyrova@gmail.com>
Co-authored-by: Lucas Wiley <lucas@tremendous.com>
Co-authored-by: Philip Corr <PhilipCorr@users.noreply.github.com>
Co-authored-by: Greg Solovyev <grishick@users.noreply.github.com>
Co-authored-by: Peter Hu <peter@airbyte.io>
Co-authored-by: Malik Diarra <malik@airbyte.io>
Co-authored-by: Thibaud Chardonnens <thibaud.ch@gmail.com>
Co-authored-by: davinchia <davinchia@users.noreply.github.com>
Co-authored-by: Erica Struthers <93952107+erica-airbyte@users.noreply.github.com>
Co-authored-by: Edward Gao <edward.gao@airbyte.io>
Co-authored-by: Tim Roes <mail@timroes.de>
Co-authored-by: ksengers <30521298+Koen03@users.noreply.github.com>
Co-authored-by: Koen Sengers <k.sengers@gynzy.com>
Co-authored-by: Titas Skrebe <titas@omnisend.com>
Co-authored-by: Artem Astapenko <3767150+Jamakase@users.noreply.github.com>
Co-authored-by: Manoj Reddy KS <saimanoj58@gmail.com>
Co-authored-by: Harshith Mullapudi <harshithmullapudi@gmail.com>
Co-authored-by: Juan <80164312+jnr0790@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/connectors Connector related issues area/documentation Improvements or additions to documentation community
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Source Facebook Marketing: Add Activities Stream
5 participants