From ce8a7dc9447dc33c523ccbd0a7804bd465f1c807 Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Fri, 15 Dec 2023 04:08:12 +0530 Subject: [PATCH] CheckBox and Filtering --- lib/codegen/kotlin/okhttp.dart | 6 ++- lib/codegen/python/http_client.dart | 6 ++- lib/codegen/python/requests.dart | 6 ++- lib/models/request_model.dart | 31 +++++++++++++- lib/providers/collection_providers.dart | 6 ++- .../request_pane/request_headers.dart | 40 +++++++++++++++--- .../request_pane/request_params.dart | 41 ++++++++++++++++--- lib/services/http_service.dart | 1 + lib/utils/convert_utils.dart | 8 ++++ lib/utils/har_utils.dart | 1 + lib/utils/http_utils.dart | 7 ++-- lib/widgets/checkbox.dart | 41 +++++++++++++++++++ lib/widgets/widgets.dart | 1 + pubspec.lock | 34 +++++++-------- test/utils/http_utils_test.dart | 17 ++++---- 15 files changed, 201 insertions(+), 45 deletions(-) create mode 100644 lib/widgets/checkbox.dart diff --git a/lib/codegen/kotlin/okhttp.dart b/lib/codegen/kotlin/okhttp.dart index 09cd2ce9..e28e7e7f 100644 --- a/lib/codegen/kotlin/okhttp.dart +++ b/lib/codegen/kotlin/okhttp.dart @@ -77,7 +77,11 @@ import okhttp3.MediaType.Companion.toMediaType"""; url = "$defaultUriScheme://$url"; } - var rec = getValidRequestUri(url, requestModel.requestParams); + var rec = getValidRequestUri( + url, + requestModel.requestParams, + requestModel.enabledParams, + ); Uri? uri = rec.$1; if (uri != null) { diff --git a/lib/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index 83d02676..169de25e 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -71,7 +71,11 @@ print(data.decode("utf-8")) } result += kTemplateStart; - var rec = getValidRequestUri(url, requestModel.requestParams); + var rec = getValidRequestUri( + url, + requestModel.requestParams, + requestModel.enabledParams, + ); Uri? uri = rec.$1; if (uri != null) { diff --git a/lib/codegen/python/requests.dart b/lib/codegen/python/requests.dart index af8b3fbe..e2e5f050 100644 --- a/lib/codegen/python/requests.dart +++ b/lib/codegen/python/requests.dart @@ -75,7 +75,11 @@ print('Response Body:', response.text) url = "$defaultUriScheme://$url"; } - var rec = getValidRequestUri(url, requestModel.requestParams); + var rec = getValidRequestUri( + url, + requestModel.requestParams, + requestModel.enabledParams, + ); Uri? uri = rec.$1; if (uri != null) { var templateStartUrl = jj.Template(kTemplateStart); diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index a928dac1..78947792 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -1,3 +1,4 @@ +import 'package:apidash/utils/convert_utils.dart'; import 'package:flutter/foundation.dart'; import 'package:apidash/consts.dart'; import 'package:apidash/utils/utils.dart' show mapToRows, rowsToMap; @@ -15,6 +16,8 @@ class RequestModel { this.requestTabIndex = 0, this.requestHeaders, this.requestParams, + this.enabledHeaders, + this.enabledParams, this.requestBodyContentType = ContentType.json, this.requestBody, this.responseStatus, @@ -30,14 +33,18 @@ class RequestModel { final int requestTabIndex; final List? requestHeaders; final List? requestParams; + final List? enabledHeaders; + final List? enabledParams; final ContentType requestBodyContentType; final String? requestBody; final int? responseStatus; final String? message; final ResponseModel? responseModel; - Map get headersMap => rowsToMap(requestHeaders) ?? {}; - Map get paramsMap => rowsToMap(requestParams) ?? {}; + Map get headersMap => + rowsToMap(getEnabledRows(requestHeaders, enabledHeaders)) ?? {}; + Map get paramsMap => + rowsToMap(getEnabledRows(requestParams, enabledParams)) ?? {}; RequestModel duplicate({ required String id, @@ -50,6 +57,8 @@ class RequestModel { description: description, requestHeaders: requestHeaders != null ? [...requestHeaders!] : null, requestParams: requestParams != null ? [...requestParams!] : null, + enabledHeaders: enabledHeaders != null ? [...enabledHeaders!] : null, + enabledParams: enabledParams != null ? [...enabledParams!] : null, requestBodyContentType: requestBodyContentType, requestBody: requestBody, ); @@ -64,6 +73,8 @@ class RequestModel { int? requestTabIndex, List? requestHeaders, List? requestParams, + List? enabledHeaders, + List? enabledParams, ContentType? requestBodyContentType, String? requestBody, int? responseStatus, @@ -72,6 +83,8 @@ class RequestModel { }) { var headers = requestHeaders ?? this.requestHeaders; var params = requestParams ?? this.requestParams; + var eHeaders = enabledHeaders ?? this.enabledHeaders; + var eParams = enabledParams ?? this.enabledParams; return RequestModel( id: id ?? this.id, method: method ?? this.method, @@ -81,6 +94,8 @@ class RequestModel { requestTabIndex: requestTabIndex ?? this.requestTabIndex, requestHeaders: headers != null ? [...headers] : null, requestParams: params != null ? [...params] : null, + enabledHeaders: eHeaders != null ? [...eHeaders] : null, + enabledParams: eParams != null ? [...eParams] : null, requestBodyContentType: requestBodyContentType ?? this.requestBodyContentType, requestBody: requestBody ?? this.requestBody, @@ -106,6 +121,8 @@ class RequestModel { final description = data["description"] as String?; final requestHeaders = data["requestHeaders"]; final requestParams = data["requestParams"]; + final enabledHeaders = data["enabledHeaders"] as List?; + final enabledParams = data["enabledParams"] as List?; try { requestBodyContentType = ContentType.values.byName(data["requestBodyContentType"] as String); @@ -136,6 +153,8 @@ class RequestModel { requestParams: requestParams != null ? mapToRows(Map.from(requestParams)) : null, + enabledHeaders: enabledHeaders, + enabledParams: enabledParams, requestBodyContentType: requestBodyContentType, requestBody: requestBody, responseStatus: responseStatus, @@ -153,6 +172,8 @@ class RequestModel { "description": description, "requestHeaders": rowsToMap(requestHeaders), "requestParams": rowsToMap(requestParams), + "enabledHeaders": enabledHeaders, + "enabledParams": enabledParams, "requestBodyContentType": requestBodyContentType.name, "requestBody": requestBody, "responseStatus": includeResponse ? responseStatus : null, @@ -171,7 +192,9 @@ class RequestModel { "Request Description: $description", "Request Tab Index: ${requestTabIndex.toString()}", "Request Headers: ${requestHeaders.toString()}", + "Enabled Headers: ${enabledHeaders.toString()}", "Request Params: ${requestParams.toString()}", + "Enabled Params: ${enabledParams.toString()}", "Request Body Content Type: ${requestBodyContentType.toString()}", "Request Body: ${requestBody.toString()}", "Response Status: $responseStatus", @@ -192,6 +215,8 @@ class RequestModel { other.requestTabIndex == requestTabIndex && listEquals(other.requestHeaders, requestHeaders) && listEquals(other.requestParams, requestParams) && + listEquals(other.enabledHeaders, enabledHeaders) && + listEquals(other.enabledParams, enabledParams) && other.requestBodyContentType == requestBodyContentType && other.requestBody == requestBody && other.responseStatus == responseStatus && @@ -211,6 +236,8 @@ class RequestModel { requestTabIndex, requestHeaders, requestParams, + enabledHeaders, + enabledParams, requestBodyContentType, requestBody, responseStatus, diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index e0273a34..8bf8c97f 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -123,6 +123,8 @@ class CollectionStateNotifier int? requestTabIndex, List? requestHeaders, List? requestParams, + List? enabledHeaders, + List? enabledParams, ContentType? requestBodyContentType, String? requestBody, int? responseStatus, @@ -137,12 +139,13 @@ class CollectionStateNotifier requestTabIndex: requestTabIndex, requestHeaders: requestHeaders, requestParams: requestParams, + enabledHeaders: enabledHeaders, + enabledParams: enabledParams, requestBodyContentType: requestBodyContentType, requestBody: requestBody, responseStatus: responseStatus, message: message, responseModel: responseModel); - //print(newModel); var map = {...state!}; map[id] = newModel; state = map; @@ -175,7 +178,6 @@ class CollectionStateNotifier responseModel: responseModel, ); } - //print(newRequestModel); ref.read(sentRequestIdStateProvider.notifier).state = null; var map = {...state!}; map[id] = newRequestModel; diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart index 82138db5..191655fc 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart @@ -16,6 +16,7 @@ class EditRequestHeaders extends ConsumerStatefulWidget { class EditRequestHeadersState extends ConsumerState { late List rows; + late List enabledRows; final random = Random.secure(); late int seed; @@ -26,9 +27,11 @@ class EditRequestHeadersState extends ConsumerState { } void _onFieldChange(String activeId) { - ref - .read(collectionStateNotifierProvider.notifier) - .update(activeId, requestHeaders: rows); + ref.read(collectionStateNotifierProvider.notifier).update( + activeId, + requestHeaders: rows, + enabledHeaders: enabledRows, + ); } @override @@ -42,10 +45,30 @@ class EditRequestHeadersState extends ConsumerState { kNameValueEmptyModel, ] : rH; + enabledRows = ref.read(activeRequestModelProvider)?.enabledHeaders ?? + List.filled(rows.length, true, growable: true); DaviModel model = DaviModel( rows: rows, columns: [ + DaviColumn( + name: 'Checkbox', + width: 36, + cellBuilder: (_, row) { + int idx = row.index; + return CheckBox( + keyId: "$activeId-$idx-headers-c-$seed", + value: enabledRows[idx], + onChanged: (value) { + setState(() { + enabledRows[idx] = value!; + }); + _onFieldChange(activeId!); + }, + colorScheme: Theme.of(context).colorScheme, + ); + }, + ), DaviColumn( name: 'Header Name', grow: 1, @@ -106,9 +129,13 @@ class EditRequestHeadersState extends ConsumerState { rows = [ kNameValueEmptyModel, ]; + enabledRows = [true]; }); } else { - rows.removeAt(row.index); + setState(() { + enabledRows.removeAt(row.index); + rows.removeAt(row.index); + }); } _onFieldChange(activeId!); }, @@ -142,7 +169,10 @@ class EditRequestHeadersState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - rows.add(kNameValueEmptyModel); + setState(() { + rows.add(kNameValueEmptyModel); + enabledRows.add(true); + }); _onFieldChange(activeId!); }, icon: const Icon(Icons.add), diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart index 9a8961c6..6bdf3cac 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart @@ -17,6 +17,7 @@ class EditRequestURLParams extends ConsumerStatefulWidget { class EditRequestURLParamsState extends ConsumerState { late List rows; + late List enabledRows; final random = Random.secure(); late int seed; @@ -27,9 +28,11 @@ class EditRequestURLParamsState extends ConsumerState { } void _onFieldChange(String activeId) { - ref - .read(collectionStateNotifierProvider.notifier) - .update(activeId, requestParams: rows); + ref.read(collectionStateNotifierProvider.notifier).update( + activeId, + requestParams: rows, + enabledParams: enabledRows, + ); } @override @@ -43,10 +46,31 @@ class EditRequestURLParamsState extends ConsumerState { kNameValueEmptyModel, ] : rP; + enabledRows = ref.read(activeRequestModelProvider)?.enabledParams ?? + List.filled(rows.length, true, growable: true); DaviModel model = DaviModel( rows: rows, columns: [ + DaviColumn( + name: 'Checkbox', + width: 36, + cellBuilder: (_, row) { + int idx = row.index; + + return CheckBox( + keyId: "$activeId-$idx-params-c-$seed", + value: enabledRows[idx], + onChanged: (value) { + setState(() { + enabledRows[idx] = value!; + }); + _onFieldChange(activeId!); + }, + colorScheme: Theme.of(context).colorScheme, + ); + }, + ), DaviColumn( name: 'URL Parameter', grow: 1, @@ -107,9 +131,13 @@ class EditRequestURLParamsState extends ConsumerState { rows = [ kNameValueEmptyModel, ]; + enabledRows = [true]; }); } else { - rows.removeAt(row.index); + setState(() { + enabledRows.removeAt(row.index); + rows.removeAt(row.index); + }); } _onFieldChange(activeId!); }, @@ -143,7 +171,10 @@ class EditRequestURLParamsState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - rows.add(kNameValueEmptyModel); + setState(() { + rows.add(kNameValueEmptyModel); + enabledRows.add(true); + }); _onFieldChange(activeId!); }, icon: const Icon(Icons.add), diff --git a/lib/services/http_service.dart b/lib/services/http_service.dart index 8265a299..c02af612 100644 --- a/lib/services/http_service.dart +++ b/lib/services/http_service.dart @@ -13,6 +13,7 @@ Future<(http.Response?, Duration?, String?)> request( (Uri?, String?) uriRec = getValidRequestUri( requestModel.url, requestModel.requestParams, + requestModel.enabledParams, defaultUriScheme: defaultUriScheme, ); if (uriRec.$1 != null) { diff --git a/lib/utils/convert_utils.dart b/lib/utils/convert_utils.dart index e12f2dcc..d3021253 100644 --- a/lib/utils/convert_utils.dart +++ b/lib/utils/convert_utils.dart @@ -109,3 +109,11 @@ Uint8List jsonMapToBytes(Map? map) { return bytes; } } + +List getEnabledRows( + List? rows, List? enabledList) { + if (rows == null || enabledList == null) { + return rows ?? []; + } + return rows.where((element) => enabledList[rows.indexOf(element)]).toList(); +} diff --git a/lib/utils/har_utils.dart b/lib/utils/har_utils.dart index f0838807..15efa7f4 100644 --- a/lib/utils/har_utils.dart +++ b/lib/utils/har_utils.dart @@ -81,6 +81,7 @@ Map requestModelToHARJsonRequest( var rec = getValidRequestUri( requestModel.url, requestModel.requestParams, + requestModel.enabledParams, defaultUriScheme: defaultUriScheme, ); diff --git a/lib/utils/http_utils.dart b/lib/utils/http_utils.dart index 63aa6181..927cdc24 100644 --- a/lib/utils/http_utils.dart +++ b/lib/utils/http_utils.dart @@ -4,7 +4,7 @@ import 'package:collection/collection.dart' show mergeMaps; import 'package:http_parser/http_parser.dart'; import 'package:xml/xml.dart'; import '../models/models.dart'; -import 'convert_utils.dart' show rowsToMap; +import 'convert_utils.dart' show getEnabledRows, rowsToMap; import '../consts.dart'; String getRequestTitleFromUrl(String? url) { @@ -63,7 +63,7 @@ String stripUrlParams(String url) { } (Uri?, String?) getValidRequestUri( - String? url, List? requestParams, + String? url, List? requestParams, List? enabledParams, {String defaultUriScheme = kDefaultUriScheme}) { url = url?.trim(); if (url == null || url == "") { @@ -88,7 +88,8 @@ String stripUrlParams(String url) { uri = uri.removeFragment(); } - Map? queryParams = rowsToMap(requestParams); + Map? queryParams = + rowsToMap(getEnabledRows(requestParams, enabledParams)); if (queryParams != null) { if (uri.hasQuery) { Map urlQueryParams = uri.queryParameters; diff --git a/lib/widgets/checkbox.dart b/lib/widgets/checkbox.dart new file mode 100644 index 00000000..22c3869f --- /dev/null +++ b/lib/widgets/checkbox.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class CheckBox extends StatelessWidget { + final String keyId; + final bool value; + final ValueChanged onChanged; + final ColorScheme? colorScheme; + const CheckBox({ + super.key, + required this.keyId, + required this.value, + required this.onChanged, + this.colorScheme, + }); + + @override + Widget build(BuildContext context) { + var colorScheme = this.colorScheme ?? Theme.of(context).colorScheme; + return Checkbox( + key: Key(keyId), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(3), + ), + side: BorderSide( + color: colorScheme.surfaceVariant, + width: 1.5, + ), + splashRadius: 0, + value: value, + onChanged: onChanged, + checkColor: colorScheme.onPrimary, + fillColor: MaterialStateProperty.resolveWith( + (Set states) { + if (states.contains(MaterialState.selected)) { + return colorScheme.primary; + } + return null; + }, + )); + } +} diff --git a/lib/widgets/widgets.dart b/lib/widgets/widgets.dart index 23929f62..94cf84b5 100644 --- a/lib/widgets/widgets.dart +++ b/lib/widgets/widgets.dart @@ -8,6 +8,7 @@ export 'error_message.dart'; export 'dropdowns.dart'; export 'splitviews.dart'; export 'texts.dart'; +export 'checkbox.dart'; export 'textfields.dart'; export 'headerfield.dart'; export 'menus.dart'; diff --git a/pubspec.lock b/pubspec.lock index 88c0a2a2..5fccd48b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -189,10 +189,10 @@ packages: dependency: "direct main" description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.17.2" convert: dependency: transitive description: @@ -629,10 +629,10 @@ packages: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.9.1" mime: dependency: transitive description: @@ -986,10 +986,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.11.0" state_notifier: dependency: transitive description: @@ -1002,10 +1002,10 @@ packages: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" stream_transform: dependency: transitive description: @@ -1034,26 +1034,26 @@ packages: dependency: "direct dev" description: name: test - sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" url: "https://pub.dev" source: hosted - version: "1.24.9" + version: "1.24.3" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.6.0" test_core: dependency: transitive description: name: test_core - sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" url: "https://pub.dev" source: hosted - version: "0.5.9" + version: "0.5.3" textwrap: dependency: transitive description: @@ -1178,10 +1178,10 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: @@ -1248,5 +1248,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" + dart: ">=3.1.0 <4.0.0" flutter: ">=3.13.0" diff --git a/test/utils/http_utils_test.dart b/test/utils/http_utils_test.dart index 2cc04763..274e925b 100644 --- a/test/utils/http_utils_test.dart +++ b/test/utils/http_utils_test.dart @@ -182,15 +182,16 @@ void main() { host: 'api.foss42.com', path: 'country/data', queryParameters: {'code': 'US'}); - expect(getValidRequestUri(url1, [kvRow1]), (uri1Expected, null)); + expect(getValidRequestUri(url1, [kvRow1], null), (uri1Expected, null)); }); test('Testing getValidRequestUri for null url value', () { const kvRow2 = NameValueModel(name: "code", value: "US"); - expect(getValidRequestUri(null, [kvRow2]), (null, "URL is missing!")); + expect( + getValidRequestUri(null, [kvRow2], null), (null, "URL is missing!")); }); test('Testing getValidRequestUri for empty url value', () { const kvRow3 = NameValueModel(name: "", value: ""); - expect(getValidRequestUri("", [kvRow3]), (null, "URL is missing!")); + expect(getValidRequestUri("", [kvRow3], null), (null, "URL is missing!")); }); test('Testing getValidRequestUri when https is not provided in url', () { String url4 = "api.foss42.com/country/data"; @@ -200,7 +201,7 @@ void main() { host: 'api.foss42.com', path: 'country/data', queryParameters: {'code': 'US'}); - expect(getValidRequestUri(url4, [kvRow4]), (uri4Expected, null)); + expect(getValidRequestUri(url4, [kvRow4], null), (uri4Expected, null)); }); test('Testing getValidRequestUri when url has fragment', () { String url5 = "https://dart.dev/guides/libraries/library-tour#numbers"; @@ -208,11 +209,11 @@ void main() { scheme: 'https', host: 'dart.dev', path: '/guides/libraries/library-tour'); - expect(getValidRequestUri(url5, null), (uri5Expected, null)); + expect(getValidRequestUri(url5, null, null), (uri5Expected, null)); }); test('Testing getValidRequestUri when uri scheme is not supported', () { String url5 = "mailto:someone@example.com"; - expect(getValidRequestUri(url5, null), + expect(getValidRequestUri(url5, null, null), (null, "Unsupported URL Scheme (mailto)")); }); test('Testing getValidRequestUri when query params in both url and kvrow', @@ -224,7 +225,7 @@ void main() { host: 'api.foss42.com', path: 'country/data', queryParameters: {'code': 'US'}); - expect(getValidRequestUri(url6, [kvRow6]), (uri6Expected, null)); + expect(getValidRequestUri(url6, [kvRow6], null), (uri6Expected, null)); }); test('Testing getValidRequestUri when kvrow is null', () { String url7 = "api.foss42.com/country/data?code=US"; @@ -233,7 +234,7 @@ void main() { host: 'api.foss42.com', path: 'country/data', queryParameters: {'code': 'US'}); - expect(getValidRequestUri(url7, null), (uri7Expected, null)); + expect(getValidRequestUri(url7, null, null), (uri7Expected, null)); }); });