From 56152b680864803bac596423994eb39ae3c25b9c Mon Sep 17 00:00:00 2001 From: Alejandro Ulate Date: Sat, 14 Mar 2026 21:02:17 -0600 Subject: [PATCH] build: upgrades lint package --- .github/actions/setup-flutter/action.yaml | 7 +- lib/extensions/base_request.dart | 69 ++++--- lib/extensions/base_response_io.dart | 71 ++++--- lib/extensions/base_response_none.dart | 49 +++-- lib/extensions/io_streamed_response.dart | 23 ++- lib/extensions/multipart_request.dart | 16 +- lib/extensions/response.dart | 19 +- lib/extensions/streamed_request.dart | 7 +- lib/extensions/streamed_response.dart | 21 +- lib/extensions/uri.dart | 24 +-- lib/http/http_methods.dart | 26 +-- lib/http/intercepted_client.dart | 193 ++++++++++--------- lib/http/intercepted_http.dart | 140 ++++++-------- lib/models/interceptor_contract.dart | 3 +- lib/models/retry_policy.dart | 3 +- lib/utils/query_parameters.dart | 12 +- pubspec.yaml | 4 +- test/extensions/base_reponse_test.dart | 6 +- test/extensions/base_request_test.dart | 9 +- test/extensions/request_test.dart | 130 +++++-------- test/extensions/response_test.dart | 10 +- test/extensions/uri_test.dart | 84 +++++--- test/http/http_methods_test.dart | 7 +- test/http/intercepted_client_error_test.dart | 39 ++-- test/http/intercepted_client_test.dart | 31 ++- test/models/retry_policy_test.dart | 29 ++- test/utils/utils_test.dart | 63 ++---- 27 files changed, 510 insertions(+), 585 deletions(-) diff --git a/.github/actions/setup-flutter/action.yaml b/.github/actions/setup-flutter/action.yaml index cfe73b9..b81486c 100644 --- a/.github/actions/setup-flutter/action.yaml +++ b/.github/actions/setup-flutter/action.yaml @@ -9,18 +9,17 @@ runs: - name: 🐦 Setup Flutter uses: subosito/flutter-action@v2 with: - flutter-version: '3.22.2' + flutter-version: '3.32.0' cache: true - name: 📦 Get dependencies shell: bash run: flutter pub get - - name: ☕️ Set up JDK 17 + - name: ☕️ Set up JDK 21 uses: actions/setup-java@v1 with: - java-version: '17' - distribution: 'temurin' + java-version: '21' - name: 🔎 Check Flutter environment shell: bash diff --git a/lib/extensions/base_request.dart b/lib/extensions/base_request.dart index aaf3156..74682e7 100644 --- a/lib/extensions/base_request.dart +++ b/lib/extensions/base_request.dart @@ -33,39 +33,38 @@ extension BaseRequestCopyWith on BaseRequest { List? files, // StreamedRequest only properties. Stream>? stream, - }) => - switch (this) { - Request req => req.copyWith( - method: method, - url: url, - headers: headers, - body: body, - encoding: encoding, - followRedirects: followRedirects, - maxRedirects: maxRedirects, - persistentConnection: persistentConnection, - ), - StreamedRequest req => req.copyWith( - method: method, - url: url, - headers: headers, - stream: stream, - followRedirects: followRedirects, - maxRedirects: maxRedirects, - persistentConnection: persistentConnection, - ), - MultipartRequest req => req.copyWith( - method: method, - url: url, - headers: headers, - fields: fields, - files: files, - followRedirects: followRedirects, - maxRedirects: maxRedirects, - persistentConnection: persistentConnection, - ), - _ => throw UnsupportedError( - 'Cannot copy unsupported type of request $runtimeType', - ), - }; + }) => switch (this) { + Request req => req.copyWith( + method: method, + url: url, + headers: headers, + body: body, + encoding: encoding, + followRedirects: followRedirects, + maxRedirects: maxRedirects, + persistentConnection: persistentConnection, + ), + StreamedRequest req => req.copyWith( + method: method, + url: url, + headers: headers, + stream: stream, + followRedirects: followRedirects, + maxRedirects: maxRedirects, + persistentConnection: persistentConnection, + ), + MultipartRequest req => req.copyWith( + method: method, + url: url, + headers: headers, + fields: fields, + files: files, + followRedirects: followRedirects, + maxRedirects: maxRedirects, + persistentConnection: persistentConnection, + ), + _ => throw UnsupportedError( + 'Cannot copy unsupported type of request $runtimeType', + ), + }; } diff --git a/lib/extensions/base_response_io.dart b/lib/extensions/base_response_io.dart index 8f7c0c1..f6c250c 100644 --- a/lib/extensions/base_response_io.dart +++ b/lib/extensions/base_response_io.dart @@ -32,40 +32,39 @@ extension BaseResponseCopyWith on BaseResponse { int? contentLength, // `IOStreamedResponse` only properties. HttpClientResponse? inner, - }) => - switch (this) { - Response res => res.copyWith( - statusCode: statusCode, - body: body, - request: request, - headers: headers, - isRedirect: isRedirect, - persistentConnection: persistentConnection, - reasonPhrase: reasonPhrase, - ), - IOStreamedResponse res => res.copyWith( - stream: stream, - statusCode: statusCode, - contentLength: contentLength, - request: request, - headers: headers, - isRedirect: isRedirect, - persistentConnection: persistentConnection, - reasonPhrase: reasonPhrase, - inner: inner, - ), - StreamedResponse res => res.copyWith( - stream: stream, - statusCode: statusCode, - contentLength: contentLength, - request: request, - headers: headers, - isRedirect: isRedirect, - persistentConnection: persistentConnection, - reasonPhrase: reasonPhrase, - ), - _ => throw UnsupportedError( - 'Cannot copy unsupported type of response $runtimeType', - ), - }; + }) => switch (this) { + Response res => res.copyWith( + statusCode: statusCode, + body: body, + request: request, + headers: headers, + isRedirect: isRedirect, + persistentConnection: persistentConnection, + reasonPhrase: reasonPhrase, + ), + IOStreamedResponse res => res.copyWith( + stream: stream, + statusCode: statusCode, + contentLength: contentLength, + request: request, + headers: headers, + isRedirect: isRedirect, + persistentConnection: persistentConnection, + reasonPhrase: reasonPhrase, + inner: inner, + ), + StreamedResponse res => res.copyWith( + stream: stream, + statusCode: statusCode, + contentLength: contentLength, + request: request, + headers: headers, + isRedirect: isRedirect, + persistentConnection: persistentConnection, + reasonPhrase: reasonPhrase, + ), + _ => throw UnsupportedError( + 'Cannot copy unsupported type of response $runtimeType', + ), + }; } diff --git a/lib/extensions/base_response_none.dart b/lib/extensions/base_response_none.dart index 8a23ee5..289cb92 100644 --- a/lib/extensions/base_response_none.dart +++ b/lib/extensions/base_response_none.dart @@ -24,29 +24,28 @@ extension BaseResponseCopyWith on BaseResponse { // `StreamedResponse` only properties. Stream>? stream, int? contentLength, - }) => - switch (this) { - Response res => res.copyWith( - statusCode: statusCode, - body: body, - request: request, - headers: headers, - isRedirect: isRedirect, - persistentConnection: persistentConnection, - reasonPhrase: reasonPhrase, - ), - StreamedResponse res => res.copyWith( - stream: stream, - statusCode: statusCode, - contentLength: contentLength, - request: request, - headers: headers, - isRedirect: isRedirect, - persistentConnection: persistentConnection, - reasonPhrase: reasonPhrase, - ), - _ => throw UnsupportedError( - 'Cannot copy unsupported type of response $runtimeType', - ), - }; + }) => switch (this) { + Response res => res.copyWith( + statusCode: statusCode, + body: body, + request: request, + headers: headers, + isRedirect: isRedirect, + persistentConnection: persistentConnection, + reasonPhrase: reasonPhrase, + ), + StreamedResponse res => res.copyWith( + stream: stream, + statusCode: statusCode, + contentLength: contentLength, + request: request, + headers: headers, + isRedirect: isRedirect, + persistentConnection: persistentConnection, + reasonPhrase: reasonPhrase, + ), + _ => throw UnsupportedError( + 'Cannot copy unsupported type of response $runtimeType', + ), + }; } diff --git a/lib/extensions/io_streamed_response.dart b/lib/extensions/io_streamed_response.dart index 424f870..87be15e 100644 --- a/lib/extensions/io_streamed_response.dart +++ b/lib/extensions/io_streamed_response.dart @@ -14,16 +14,15 @@ extension IOStreamedResponseCopyWith on IOStreamedResponse { bool? persistentConnection, String? reasonPhrase, HttpClientResponse? inner, - }) => - IOStreamedResponse( - stream ?? this.stream, - statusCode ?? this.statusCode, - contentLength: contentLength ?? this.contentLength, - request: request ?? this.request, - headers: headers ?? this.headers, - isRedirect: isRedirect ?? this.isRedirect, - persistentConnection: persistentConnection ?? this.persistentConnection, - reasonPhrase: reasonPhrase ?? this.reasonPhrase, - inner: inner, - ); + }) => IOStreamedResponse( + stream ?? this.stream, + statusCode ?? this.statusCode, + contentLength: contentLength ?? this.contentLength, + request: request ?? this.request, + headers: headers ?? this.headers, + isRedirect: isRedirect ?? this.isRedirect, + persistentConnection: persistentConnection ?? this.persistentConnection, + reasonPhrase: reasonPhrase ?? this.reasonPhrase, + inner: inner, + ); } diff --git a/lib/extensions/multipart_request.dart b/lib/extensions/multipart_request.dart index a73912f..7f90d36 100644 --- a/lib/extensions/multipart_request.dart +++ b/lib/extensions/multipart_request.dart @@ -21,13 +21,15 @@ extension MultipartRequestCopyWith on MultipartRequest { ..fields.addAll(fields ?? this.fields); for (final MultipartFile file in this.files) { - clonedRequest.files.add(MultipartFile( - file.field, - file.finalize(), - file.length, - filename: file.filename, - contentType: file.contentType, - )); + clonedRequest.files.add( + MultipartFile( + file.field, + file.finalize(), + file.length, + filename: file.filename, + contentType: file.contentType, + ), + ); } this.persistentConnection = diff --git a/lib/extensions/response.dart b/lib/extensions/response.dart index ffd43fe..a5fda38 100644 --- a/lib/extensions/response.dart +++ b/lib/extensions/response.dart @@ -12,14 +12,13 @@ extension ResponseCopyWith on Response { bool? isRedirect, bool? persistentConnection, String? reasonPhrase, - }) => - Response( - body ?? this.body, - statusCode ?? this.statusCode, - request: request ?? this.request, - headers: headers ?? this.headers, - isRedirect: isRedirect ?? this.isRedirect, - persistentConnection: persistentConnection ?? this.persistentConnection, - reasonPhrase: reasonPhrase ?? this.reasonPhrase, - ); + }) => Response( + body ?? this.body, + statusCode ?? this.statusCode, + request: request ?? this.request, + headers: headers ?? this.headers, + isRedirect: isRedirect ?? this.isRedirect, + persistentConnection: persistentConnection ?? this.persistentConnection, + reasonPhrase: reasonPhrase ?? this.reasonPhrase, + ); } diff --git a/lib/extensions/streamed_request.dart b/lib/extensions/streamed_request.dart index e0a8e75..43f9a55 100644 --- a/lib/extensions/streamed_request.dart +++ b/lib/extensions/streamed_request.dart @@ -15,9 +15,10 @@ extension StreamedRequestCopyWith on StreamedRequest { bool? persistentConnection, }) { // Create a new StreamedRequest with the same method and URL - final StreamedRequest clonedRequest = - StreamedRequest(method?.asString ?? this.method, url ?? this.url) - ..headers.addAll(headers ?? this.headers); + final StreamedRequest clonedRequest = StreamedRequest( + method?.asString ?? this.method, + url ?? this.url, + )..headers.addAll(headers ?? this.headers); // Use a broadcast stream to allow multiple listeners final Stream> broadcastStream = diff --git a/lib/extensions/streamed_response.dart b/lib/extensions/streamed_response.dart index 9b4b624..1167a25 100644 --- a/lib/extensions/streamed_response.dart +++ b/lib/extensions/streamed_response.dart @@ -13,15 +13,14 @@ extension StreamedResponseCopyWith on StreamedResponse { bool? isRedirect, bool? persistentConnection, String? reasonPhrase, - }) => - StreamedResponse( - stream ?? this.stream, - statusCode ?? this.statusCode, - contentLength: contentLength ?? this.contentLength, - request: request ?? this.request, - headers: headers ?? this.headers, - isRedirect: isRedirect ?? this.isRedirect, - persistentConnection: persistentConnection ?? this.persistentConnection, - reasonPhrase: reasonPhrase ?? this.reasonPhrase, - ); + }) => StreamedResponse( + stream ?? this.stream, + statusCode ?? this.statusCode, + contentLength: contentLength ?? this.contentLength, + request: request ?? this.request, + headers: headers ?? this.headers, + isRedirect: isRedirect ?? this.isRedirect, + persistentConnection: persistentConnection ?? this.persistentConnection, + reasonPhrase: reasonPhrase ?? this.reasonPhrase, + ); } diff --git a/lib/extensions/uri.dart b/lib/extensions/uri.dart index 9e81ae5..9441e0a 100644 --- a/lib/extensions/uri.dart +++ b/lib/extensions/uri.dart @@ -6,18 +6,14 @@ extension AddParameters on Uri { /// Returns a new [Uri] instance based on `this` and adds [parameters]. Uri addParameters([Map? parameters]) => parameters?.isNotEmpty ?? false - ? (StringBuffer() - ..writeAll([ - buildUrlString( - "$origin$path", - { - ...queryParametersAll, - ...?parameters, - }, - ), - if (fragment.isNotEmpty) '#$fragment', - ])) - .toString() - .toUri() - : this; + ? (StringBuffer()..writeAll([ + buildUrlString("$origin$path", { + ...queryParametersAll, + ...?parameters, + }), + if (fragment.isNotEmpty) '#$fragment', + ])) + .toString() + .toUri() + : this; } diff --git a/lib/http/http_methods.dart b/lib/http/http_methods.dart index cf922cb..946d730 100644 --- a/lib/http/http_methods.dart +++ b/lib/http/http_methods.dart @@ -11,19 +11,19 @@ enum HttpMethod { /// Converts a string to an [HttpMethod]. static HttpMethod fromString(String method) => switch (method) { - "HEAD" => HttpMethod.HEAD, - "GET" => HttpMethod.GET, - "POST" => HttpMethod.POST, - "PUT" => HttpMethod.PUT, - "PATCH" => HttpMethod.PATCH, - "DELETE" => HttpMethod.DELETE, - "OPTIONS" => HttpMethod.OPTIONS, - _ => throw ArgumentError.value( - method, - "method", - "Must be a valid HTTP Method.", - ), - }; + "HEAD" => HttpMethod.HEAD, + "GET" => HttpMethod.GET, + "POST" => HttpMethod.POST, + "PUT" => HttpMethod.PUT, + "PATCH" => HttpMethod.PATCH, + "DELETE" => HttpMethod.DELETE, + "OPTIONS" => HttpMethod.OPTIONS, + _ => throw ArgumentError.value( + method, + "method", + "Must be a valid HTTP Method.", + ), + }; /// Converts the [HttpMethod] to a string. String get asString => name; diff --git a/lib/http/intercepted_client.dart b/lib/http/intercepted_client.dart index 323623c..9a07250 100644 --- a/lib/http/intercepted_client.dart +++ b/lib/http/intercepted_client.dart @@ -88,25 +88,22 @@ class InterceptedClient extends BaseClient { TimeoutCallback? onRequestTimeout, RetryPolicy? retryPolicy, Client? client, - }) => - InterceptedClient._internal( - interceptors: interceptors, - requestTimeout: requestTimeout, - onRequestTimeout: onRequestTimeout, - retryPolicy: retryPolicy, - client: client, - ); + }) => InterceptedClient._internal( + interceptors: interceptors, + requestTimeout: requestTimeout, + onRequestTimeout: onRequestTimeout, + retryPolicy: retryPolicy, + client: client, + ); @override - Future head( - Uri url, { - Map? headers, - }) async => + Future head(Uri url, {Map? headers}) async => (await _sendUnstreamed( - method: HttpMethod.HEAD, - url: url, - headers: headers, - )) as Response; + method: HttpMethod.HEAD, + url: url, + headers: headers, + )) + as Response; @override Future get( @@ -115,11 +112,12 @@ class InterceptedClient extends BaseClient { Map? params, }) async => (await _sendUnstreamed( - method: HttpMethod.GET, - url: url, - headers: headers, - params: params, - )) as Response; + method: HttpMethod.GET, + url: url, + headers: headers, + params: params, + )) + as Response; @override Future post( @@ -130,13 +128,14 @@ class InterceptedClient extends BaseClient { Encoding? encoding, }) async => (await _sendUnstreamed( - method: HttpMethod.POST, - url: url, - headers: headers, - params: params, - body: body, - encoding: encoding, - )) as Response; + method: HttpMethod.POST, + url: url, + headers: headers, + params: params, + body: body, + encoding: encoding, + )) + as Response; @override Future put( @@ -147,13 +146,14 @@ class InterceptedClient extends BaseClient { Encoding? encoding, }) async => (await _sendUnstreamed( - method: HttpMethod.PUT, - url: url, - headers: headers, - params: params, - body: body, - encoding: encoding, - )) as Response; + method: HttpMethod.PUT, + url: url, + headers: headers, + params: params, + body: body, + encoding: encoding, + )) + as Response; @override Future patch( @@ -164,13 +164,14 @@ class InterceptedClient extends BaseClient { Encoding? encoding, }) async => (await _sendUnstreamed( - method: HttpMethod.PATCH, - url: url, - headers: headers, - params: params, - body: body, - encoding: encoding, - )) as Response; + method: HttpMethod.PATCH, + url: url, + headers: headers, + params: params, + body: body, + encoding: encoding, + )) + as Response; @override Future delete( @@ -181,13 +182,14 @@ class InterceptedClient extends BaseClient { Encoding? encoding, }) async => (await _sendUnstreamed( - method: HttpMethod.DELETE, - url: url, - headers: headers, - params: params, - body: body, - encoding: encoding, - )) as Response; + method: HttpMethod.DELETE, + url: url, + headers: headers, + params: params, + body: body, + encoding: encoding, + )) + as Response; @override Future read( @@ -213,8 +215,10 @@ class InterceptedClient extends BaseClient { @override Future send(BaseRequest request) async { - final BaseResponse response = - await _attemptRequest(request, isStream: true); + final BaseResponse response = await _attemptRequest( + request, + isStream: true, + ); final BaseResponse interceptedResponse = await _interceptResponse(response); @@ -235,10 +239,7 @@ class InterceptedClient extends BaseClient { Object? body, Encoding? encoding, }) async { - final Request request = Request( - method.asString, - url.addParameters(params), - ); + final Request request = Request(method.asString, url.addParameters(params)); if (headers != null) request.headers.addAll(headers); if (encoding != null) request.encoding = encoding; if (body != null) { @@ -298,8 +299,9 @@ class InterceptedClient extends BaseClient { } else { // Use a completer to properly handle timeout and cancellation final Completer completer = Completer(); - final Future requestFuture = - _inner.send(interceptedRequest); + final Future requestFuture = _inner.send( + interceptedRequest, + ); // Set up timeout with proper cleanup bool isCompleted = false; @@ -312,15 +314,17 @@ class InterceptedClient extends BaseClient { try { final timeoutResponse = onRequestTimeout!(); if (timeoutResponse is Future) { - timeoutResponse.then((response) { - if (!completer.isCompleted) { - completer.complete(response); - } - }).catchError((error) { - if (!completer.isCompleted) { - completer.completeError(error); - } - }); + timeoutResponse + .then((response) { + if (!completer.isCompleted) { + completer.complete(response); + } + }) + .catchError((error) { + if (!completer.isCompleted) { + completer.completeError(error); + } + }); } else { if (!completer.isCompleted) { completer.complete(timeoutResponse); @@ -334,31 +338,36 @@ class InterceptedClient extends BaseClient { } else { // Default timeout behavior if (!completer.isCompleted) { - completer.completeError(Exception( - 'Request timeout after ${requestTimeout!.inMilliseconds}ms')); + completer.completeError( + Exception( + 'Request timeout after ${requestTimeout!.inMilliseconds}ms', + ), + ); } } } }); // Handle the actual request completion - requestFuture.then((streamResponse) { - timeoutTimer.cancel(); - if (!isCompleted) { - isCompleted = true; - if (!completer.isCompleted) { - completer.complete(streamResponse); - } - } - }).catchError((error) { - timeoutTimer.cancel(); - if (!isCompleted) { - isCompleted = true; - if (!completer.isCompleted) { - completer.completeError(error); - } - } - }); + requestFuture + .then((streamResponse) { + timeoutTimer.cancel(); + if (!isCompleted) { + isCompleted = true; + if (!completer.isCompleted) { + completer.complete(streamResponse); + } + } + }) + .catchError((error) { + timeoutTimer.cancel(); + if (!isCompleted) { + isCompleted = true; + if (!completer.isCompleted) { + completer.completeError(error); + } + } + }); stream = await completer.future; } @@ -369,8 +378,9 @@ class InterceptedClient extends BaseClient { retryPolicy!.maxRetryAttempts > _retryCount && await retryPolicy!.shouldAttemptRetryOnResponse(response)) { _retryCount += 1; - await Future.delayed(retryPolicy! - .delayRetryAttemptOnResponse(retryAttempt: _retryCount)); + await Future.delayed( + retryPolicy!.delayRetryAttemptOnResponse(retryAttempt: _retryCount), + ); return _attemptRequestWithRetries(request, isStream: isStream); } } on Exception catch (error, stackTrace) { @@ -378,8 +388,9 @@ class InterceptedClient extends BaseClient { retryPolicy!.maxRetryAttempts > _retryCount && await retryPolicy!.shouldAttemptRetryOnException(error, request)) { _retryCount += 1; - await Future.delayed(retryPolicy! - .delayRetryAttemptOnException(retryAttempt: _retryCount)); + await Future.delayed( + retryPolicy!.delayRetryAttemptOnException(retryAttempt: _retryCount), + ); return _attemptRequestWithRetries(request, isStream: isStream); } else { await _interceptError( @@ -436,7 +447,9 @@ class InterceptedClient extends BaseClient { }) async { for (InterceptorContract interceptor in interceptors) { if (await interceptor.shouldInterceptError( - request: request, response: response)) { + request: request, + response: response, + )) { await interceptor.interceptError( request: request, response: response, diff --git a/lib/http/intercepted_http.dart b/lib/http/intercepted_http.dart index 7e05462..e94ccf2 100644 --- a/lib/http/intercepted_http.dart +++ b/lib/http/intercepted_http.dart @@ -86,27 +86,19 @@ class InterceptedHttp { TimeoutCallback? onRequestTimeout, RetryPolicy? retryPolicy, Client? client, - }) => - InterceptedHttp._internal( - interceptors: interceptors, - requestTimeout: requestTimeout, - onRequestTimeout: onRequestTimeout, - retryPolicy: retryPolicy, - client: client, - ); + }) => InterceptedHttp._internal( + interceptors: interceptors, + requestTimeout: requestTimeout, + onRequestTimeout: onRequestTimeout, + retryPolicy: retryPolicy, + client: client, + ); /// Performs a HEAD request with a new [Client] instance and closes it after /// it has been used. - Future head( - Uri url, { - Map? headers, - }) => - _withClient( - (InterceptedClient client) => client.head( - url, - headers: headers, - ), - ); + Future head(Uri url, {Map? headers}) => _withClient( + (InterceptedClient client) => client.head(url, headers: headers), + ); /// Performs a GET request with a new [Client] instance and closes it after /// it has been used. @@ -114,14 +106,10 @@ class InterceptedHttp { Uri url, { Map? headers, Map? params, - }) => - _withClient( - (InterceptedClient client) => client.get( - url, - headers: headers, - params: params, - ), - ); + }) => _withClient( + (InterceptedClient client) => + client.get(url, headers: headers, params: params), + ); /// Performs a POST request with a new [Client] instance and closes it after /// it has been used. @@ -131,16 +119,15 @@ class InterceptedHttp { Map? params, Object? body, Encoding? encoding, - }) => - _withClient( - (InterceptedClient client) => client.post( - url, - headers: headers, - params: params, - body: body, - encoding: encoding, - ), - ); + }) => _withClient( + (InterceptedClient client) => client.post( + url, + headers: headers, + params: params, + body: body, + encoding: encoding, + ), + ); /// Performs a PUT request with a new [Client] instance and closes it after /// it has been used. @@ -150,16 +137,15 @@ class InterceptedHttp { Map? params, Object? body, Encoding? encoding, - }) => - _withClient( - (InterceptedClient client) => client.put( - url, - headers: headers, - params: params, - body: body, - encoding: encoding, - ), - ); + }) => _withClient( + (InterceptedClient client) => client.put( + url, + headers: headers, + params: params, + body: body, + encoding: encoding, + ), + ); /// Performs a PATCH request with a new [Client] instance and closes it after /// it has been used. @@ -169,16 +155,15 @@ class InterceptedHttp { Map? params, Object? body, Encoding? encoding, - }) => - _withClient( - (InterceptedClient client) => client.patch( - url, - headers: headers, - params: params, - body: body, - encoding: encoding, - ), - ); + }) => _withClient( + (InterceptedClient client) => client.patch( + url, + headers: headers, + params: params, + body: body, + encoding: encoding, + ), + ); /// Performs a DELETE request with a new [Client] instance and closes it after /// it has been used. @@ -188,16 +173,15 @@ class InterceptedHttp { Map? params, Object? body, Encoding? encoding, - }) => - _withClient( - (InterceptedClient client) => client.delete( - url, - headers: headers, - params: params, - body: body, - encoding: encoding, - ), - ); + }) => _withClient( + (InterceptedClient client) => client.delete( + url, + headers: headers, + params: params, + body: body, + encoding: encoding, + ), + ); /// Executes `client.read` with a new [Client] instance and closes it after /// it has been used. @@ -205,14 +189,10 @@ class InterceptedHttp { Uri url, { Map? headers, Map? params, - }) => - _withClient( - (InterceptedClient client) => client.read( - url, - headers: headers, - params: params, - ), - ); + }) => _withClient( + (InterceptedClient client) => + client.read(url, headers: headers, params: params), + ); /// Executes `client.readBytes` with a new [Client] instance and closes it /// after it has been used. @@ -220,14 +200,10 @@ class InterceptedHttp { Uri url, { Map? headers, Map? params, - }) => - _withClient( - (InterceptedClient client) => client.readBytes( - url, - headers: headers, - params: params, - ), - ); + }) => _withClient( + (InterceptedClient client) => + client.readBytes(url, headers: headers, params: params), + ); /// Internal convenience utility to create a new [Client] instance for each /// request. It closes the client after using it for the request. diff --git a/lib/models/interceptor_contract.dart b/lib/models/interceptor_contract.dart index 2a6c9d9..4b4c910 100644 --- a/lib/models/interceptor_contract.dart +++ b/lib/models/interceptor_contract.dart @@ -45,8 +45,7 @@ abstract class InterceptorContract { FutureOr shouldInterceptError({ BaseRequest? request, BaseResponse? response, - }) => - true; + }) => true; /// Intercepts the error response. FutureOr interceptError({ diff --git a/lib/models/retry_policy.dart b/lib/models/retry_policy.dart index c838493..481fc40 100644 --- a/lib/models/retry_policy.dart +++ b/lib/models/retry_policy.dart @@ -45,8 +45,7 @@ abstract class RetryPolicy { FutureOr shouldAttemptRetryOnException( Exception reason, BaseRequest request, - ) => - false; + ) => false; /// Defines whether the request should be retried after the request has /// received `response` from the server. diff --git a/lib/utils/query_parameters.dart b/lib/utils/query_parameters.dart index 6e39c39..1d0b2c5 100644 --- a/lib/utils/query_parameters.dart +++ b/lib/utils/query_parameters.dart @@ -18,19 +18,17 @@ String buildUrlString(String url, Map? parameters) { return parameters?.isNotEmpty ?? false ? uri - .replace( + .replace( query: qs.encode( - { - ...uri.queryParametersAll, - ...?parameters, - }, + {...uri.queryParametersAll, ...?parameters}, qs.EncodeOptions( listFormat: qs.ListFormat.repeat, skipNulls: false, strictNullHandling: false, ), ), - queryParameters: null) - .toString() + queryParameters: null, + ) + .toString() : url; } diff --git a/pubspec.yaml b/pubspec.yaml index fc917a7..5e4f146 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ issue_tracker: https://github.com/CodingAleCR/http_interceptor/issues repository: https://github.com/CodingAleCR/http_interceptor environment: - sdk: ">=3.0.3 <4.0.0" + sdk: ">=3.8.0 <4.0.0" dependencies: http: ^1.2.1 @@ -16,5 +16,5 @@ dependencies: validators: ^3.0.0 dev_dependencies: - lints: ^4.0.0 + lints: ^6.1.0 test: ^1.25.8 diff --git a/test/extensions/base_reponse_test.dart b/test/extensions/base_reponse_test.dart index 2ac27fe..be5917d 100644 --- a/test/extensions/base_reponse_test.dart +++ b/test/extensions/base_reponse_test.dart @@ -1,7 +1,7 @@ import 'package:http_interceptor/http_interceptor.dart'; import 'package:test/test.dart'; -main() { +void main() { group('BaseResponse.copyWith: ', () { test('Response is copied from BaseResponse', () { // Arrange @@ -20,7 +20,9 @@ main() { expect(copied.isRedirect, equals(response.isRedirect)); expect(copied.reasonPhrase, equals(response.reasonPhrase)); expect( - copied.persistentConnection, equals(response.persistentConnection)); + copied.persistentConnection, + equals(response.persistentConnection), + ); }); }); } diff --git a/test/extensions/base_request_test.dart b/test/extensions/base_request_test.dart index b75df27..8c0db0c 100644 --- a/test/extensions/base_request_test.dart +++ b/test/extensions/base_request_test.dart @@ -3,13 +3,14 @@ import 'dart:convert'; import 'package:http_interceptor/http_interceptor.dart'; import 'package:test/test.dart'; -main() { +void main() { group('BaseRequest.copyWith: ', () { test('Request is copied from BaseRequest', () { // Arrange - final BaseRequest baseRequest = - Request("GET", Uri.https("www.google.com", "/helloworld")) - ..body = jsonEncode({'some_param': 'some value'}); + final BaseRequest baseRequest = Request( + "GET", + Uri.https("www.google.com", "/helloworld"), + )..body = jsonEncode({'some_param': 'some value'}); final copiedBaseRequest = baseRequest.copyWith(); // Act diff --git a/test/extensions/request_test.dart b/test/extensions/request_test.dart index 09fab4b..0e1221b 100644 --- a/test/extensions/request_test.dart +++ b/test/extensions/request_test.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:http_interceptor/http_interceptor.dart'; import 'package:test/test.dart'; -main() { +void main() { late BaseRequest baseRequest; late Request request; @@ -61,17 +61,10 @@ main() { final Uri newUrl = Uri.https("www.google.com", "/foobar"); // Act - final Request copied = request.copyWith( - url: newUrl, - ); + final Request copied = request.copyWith(url: newUrl); // Assert - expect( - copied.url, - allOf([ - equals(newUrl), - isNot(equals(request.url)), - ])); + expect(copied.url, allOf([equals(newUrl), isNot(equals(request.url))])); expect(copied.method, equals(request.method)); expect(copied.headers, equals(request.headers)); expect(copied.body, equals(request.body)); @@ -85,18 +78,17 @@ main() { const newMethod = HttpMethod.POST; // Act - final Request copied = request.copyWith( - method: newMethod, - ); + final Request copied = request.copyWith(method: newMethod); // Assert expect(copied.url, equals(request.url)); expect( - copied.method, - allOf([ - equals(HttpMethod.POST.asString), - isNot(equals(request.method)), - ])); + copied.method, + allOf([ + equals(HttpMethod.POST.asString), + isNot(equals(request.method)), + ]), + ); expect(copied.headers, equals(request.headers)); expect(copied.body, equals(request.body)); expect(copied.encoding, equals(request.encoding)); @@ -110,19 +102,15 @@ main() { newHeaders['Authorization'] = 'Bearer token'; // Act - final Request copied = request.copyWith( - headers: newHeaders, - ); + final Request copied = request.copyWith(headers: newHeaders); // Assert expect(copied.url, equals(request.url)); expect(copied.method, equals(request.method)); expect( - copied.headers, - allOf([ - equals(newHeaders), - isNot(equals(request.headers)), - ])); + copied.headers, + allOf([equals(newHeaders), isNot(equals(request.headers))]), + ); expect(copied.body, equals(request.body)); expect(copied.encoding, equals(request.encoding)); expect(copied.followRedirects, equals(request.followRedirects)); @@ -135,19 +123,15 @@ main() { newHeaders['Authorization'] = 'Bearer token'; // Act - final Request copied = request.copyWith( - headers: newHeaders, - ); + final Request copied = request.copyWith(headers: newHeaders); // Assert expect(copied.url, equals(request.url)); expect(copied.method, equals(request.method)); expect( - copied.headers, - allOf([ - equals(newHeaders), - isNot(equals(request.headers)), - ])); + copied.headers, + allOf([equals(newHeaders), isNot(equals(request.headers))]), + ); expect(copied.body, equals(request.body)); expect(copied.encoding, equals(request.encoding)); expect(copied.followRedirects, equals(request.followRedirects)); @@ -160,19 +144,15 @@ main() { newHeaders['content-type'] = 'text/plain; charset=utf-8'; // Act - final Request copied = request.copyWith( - headers: newHeaders, - ); + final Request copied = request.copyWith(headers: newHeaders); // Assert expect(copied.url, equals(request.url)); expect(copied.method, equals(request.method)); expect( - copied.headers, - allOf([ - equals(newHeaders), - isNot(equals(request.headers)), - ])); + copied.headers, + allOf([equals(newHeaders), isNot(equals(request.headers))]), + ); expect(copied.body, equals(request.body)); expect(copied.encoding, equals(request.encoding)); expect(copied.followRedirects, equals(request.followRedirects)); @@ -186,20 +166,16 @@ main() { newBody['hello'] = 'world'; // Act - final Request copied = request.copyWith( - body: jsonEncode(newBody), - ); + final Request copied = request.copyWith(body: jsonEncode(newBody)); // Assert expect(copied.url, equals(request.url)); expect(copied.method, equals(request.method)); expect(copied.headers, equals(request.headers)); expect( - copied.body, - allOf([ - equals(jsonEncode(newBody)), - isNot(equals(request.body)), - ])); + copied.body, + allOf([equals(jsonEncode(newBody)), isNot(equals(request.body))]), + ); expect(copied.encoding, equals(request.encoding)); expect(copied.followRedirects, equals(request.followRedirects)); expect(copied.maxRedirects, equals(request.maxRedirects)); @@ -216,9 +192,7 @@ main() { // Act final utfBytes = utf8.encode(jsonEncode(newBody)); final gzipBytes = gzip.encode(utfBytes); - final Request copied = request.copyWith( - body: base64.encode(gzipBytes), - ); + final Request copied = request.copyWith(body: base64.encode(gzipBytes)); // Assert final decodedBody = utf8.decode(gzip.decode(base64.decode(copied.body))); @@ -226,11 +200,9 @@ main() { expect(copied.method, equals(request.method)); expect(copied.headers, equals(request.headers)); expect( - decodedBody, - allOf([ - equals(jsonEncode(newBody)), - isNot(equals(request.body)), - ])); + decodedBody, + allOf([equals(jsonEncode(newBody)), isNot(equals(request.body))]), + ); expect(copied.encoding, equals(request.encoding)); expect(copied.followRedirects, equals(request.followRedirects)); expect(copied.maxRedirects, equals(request.maxRedirects)); @@ -259,11 +231,9 @@ main() { expect(updatedHeadersRequest.headers, equals(request.headers)); expect(copied.body, equals(request.body)); expect( - copied.encoding, - allOf([ - equals(newEncoding), - isNot(equals(request.encoding)), - ])); + copied.encoding, + allOf([equals(newEncoding), isNot(equals(request.encoding))]), + ); expect(copied.followRedirects, equals(request.followRedirects)); expect(copied.maxRedirects, equals(request.maxRedirects)); expect(copied.persistentConnection, equals(request.persistentConnection)); @@ -284,11 +254,12 @@ main() { expect(copied.body, equals(request.body)); expect(copied.encoding, equals(request.encoding)); expect( - copied.followRedirects, - allOf([ - equals(newFollowRedirects), - isNot(equals(request.followRedirects)), - ])); + copied.followRedirects, + allOf([ + equals(newFollowRedirects), + isNot(equals(request.followRedirects)), + ]), + ); expect(copied.maxRedirects, equals(request.maxRedirects)); expect(copied.persistentConnection, equals(request.persistentConnection)); }); @@ -297,9 +268,7 @@ main() { const newMaxRedirects = 2; // Act - final Request copied = request.copyWith( - maxRedirects: newMaxRedirects, - ); + final Request copied = request.copyWith(maxRedirects: newMaxRedirects); // Assert expect(copied.url, equals(request.url)); @@ -309,11 +278,9 @@ main() { expect(copied.encoding, equals(request.encoding)); expect(copied.followRedirects, equals(request.followRedirects)); expect( - copied.maxRedirects, - allOf([ - equals(newMaxRedirects), - isNot(equals(request.maxRedirects)), - ])); + copied.maxRedirects, + allOf([equals(newMaxRedirects), isNot(equals(request.maxRedirects))]), + ); expect(copied.persistentConnection, equals(request.persistentConnection)); }); @@ -335,11 +302,12 @@ main() { expect(copied.followRedirects, equals(request.followRedirects)); expect(copied.maxRedirects, equals(request.maxRedirects)); expect( - copied.persistentConnection, - allOf([ - equals(newPersistentConnection), - isNot(equals(request.persistentConnection)), - ])); + copied.persistentConnection, + allOf([ + equals(newPersistentConnection), + isNot(equals(request.persistentConnection)), + ]), + ); }); }); } diff --git a/test/extensions/response_test.dart b/test/extensions/response_test.dart index 20bfa75..a4980ac 100644 --- a/test/extensions/response_test.dart +++ b/test/extensions/response_test.dart @@ -1,7 +1,7 @@ import 'package:http_interceptor/http_interceptor.dart'; import 'package:test/test.dart'; -main() { +void main() { late BaseResponse baseResponse; late Response response; @@ -9,9 +9,7 @@ main() { baseResponse = Response( "{'foo': 'bar'}", 200, - headers: { - 'some_header': 'header_value', - }, + headers: {'some_header': 'header_value'}, ); response = baseResponse as Response; }); @@ -32,7 +30,9 @@ main() { expect(copied.isRedirect, equals(response.isRedirect)); expect(copied.reasonPhrase, equals(response.reasonPhrase)); expect( - copied.persistentConnection, equals(response.persistentConnection)); + copied.persistentConnection, + equals(response.persistentConnection), + ); }); }); } diff --git a/test/extensions/uri_test.dart b/test/extensions/uri_test.dart index 8cb3ebc..2b41054 100644 --- a/test/extensions/uri_test.dart +++ b/test/extensions/uri_test.dart @@ -29,8 +29,11 @@ void main() { // Assert Map allParameters = {"foo": "bar", "num": "0"}; - Uri expectedUrl = - Uri.https("www.google.com", "/helloworld", allParameters); + Uri expectedUrl = Uri.https( + "www.google.com", + "/helloworld", + allParameters, + ); expect(parameterUri, equals(expectedUrl)); }); test("Add parameters with array to Uri Url without parameters", () { @@ -67,8 +70,11 @@ void main() { "foo": ["bar", "bar1"], "num": "0", }; - Uri expectedUrl = - Uri.https("www.google.com", "/helloworld", allParameters); + Uri expectedUrl = Uri.https( + "www.google.com", + "/helloworld", + allParameters, + ); expect(parameterUri, equals(expectedUrl)); }); test("Add non-string parameters to Uri without parameters", () { @@ -82,8 +88,11 @@ void main() { Uri parameterUri = url.addParameters(parameters); // Assert - Uri expectedUrl = - Uri.https("www.google.com", "/helloworld", expectedParameters); + Uri expectedUrl = Uri.https( + "www.google.com", + "/helloworld", + expectedParameters, + ); expect(parameterUri, equals(expectedUrl)); }); test("Add non-string parameters to Uri with parameters", () { @@ -99,32 +108,40 @@ void main() { // Assert Map allParameters = {"foo": "bar", "num": "0"}; - Uri expectedUrl = - Uri.https("www.google.com", "/helloworld", allParameters); - expect(parameterUri, equals(expectedUrl)); - }); - test("Add non-string parameters with array to Uri Url without parameters", - () { - // Arrange - String stringUrl = "https://www.google.com/helloworld"; - Map expectedParameters = { - "foo": "bar", - "num": ["0", "1"], - }; - Map parameters = { - "foo": "bar", - "num": ["0", 1], - }; - Uri url = Uri.parse(stringUrl); - - // Act - Uri parameterUri = url.addParameters(parameters); - - // Assert - Uri expectedUrl = - Uri.https("www.google.com", "/helloworld", expectedParameters); + Uri expectedUrl = Uri.https( + "www.google.com", + "/helloworld", + allParameters, + ); expect(parameterUri, equals(expectedUrl)); }); + test( + "Add non-string parameters with array to Uri Url without parameters", + () { + // Arrange + String stringUrl = "https://www.google.com/helloworld"; + Map expectedParameters = { + "foo": "bar", + "num": ["0", "1"], + }; + Map parameters = { + "foo": "bar", + "num": ["0", 1], + }; + Uri url = Uri.parse(stringUrl); + + // Act + Uri parameterUri = url.addParameters(parameters); + + // Assert + Uri expectedUrl = Uri.https( + "www.google.com", + "/helloworld", + expectedParameters, + ); + expect(parameterUri, equals(expectedUrl)); + }, + ); test("Add non-string parameters to Uri Url with array parameters", () { // Arrange String authority = "www.google.com"; @@ -149,8 +166,11 @@ void main() { "num2": "1", "num3": ["3", "2"], }; - Uri expectedUrl = - Uri.https("www.google.com", "/helloworld", expectedParameters); + Uri expectedUrl = Uri.https( + "www.google.com", + "/helloworld", + expectedParameters, + ); expect(parameterUri, equals(expectedUrl)); }); }); diff --git a/test/http/http_methods_test.dart b/test/http/http_methods_test.dart index dca3650..173700a 100644 --- a/test/http/http_methods_test.dart +++ b/test/http/http_methods_test.dart @@ -1,7 +1,7 @@ import 'package:http_interceptor/http/http_methods.dart'; import 'package:test/test.dart'; -main() { +void main() { group("Can parse from string", () { test("with HEAD method", () { // Arrange @@ -171,10 +171,7 @@ main() { // Act // Assert - expect( - () => HttpMethod.fromString(methodString), - throwsArgumentError, - ); + expect(() => HttpMethod.fromString(methodString), throwsArgumentError); }); }); diff --git a/test/http/intercepted_client_error_test.dart b/test/http/intercepted_client_error_test.dart index b28de76..8ea1662 100644 --- a/test/http/intercepted_client_error_test.dart +++ b/test/http/intercepted_client_error_test.dart @@ -11,30 +11,27 @@ void main() { client = InterceptedClient.build(interceptors: [mockInterceptor]); }); - test( - 'interceptors are called when an error occurs', - () async { - final request = Request('GET', Uri.parse('https://example.com')); - final error = Exception('Test error'); - final stackTrace = StackTrace.current; + test('interceptors are called when an error occurs', () async { + final request = Request('GET', Uri.parse('https://example.com')); + final error = Exception('Test error'); + final stackTrace = StackTrace.current; - mockInterceptor.shouldInterceptErrorResult = true; + mockInterceptor.shouldInterceptErrorResult = true; - // Call the internal _interceptError method indirectly - // by creating a scenario where it would be called - await _callInterceptError( - client: client, - request: request, - error: error, - stackTrace: stackTrace, - ); + // Call the internal _interceptError method indirectly + // by creating a scenario where it would be called + await _callInterceptError( + client: client, + request: request, + error: error, + stackTrace: stackTrace, + ); - expect(mockInterceptor.interceptErrorCalled, true); - expect(mockInterceptor.lastRequest, isNotNull); - expect(mockInterceptor.lastError, isNotNull); - expect(mockInterceptor.lastStackTrace, isNotNull); - }, - ); + expect(mockInterceptor.interceptErrorCalled, true); + expect(mockInterceptor.lastRequest, isNotNull); + expect(mockInterceptor.lastError, isNotNull); + expect(mockInterceptor.lastStackTrace, isNotNull); + }); test( 'interceptors are not called when shouldInterceptError returns false', diff --git a/test/http/intercepted_client_test.dart b/test/http/intercepted_client_test.dart index df9929e..2aafbb9 100644 --- a/test/http/intercepted_client_test.dart +++ b/test/http/intercepted_client_test.dart @@ -208,10 +208,7 @@ void main() { reasonPhrase: 'Not Found', ); - expect( - () => client.read(url), - throwsA(isA()), - ); + expect(() => client.read(url), throwsA(isA())); }); test('send method returns StreamedResponse', () async { @@ -380,10 +377,7 @@ void main() { retryPolicy.shouldRetryOnException = true; retryPolicy.maxRetryAttempts = 1; - await expectLater( - () => client.get(url), - throwsException, - ); + await expectLater(() => client.get(url), throwsException); expect(mockClient.requestCount, 2); // Original + 1 retry }); @@ -435,10 +429,7 @@ void main() { final url = Uri.parse('https://example.com'); mockClient.delayResponse = Duration(milliseconds: 200); - expect( - () => client.get(url), - throwsA(isA()), - ); + expect(() => client.get(url), throwsA(isA())); }); test('uses timeout callback when provided', () async { @@ -489,10 +480,10 @@ class _MockClient extends BaseClient { Map? lastRequestFields; StreamedResponse get response => StreamedResponse( - Stream.value(_responseBody), - _responseStatusCode, - headers: _responseHeaders, - ); + Stream.value(_responseBody), + _responseStatusCode, + headers: _responseHeaders, + ); set response(StreamedResponse resp) { _responseStatusCode = resp.statusCode; @@ -513,8 +504,9 @@ class _MockClient extends BaseClient { lastRequestBody = request.body; // For form fields - only access if content type is appropriate - if (request.headers['content-type'] - ?.contains('application/x-www-form-urlencoded') ?? + if (request.headers['content-type']?.contains( + 'application/x-www-form-urlencoded', + ) ?? false) { try { lastRequestFields = request.bodyFields; @@ -651,8 +643,7 @@ class _MockRetryPolicy extends RetryPolicy { bool shouldAttemptRetryOnException( Exception exception, BaseRequest request, - ) => - shouldRetryOnException; + ) => shouldRetryOnException; @override Duration delayRetryAttemptOnResponse({required int retryAttempt}) => delay; diff --git a/test/models/retry_policy_test.dart b/test/models/retry_policy_test.dart index 65e0d2e..4c19bad 100644 --- a/test/models/retry_policy_test.dart +++ b/test/models/retry_policy_test.dart @@ -1,7 +1,7 @@ import 'package:http_interceptor/http_interceptor.dart'; import 'package:test/test.dart'; -main() { +void main() { late RetryPolicy testObject; setUp(() { @@ -14,9 +14,7 @@ main() { }); test("can be overridden", () { - testObject = TestRetryPolicy( - maxRetryAttempts: 5, - ); + testObject = TestRetryPolicy(maxRetryAttempts: 5); expect(testObject.maxRetryAttempts, 5); }); @@ -45,23 +43,19 @@ main() { group("shouldAttemptRetryOnException", () { test("returns false by default", () async { expect( - await testObject.shouldAttemptRetryOnException( - Exception("Test Exception."), - Request( - 'GET', - Uri(), - ), - ), - false); + await testObject.shouldAttemptRetryOnException( + Exception("Test Exception."), + Request('GET', Uri()), + ), + false, + ); }); }); group("shouldAttemptRetryOnResponse", () { test("returns false by default", () async { expect( - await testObject.shouldAttemptRetryOnResponse( - Response('', 200), - ), + await testObject.shouldAttemptRetryOnResponse(Response('', 200)), false, ); }); @@ -69,9 +63,8 @@ main() { } class TestRetryPolicy extends RetryPolicy { - TestRetryPolicy({ - int maxRetryAttempts = 1, - }) : internalMaxRetryAttempts = maxRetryAttempts; + TestRetryPolicy({int maxRetryAttempts = 1}) + : internalMaxRetryAttempts = maxRetryAttempts; final int internalMaxRetryAttempts; diff --git a/test/utils/utils_test.dart b/test/utils/utils_test.dart index 33c58f5..7b4d7ed 100644 --- a/test/utils/utils_test.dart +++ b/test/utils/utils_test.dart @@ -1,7 +1,7 @@ -import 'package:test/test.dart'; import 'package:http_interceptor/utils/utils.dart'; +import 'package:test/test.dart'; -main() { +void main() { group("buildUrlString", () { test("Adds parameters to a URL string without parameters", () { // Arrange @@ -23,7 +23,7 @@ main() { final String url = "https://www.google.com/helloworld?foo=bar&num=0"; final Map parameters = { "extra": "1", - "extra2": "anotherone" + "extra2": "anotherone", }; // Act @@ -58,18 +58,12 @@ main() { test("Null parameters returns original URL", () { final url = "https://example.com/path"; - expect( - buildUrlString(url, null), - equals(url), - ); + expect(buildUrlString(url, null), equals(url)); }); test("Empty parameters returns original URL", () { final url = "https://example.com/path"; - expect( - buildUrlString(url, {}), - equals(url), - ); + expect(buildUrlString(url, {}), equals(url)); }); test("Null parameter value becomes empty assignment", () { @@ -93,15 +87,19 @@ main() { test("Preserves fragment without existing query", () { final url = "https://example.com/path#section"; final params = {"a": "1"}; - expect(buildUrlString(url, params), - equals("https://example.com/path?a=1#section")); + expect( + buildUrlString(url, params), + equals("https://example.com/path?a=1#section"), + ); }); test("Preserves fragment with existing query", () { final url = "https://example.com/path?foo=bar#section"; final params = {"baz": "qux"}; - expect(buildUrlString(url, params), - equals("https://example.com/path?foo=bar&baz=qux#section")); + expect( + buildUrlString(url, params), + equals("https://example.com/path?foo=bar&baz=qux#section"), + ); }); test("Invalid URL does not trigger concatenation fallback", () { @@ -131,7 +129,7 @@ main() { test("List parameter overrides existing singular key", () { final url = "https://example.com/path?x=1"; final params = { - "x": ["2", "3"] + "x": ["2", "3"], }; expect( buildUrlString(url, params), @@ -141,22 +139,13 @@ main() { test('encodes a query string object (basic key/value)', () { final String testUrl = 'https://example.com/path'; - expect( - buildUrlString(testUrl, {'a': 'b'}), - equals('$testUrl?a=b'), - ); - expect( - buildUrlString(testUrl, {'a': '1'}), - equals('$testUrl?a=1'), - ); + expect(buildUrlString(testUrl, {'a': 'b'}), equals('$testUrl?a=b')); + expect(buildUrlString(testUrl, {'a': '1'}), equals('$testUrl?a=1')); expect( buildUrlString(testUrl, {'a': '1', 'b': '2'}), equals('$testUrl?a=1&b=2'), ); - expect( - buildUrlString(testUrl, {'a': 'A_Z'}), - equals('$testUrl?a=A_Z'), - ); + expect(buildUrlString(testUrl, {'a': 'A_Z'}), equals('$testUrl?a=A_Z')); }); test('encodes various unicode characters', () { @@ -169,10 +158,7 @@ main() { buildUrlString(testUrl, {'a': ''}), equals('$testUrl?a=%EE%80%80'), ); - expect( - buildUrlString(testUrl, {'a': 'א'}), - equals('$testUrl?a=%D7%90'), - ); + expect(buildUrlString(testUrl, {'a': 'א'}), equals('$testUrl?a=%D7%90')); expect( buildUrlString(testUrl, {'a': '𐐷'}), equals('$testUrl?a=%F0%90%90%B7'), @@ -200,7 +186,7 @@ main() { expect( buildUrlString(testUrl, { 'a': ['b', 'c', 'd'], - 'e': 'f' + 'e': 'f', }), equals('$testUrl?a=b&a=c&a=d&e=f'), ); @@ -216,10 +202,7 @@ main() { test('single key with empty string value', () { final String testUrl = 'https://example.com/path'; - expect( - buildUrlString(testUrl, {'a': ''}), - equals('$testUrl?a='), - ); + expect(buildUrlString(testUrl, {'a': ''}), equals('$testUrl?a=')); }); test('null value is not skipped', () { @@ -275,11 +258,7 @@ main() { test('multiple keys maintain insertion order', () { final String testUrl = 'https://example.com/path'; expect( - buildUrlString(testUrl, { - 'first': '1', - 'second': '2', - 'third': '3', - }), + buildUrlString(testUrl, {'first': '1', 'second': '2', 'third': '3'}), equals('$testUrl?first=1&second=2&third=3'), ); });