Repository navigation
feat(standard-tests): run each acceptance-test-config.yml config with its section's command, and assert the check status and basic_read records - #1142
Conversation
Co-Authored-By: bot_apk <apk@cognition.ai>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
👋 Greetings, Airbyte Team Member!Here are some helpful tips and reminders for your convenience. 💡 Show Tips and TricksTesting This CDK VersionYou can test this version of the CDK using the following: # Run the CLI from this branch:
uvx 'git+https://github.com/airbytehq/airbyte-python-cdk.git@devin/1788275534-shared-check-assertion#egg=airbyte-python-cdk[dev]' --help
# Update a connector to use the CDK from this branch ref:
cd airbyte-integrations/connectors/source-example
poe use-cdk-branch devin/1788275534-shared-check-assertionPR Slash CommandsAirbyte Maintainers can execute the following slash commands on your PR:
|
|
CI note on the That job is already red on On this PR the same job fails 4 tests: the same 2 plus the two in-process |
PyTest Results (Fast)5 748 tests +263 5 718 ✅ +245 10m 10s ⏱️ +31s Results for commit b4e470b. ± Comparison against base commit 57e4c07. This pull request removes 11 and adds 274 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
Pull request overview
Unifies and tightens how Standard Tests assert the outcome of the check command so the in-process and Docker-based paths enforce the same expectations and don’t drift.
Changes:
- Extracts shared
checkassertion logic intoairbyte_cdk/test/standard_tests/_assertions.py::assert_check_outcome. - Updates both Docker (
docker_base) and in-process (_job_runner.run_test_job) paths to use the shared assertion. - Replaces/updates unit tests to cover the full outcome matrix (including end-to-end via
run_test_job).
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| unit_tests/test/test_docker_base_check_outcome.py | Removes old unit tests tied to the Docker-only assertion helper. |
| unit_tests/test/test_check_assertions.py | Adds comprehensive unit tests for shared check assertion and in-process coverage. |
| airbyte_cdk/test/standard_tests/docker_base.py | Switches Docker check path to call the shared assert_check_outcome. |
| airbyte_cdk/test/standard_tests/_job_runner.py | Switches in-process check path to call the shared assert_check_outcome. |
| airbyte_cdk/test/standard_tests/_assertions.py | Introduces shared assertion implementation for check outcome validation. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
PyTest Results (Full)5 248 tests +182 5 227 ✅ +174 13m 11s ⏱️ + 3m 24s Results for commit a07a090. ± Comparison against base commit 42f6023. This pull request removes 11 and adds 193 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
…both paths - `status: exception` is a distinct outcome (`ExpectedOutcome.EXPECT_UNCAUGHT_ERROR`): a TRACE error must be present and no SUCCEEDED reported; a CONNECTION_STATUS is not required. `expect_exception()` still covers `failed` and `exception`, so existing callers keep their behaviour; `expect_uncaught_error()` tells them apart. - No declared `status` requires a reported CONNECTION_STATUS, either value accepted. The CAT default of `succeed` is applied to status-less `connection` entries only, at the `check` call sites (`DockerConnectorTestSuite._check_scenario`), so `spec` / `basic_read`-only configs and the discover/read tests are unaffected. - The in-process `check` run surfaces an uncaught error for every scenario that is not `failed` / `exception`, mirroring `raise_if_errors` on the Docker path. - The "no CONNECTION_STATUS" failure includes the formatted trace error and a hint to declare `status: exception`. - `test_check` in the suite base classes no longer demands exactly one CONNECTION_STATUS for `status: exception` scenarios; the `ConnectorTestSuiteBase` message is an f-string. - Tests: four-outcome matrices asserting the failure reason and exception type, the suite `test_check` methods and the Docker call site exercised without Docker, the `_check_scenario` default by section, and a `status: failed` scenario for the bundled pokeapi suite. - `cdk-migrations.md`: new "Upgrading to 7.34.0" section; stale docstrings reworded. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… in every section Drop the "either outcome is fine" reading of a status-less scenario for `check`. `assert_check_outcome` now treats `ALLOW_ANY` as `succeed`, the CAT default, whichever section of `acceptance-test-config.yml` lists the config, so the section-aware `_check_scenario` helper is no longer needed. A config that `check` is expected to reject must declare `status: failed` (or `exception`). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
check status in both standard-test pathscheck in both standard-test paths
v7.34.0 was released from main on 2026-10-08 without this change, so the section describing the `check` status contract now targets the next release. The publisher renames it again if the change ships as a major. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ce-test-config.yml `get_scenarios` only read the `spec`, `connection` and `basic_read` sections, so a config listed only under `discovery`, `full_refresh` or `incremental` was never tested at all. Every section now contributes its configs, and each one is validated with `check` against its declared `status` (or the `succeed` default). Configs that appear only under those three sections are marked check-only: `ConnectorTestScenario.sections` records where a config was listed (unioned when the same config is deduplicated across sections) and `check_only` derives from it. `test_discover`, `test_basic_read`, `test_fail_read_with_bad_catalog` and `test_docker_image_build_and_read` skip such scenarios with a reason naming the sections, because those sections described CAT tests the standard tests do not reproduce and reading every stream of such a config would add CI time nobody asked for. A config that also appears under `spec`, `connection` or `basic_read` keeps running every test. At airbyte@master this adds a `check` scenario for 13 configs in 11 connectors (one is Java and never runs). The migration note covers the new rule. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
check in both standard-test pathscheck for every config in acceptance-test-config.yml, in both standard-test paths
…nce-test-config.yml section Replace the check-only treatment of configs listed under `discovery`, `full_refresh` or `incremental` with a strict section-to-command mapping (`SECTION_COMMANDS`): `spec` validates the config against the connector's spec, `connection` runs `check` against the declared `status`, `discovery` runs `discover`, `basic_read` and `full_refresh` run a full-refresh `read`, and `incremental` runs an incremental `read` that must emit state. A config listed under several sections runs the union of their commands and nothing else; tests that do not apply skip with a reason naming the sections (`skip_unless_runs`). - `ConnectorTestScenario.commands` / `runs()` replace `check_only`; unknown sections are rejected; `with_default_success()` applies the CAT `succeed` default to every command, so `discover` and `read` errors, and a read without records, now fail status-less configs on the in-process path too (they were swallowed by `ALLOW_ANY`). - New tests: `test_config_matches_spec` and `test_docker_image_build_and_config_matches_spec` (jsonschema validation, offending value redacted), `test_docker_image_build_and_discover`, `test_incremental_read` (incremental streams with a known cursor, at least one STATE). - Docker read: the image build is shared (`_connector_image`), incremental-only configs read incrementally where the stream has a known cursor, and `empty_streams` no longer crashes with an AttributeError (stream names were compared as streams). - `cdk-migrations.md`: the 7.35.0 section describes the mapping, the `succeed` default and the Docker read gate. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
check for every config in acceptance-test-config.yml, in both standard-test pathscheck reports
`read` now runs only for `basic_read` and `full_refresh` configs, and a config without a `status` expects success. The record checks keep applying to `basic_read` configs only; a config read because of `full_refresh` keeps the "some records" floor, which now runs before the record checks so a read without any records keeps its message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # airbyte_cdk/test/standard_tests/connector_base.py
check reportscheck reports
v7.35.0 shipped without this change, and the change only touches the test harness, so it ships in a minor release. Use the unreleased heading shared with the other standard-test PRs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`test_incremental_read` added a second full read for every config listed under both `basic_read` and `incremental`, which doubles the read time of those connectors' test suites. Configs listed under `incremental` keep the bad-catalog check, and the Docker read test still reads them once in incremental mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Without input state, an incremental `read` exercises the same requests and records as a full-refresh one, and the standard tests no longer assert on state. Reading `incremental` configs only added read time (twilio's lookback config ran for 15+ minutes) and new failures from stale secrets. The section is ignored again, as on `main`; the Docker read is back to the first supported sync mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Daryna Ishchenko (darynaishchenko)
left a comment
There was a problem hiding this comment.
Requesting changes for the release title (inline) and the rollout. The harness work itself is solid. 182 tests pass, all 24 deliberate code breaks I tried were caught, and a probe of 8 jsonschema error kinds leaked no secret value into the config-vs-spec messages. A static sweep of get_scenarios() over 590 monorepo connectors (head vs merge-base) matches the intent: 10 configs collected for the first time, 9 read configs now strict, and the same collection errors before and after.
Also, please fix the fleet table in the PR body, since connector owners will read it as the release note:
destination-motherduckis not resolved:secrets/config.jsonis underconnectionwithstatus: succeed, andCheck: destination-motherducknow fails 2 tests at this head vs 1 on baseline. Onlyintegration_tests/config.jsonis spec-only.- The "Configs that run less than before (listed only under spec or connection)" row is wrong for linkedin-ads, paypal-transaction, sendgrid, duckdb and kyve. After deduplication each of those is also under
connection, so it runs as before. - Two affected groups are missing: the stricter Docker check for 38 Python
status: failedconfigs, and the first-time container discover for 31 Python discovery configs (see the comment ondocker_base.py).
|
❌ Cannot revive Devin session - the session is too old. Please start a new session instead. |
check reports…og_path The read tests built their catalog from every discovered stream and ignored the `configured_catalog_path` of `basic_read` and `full_refresh` entries, so configs written for a narrow catalog read every stream. Both read paths now read the streams named in the declared catalog (with the definitions that `discover` reports, all in full-refresh mode), as CAT did, and fall back to every discovered stream only when no catalog is declared. A config read through several sections keeps its catalog only when every read entry declares the same one. A declared stream that is not discovered, or a missing catalog file, fails the test with a message naming the catalog. The Docker read now configures every stream in full-refresh mode, and the bundled pokeapi fixture gains the catalog its config already pointed at. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… once source-hubspot's `full_refresh_oauth_catalog.json` lists `form_submissions` twice; configuring it twice would read it twice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…talog With #1142's `configured_catalog_path` support, the per-stream record check covers the streams of the config's declared catalog, and records are validated against the schemas that `discover` reports. Pin both, and say so in the migration guide. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…configured catalog The manifest no longer defines nps_responses. Once the standard tests read a config's configured_catalog_path (airbytehq/airbyte-python-cdk#1142), a catalog stream that discover does not return fails the read. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the basic read test (#1218) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Combines #1217, #1219 and #1220 with this branch: - test_discover keeps the section gate of this branch and runs the catalog checks from main; an empty catalog now fails the enforced 'catalog has streams' check, so its test expects that assertion. - test_check runs the secret leak check before asserting the check outcome. - cdk-migrations.md lists every section under one 7.36.0 heading. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Two gaps in the standard tests, one fix each.
checkcould not fail. A failingcheckreportsstatus: FAILEDin aCONNECTION_STATUSmessage and exits 0, so neither path could tell a failingcheckfrom a passing one:run_test_job(in-process) only looked forFAILEDinside theexpect_exception()branch, and the Docker path only assertedSUCCEEDEDunderexpect_success(), so a config without a declaredstatusaccepted a failingcheck. This PR extracts one assertion,airbyte_cdk/test/standard_tests/_assertions.py::assert_check_outcome, calls it from both paths so they cannot drift again, and makes it follow the CATstatuscontract exactly:statusinacceptance-test-config.ymlcheckmustsucceedSUCCEEDEDfailedFAILED, gracefully (a raise is not a graceful failure)exceptionTRACEerror and noSUCCEEDED; noCONNECTION_STATUSrequiredsucceed(the CAT default)Half of
acceptance-test-config.ymlwas never read, and the other half ran the wrong commands. Onlyspec,connectionandbasic_readwere collected, every config found there ran every test, and configs listed only underdiscoveryorfull_refreshwere never tested at all. Now every section with atestslist contributes its configs, exceptincremental, and each config runs the command CAT ran it with (SECTION_COMMANDS):specconnectionSpecification(CATtest_config_match_spec)test_config_matches_spec(new),test_docker_image_build_and_config_matches_spec(new)connectioncheckreport the declaredstatustest_check,test_docker_image_build_and_checkdiscoverydiscoversucceed and return streamstest_discover,test_docker_image_build_and_discover(new)basic_read,full_refreshreadsucceed with records. The read covers the streams of the config'sconfigured_catalog_path, or every discovered stream when none is declared, minusempty_streamstest_basic_read,test_fail_read_with_bad_catalog,test_docker_image_build_and_readA config listed under several sections runs the union of their commands and nothing else: a
spec-only config is no longerchecked, aconnection-only config is no longer read. Tests that do not apply skip with a reason naming the config's sections. Thesucceeddefault now applies to every command, so for a status-less configdiscoverandreaderrors, and a read without records, fail the test;ALLOW_ANYused to swallow them on the in-process path. The Docker read test keeps its--read-scenariosdefault (config,valid_config,default), so other read-section configs are read byairbyte-cdk connector test(manifest-only connectors in the monorepo) but not byairbyte-cdk image test(Python connectors).Changes
ExpectedOutcomegainsEXPECT_UNCAUGHT_ERRORforstatus: exception, which is no longer an alias offailed.expect_exception()still covers both, so every existing caller keeps its behaviour; the newexpect_uncaught_error()tells them apart. Foldingexceptionintofailedwould have turnedsource-gcsandsource-marketored: both raise onintegration_tests/invalid_config.jsonand emit aTRACEwith no status, which is exactly what CAT'sexceptionmeant.assert_check_outcomeimplements the status table. The "no CONNECTION_STATUS" failure includes the formatted trace error and a hint to declarestatus: exceptionwhen raising is intended. In-processrun_test_job("check")surfaces an uncaught error for every scenario that is notfailed/exception, mirroringraise_if_errorson the Docker path.test_checkno longer demands aCONNECTION_STATUSforstatus: exceptionscenarios (and theConnectorTestSuiteBasemessage was not an f-string).ConnectorTestScenario:sectionsrecords where a config is listed (get_scenariosreads every section butincremental,_dedup_scenariosunions them), unknown sections are rejected,commands/runs()derive the commands fromSECTION_COMMANDS, andwith_default_success()applies thesucceeddefault.skip_unless_runs(scenario, *commands)gates each test.assert_config_matches_spec(jsonschema, already a CDK dependency) validates a config against the reported spec; the offending value is replaced by<config value>in the failure so secrets do not land in CI logs.incrementalsection is not collected, as onmain. An earlier revision read its configs incrementally (in-processtest_incremental_read, and incremental mode in the Docker read). Without input state, that read sends the same requests and returns the same records as a full-refresh one, so it only added read time (a second read for configs also underbasic_read, 15+ minutes for twilio's lookback config) and reds from stale secrets. Real incremental coverage (reading withfuture_state) is left for a follow-up._connector_image; new discover and config-vs-spec tests;get_discovered_streamsis shared with the in-process tests. Fixed in passing:empty_streamscrashed the Docker read withAttributeError: 'str' object has no attribute 'name'(stream names were filtered as if they were streams), onmaintoo.configured_catalog_pathis honoured, as in CAT (get_read_streams, shared bytest_basic_readandtest_docker_image_build_and_read). The read covers the streams named in the config's declared catalog, in its order and once each, with the definitions and JSON schemasdiscoverreports, all in full-refresh mode whatever the catalog says. Without a declared catalog, every discovered stream is read, minusempty_streamsas before. When several read entries list the same config,_dedup_scenarioskeeps the catalog only if every read entry declares the same one; otherwise (one entry declares none, or they differ) every discovered stream is read. A catalog stream thatdiscoverdoes not report, or a missing catalog file, fails the read test with a message naming the catalog. The Docker read now configures every stream asfull_refreshinstead of the first mode it supports. The bundled pokeapi fixture gains theintegration_tests/configured_catalog.jsonits config already pointed at.cdk-migrations.md: the## Upgrading to 7.36.0section with the two tables, theconfigured_catalog_pathbehaviour, migration steps and rationale. It also holds the sections of feat(standard-tests): assert discovered catalog properties in test_discover #1217, feat(standard-tests): assert per-stream records and record schemas in the basic read test #1218, feat(standard-tests): lintairbyte_secretmarking and secret leaks #1219 and feat(standard-tests): check spec backward compatibility against the published version #1220, so all five ship in the 7.36.0 release.Includes #1218
#1218 was merged into this branch (
f0fad4e9), so this PR carries its change too. Full description, fleet measurement and rollout notes: #1218.SourceTestSuiteBase.test_basic_readchecks, for configs listed underbasic_readand expected to succeed, that every configured stream returns records (empty_streamsare the exceptions) and that every record matches its stream's JSON schema (CAT's Draft 7 validator: strict integers, lenientdate-time, extra columns allowed).validate_schema: falsein abasic_readentry turns the schema check off for that config, except attest_strictness_level: high, where the test fails before reading, as in CAT.airbyte_cdk/test/standard_tests/_read_assertions.py, tests inunit_tests/test/test_read_assertions.py.Merged with
mainmaingained #1217 (catalog checks intest_discover), #1219 (spec lint and secret leak check) and #1220 (spec backward compatibility) after this branch was cut. Merging them in (b4e470b5) combined:test_discoverkeeps this PR's section gate and runs feat(standard-tests): assert discovered catalog properties in test_discover #1217's catalog checks. An empty catalog now fails feat(standard-tests): assert discovered catalog properties in test_discover #1217's enforced "catalog has streams" check (AssertionError) instead of this PR'sValueError;test_discover_fails_on_an_empty_catalogexpects that.test_checkandtest_docker_image_build_and_checkrun feat(standard-tests): lintairbyte_secretmarking and secret leaks #1219's secret leak check first, then this PR'sassert_check_outcome. On the Docker path,raise_if_errorsis applied after the leak check, still only for scenarios that do not expect a failure.test_docker_image_build_and_specuses this PR's_connector_imageand feat(standard-tests): lintairbyte_secretmarking and secret leaks #1219's spec lint.Test Coverage
unit_tests/test/test_check_assertions.py(replacingunit_tests/test/test_docker_base_check_outcome.py): 19 direct cases over the four outcomes × (SUCCEEDED / FAILED / none) × (trace error / none), each asserting the failure reason viamatch=; 17 in-process cases throughrun_test_jobwith a fake source; the same 17 throughSourceTestSuiteBase.test_checkandConnectorTestSuiteBase.test_check; 9 throughtest_docker_image_build_and_checkwithrun_docker_airbyte_commandstubbed (no Docker needed).unit_tests/test/test_scenario_sections.py: the section-to-command table;get_scenariosover a six-section config (incrementalignored, dedup,iam_roleandconfig_path-less entries skipped, status carried, commands per config);commands/runs()across derived scenarios; unknown-section rejection;with_default_success; the exactskip_unless_runsmessage; a 5 tests × 5 sections matrix for the source suite and a 4 × 5 matrix for the Docker suite proving each test runs exactly for its sections (plus hand-built scenarios running everything); config-vs-spec validation on both paths with the secret value redacted;test_discover/test_basic_readfailing on errors, an empty catalog and missing records for a status-less config; the Docker discover test (pass, empty catalog, trace error); the Docker read catalog per section (full refresh forbasic_read/full_refresh/ mixed), withempty_streamsset; a declaredconfigured_catalog_pathon both read paths (the catalog's streams in its order, once each, forced to full refresh, with the discovered schema rather than the catalog's stale one, minusempty_streams, narrowed by--read-from-streamson Docker), a catalog stream that is not discovered, a missing catalog file, and the_dedup_scenarioscatalog merge (same catalog kept; one entry without a catalog, or differing catalogs, read every stream; non-read entries ignored).status: failedscenario (integration_tests/invalid_config.json) and now skips the tests that do not apply to each config, with the reason visible in-rs.After the merge with
main(b4e470b5):unit_tests/test,test_entrypoint.py,destinations/test_destination.py,utils/test_traced_exception.pyandlegacy/sources/declarative/test_manifest_declarative_source.py: 925 passed, 9 skipped;ruff check,ruff format --checkandmypy airbyte_cdk/test/standard_testsare clean.Connectors affected on the next release
Scanned at
airbytehq/airbyte@master(d71678a6fb2, 2026-10-12); counts leave out archived connectors. Local verification ran each config through its own command with the published connector image and, where needed, the GSM secret. "Gated" means the Docker read test's--read-scenariosdefault skips the config, so nothing runs for it in CI (Python connectors only runairbyte-cdk image test). Java connectors (source-mysql×3,source-singlestore,source-scaffold-java-jdbc) are inert: the standard tests never run for them.Companion connector fix PR: airbytehq/airbyte#88480 (source-zoho-crm, source-microsoft-lists, source-mixpanel; merged).
Known red on release, and their fixes:
secrets/config.json,connection,status: succeedCheck: destination-motherduckfails 2 tests at this head (test_docker_image_build_and_check, and the in-processtest_check, which used to accept a reportedFAILED) against 1 on a PR based onmain(#1224,test_docker_image_build_and_checkonly). It is red on every PR.integration_tests/invalid_config.json,status: failedairbyte/source-zoho-crm:0.3.3:checkexits 1 with oneTRACEsystem_error("Error while refreshing access token: 'access_token'") and noCONNECTION_STATUS. The old Docker assertion accepted that as the expected failure;failednow needs a reportedFAILED.status: exceptionfor the invalid config (airbyte-cdk image test --no-creds: 1 failed → 2 passed).secrets/config.json,connection, no statusAADSTS7000215(invalid client secret; the secret dates from 2025-04).status: failedfor it until the secret is rotated.secrets/config.json,secrets/config_project_secret.json(connection,status: succeed);secrets/config_incremental.json(discovery)Your plan does not allow API calls:checkfails oncohorts/listfor bothsucceedconfigs (the old lenient Docker check hid it), and the first containerdiscoverfails onevents/properties/top.connectionconfigsstatus: failedand bypasses thediscoverysection, keeping the original entry in a comment (3 failed → 4 passed).secrets/config_limited_scopes.json,full_refreshproject_detail,projects,releases);projectsstill returns403 Forbiddenwith the limited-scope token.empty_streams.secrets/config_oauth_no_start_date.json,full_refreshcampaigns,companiesandcontact_listsare in it and fail with403(missingcrm.lists.readand other scopes); CAT's own read of this catalog fails the same way.secrets/config.json,basic_read+full_refreshintegration_tests/configured_catalog.jsonlistsnps_responses, which the manifest no longer defines, so the read test fails with "lists streams that connector 'source-vitally' does not discover" (found by a static scan, not run).testSecretsinmetadata.yaml), so its standard tests already fail on any PR that touches it, before reading. Drop the stream from the catalog when a secret is added.status: failedconfigs of Python connectors: stricter Dockercheck(38 configs in 35 connectors). The old Docker assertion accepted an uncaught error with noCONNECTION_STATUSas the expected failure; nowfailedneeds a reportedFAILED, and a raise needsstatus: exception. Verified with each connector's published image (all 38 invalid configs are committed files, so no secrets are needed): 37 reportFAILEDand pass; only source-zoho-crm (above) raises.Configs that run less than before (listed only under
spec; they used to runcheck,discoverandreadleniently):integration_tests/config.jsonsecrets/config.jsonis a separateconnectionconfig, see above.Configs listed only under
connectionare no longer read, anddiscovery-only configs are no longerchecked. Every other config listed underspec(for example in source-linkedin-ads, source-paypal-transaction, source-sendgrid, destination-duckdb and source-kyve) is also listed underconnection, so it runscheckas before.status: exceptionconfigs: source-gcs, source-marketo and source-salesforce (config_error) raise onintegration_tests/invalid_config.jsonand pass (they would be red ifexceptionwere folded intofailed).Status-less
basic_readconfigs (they used to run everything leniently; now a full-refresh read must succeed with records, andcheckno longer runs for them):config_jsonl.json), source-google-ads (config_click_view.json), source-s3 (parquet_dataset_config.json,v4_parquet_decimal_config.json,unstructured_config.json), source-shopify (config_transactions_with_user_id.json)basic_readsecrets/config_with_ids.jsonsecrets/config_order_modern_api.jsonForbiddenonbundle_selections,credit_adjustments,events), so it would be red if the gate were lifted.secrets/accounts_only_config.jsonConfigs collected for the first time (listed only under
discoveryorfull_refresh):config_central_api_router.json), source-google-ads (config_manager_account.json)full_refreshcheckreds of an earlier revision (HTTP 500, "no stream slices") do not applysecrets/config_incremental.jsondiscovery→ Docker discoversecrets/config.jsondiscovery→ discoversecrets/config_old.jsondiscovery→ discovercheckfailure of an earlier revision ('dict object' has no attribute 'credentials') does not apply becausediscoverdoes not touch the credentialssecrets/config_oauth.json,secrets/prod_config.jsondiscovery→ discoverbusiness-api.tiktok.comwith a 403 block page; CI has real egressfull_refresh→ in-process read of the declared catalogFirst container
discoverfor 30 Python discovery configs (test_docker_image_build_and_discoveris new). The Docker read, which runs only theconfig,valid_configanddefaultconfigs, already randiscoverin a container; these 30 never did: source-s3 ×15, source-azure-blob-storage ×12, source-gcs ×2 and source-mixpanel (red, see above). Verified withairbyte-cdk image testfrom this branch with secrets, on the published source-s3 4.15.26 and source-azure-blob-storage 0.8.37 images: all 15 s3 and 12 azure-blob-storage configs passdiscoverandcheck(s3: 36 passed, 53 skipped; azure-blob-storage: 28 passed, 29 skipped; reads skipped by the--read-scenariosdefault). The two gcs configs were not run. (Counting archived connectors, source-google-analytics-v4 and source-fauna add one each.)configured_catalog_pathnow decides what is read. 174 read configs (153 manifest-only, 20 Python, 1 Java) declare the same catalog in every read entry, and now read only that catalog's streams instead of every discovered stream. For most the catalog lists every stream anyway; a narrower catalog reads less than at the previous head (whichmainread leniently). The 80 configs whosebasic_readentry declares no catalog while theirfull_refreshentry does keep reading every discovered stream. A static scan of the manifest-only catalogs against their manifests found one stale catalog (source-vitally, above); the Python catalogs and the dynamic-stream manifests (source-hubspot, source-bing-ads) cannot be checked statically.Merge order
Merging into
maindoes not publish anything; the CDK release is the gate.airbyte_secretmarking and secret leaks #1219, feat(standard-tests): check spec backward compatibility against the published version #1220 merged intomain, and feat(standard-tests): assert per-stream records and record schemas in the basic read test #1218 into this branch.sla_policiesids as integers airbyte#88407, fix(source-sentry): type thesentry:replay_rage_click_issuesproject option as boolean airbyte#88408, fix(source-jira): type rendered comment bodies inissuesas strings airbyte#88409, fix(source-shopify): keep the countries dedup list per stream instance airbyte#88405, fix(source-customer-io)!: 🚨🚨 declare integer from_id, reply_to_id and sent_at and typed array items 🚨🚨 airbyte#88159.Declarative-First Evaluation
N/A — this is a CDK test-harness change, not a connector change.
Resolves https://github.com/airbytehq/airbyte-internal-issues/issues/17140
airbytehq/airbyte-internal-issues#16212 is not closed by this PR: its gap 2 (
EXPECT_SUCCESSnot asserting the reported status) is fixed here, but PR #991 and the rest of that issue remain open.Link to Devin session: https://app.devin.ai/sessions/a3d02c9188e44c789e336784dced8888
Open in Devin Desktop: https://app.devin.ai/desktop/session/a3d02c9188e44c789e336784dced8888?variant=devin
🤖 Generated with Claude Code