From c2d99977a7764f2602410207ea0ac93b6cc2c292 Mon Sep 17 00:00:00 2001 From: Anton Krytskyi Date: Wed, 8 Jul 2026 14:56:38 +0300 Subject: [PATCH] add unit tests for daz improvements --- tests/core/test_utils.py | 44 ++++++++++ tests/providers/osfstorage/test_provider.py | 89 +++++++++++++++++++++ 2 files changed, 133 insertions(+) diff --git a/tests/core/test_utils.py b/tests/core/test_utils.py index 827774efe..13595d46d 100644 --- a/tests/core/test_utils.py +++ b/tests/core/test_utils.py @@ -4,6 +4,10 @@ import pytest from waterbutler.core import utils +from waterbutler.core.path import WaterButlerPath +from waterbutler.core.streams import EmptyStream + +from tests.utils import MockCoroutine, MockFileMetadata, MockProvider class TestAsyncRetry: @@ -159,3 +163,43 @@ def test_content_disposition(self, filename, expected): def test_disposition_encoding(self, filename, expected): encoded = utils.encode_for_disposition(filename) assert encoded == expected + + +class TestZipStreamGenerator: + + @pytest.mark.asyncio + async def test_passes_child_metadata_to_download(self): + provider = MockProvider() + root_path = WaterButlerPath('/folder/', folder=True) + file_meta = MockFileMetadata() + provider.metadata = MockCoroutine(return_value=[file_meta]) + provider.download = MockCoroutine(return_value=EmptyStream()) + + generator = utils.ZipStreamGenerator(provider, root_path, minimal=True) + zip_name, _ = await generator.__anext__() + + assert zip_name == 'Foo.name' + provider.download.assert_called_once() + assert provider.download.call_args.kwargs['metadata'] is file_meta + + +class TestZipStreamGeneratorPaginated: + + @pytest.mark.asyncio + async def test_passes_child_metadata_to_download(self): + provider = MockProvider() + root_path = WaterButlerPath('/folder/', folder=True) + file_meta = MockFileMetadata() + provider.download = MockCoroutine(return_value=EmptyStream()) + + async def iter_children_pages(path, **kwargs): + yield [file_meta] + + provider.iter_children_pages = iter_children_pages + + generator = utils.ZipStreamGeneratorPaginated(provider, root_path, minimal=True) + zip_name, _ = await generator.__anext__() + + assert zip_name == 'Foo.name' + provider.download.assert_called_once() + assert provider.download.call_args.kwargs['metadata'] is file_meta diff --git a/tests/providers/osfstorage/test_provider.py b/tests/providers/osfstorage/test_provider.py index a1a768ad2..657e505de 100644 --- a/tests/providers/osfstorage/test_provider.py +++ b/tests/providers/osfstorage/test_provider.py @@ -134,6 +134,78 @@ async def test_download_with_display_name(self, provider_and_mock_one, download_ inner_provider.download.assert_called_once_with(path=expected_path, display_name=expected_name) + @pytest.mark.asyncio + @pytest.mark.aiohttpretty + async def test_download_with_embedded_storage_skips_osf( + self, provider_and_mock_one, download_response, download_path, mock_time): + + provider, inner_provider = provider_and_mock_one + uri, params = build_signed_url_without_auth( + provider, 'GET', download_path.identifier, 'download', version=None, mode=None, + ) + + metadata = OsfStorageFileMetadata({ + 'kind': 'file', + 'name': download_response['data']['name'], + 'path': f'/{download_path.identifier}', + 'storage': download_response, + }, str(download_path)) + + await provider.download(download_path, metadata=metadata) + + assert not aiohttpretty.has_call(method='GET', uri=uri, params=params) + provider.make_provider.assert_called_once_with(download_response['settings']) + expected_path = WaterButlerPath('/' + download_response['data']['path']) + inner_provider.download.assert_called_once_with( + path=expected_path, + display_name=download_response['data']['name'], + ) + + @pytest.mark.asyncio + @pytest.mark.aiohttpretty + async def test_download_without_storage_falls_back_to_osf( + self, provider_and_mock_one, download_response, download_path, mock_time): + + provider, inner_provider = provider_and_mock_one + uri, params = build_signed_url_without_auth( + provider, 'GET', download_path.identifier, 'download', version=None, mode=None, + ) + aiohttpretty.register_json_uri('GET', uri, body=download_response, params=params) + + metadata = OsfStorageFileMetadata({ + 'kind': 'file', + 'name': download_response['data']['name'], + 'path': f'/{download_path.identifier}', + }, str(download_path)) + + await provider.download(download_path, metadata=metadata) + + assert aiohttpretty.has_call(method='GET', uri=uri, params=params) + inner_provider.download.assert_called_once() + + @pytest.mark.asyncio + @pytest.mark.aiohttpretty + async def test_download_with_version_ignores_embedded_storage( + self, provider_and_mock_one, download_response, download_path, mock_time): + + provider, inner_provider = provider_and_mock_one + uri, params = build_signed_url_without_auth( + provider, 'GET', download_path.identifier, 'download', version=1, mode=None, + ) + aiohttpretty.register_json_uri('GET', uri, body=download_response, params=params) + + metadata = OsfStorageFileMetadata({ + 'kind': 'file', + 'name': download_response['data']['name'], + 'path': f'/{download_path.identifier}', + 'storage': download_response, + }, str(download_path)) + + await provider.download(download_path, metadata=metadata, version=1) + + assert aiohttpretty.has_call(method='GET', uri=uri, params=params) + inner_provider.download.assert_called_once() + class TestDelete: @@ -1233,6 +1305,23 @@ async def test_intra_copy_reject_by_quota(self, provider_one, auth, credentials, class TestMinimalMetadataDAZ: + @pytest.mark.asyncio + async def test_zip_requests_minimal_metadata(self, provider_one, folder_path, monkeypatch): + captured = {} + + async def capture_zip(self, path, **kwargs): + captured.update(kwargs) + return object() + + monkeypatch.setattr( + 'waterbutler.core.provider.BaseProvider.zip', + capture_zip, + ) + + await provider_one.zip(folder_path) + + assert captured.get('minimal') is True + @pytest.mark.asyncio @pytest.mark.aiohttpretty async def test_minimal_metadata(self, provider_one, folder_path, folder_children_metadata_minimal):