|
19 | 19 | import pytest |
20 | 20 | import requests |
21 | 21 | import yaml |
| 22 | +from airbyte_protocol_dataclasses.models import ( |
| 23 | + AirbyteStreamStatus, |
| 24 | + AirbyteStreamStatusTraceMessage, |
| 25 | + AirbyteTraceMessage, |
| 26 | + TraceType, |
| 27 | +) |
22 | 28 | from jsonschema.exceptions import ValidationError |
23 | 29 | from typing_extensions import deprecated |
24 | 30 |
|
@@ -1898,6 +1904,55 @@ def get_mocked_read_records_output(stream_name: str) -> Mapping[tuple[str, str], |
1898 | 1904 | } |
1899 | 1905 |
|
1900 | 1906 |
|
| 1907 | +@freezegun.freeze_time("2025-01-01T00:00:00") |
| 1908 | +def test_catalog_contains_missing_stream_in_source(): |
| 1909 | + expected_messages = [ |
| 1910 | + AirbyteMessage( |
| 1911 | + type=Type.TRACE, |
| 1912 | + trace=AirbyteTraceMessage( |
| 1913 | + type=TraceType.STREAM_STATUS, |
| 1914 | + stream_status=AirbyteStreamStatusTraceMessage( |
| 1915 | + stream_descriptor=StreamDescriptor(name="missing"), |
| 1916 | + status=AirbyteStreamStatus.INCOMPLETE, |
| 1917 | + ), |
| 1918 | + emitted_at=1735689600000.0, |
| 1919 | + ), |
| 1920 | + ), |
| 1921 | + AirbyteTracedException( |
| 1922 | + message="A stream listed in your configuration was not found in the source. Please check the logs for more " |
| 1923 | + "details.", |
| 1924 | + internal_message=( |
| 1925 | + "The stream 'missing' in your connection configuration was not found in the source. Refresh the schema in your replication settings and remove this stream from future sync attempts." |
| 1926 | + ), |
| 1927 | + failure_type=FailureType.config_error, |
| 1928 | + stream_descriptor=StreamDescriptor(name="missing"), |
| 1929 | + ).as_airbyte_message(stream_descriptor=StreamDescriptor(name="missing")), |
| 1930 | + ] |
| 1931 | + |
| 1932 | + catalog = ConfiguredAirbyteCatalog( |
| 1933 | + streams=[ |
| 1934 | + ConfiguredAirbyteStream( |
| 1935 | + stream=AirbyteStream( |
| 1936 | + name="missing", json_schema={}, supported_sync_modes=[SyncMode.full_refresh] |
| 1937 | + ), |
| 1938 | + sync_mode=SyncMode.full_refresh, |
| 1939 | + destination_sync_mode=DestinationSyncMode.append, |
| 1940 | + ), |
| 1941 | + ] |
| 1942 | + ) |
| 1943 | + |
| 1944 | + source = ConcurrentDeclarativeSource( |
| 1945 | + source_config=_MANIFEST, config=_CONFIG, catalog=catalog, state=[] |
| 1946 | + ) |
| 1947 | + |
| 1948 | + list(source.read(logger=source.logger, config=_CONFIG, catalog=catalog, state=[])) |
| 1949 | + queue = source._concurrent_source._queue |
| 1950 | + |
| 1951 | + for expected_message in expected_messages: |
| 1952 | + queue_message = queue.get() |
| 1953 | + assert queue_message == expected_message |
| 1954 | + |
| 1955 | + |
1901 | 1956 | def get_records_for_stream( |
1902 | 1957 | stream_name: str, messages: List[AirbyteMessage] |
1903 | 1958 | ) -> List[AirbyteRecordMessage]: |
|
0 commit comments