airbyte
airbyte copied to clipboard
🎉 Source Amazon Ads : Add attribution reports
What
*Add attribution reports
How
*Call attribution report API for different report types
Recommended reading order
-
source.py
-
streams/attribution_report.py
🚨 User Impact 🚨
No impact to existing functionality. Not a breaking change
Pre-merge Checklist
Updating a connector
Community member or Airbyter
- [x] Grant edit access to maintainers (instructions)
- [ ] Secrets in the connector's spec are annotated with
airbyte_secret
- [x] 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 - [x] Changelog updated in
docs/integrations/<source or destination>/<name>.md
including changelog. See changelog example
- [ ] Connector's
- [x] 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
- [ ] If new credentials are required for use in CI, add them to GSM. Instructions.
- [ ]
/test connector=connectors/<name>
command is passing - [ ] New Connector version released on Dockerhub and connector version bumped by running the
/publish
command described here
Tests
Unit
Results (4.23s):
55 passed
Name Stmts Miss Cover Missing
-----------------------------------------------------------------------------------------------
source_amazon_ads/__init__.py 2 0 100%
source_amazon_ads/constants.py 1 0 100%
source_amazon_ads/schemas/__init__.py 7 0 100%
source_amazon_ads/schemas/attribution_report.py 21 0 100%
source_amazon_ads/schemas/common.py 51 1 98% 26
source_amazon_ads/schemas/profile.py 16 0 100%
source_amazon_ads/schemas/sponsored_brands.py 22 0 100%
source_amazon_ads/schemas/sponsored_display.py 31 0 100%
source_amazon_ads/schemas/sponsored_products.py 37 0 100%
source_amazon_ads/source.py 44 1 98% 129
source_amazon_ads/streams/__init__.py 7 0 100%
source_amazon_ads/streams/attribution_report.py 78 0 100%
source_amazon_ads/streams/common.py 79 1 99% 157
source_amazon_ads/streams/profiles.py 21 0 100%
source_amazon_ads/streams/report_streams/__init__.py 5 0 100%
source_amazon_ads/streams/report_streams/brands_report.py 10 0 100%
source_amazon_ads/streams/report_streams/brands_video_report.py 10 0 100%
source_amazon_ads/streams/report_streams/display_report.py 16 0 100%
source_amazon_ads/streams/report_streams/products_report.py 18 0 100%
source_amazon_ads/streams/report_streams/report_streams.py 237 18 92% 137, 190-191, 243-244, 363-364, 396-398, 409-413, 427-428, 430
source_amazon_ads/streams/sponsored_brands.py 17 0 100%
source_amazon_ads/streams/sponsored_display.py 22 0 100%
source_amazon_ads/streams/sponsored_products.py 32 0 100%
source_amazon_ads/utils.py 9 0 100%
unit_tests/__init__.py 0 0 100%
unit_tests/conftest.py 34 0 100%
unit_tests/test_attribution_report.py 56 1 98% 47
unit_tests/test_report_streams.py 288 0 100%
unit_tests/test_source.py 47 0 100%
unit_tests/test_streams.py 126 1 99% 77
unit_tests/utils.py 32 0 100%
-----------------------------------------------------------------------------------------------
TOTAL 1376 23 98%
Integration
Put your integration tests output here.
Acceptance
Put your acceptance tests output here.
Need help with acceptance tests.
With my version of secrets/config.json
file, it's stuck after reaching 70%. Looks like tests are based for a specific ads account.
python -m pytest -p integration_tests.acceptance
Test session starts (platform: darwin, Python 3.9.11, pytest 6.1.2, pytest-sugar 0.9.5)
cachedir: .pytest_cache
hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('/Users/ganpatagarwal/stoke/airbyte/airbyte-integrations/connectors/source-amazon-ads/.hypothesis/examples')
rootdir: /Users/ganpatagarwal/stoke/airbyte, configfile: pytest.ini
plugins: sugar-0.9.5, requests-mock-1.9.3, mock-3.7.0, hypothesis-6.54.4, timeout-1.4.2, cov-3.0.0
collecting ...
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_config_match_spec[inputs0] ✓ 3% ▍
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_match_expected[inputs0] ✓ 6% ▋
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_docker_env[inputs0] ✓ 9% ▉
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_oneof_usage[inputs0] ✓ 12% █▎
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_required[inputs0] ✓ 15% █▌
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_optional[inputs0] ✓ 18% █▊
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_has_secret[inputs0] ✓ 21% ██▎
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_secret_never_in_the_output[inputs0] ✓ 24% ██▌
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_defined_refs_exist_in_json_spec_file[inputs0] ✓ 27% ██▊
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_oauth_flow_parameters[inputs0] ✓ 30% ███
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_backward_compatibility[inputs0] ✓ 33% ███▍
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_additional_properties_is_true[inputs0] ✓ 36% ███▋
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestConnection.test_check[inputs0] ✓ 39% ███▉
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestConnection.test_check[inputs1] ✓ 42% ████▎
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_discover[inputs0] ✓ 45% ████▋
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_cursors_exist_in_schema[inputs0] ✓ 48% ████▉
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_refs_exist_in_schema[inputs0] ✓ 52% █████▎
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_keyword_exist_in_schema[inputs0-allOf] ✓ 55% █████▌
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_keyword_exist_in_schema[inputs0-not] ✓ 58% █████▊
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_primary_keys_exist_in_schema[inputs0] ✓ 61% ██████▏
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_streams_has_sync_modes[inputs0] ✓ 64% ██████▍
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_additional_properties_is_true[inputs0] ✓ 67% ██████▋
airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_backward_compatibility[inputs0] ✓ 70% ███████ ^C
{"type": "LOG", "log": {"level": "INFO", "message": "/Users/ganpatagarwal/stoke/airbyte/airbyte-integrations/connectors/source-amazon-ads - SAT run - 4d86c53ca5646a106dda7d35226e032637529b26 - PASSED"}}
regarding the test being stuck at 70%, can you remove the expect_records
section and try again?
expect_records:
path: "integration_tests/expected_records.txt"
extra_fields: no
exact_order: no
extra_records: no
@sajarin can you help cherry-pick this commit to the topic branch? https://github.com/YiyangLi/airbyte/commit/9341fc62a69b90ac114568b5d66a2faefba9d9bd
It's irrelevant to this topic branch. The acceptance test fails at TestDiscovery.test_backward_compatibility
even in the master
branch because of the missing data. I added the data back.
I don't know why, in my local test, the test is stuck at TestBasicRead.test_read[inputs0]
for a long time, in both the topic branch and master branch.
To reproduce the issue, you can use the credential, but change the region from SANDBOX
to NA
.
/test connector=connectors/source-amazon-ads
/test connector=connectors/source-amazon-ads
:clock2: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3023863746 :x: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3023863746 :bug: https://gradle.com/s/mszvkqcli3gso
Build Failed
Test summary info:
=========================== short test summary info ============================
FAILED test_core.py::TestBasicRead::test_read[inputs0] - docker.errors.Contai...
FAILED test_full_refresh.py::TestFullRefresh::test_sequential_reads[inputs0]
FAILED test_incremental.py::TestIncremental::test_two_sequential_reads[inputs0]
FAILED test_incremental.py::TestIncremental::test_read_sequential_slices[inputs0]
================== 4 failed, 28 passed in 6678.75s (1:51:18) ===================
@ganpatagarwal The CI throws an error of This profileID is not authorized to use Amazon Attribution
. I guess that's why the acceptance tests are stuck. Can you provide the instruction about it? Or even better, can you update the doc for Amazon Ads? docs/integrations/sources/amazon-ads.md
Thanks.
@YiyangLi
The amazon ads account I am using for testing is not given me any issues to fetch attribution report. We had been using the attribution feature on that account and used the same to fetch the reports via API.
If you are authorizing your developer application with advertising::campaign_management
scope, it should have access to Attribution APIs
My guess would be limitations with the amazon ads account your are using with CI
https://advertising.amazon.com/API/docs/en-us/amazon-attribution/troubleshooting#i-get-a-403-error-when-i-call-an-amazon-attribution-endpoint-using-my-advertisers-profile-even-though-i-am-authorized
Amazon Attribution is currently available in beta to professional seller brand owners enrolled in Amazon Brand Registry and vendors that sell products on Amazon in the following markets: US, Canada, Mexico, UK, Germany, France, Italy, Spain, and Netherlands.
I have already added the link for amazon attribution reports in docs/integrations/sources/amazon-ads.md
Please let me know if I should add any other information.
@YiyangLi
The amazon ads account I am using for testing is not given me any issues to fetch attribution report. We had been using the attribution feature on that account and used the same to fetch the reports via API.
If you are authorizing your developer application with
advertising::campaign_management
scope, it should have access to Attribution APIsMy guess would be limitations with the amazon ads account your are using with CI
https://advertising.amazon.com/API/docs/en-us/amazon-attribution/troubleshooting#i-get-a-403-error-when-i-call-an-amazon-attribution-endpoint-using-my-advertisers-profile-even-though-i-am-authorized
Amazon Attribution is currently available in beta to professional seller brand owners enrolled in Amazon Brand Registry and vendors that sell products on Amazon in the following markets: US, Canada, Mexico, UK, Germany, France, Italy, Spain, and Netherlands.
I have already added the link for amazon attribution reports in
docs/integrations/sources/amazon-ads.md
Please let me know if I should add any other information.
Thank you, I will get the dev account and try to get a new token. Overall, the goal is to get acceptance tests passed at 100%, then we are good to merge.
So, are you able to complete the acceptance test? If not, you could bypass the expect_records by removing the section locally? It would be great if you could share the pass rate on your end.
@YiyangLi
I started executing acceptance test iteratively on my local env.
First Error
------------------------------------------------------------------------------------- Captured log call --------------------------------------------------------------------------------------
ERROR root:test_core.py:376
The sponsored_display_campaigns stream has the following schema errors:
163170956955202 is not of type 'null', 'string'
Failed validating 'type' in schema['properties']['portfolioId']:
{'type': ['null', 'string']}
On instance['portfolioId']:
163170956955202
Applied below fix
--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display.py
@@ -16,7 +16,7 @@ class DisplayCampaign(CatalogModel):
endDate: str = None
costType: str
state: str
- portfolioId: str = None
+ portfolioId: Decimal = None
tactic: str
deliveryProfile: str
Second Error With above fix applied , it's failing at backward compatibility check
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <source_acceptance_test.utils.backward_compatibility.CatalogDiffChecker object at 0x108e86ac0>, message = "The'type' field value was changed."
diff = {'dictionary_item_added': [<root['attribution_report_performance_adgroup'] t1:not present, t2:{'type': 'ob...}>, <root...ues_changed': [<root['sponsored_display_campaigns']['properties']['portfolioId']['type'][1] t1:'string', t2:'number'>]}
def _raise_error(self, message: str, diff: DeepDiff):
> raise NonBackwardCompatibleError(f"{message}. Diff: {diff.pretty()}", self.context)
E source_acceptance_test.utils.backward_compatibility.NonBackwardCompatibleError: BackwardIncompatibilityContext.DISCOVER - The'type' field value was changed.. Diff: Item root['attribution_report_performance_adgroup'] added to dictionary.
E Item root['attribution_report_performance_campaign'] added to dictionary.
E Item root['attribution_report_performance_creative'] added to dictionary.
E Item root['attribution_report_products'] added to dictionary.
E Item root['sponsored_display_campaigns']['properties']['portfolioId']['type'][1] removed from iterable.
../../bases/source-acceptance-test/source_acceptance_test/utils/backward_compatibility.py:38: NonBackwardCompatibleError
How to fix this?
it looks like portfolioId
comes from sponsored_products stream, and it's expected to be a nullable string, but the data is an integer.
@sajarin can you help me cherry-pick the commit https://github.com/YiyangLi/airbyte/commit/8a9ac8f07ecfbe1c99880d55130c03f18a68acf1 and run again the acceptance test for me?
/test connector=connectors/source-amazon-ads
/test connector=connectors/source-amazon-ads
:clock2: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3054665410 :x: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3054665410 :bug: https://gradle.com/s/ifdn3y5j7iy46
Build Failed
Test summary info:
=========================== short test summary info ============================
FAILED test_core.py::TestBasicRead::test_read[inputs0] - docker.errors.Contai...
FAILED test_full_refresh.py::TestFullRefresh::test_sequential_reads[inputs0]
FAILED test_incremental.py::TestIncremental::test_two_sequential_reads[inputs0]
================== 3 failed, 29 passed in 6439.61s (1:47:19) ===================
/test connector=connectors/source-amazon-ads
:clock2: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3106402954 :white_check_mark: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3106402954 Python tests coverage:
Name Stmts Miss Cover
-------------------------------------------------------------------------------------
source_amazon_ads/utils.py 9 0 100%
source_amazon_ads/streams/sponsored_products.py 32 0 100%
source_amazon_ads/streams/sponsored_display.py 22 0 100%
source_amazon_ads/streams/sponsored_brands.py 17 0 100%
source_amazon_ads/streams/report_streams/products_report.py 18 0 100%
source_amazon_ads/streams/report_streams/display_report.py 16 0 100%
source_amazon_ads/streams/report_streams/brands_video_report.py 10 0 100%
source_amazon_ads/streams/report_streams/brands_report.py 10 0 100%
source_amazon_ads/streams/report_streams/__init__.py 5 0 100%
source_amazon_ads/streams/profiles.py 21 0 100%
source_amazon_ads/streams/attribution_report.py 81 0 100%
source_amazon_ads/streams/__init__.py 7 0 100%
source_amazon_ads/schemas/sponsored_products.py 37 0 100%
source_amazon_ads/schemas/sponsored_display.py 31 0 100%
source_amazon_ads/schemas/sponsored_brands.py 22 0 100%
source_amazon_ads/schemas/profile.py 16 0 100%
source_amazon_ads/schemas/attribution_report.py 21 0 100%
source_amazon_ads/schemas/__init__.py 7 0 100%
source_amazon_ads/constants.py 1 0 100%
source_amazon_ads/__init__.py 2 0 100%
source_amazon_ads/streams/common.py 79 1 99%
source_amazon_ads/schemas/common.py 51 1 98%
source_amazon_ads/source.py 44 1 98%
source_amazon_ads/streams/report_streams/report_streams.py 237 18 92%
-------------------------------------------------------------------------------------
TOTAL 796 21 97%
Name Stmts Miss Cover Missing
----------------------------------------------------------------------------------
source_acceptance_test/base.py 10 4 60% 15-18
source_acceptance_test/config.py 83 6 93% 78-80, 84-86
source_acceptance_test/conftest.py 164 164 0% 6-282
source_acceptance_test/plugin.py 48 48 0% 6-104
source_acceptance_test/tests/test_core.py 329 111 66% 39, 50-58, 63-70, 74-75, 79-80, 164, 202-219, 228-236, 240-245, 251, 284-289, 327-334, 374-376, 379, 439-448, 477-478, 484, 487, 520-530, 543-568, 573-577
source_acceptance_test/tests/test_full_refresh.py 52 2 96% 34, 65
source_acceptance_test/tests/test_incremental.py 152 26 83% 21-23, 29-31, 36-43, 48-61, 239, 250-258
source_acceptance_test/utils/asserts.py 37 2 95% 57-58
source_acceptance_test/utils/common.py 77 17 78% 15-16, 24-30, 47-54, 64, 67
source_acceptance_test/utils/compare.py 62 23 63% 21-51, 68, 97-99
source_acceptance_test/utils/connector_runner.py 112 50 55% 23-26, 32, 36, 39-67, 70-72, 75-77, 80-82, 85-87, 90-92, 95-113, 147-149
source_acceptance_test/utils/json_schema_helper.py 105 13 88% 30-31, 38, 41, 65-68, 96, 120, 190-192
----------------------------------------------------------------------------------
TOTAL 1358 466 66%
Build Passed
Test summary info:
All Passed
@grubberr are we able to merge this?
/test connector=connectors/source-amazon-ads
:clock2: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3128888397 :x: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3128888397 :bug: https://gradle.com/s/2zmhoymp77pk4
Build Failed
Test summary info:
=========================== short test summary info ============================
FAILED test_incremental.py::TestIncremental::test_read_sequential_slices[inputs0]
================== 1 failed, 31 passed in 4254.78s (1:10:54) ===================
@sajarin
Failed: Timeout >2400.0s
According to the log, it looks like the Integration test timeouts at incremental test, can you help to run the test again? Thanks.
/test connector=connectors/source-amazon-ads
:clock2: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3129700626 :x: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3129700626 :bug: https://gradle.com/s/ft72ypn6sndji
Build Failed
Test summary info:
=========================== short test summary info ============================
FAILED test_incremental.py::TestIncremental::test_two_sequential_reads[inputs0]
================== 1 failed, 31 passed in 3970.08s (1:06:10) ===================
https://github.com/airbytehq/airbyte/pull/17202 there is a patch merged to master today, @ganpatagarwal can you rebase and try again? sorry for the inconvenience.
This branch has conflicts that must be resolved
The conflict is related to the doc, hope it's quick.
docs/integrations/sources/amazon-ads.md
Done !!
/test connector=connectors/source-amazon-ads
:clock2: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3145122936 :white_check_mark: connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3145122936 Python tests coverage:
Name Stmts Miss Cover
-------------------------------------------------------------------------------------
source_amazon_ads/utils.py 9 0 100%
source_amazon_ads/streams/sponsored_products.py 32 0 100%
source_amazon_ads/streams/sponsored_display.py 22 0 100%
source_amazon_ads/streams/sponsored_brands.py 17 0 100%
source_amazon_ads/streams/report_streams/products_report.py 18 0 100%
source_amazon_ads/streams/report_streams/display_report.py 16 0 100%
source_amazon_ads/streams/report_streams/brands_video_report.py 10 0 100%
source_amazon_ads/streams/report_streams/brands_report.py 10 0 100%
source_amazon_ads/streams/report_streams/__init__.py 5 0 100%
source_amazon_ads/streams/profiles.py 21 0 100%
source_amazon_ads/streams/attribution_report.py 81 0 100%
source_amazon_ads/streams/__init__.py 7 0 100%
source_amazon_ads/schemas/sponsored_products.py 37 0 100%
source_amazon_ads/schemas/sponsored_display.py 31 0 100%
source_amazon_ads/schemas/sponsored_brands.py 22 0 100%
source_amazon_ads/schemas/profile.py 16 0 100%
source_amazon_ads/schemas/attribution_report.py 21 0 100%
source_amazon_ads/schemas/__init__.py 7 0 100%
source_amazon_ads/constants.py 1 0 100%
source_amazon_ads/__init__.py 2 0 100%
source_amazon_ads/streams/common.py 79 1 99%
source_amazon_ads/schemas/common.py 51 1 98%
source_amazon_ads/source.py 44 1 98%
source_amazon_ads/streams/report_streams/report_streams.py 240 19 92%
-------------------------------------------------------------------------------------
TOTAL 799 22 97%
Name Stmts Miss Cover Missing
----------------------------------------------------------------------------------
source_acceptance_test/base.py 10 4 60% 15-18
source_acceptance_test/config.py 83 6 93% 78-80, 84-86
source_acceptance_test/conftest.py 164 164 0% 6-282
source_acceptance_test/plugin.py 48 48 0% 6-104
source_acceptance_test/tests/test_core.py 329 111 66% 39, 50-58, 63-70, 74-75, 79-80, 164, 202-219, 228-236, 240-245, 251, 284-289, 327-334, 374-376, 379, 439-448, 477-478, 484, 487, 520-530, 543-568, 573-577
source_acceptance_test/tests/test_full_refresh.py 52 2 96% 34, 65
source_acceptance_test/tests/test_incremental.py 152 26 83% 21-23, 29-31, 36-43, 48-61, 239, 250-258
source_acceptance_test/utils/asserts.py 37 2 95% 57-58
source_acceptance_test/utils/common.py 77 17 78% 15-16, 24-30, 47-54, 64, 67
source_acceptance_test/utils/compare.py 62 23 63% 21-51, 68, 97-99
source_acceptance_test/utils/connector_runner.py 112 50 55% 23-26, 32, 36, 39-67, 70-72, 75-77, 80-82, 85-87, 90-92, 95-113, 147-149
source_acceptance_test/utils/json_schema_helper.py 105 13 88% 30-31, 38, 41, 65-68, 96, 120, 190-192
----------------------------------------------------------------------------------
TOTAL 1358 466 66%
Build Passed
Test summary info:
All Passed