From ea39440c5dc737dc593567c93d1f4cfb91afbcc3 Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Tue, 16 Dec 2025 16:19:30 -0300 Subject: [PATCH 1/3] feat(storage): add queryParams support to download method - Add optional queryParams parameter to download method - Merge queryParams with transform query parameters - Add test case for download with query params - Enhance CustomHttpClient to track received requests --- .../lib/src/storage_file_api.dart | 12 +++++++++--- packages/storage_client/test/basic_test.dart | 18 ++++++++++++++++++ .../test/custom_http_client.dart | 5 ++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/packages/storage_client/lib/src/storage_file_api.dart b/packages/storage_client/lib/src/storage_file_api.dart index a45624535..d13ecac2e 100644 --- a/packages/storage_client/lib/src/storage_file_api.dart +++ b/packages/storage_client/lib/src/storage_file_api.dart @@ -395,16 +395,22 @@ class StorageFileApi { /// name. For example `download('folder/image.png')`. /// /// [transform] download a transformed variant of the image with the provided options - Future download(String path, {TransformOptions? transform}) async { + /// + /// [queryParams] additional query parameters to be added to the URL + Future download(String path, + {TransformOptions? transform, Map? queryParams}) async { final wantsTransformations = transform != null; final finalPath = _getFinalPath(path); final renderPath = wantsTransformations ? 'render/image/authenticated' : 'object'; - final queryParams = transform?.toQueryParams; + + Map query = transform?.toQueryParams ?? {}; + query.addAll(queryParams ?? {}); + final options = FetchOptions(headers: headers, noResolveJson: true); var fetchUrl = Uri.parse('$url/$renderPath/$finalPath'); - fetchUrl = fetchUrl.replace(queryParameters: queryParams); + fetchUrl = fetchUrl.replace(queryParameters: query); final response = await _storageFetch.get(fetchUrl.toString(), options: options); diff --git a/packages/storage_client/test/basic_test.dart b/packages/storage_client/test/basic_test.dart index b530e22c7..1096b7e7e 100644 --- a/packages/storage_client/test/basic_test.dart +++ b/packages/storage_client/test/basic_test.dart @@ -153,6 +153,24 @@ void main() { expect(String.fromCharCodes(response), 'Updated content'); }); + test('should download public file with query params', () async { + final file = File('a.txt'); + file.writeAsStringSync('Updated content'); + + customHttpClient.response = file.readAsBytesSync(); + + final response = await client + .from('public_bucket') + .download('b.txt', queryParams: {'version': '1'}); + expect(response, isA()); + expect(String.fromCharCodes(response), 'Updated content'); + + expect(customHttpClient.receivedRequests.length, 1); + + final request = customHttpClient.receivedRequests.first; + expect(request.url.queryParameters, {'version': '1'}); + }); + test('should get public URL of a path', () { final response = client.from('files').getPublicUrl('b.txt'); expect(response, '$objectUrl/public/files/b.txt'); diff --git a/packages/storage_client/test/custom_http_client.dart b/packages/storage_client/test/custom_http_client.dart index 833576a9c..0a2f6a5ae 100644 --- a/packages/storage_client/test/custom_http_client.dart +++ b/packages/storage_client/test/custom_http_client.dart @@ -34,10 +34,13 @@ class RetryHttpClient extends BaseClient { } class CustomHttpClient extends BaseClient { + int statusCode = 201; dynamic response; + List receivedRequests = []; @override Future send(BaseRequest request) async { + receivedRequests.add(request); final dynamic body; if (response is Uint8List) { body = response; @@ -47,7 +50,7 @@ class CustomHttpClient extends BaseClient { return StreamedResponse( Stream.value(body), - 201, + statusCode, request: request, ); } From 8b4b7d7f2935a41bb86f621e9437787e8c4e5a55 Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 17 Dec 2025 11:11:43 -0300 Subject: [PATCH 2/3] test: clear receivedRequests on teardown --- packages/storage_client/test/basic_test.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/storage_client/test/basic_test.dart b/packages/storage_client/test/basic_test.dart index 1096b7e7e..254ea1d40 100644 --- a/packages/storage_client/test/basic_test.dart +++ b/packages/storage_client/test/basic_test.dart @@ -38,6 +38,7 @@ void main() { tearDown(() { final file = File('a.txt'); if (file.existsSync()) file.deleteSync(); + customHttpClient.receivedRequests.clear(); }); group('Client with custom http client', () { From b3d9dda45939c397a736f98f8ab486656e3e828d Mon Sep 17 00:00:00 2001 From: Guilherme Souza Date: Wed, 17 Dec 2025 11:16:53 -0300 Subject: [PATCH 3/3] ci: run analyzer only on stable dart --- .github/workflows/dart-package-test.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dart-package-test.yml b/.github/workflows/dart-package-test.yml index c730351a1..6f53eab41 100644 --- a/.github/workflows/dart-package-test.yml +++ b/.github/workflows/dart-package-test.yml @@ -73,12 +73,8 @@ jobs: run: dart format lib test -l 80 --set-exit-if-changed - name: analyzer - run: | - if [ "${{ matrix.sdk }}" == "stable" ]; then - dart analyze --fatal-warnings . - else - dart analyze - fi + if: ${{ matrix.sdk == 'stable'}} + run: dart analyze --fatal-warnings . - name: Start Docker services if: ${{ inputs.needs-docker }}