|
7 | 7 | from io import IOBase |
8 | 8 | from os import path |
9 | 9 | from typing import Any, ClassVar, Dict, Iterable, List, Mapping, Optional, Set |
| 10 | +from unittest.mock import MagicMock |
10 | 11 |
|
11 | 12 | import pytest |
12 | 13 | from pydantic.v1 import AnyUrl |
13 | 14 |
|
14 | 15 | from airbyte_cdk.sources.file_based.config.abstract_file_based_spec import AbstractFileBasedSpec |
| 16 | +from airbyte_cdk.sources.file_based.exceptions import FileSizeLimitError |
| 17 | +from airbyte_cdk.sources.file_based.file_based_file_transfer_reader import ( |
| 18 | + AbstractFileBasedFileTransferReader, |
| 19 | +) |
15 | 20 | from airbyte_cdk.sources.file_based.file_based_stream_reader import AbstractFileBasedStreamReader |
16 | 21 | from airbyte_cdk.sources.file_based.remote_file import RemoteFile |
17 | 22 | from airbyte_cdk.sources.utils.files_directory import get_files_directory |
|
64 | 69 | } |
65 | 70 |
|
66 | 71 |
|
| 72 | +class TestFileBasedFileTransferReader(AbstractFileBasedFileTransferReader): |
| 73 | + @property |
| 74 | + def file_id(self) -> str: |
| 75 | + return "test_file_id" |
| 76 | + |
| 77 | + @property |
| 78 | + def file_created_at(self) -> str: |
| 79 | + return "2025-05-05" |
| 80 | + |
| 81 | + @property |
| 82 | + def file_updated_at(self) -> str: |
| 83 | + return "2025-05-06" |
| 84 | + |
| 85 | + @property |
| 86 | + def file_size(self) -> int: |
| 87 | + return self.remote_file.size |
| 88 | + |
| 89 | + def download_to_local_directory(self, local_file_path: str) -> None: |
| 90 | + pass |
| 91 | + |
| 92 | + @property |
| 93 | + def source_file_relative_path(self) -> str: |
| 94 | + return "source/path" |
| 95 | + |
| 96 | + @property |
| 97 | + def file_uri_for_logging(self) -> str: |
| 98 | + return "logging/url" |
| 99 | + |
| 100 | + |
| 101 | +class TestStreamReaderWithFileTransferClass(AbstractFileBasedStreamReader): |
| 102 | + __test__: ClassVar[bool] = False # Tell Pytest this is not a Pytest class, despite its name |
| 103 | + |
| 104 | + file_transfer_reader_class = TestFileBasedFileTransferReader |
| 105 | + |
| 106 | + @property |
| 107 | + def config(self) -> Optional[AbstractFileBasedSpec]: |
| 108 | + return self._config |
| 109 | + |
| 110 | + @config.setter |
| 111 | + def config(self, value: AbstractFileBasedSpec) -> None: |
| 112 | + self._config = value |
| 113 | + |
| 114 | + def get_matching_files(self, globs: List[str]) -> Iterable[RemoteFile]: |
| 115 | + pass |
| 116 | + |
| 117 | + def open_file(self, file: RemoteFile) -> IOBase: |
| 118 | + pass |
| 119 | + |
| 120 | + def get_file_acl_permissions(self, file: RemoteFile, logger: logging.Logger) -> Dict[str, Any]: |
| 121 | + return {} |
| 122 | + |
| 123 | + def load_identity_groups(self, logger: logging.Logger) -> Iterable[Dict[str, Any]]: |
| 124 | + return [{}] |
| 125 | + |
| 126 | + @property |
| 127 | + def file_permissions_schema(self) -> Dict[str, Any]: |
| 128 | + return {"type": "object", "properties": {}} |
| 129 | + |
| 130 | + @property |
| 131 | + def identities_schema(self) -> Dict[str, Any]: |
| 132 | + return {"type": "object", "properties": {}} |
| 133 | + |
| 134 | + |
67 | 135 | class TestStreamReader(AbstractFileBasedStreamReader): |
68 | 136 | __test__: ClassVar[bool] = False # Tell Pytest this is not a Pytest class, despite its name |
69 | 137 |
|
@@ -458,3 +526,24 @@ def test_preserve_sub_directories_scenarios( |
458 | 526 | assert file_paths[AbstractFileBasedStreamReader.LOCAL_FILE_PATH] == expected_local_file_path |
459 | 527 | assert file_paths[AbstractFileBasedStreamReader.FILE_NAME] == path.basename(source_file_path) |
460 | 528 | assert file_paths[AbstractFileBasedStreamReader.FILE_FOLDER] == path.dirname(source_file_path) |
| 529 | + |
| 530 | + |
| 531 | +def test_upload_with_file_transfer_reader(): |
| 532 | + stream_reader = TestStreamReaderWithFileTransferClass() |
| 533 | + logger = logging.getLogger("airbyte") |
| 534 | + |
| 535 | + remote_file = MagicMock() |
| 536 | + remote_file.size = 200 |
| 537 | + remote_file.uri = "test_url" |
| 538 | + remote_file.mime_type = "test_mime_type" |
| 539 | + file_record_data, file_reference = stream_reader.upload(remote_file, "test_directory", logger) |
| 540 | + assert file_record_data |
| 541 | + assert file_reference |
| 542 | + |
| 543 | + remote_file = MagicMock() |
| 544 | + remote_file.size = 2_500_000_000 |
| 545 | + remote_file.uri = "test_url" |
| 546 | + remote_file.mime_type = "test_mime_type" |
| 547 | + logger = logging.getLogger("airbyte") |
| 548 | + with pytest.raises(FileSizeLimitError): |
| 549 | + stream_reader.upload(remote_file, "test_directory", logger) |
0 commit comments