Skip to content

Commit 5fb3f0f

Browse files
committed
merge from main
2 parents be25429 + 0a5dee2 commit 5fb3f0f

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

airbyte_cdk/sources/declarative/concurrent_declarative_source.py

+1
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ def _group_streams(
306306
stream_name=declarative_stream.name,
307307
stream_namespace=declarative_stream.namespace,
308308
config=config or {},
309+
stream_state_migrations=declarative_stream.state_migrations,
309310
)
310311
partition_generator = StreamSlicerPartitionGenerator(
311312
partition_factory=DeclarativePartitionFactory(

unit_tests/sources/declarative/file/test_file_stream.py

+55
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,61 @@ def __init__(self, *args, **kwargs):
445445
)
446446
assert record_data["file_size_bytes"] == file_reference.file_size_bytes
447447

448+
def test_get_article_attachments_messages_for_connector_builder(self) -> None:
449+
with HttpMocker() as http_mocker:
450+
http_mocker.get(
451+
HttpRequest(url=STREAM_URL),
452+
HttpResponse(json.dumps(find_template("file_api/articles", __file__)), 200),
453+
)
454+
http_mocker.get(
455+
HttpRequest(url=STREAM_ATTACHMENTS_URL),
456+
HttpResponse(
457+
json.dumps(find_template("file_api/article_attachments", __file__)), 200
458+
),
459+
)
460+
http_mocker.get(
461+
HttpRequest(url=STREAM_ATTACHMENT_CONTENT_URL),
462+
HttpResponse(
463+
find_binary_response("file_api/article_attachment_content.png", __file__), 200
464+
),
465+
)
466+
467+
# Define a mock factory that forces emit_connector_builder_messages=True
468+
class MockModelToComponentFactory(OriginalModelToComponentFactory):
469+
def __init__(self, *args, **kwargs):
470+
kwargs["emit_connector_builder_messages"] = True
471+
super().__init__(*args, **kwargs)
472+
473+
# Patch the factory class where ConcurrentDeclarativeSource (parent of YamlDeclarativeSource) imports it
474+
with patch(
475+
"airbyte_cdk.sources.declarative.concurrent_declarative_source.ModelToComponentFactory",
476+
new=MockModelToComponentFactory,
477+
):
478+
output = read(
479+
self._config(),
480+
CatalogBuilder()
481+
.with_stream(ConfiguredAirbyteStreamBuilder().with_name("article_attachments"))
482+
.build(),
483+
yaml_file="test_file_stream_with_filename_extractor.yaml",
484+
)
485+
486+
assert len(output.records) == 1
487+
file_reference = output.records[0].record.file_reference
488+
assert file_reference
489+
assert file_reference.staging_file_url
490+
assert file_reference.source_file_relative_path
491+
# because we didn't write the file, the size is NOOP_FILE_SIZE
492+
assert file_reference.file_size_bytes == NoopFileWriter.NOOP_FILE_SIZE
493+
494+
# Assert file reference fields are copied to record data
495+
record_data = output.records[0].record.data
496+
assert record_data["staging_file_url"] == file_reference.staging_file_url
497+
assert (
498+
record_data["source_file_relative_path"]
499+
== file_reference.source_file_relative_path
500+
)
501+
assert record_data["file_size_bytes"] == file_reference.file_size_bytes
502+
448503
def test_discover_article_attachments(self) -> None:
449504
output = discover(self._config())
450505

0 commit comments

Comments
 (0)