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 01/17] 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)); }); }); From 92c610dbf528316a71a3bff8a614843ce4e74c13 Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Fri, 15 Dec 2023 04:21:55 +0530 Subject: [PATCH 02/17] Update request_model_test.dart --- test/models/request_model_test.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/models/request_model_test.dart b/test/models/request_model_test.dart index 1f03e809..3c73b9d4 100644 --- a/test/models/request_model_test.dart +++ b/test/models/request_model_test.dart @@ -106,7 +106,9 @@ void main() { 'content-length': '18', 'content-type': 'application/json; charset=utf-8' }, + 'enabledHeaders': null, 'requestParams': null, + 'enabledParams': null, "requestBodyContentType": 'json', "requestBody": '''{ "text":"WORLD" @@ -140,7 +142,9 @@ void main() { "Request Description: ", "Request Tab Index: 0", "Request Headers: [NameValueModel(name: content-length, value: 18), NameValueModel(name: content-type, value: application/json; charset=utf-8)]", + "Enabled Headers: null", "Request Params: null", + "Enabled Params: null", "Request Body Content Type: ContentType.json", 'Request Body: {\n"text":"WORLD"\n}', "Response Status: null", From 862d6ecc2041a5b64277399b1ddaf3289c5ae02e Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Fri, 15 Dec 2023 04:24:54 +0530 Subject: [PATCH 03/17] Update convert_utils.dart --- lib/utils/convert_utils.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/utils/convert_utils.dart b/lib/utils/convert_utils.dart index d3021253..a7350257 100644 --- a/lib/utils/convert_utils.dart +++ b/lib/utils/convert_utils.dart @@ -110,10 +110,12 @@ Uint8List jsonMapToBytes(Map? map) { } } -List getEnabledRows( +List? getEnabledRows( List? rows, List? enabledList) { if (rows == null || enabledList == null) { - return rows ?? []; + return rows; } - return rows.where((element) => enabledList[rows.indexOf(element)]).toList(); + List finalRows = + rows.where((element) => enabledList[rows.indexOf(element)]).toList(); + return finalRows == [] ? null : finalRows; } From 06f8cd7f0267d1364d2fcbf78eef6bb5a23653cd Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Fri, 22 Dec 2023 20:25:26 +0530 Subject: [PATCH 04/17] fix: review changes --- lib/codegen/dart/http.dart | 4 +- lib/codegen/kotlin/okhttp.dart | 7 +- lib/codegen/python/http_client.dart | 7 +- lib/codegen/python/requests.dart | 7 +- lib/models/request_model.dart | 69 +++++++++++-------- lib/providers/collection_providers.dart | 8 +-- .../request_pane/request_headers.dart | 35 ++++------ .../request_pane/request_params.dart | 31 ++++----- lib/services/http_service.dart | 5 +- lib/utils/convert_utils.dart | 6 +- lib/utils/har_utils.dart | 7 +- lib/utils/http_utils.dart | 7 +- test/models/request_model_test.dart | 4 +- test/utils/http_utils_test.dart | 17 +++-- 14 files changed, 104 insertions(+), 110 deletions(-) diff --git a/lib/codegen/dart/http.dart b/lib/codegen/dart/http.dart index 2c0e016c..9e3d6976 100644 --- a/lib/codegen/dart/http.dart +++ b/lib/codegen/dart/http.dart @@ -111,9 +111,9 @@ void main() async { } } - var headersList = requestModel.requestHeaders; + var headersList = requestModel.enabledRequestHeaders; if (headersList != null || hasBody) { - var headers = requestModel.headersMap; + var headers = requestModel.enabledHeadersMap; if (headers.isNotEmpty || hasBody) { hasHeaders = true; if (hasBody) { diff --git a/lib/codegen/kotlin/okhttp.dart b/lib/codegen/kotlin/okhttp.dart index e28e7e7f..362e31a1 100644 --- a/lib/codegen/kotlin/okhttp.dart +++ b/lib/codegen/kotlin/okhttp.dart @@ -79,8 +79,7 @@ import okhttp3.MediaType.Companion.toMediaType"""; var rec = getValidRequestUri( url, - requestModel.requestParams, - requestModel.enabledParams, + requestModel.enabledRequestParams, ); Uri? uri = rec.$1; @@ -124,9 +123,9 @@ import okhttp3.MediaType.Companion.toMediaType"""; result = stringStart + result; result += kStringRequestStart; - var headersList = requestModel.requestHeaders; + var headersList = requestModel.enabledRequestHeaders; if (headersList != null) { - var headers = requestModel.headersMap; + var headers = requestModel.enabledHeadersMap; if (headers.isNotEmpty) { hasHeaders = true; result += getHeaders(headers); diff --git a/lib/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index 169de25e..9ba66919 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -73,8 +73,7 @@ print(data.decode("utf-8")) result += kTemplateStart; var rec = getValidRequestUri( url, - requestModel.requestParams, - requestModel.enabledParams, + requestModel.enabledRequestParams, ); Uri? uri = rec.$1; @@ -101,9 +100,9 @@ print(data.decode("utf-8")) } } - var headersList = requestModel.requestHeaders; + var headersList = requestModel.enabledRequestHeaders; if (headersList != null || hasBody) { - var headers = requestModel.headersMap; + var headers = requestModel.enabledHeadersMap; if (headers.isNotEmpty || hasBody) { hasHeaders = true; if (hasBody) { diff --git a/lib/codegen/python/requests.dart b/lib/codegen/python/requests.dart index e2e5f050..bb3c53c8 100644 --- a/lib/codegen/python/requests.dart +++ b/lib/codegen/python/requests.dart @@ -77,8 +77,7 @@ print('Response Body:', response.text) var rec = getValidRequestUri( url, - requestModel.requestParams, - requestModel.enabledParams, + requestModel.enabledRequestParams, ); Uri? uri = rec.$1; if (uri != null) { @@ -113,9 +112,9 @@ print('Response Body:', response.text) } } - var headersList = requestModel.requestHeaders; + var headersList = requestModel.enabledRequestHeaders; if (headersList != null || hasBody) { - var headers = requestModel.headersMap; + var headers = requestModel.enabledHeadersMap; if (headers.isNotEmpty || hasBody) { hasHeaders = true; if (hasBody) { diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index 78947792..df49ba1e 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -1,7 +1,7 @@ -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; +import 'package:apidash/utils/utils.dart' + show mapToRows, rowsToMap, getEnabledRows; import 'name_value_model.dart'; import 'response_model.dart'; @@ -16,8 +16,8 @@ class RequestModel { this.requestTabIndex = 0, this.requestHeaders, this.requestParams, - this.enabledHeaders, - this.enabledParams, + this.isHeaderEnabledList, + this.isParamEnabledList, this.requestBodyContentType = ContentType.json, this.requestBody, this.responseStatus, @@ -33,18 +33,25 @@ class RequestModel { final int requestTabIndex; final List? requestHeaders; final List? requestParams; - final List? enabledHeaders; - final List? enabledParams; + final List? isHeaderEnabledList; + final List? isParamEnabledList; final ContentType requestBodyContentType; final String? requestBody; final int? responseStatus; final String? message; final ResponseModel? responseModel; - Map get headersMap => - rowsToMap(getEnabledRows(requestHeaders, enabledHeaders)) ?? {}; - Map get paramsMap => - rowsToMap(getEnabledRows(requestParams, enabledParams)) ?? {}; + List? get enabledRequestHeaders => + getEnabledRows(requestHeaders, isHeaderEnabledList); + List? get enabledRequestParams => + getEnabledRows(requestParams, isParamEnabledList); + + Map get enabledHeadersMap => + rowsToMap(enabledRequestHeaders) ?? {}; + Map get enabledParamsMap => + rowsToMap(enabledRequestParams) ?? {}; + Map get headersMap => rowsToMap(requestHeaders) ?? {}; + Map get paramsMap => rowsToMap(requestParams) ?? {}; RequestModel duplicate({ required String id, @@ -57,8 +64,10 @@ class RequestModel { description: description, requestHeaders: requestHeaders != null ? [...requestHeaders!] : null, requestParams: requestParams != null ? [...requestParams!] : null, - enabledHeaders: enabledHeaders != null ? [...enabledHeaders!] : null, - enabledParams: enabledParams != null ? [...enabledParams!] : null, + isHeaderEnabledList: + isHeaderEnabledList != null ? [...isHeaderEnabledList!] : null, + isParamEnabledList: + isParamEnabledList != null ? [...isParamEnabledList!] : null, requestBodyContentType: requestBodyContentType, requestBody: requestBody, ); @@ -73,8 +82,8 @@ class RequestModel { int? requestTabIndex, List? requestHeaders, List? requestParams, - List? enabledHeaders, - List? enabledParams, + List? isHeaderEnabledList, + List? isParamEnabledList, ContentType? requestBodyContentType, String? requestBody, int? responseStatus, @@ -83,8 +92,8 @@ class RequestModel { }) { var headers = requestHeaders ?? this.requestHeaders; var params = requestParams ?? this.requestParams; - var eHeaders = enabledHeaders ?? this.enabledHeaders; - var eParams = enabledParams ?? this.enabledParams; + var enabledHeaders = isHeaderEnabledList ?? this.isHeaderEnabledList; + var enabledParams = isParamEnabledList ?? this.isParamEnabledList; return RequestModel( id: id ?? this.id, method: method ?? this.method, @@ -94,8 +103,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, + isHeaderEnabledList: enabledHeaders != null ? [...enabledHeaders] : null, + isParamEnabledList: enabledParams != null ? [...enabledParams] : null, requestBodyContentType: requestBodyContentType ?? this.requestBodyContentType, requestBody: requestBody ?? this.requestBody, @@ -121,8 +130,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?; + final isHeaderEnabledList = data["isHeaderEnabledList"] as List?; + final isParamEnabledList = data["isParamEnabledList"] as List?; try { requestBodyContentType = ContentType.values.byName(data["requestBodyContentType"] as String); @@ -153,8 +162,8 @@ class RequestModel { requestParams: requestParams != null ? mapToRows(Map.from(requestParams)) : null, - enabledHeaders: enabledHeaders, - enabledParams: enabledParams, + isHeaderEnabledList: isHeaderEnabledList, + isParamEnabledList: isParamEnabledList, requestBodyContentType: requestBodyContentType, requestBody: requestBody, responseStatus: responseStatus, @@ -172,8 +181,8 @@ class RequestModel { "description": description, "requestHeaders": rowsToMap(requestHeaders), "requestParams": rowsToMap(requestParams), - "enabledHeaders": enabledHeaders, - "enabledParams": enabledParams, + "isHeaderEnabledList": isHeaderEnabledList, + "isParamEnabledList": isParamEnabledList, "requestBodyContentType": requestBodyContentType.name, "requestBody": requestBody, "responseStatus": includeResponse ? responseStatus : null, @@ -192,9 +201,9 @@ class RequestModel { "Request Description: $description", "Request Tab Index: ${requestTabIndex.toString()}", "Request Headers: ${requestHeaders.toString()}", - "Enabled Headers: ${enabledHeaders.toString()}", + "Enabled Headers: ${isHeaderEnabledList.toString()}", "Request Params: ${requestParams.toString()}", - "Enabled Params: ${enabledParams.toString()}", + "Enabled Params: ${isParamEnabledList.toString()}", "Request Body Content Type: ${requestBodyContentType.toString()}", "Request Body: ${requestBody.toString()}", "Response Status: $responseStatus", @@ -215,8 +224,8 @@ class RequestModel { other.requestTabIndex == requestTabIndex && listEquals(other.requestHeaders, requestHeaders) && listEquals(other.requestParams, requestParams) && - listEquals(other.enabledHeaders, enabledHeaders) && - listEquals(other.enabledParams, enabledParams) && + listEquals(other.isHeaderEnabledList, isHeaderEnabledList) && + listEquals(other.isParamEnabledList, isParamEnabledList) && other.requestBodyContentType == requestBodyContentType && other.requestBody == requestBody && other.responseStatus == responseStatus && @@ -236,8 +245,8 @@ class RequestModel { requestTabIndex, requestHeaders, requestParams, - enabledHeaders, - enabledParams, + isHeaderEnabledList, + isParamEnabledList, requestBodyContentType, requestBody, responseStatus, diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 8bf8c97f..8e5b305a 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -123,8 +123,8 @@ class CollectionStateNotifier int? requestTabIndex, List? requestHeaders, List? requestParams, - List? enabledHeaders, - List? enabledParams, + List? isHeaderEnabledList, + List? isParamEnabledList, ContentType? requestBodyContentType, String? requestBody, int? responseStatus, @@ -139,8 +139,8 @@ class CollectionStateNotifier requestTabIndex: requestTabIndex, requestHeaders: requestHeaders, requestParams: requestParams, - enabledHeaders: enabledHeaders, - enabledParams: enabledParams, + isHeaderEnabledList: isHeaderEnabledList, + isParamEnabledList: isParamEnabledList, requestBodyContentType: requestBodyContentType, requestBody: requestBody, responseStatus: responseStatus, 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 191655fc..4517d1d1 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,7 +16,7 @@ class EditRequestHeaders extends ConsumerStatefulWidget { class EditRequestHeadersState extends ConsumerState { late List rows; - late List enabledRows; + late List isRowEnabledList; final random = Random.secure(); late int seed; @@ -30,7 +30,7 @@ class EditRequestHeadersState extends ConsumerState { ref.read(collectionStateNotifierProvider.notifier).update( activeId, requestHeaders: rows, - enabledHeaders: enabledRows, + isHeaderEnabledList: isRowEnabledList, ); } @@ -45,8 +45,9 @@ class EditRequestHeadersState extends ConsumerState { kNameValueEmptyModel, ] : rH; - enabledRows = ref.read(activeRequestModelProvider)?.enabledHeaders ?? - List.filled(rows.length, true, growable: true); + isRowEnabledList = + ref.read(activeRequestModelProvider)?.isHeaderEnabledList ?? + List.filled(rows.length, true, growable: true); DaviModel model = DaviModel( rows: rows, @@ -58,10 +59,10 @@ class EditRequestHeadersState extends ConsumerState { int idx = row.index; return CheckBox( keyId: "$activeId-$idx-headers-c-$seed", - value: enabledRows[idx], + value: isRowEnabledList[idx], onChanged: (value) { setState(() { - enabledRows[idx] = value!; + isRowEnabledList[idx] = value!; }); _onFieldChange(activeId!); }, @@ -125,17 +126,13 @@ class EditRequestHeadersState extends ConsumerState { onTap: () { seed = random.nextInt(kRandMax); if (rows.length == 1) { - setState(() { - rows = [ - kNameValueEmptyModel, - ]; - enabledRows = [true]; - }); + rows = [ + kNameValueEmptyModel, + ]; + isRowEnabledList = [true]; } else { - setState(() { - enabledRows.removeAt(row.index); - rows.removeAt(row.index); - }); + isRowEnabledList.removeAt(row.index); + rows.removeAt(row.index); } _onFieldChange(activeId!); }, @@ -169,10 +166,8 @@ class EditRequestHeadersState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - setState(() { - rows.add(kNameValueEmptyModel); - enabledRows.add(true); - }); + rows.add(kNameValueEmptyModel); + isRowEnabledList.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 6bdf3cac..83603631 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,7 +17,7 @@ class EditRequestURLParams extends ConsumerStatefulWidget { class EditRequestURLParamsState extends ConsumerState { late List rows; - late List enabledRows; + late List isRowEnabledList; final random = Random.secure(); late int seed; @@ -31,7 +31,7 @@ class EditRequestURLParamsState extends ConsumerState { ref.read(collectionStateNotifierProvider.notifier).update( activeId, requestParams: rows, - enabledParams: enabledRows, + isParamEnabledList: isRowEnabledList, ); } @@ -46,8 +46,9 @@ class EditRequestURLParamsState extends ConsumerState { kNameValueEmptyModel, ] : rP; - enabledRows = ref.read(activeRequestModelProvider)?.enabledParams ?? - List.filled(rows.length, true, growable: true); + isRowEnabledList = + ref.read(activeRequestModelProvider)?.isParamEnabledList ?? + List.filled(rows.length, true, growable: true); DaviModel model = DaviModel( rows: rows, @@ -60,10 +61,10 @@ class EditRequestURLParamsState extends ConsumerState { return CheckBox( keyId: "$activeId-$idx-params-c-$seed", - value: enabledRows[idx], + value: isRowEnabledList[idx], onChanged: (value) { setState(() { - enabledRows[idx] = value!; + isRowEnabledList[idx] = value!; }); _onFieldChange(activeId!); }, @@ -127,17 +128,13 @@ class EditRequestURLParamsState extends ConsumerState { onTap: () { seed = random.nextInt(kRandMax); if (rows.length == 1) { - setState(() { - rows = [ - kNameValueEmptyModel, - ]; - enabledRows = [true]; - }); + rows = [ + kNameValueEmptyModel, + ]; + isRowEnabledList = [true]; } else { - setState(() { - enabledRows.removeAt(row.index); - rows.removeAt(row.index); - }); + isRowEnabledList.removeAt(row.index); + rows.removeAt(row.index); } _onFieldChange(activeId!); }, @@ -173,7 +170,7 @@ class EditRequestURLParamsState extends ConsumerState { onPressed: () { setState(() { rows.add(kNameValueEmptyModel); - enabledRows.add(true); + isRowEnabledList.add(true); }); _onFieldChange(activeId!); }, diff --git a/lib/services/http_service.dart b/lib/services/http_service.dart index c02af612..bac77ce6 100644 --- a/lib/services/http_service.dart +++ b/lib/services/http_service.dart @@ -12,13 +12,12 @@ Future<(http.Response?, Duration?, String?)> request( }) async { (Uri?, String?) uriRec = getValidRequestUri( requestModel.url, - requestModel.requestParams, - requestModel.enabledParams, + requestModel.enabledRequestParams, defaultUriScheme: defaultUriScheme, ); if (uriRec.$1 != null) { Uri requestUrl = uriRec.$1!; - Map headers = requestModel.headersMap; + Map headers = requestModel.enabledHeadersMap; http.Response response; String? body; try { diff --git a/lib/utils/convert_utils.dart b/lib/utils/convert_utils.dart index a7350257..94e6c878 100644 --- a/lib/utils/convert_utils.dart +++ b/lib/utils/convert_utils.dart @@ -111,11 +111,11 @@ Uint8List jsonMapToBytes(Map? map) { } List? getEnabledRows( - List? rows, List? enabledList) { - if (rows == null || enabledList == null) { + List? rows, List? isRowEnabledList) { + if (rows == null || isRowEnabledList == null) { return rows; } List finalRows = - rows.where((element) => enabledList[rows.indexOf(element)]).toList(); + rows.where((element) => isRowEnabledList[rows.indexOf(element)]).toList(); return finalRows == [] ? null : finalRows; } diff --git a/lib/utils/har_utils.dart b/lib/utils/har_utils.dart index 15efa7f4..2bf30731 100644 --- a/lib/utils/har_utils.dart +++ b/lib/utils/har_utils.dart @@ -80,8 +80,7 @@ Map requestModelToHARJsonRequest( var rec = getValidRequestUri( requestModel.url, - requestModel.requestParams, - requestModel.enabledParams, + requestModel.enabledRequestParams, defaultUriScheme: defaultUriScheme, ); @@ -126,9 +125,9 @@ Map requestModelToHARJsonRequest( } } - var headersList = requestModel.requestHeaders; + var headersList = requestModel.enabledRequestHeaders; if (headersList != null || hasBody) { - var headers = requestModel.headersMap; + var headers = requestModel.enabledHeadersMap; if (headers.isNotEmpty || hasBody) { if (hasBody) { var m = { diff --git a/lib/utils/http_utils.dart b/lib/utils/http_utils.dart index 927cdc24..63aa6181 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 getEnabledRows, rowsToMap; +import 'convert_utils.dart' show rowsToMap; import '../consts.dart'; String getRequestTitleFromUrl(String? url) { @@ -63,7 +63,7 @@ String stripUrlParams(String url) { } (Uri?, String?) getValidRequestUri( - String? url, List? requestParams, List? enabledParams, + String? url, List? requestParams, {String defaultUriScheme = kDefaultUriScheme}) { url = url?.trim(); if (url == null || url == "") { @@ -88,8 +88,7 @@ String stripUrlParams(String url) { uri = uri.removeFragment(); } - Map? queryParams = - rowsToMap(getEnabledRows(requestParams, enabledParams)); + Map? queryParams = rowsToMap(requestParams); if (queryParams != null) { if (uri.hasQuery) { Map urlQueryParams = uri.queryParameters; diff --git a/test/models/request_model_test.dart b/test/models/request_model_test.dart index 3c73b9d4..b1b56bfd 100644 --- a/test/models/request_model_test.dart +++ b/test/models/request_model_test.dart @@ -106,9 +106,9 @@ void main() { 'content-length': '18', 'content-type': 'application/json; charset=utf-8' }, - 'enabledHeaders': null, + 'isHeaderEnabledList': null, 'requestParams': null, - 'enabledParams': null, + 'isParamEnabledList': null, "requestBodyContentType": 'json', "requestBody": '''{ "text":"WORLD" diff --git a/test/utils/http_utils_test.dart b/test/utils/http_utils_test.dart index 5b10cb63..55129bcc 100644 --- a/test/utils/http_utils_test.dart +++ b/test/utils/http_utils_test.dart @@ -182,16 +182,15 @@ void main() { host: 'api.foss42.com', path: 'country/data', queryParameters: {'code': 'US'}); - expect(getValidRequestUri(url1, [kvRow1], null), (uri1Expected, null)); + expect(getValidRequestUri(url1, [kvRow1]), (uri1Expected, null)); }); test('Testing getValidRequestUri for null url value', () { const kvRow2 = NameValueModel(name: "code", value: "US"); - expect( - getValidRequestUri(null, [kvRow2], null), (null, "URL is missing!")); + expect(getValidRequestUri(null, [kvRow2]), (null, "URL is missing!")); }); test('Testing getValidRequestUri for empty url value', () { const kvRow3 = NameValueModel(name: "", value: ""); - expect(getValidRequestUri("", [kvRow3], null), (null, "URL is missing!")); + expect(getValidRequestUri("", [kvRow3]), (null, "URL is missing!")); }); test('Testing getValidRequestUri when https is not provided in url', () { String url4 = "api.foss42.com/country/data"; @@ -201,7 +200,7 @@ void main() { host: 'api.foss42.com', path: 'country/data', queryParameters: {'code': 'US'}); - expect(getValidRequestUri(url4, [kvRow4], null), (uri4Expected, null)); + expect(getValidRequestUri(url4, [kvRow4]), (uri4Expected, null)); }); test('Testing getValidRequestUri when url has fragment', () { String url5 = "https://dart.dev/guides/libraries/library-tour#numbers"; @@ -209,11 +208,11 @@ void main() { scheme: 'https', host: 'dart.dev', path: '/guides/libraries/library-tour'); - expect(getValidRequestUri(url5, null, null), (uri5Expected, null)); + expect(getValidRequestUri(url5, null), (uri5Expected, null)); }); test('Testing getValidRequestUri when uri scheme is not supported', () { String url5 = "mailto:someone@example.com"; - expect(getValidRequestUri(url5, null, null), + expect(getValidRequestUri(url5, null), (null, "Unsupported URL Scheme (mailto)")); }); test('Testing getValidRequestUri when query params in both url and kvrow', @@ -225,7 +224,7 @@ void main() { host: 'api.foss42.com', path: 'country/data', queryParameters: {'code': 'US'}); - expect(getValidRequestUri(url6, [kvRow6], null), (uri6Expected, null)); + expect(getValidRequestUri(url6, [kvRow6]), (uri6Expected, null)); }); test('Testing getValidRequestUri when kvrow is null', () { String url7 = "api.foss42.com/country/data?code=US"; @@ -234,7 +233,7 @@ void main() { host: 'api.foss42.com', path: 'country/data', queryParameters: {'code': 'US'}); - expect(getValidRequestUri(url7, null, null), (uri7Expected, null)); + expect(getValidRequestUri(url7, null), (uri7Expected, null)); }); }); From 72bc6a6487709a1c82c0777da9f05309513dea2b Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Fri, 22 Dec 2023 20:25:59 +0530 Subject: [PATCH 05/17] chore: add test for getEnabledRows --- test/utils/convert_utils_test.dart | 50 ++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/test/utils/convert_utils_test.dart b/test/utils/convert_utils_test.dart index 26be2c10..713d6242 100644 --- a/test/utils/convert_utils_test.dart +++ b/test/utils/convert_utils_test.dart @@ -127,4 +127,54 @@ Easily manipulate and play around with request inputs like headers, query parame expect(padMultilineString(text1, 10), text1FirstLineNotPaddedExpected); }); }); + + group("Test getEnabledRows", () { + test('Testing for null', () { + expect(getEnabledRows(null, null), null); + }); + test('Testing for empty list', () { + expect(getEnabledRows([], null), []); + }); + test('Testing for empty list', () { + expect(getEnabledRows([], []), []); + }); + test('Testing with isRowEnabledList null', () { + const kvRow1 = NameValueModel(name: "code", value: "IN"); + const kvRow2 = NameValueModel(name: "lang", value: "eng"); + const kvRow3 = NameValueModel(name: "version", value: 0.1); + const kvRow4 = NameValueModel(name: "month", value: 4); + expect(getEnabledRows([kvRow1, kvRow2, kvRow3, kvRow4], null), + [kvRow1, kvRow2, kvRow3, kvRow4]); + }); + test('Testing for list with all enabled', () { + const kvRow1 = NameValueModel(name: "code", value: "IN"); + const kvRow2 = NameValueModel(name: "lang", value: "eng"); + const kvRow3 = NameValueModel(name: "version", value: 0.1); + const kvRow4 = NameValueModel(name: "month", value: 4); + expect( + getEnabledRows( + [kvRow1, kvRow2, kvRow3, kvRow4], [true, true, true, true]), + [kvRow1, kvRow2, kvRow3, kvRow4]); + }); + test('Testing for list with all disabled', () { + const kvRow1 = NameValueModel(name: "code", value: "IN"); + const kvRow2 = NameValueModel(name: "lang", value: "eng"); + const kvRow3 = NameValueModel(name: "version", value: 0.1); + const kvRow4 = NameValueModel(name: "month", value: 4); + expect( + getEnabledRows( + [kvRow1, kvRow2, kvRow3, kvRow4], [false, false, false, false]), + []); + }); + test('Testing for list with some disabled', () { + const kvRow1 = NameValueModel(name: "code", value: "IN"); + const kvRow2 = NameValueModel(name: "lang", value: "eng"); + const kvRow3 = NameValueModel(name: "version", value: 0.1); + const kvRow4 = NameValueModel(name: "month", value: 4); + expect( + getEnabledRows( + [kvRow1, kvRow2, kvRow3, kvRow4], [true, false, true, false]), + [kvRow1, kvRow3]); + }); + }); } From ba007ad0ed85171857657b17468a4d70d9612015 Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Fri, 22 Dec 2023 20:45:59 +0530 Subject: [PATCH 06/17] fix: setState --- .../request_pane/request_headers.dart | 10 +++++----- .../request_pane/request_params.dart | 16 +++++++--------- 2 files changed, 12 insertions(+), 14 deletions(-) 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 4517d1d1..312307ad 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 @@ -126,13 +126,13 @@ class EditRequestHeadersState extends ConsumerState { onTap: () { seed = random.nextInt(kRandMax); if (rows.length == 1) { - rows = [ - kNameValueEmptyModel, - ]; - isRowEnabledList = [true]; + setState(() { + rows = [kNameValueEmptyModel]; + isRowEnabledList = [true]; + }); } else { - isRowEnabledList.removeAt(row.index); rows.removeAt(row.index); + isRowEnabledList.removeAt(row.index); } _onFieldChange(activeId!); }, 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 83603631..e4e0ebb4 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 @@ -128,13 +128,13 @@ class EditRequestURLParamsState extends ConsumerState { onTap: () { seed = random.nextInt(kRandMax); if (rows.length == 1) { - rows = [ - kNameValueEmptyModel, - ]; - isRowEnabledList = [true]; + setState(() { + rows = [kNameValueEmptyModel]; + isRowEnabledList = [true]; + }); } else { - isRowEnabledList.removeAt(row.index); rows.removeAt(row.index); + isRowEnabledList.removeAt(row.index); } _onFieldChange(activeId!); }, @@ -168,10 +168,8 @@ class EditRequestURLParamsState extends ConsumerState { padding: const EdgeInsets.only(bottom: 30), child: ElevatedButton.icon( onPressed: () { - setState(() { - rows.add(kNameValueEmptyModel); - isRowEnabledList.add(true); - }); + rows.add(kNameValueEmptyModel); + isRowEnabledList.add(true); _onFieldChange(activeId!); }, icon: const Icon(Icons.add), From d912d5fcb58090f4fab117c91393426229d4b7c6 Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Sat, 23 Dec 2023 02:10:08 +0530 Subject: [PATCH 07/17] Update convert_utils_test.dart --- test/utils/convert_utils_test.dart | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/test/utils/convert_utils_test.dart b/test/utils/convert_utils_test.dart index 713d6242..53ec1c84 100644 --- a/test/utils/convert_utils_test.dart +++ b/test/utils/convert_utils_test.dart @@ -132,45 +132,30 @@ Easily manipulate and play around with request inputs like headers, query parame test('Testing for null', () { expect(getEnabledRows(null, null), null); }); - test('Testing for empty list', () { - expect(getEnabledRows([], null), []); - }); test('Testing for empty list', () { expect(getEnabledRows([], []), []); }); + const kvRow1 = NameValueModel(name: "code", value: "IN"); + const kvRow2 = NameValueModel(name: "lang", value: "eng"); + const kvRow3 = NameValueModel(name: "version", value: 0.1); + const kvRow4 = NameValueModel(name: "month", value: 4); test('Testing with isRowEnabledList null', () { - const kvRow1 = NameValueModel(name: "code", value: "IN"); - const kvRow2 = NameValueModel(name: "lang", value: "eng"); - const kvRow3 = NameValueModel(name: "version", value: 0.1); - const kvRow4 = NameValueModel(name: "month", value: 4); expect(getEnabledRows([kvRow1, kvRow2, kvRow3, kvRow4], null), [kvRow1, kvRow2, kvRow3, kvRow4]); }); test('Testing for list with all enabled', () { - const kvRow1 = NameValueModel(name: "code", value: "IN"); - const kvRow2 = NameValueModel(name: "lang", value: "eng"); - const kvRow3 = NameValueModel(name: "version", value: 0.1); - const kvRow4 = NameValueModel(name: "month", value: 4); expect( getEnabledRows( [kvRow1, kvRow2, kvRow3, kvRow4], [true, true, true, true]), [kvRow1, kvRow2, kvRow3, kvRow4]); }); test('Testing for list with all disabled', () { - const kvRow1 = NameValueModel(name: "code", value: "IN"); - const kvRow2 = NameValueModel(name: "lang", value: "eng"); - const kvRow3 = NameValueModel(name: "version", value: 0.1); - const kvRow4 = NameValueModel(name: "month", value: 4); expect( getEnabledRows( [kvRow1, kvRow2, kvRow3, kvRow4], [false, false, false, false]), []); }); test('Testing for list with some disabled', () { - const kvRow1 = NameValueModel(name: "code", value: "IN"); - const kvRow2 = NameValueModel(name: "lang", value: "eng"); - const kvRow3 = NameValueModel(name: "version", value: 0.1); - const kvRow4 = NameValueModel(name: "month", value: 4); expect( getEnabledRows( [kvRow1, kvRow2, kvRow3, kvRow4], [true, false, true, false]), From 3fd0a1933c4fe42f166bb3148c5bd203351faf79 Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Wed, 27 Dec 2023 12:16:40 +0530 Subject: [PATCH 08/17] chore: add request_model tests --- lib/codegen/dart/dio.dart | 4 +- lib/codegen/js/axios.dart | 2 +- lib/codegen/js/fetch.dart | 2 +- lib/codegen/others/curl.dart | 2 +- lib/codegen/others/har.dart | 6 +- .../request_pane/request_headers.dart | 4 +- .../request_pane/request_params.dart | 4 +- lib/utils/har_utils.dart | 8 +- lib/utils/header_utils.dart | 1 + test/codegen/curl_codegen_test.dart | 37 ++++++ test/codegen/dart_dio_codegen_test.dart | 115 ++++++++++++++++ test/codegen/dart_http_codegen_test.dart | 117 ++++++++++++++++ test/codegen/har_codegen_test.dart | 83 ++++++++++++ test/codegen/js_axios_codegen_test.dart | 109 +++++++++++++++ test/codegen/js_fetch_codegen_test.dart | 121 +++++++++++++++++ test/codegen/kotlin_okhttp_codegen_test.dart | 113 ++++++++++++++++ test/codegen/nodejs_axios_codegen_test.dart | 117 ++++++++++++++++ test/codegen/nodejs_fetch_codegen_test.dart | 125 ++++++++++++++++++ .../python_http_client_codegen_test.dart | 92 +++++++++++++ .../codegen/python_requests_codegen_test.dart | 80 +++++++++++ test/request_models.dart | 88 ++++++++++++ 21 files changed, 1219 insertions(+), 11 deletions(-) diff --git a/lib/codegen/dart/dio.dart b/lib/codegen/dart/dio.dart index fcaa8314..1c6a42d3 100644 --- a/lib/codegen/dart/dio.dart +++ b/lib/codegen/dart/dio.dart @@ -18,8 +18,8 @@ class DartDioCodeGen { final next = generatedDartCode( url: url, method: requestModel.method, - queryParams: requestModel.paramsMap, - headers: requestModel.headersMap, + queryParams: requestModel.enabledParamsMap, + headers: requestModel.enabledHeadersMap, body: requestModel.requestBody, contentType: requestModel.requestBodyContentType, ); diff --git a/lib/codegen/js/axios.dart b/lib/codegen/js/axios.dart index 21c99c8b..bc338945 100644 --- a/lib/codegen/js/axios.dart +++ b/lib/codegen/js/axios.dart @@ -60,7 +60,7 @@ axios(config) } var rM = requestModel.copyWith(url: url); - var harJson = requestModelToHARJsonRequest(rM); + var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ diff --git a/lib/codegen/js/fetch.dart b/lib/codegen/js/fetch.dart index 2d57d290..bc15b7dd 100644 --- a/lib/codegen/js/fetch.dart +++ b/lib/codegen/js/fetch.dart @@ -61,7 +61,7 @@ fetch(url, options) } var rM = requestModel.copyWith(url: url); - var harJson = requestModelToHARJsonRequest(rM); + var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ diff --git a/lib/codegen/others/curl.dart b/lib/codegen/others/curl.dart index 5405ee1a..673014aa 100644 --- a/lib/codegen/others/curl.dart +++ b/lib/codegen/others/curl.dart @@ -28,7 +28,7 @@ class cURLCodeGen { } var rM = requestModel.copyWith(url: url); - var harJson = requestModelToHARJsonRequest(rM); + var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ diff --git a/lib/codegen/others/har.dart b/lib/codegen/others/har.dart index f540cf76..77d78f58 100644 --- a/lib/codegen/others/har.dart +++ b/lib/codegen/others/har.dart @@ -9,8 +9,10 @@ class HARCodeGen { ) { try { var harString = kEncoder.convert(requestModelToHARJsonRequest( - requestModel, - defaultUriScheme: defaultUriScheme)); + requestModel, + defaultUriScheme: defaultUriScheme, + useEnabled: true, + )); return harString; } catch (e) { return null; 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 312307ad..1637f265 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 @@ -127,7 +127,9 @@ class EditRequestHeadersState extends ConsumerState { seed = random.nextInt(kRandMax); if (rows.length == 1) { setState(() { - rows = [kNameValueEmptyModel]; + rows = [ + kNameValueEmptyModel, + ]; isRowEnabledList = [true]; }); } else { 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 e4e0ebb4..18b17e58 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 @@ -129,7 +129,9 @@ class EditRequestURLParamsState extends ConsumerState { seed = random.nextInt(kRandMax); if (rows.length == 1) { setState(() { - rows = [kNameValueEmptyModel]; + rows = [ + kNameValueEmptyModel, + ]; isRowEnabledList = [true]; }); } else { diff --git a/lib/utils/har_utils.dart b/lib/utils/har_utils.dart index 2bf30731..0ec7714d 100644 --- a/lib/utils/har_utils.dart +++ b/lib/utils/har_utils.dart @@ -74,6 +74,7 @@ Map requestModelToHARJsonRequest( RequestModel requestModel, { defaultUriScheme = kDefaultUriScheme, bool exportMode = false, + bool useEnabled = false, }) { Map json = {}; bool hasBody = false; @@ -125,9 +126,12 @@ Map requestModelToHARJsonRequest( } } - var headersList = requestModel.enabledRequestHeaders; + var headersList = useEnabled + ? requestModel.enabledRequestHeaders + : requestModel.requestHeaders; if (headersList != null || hasBody) { - var headers = requestModel.enabledHeadersMap; + var headers = + useEnabled ? requestModel.enabledHeadersMap : requestModel.headersMap; if (headers.isNotEmpty || hasBody) { if (hasBody) { var m = { diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index 63a456ef..7d0728dd 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -15,6 +15,7 @@ Map headers = { "Indicates the encoding transformations that have been applied to the entity body of the response.", "Content-Security-Policy": "Controls the sources from which content can be loaded on a web page to mitigate various types of attacks.", + "Content-Type": "Indicates the media type of the entity body.", "Cookie": "Used to send previously stored cookies back to the server.", "Cross-Origin-Embedder-Policy": "Controls whether a document is allowed to be embedded in another document.", diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index b67c8fa2..73bc8e85 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -100,6 +100,7 @@ void main() { expect(curlCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""curl --request PUT \ @@ -144,4 +145,40 @@ void main() { expect(curlCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = + r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'"""; + expect(curlCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = + r"""curl --url 'https://api.foss42.com/humanize/social' \ + --header 'User-Agent: Test Agent'"""; + expect( + curlCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = + r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&digits=3' \ + --header 'User-Agent: Test Agent'"""; + expect( + curlCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = + r"""curl --url 'https://api.foss42.com/humanize/social'"""; + expect( + curlCodeGen.getCode(requestModelDisabledRows, "https"), expectedCode); + }); + }); } diff --git a/test/codegen/dart_dio_codegen_test.dart b/test/codegen/dart_dio_codegen_test.dart index 6f1e3149..fba58e8c 100644 --- a/test/codegen/dart_dio_codegen_test.dart +++ b/test/codegen/dart_dio_codegen_test.dart @@ -340,6 +340,7 @@ void main() async { expect(dartDioCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import 'package:dio/dio.dart' as dio; @@ -455,4 +456,118 @@ void main() async { dartDioCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final queryParams = { + 'num': '8700000', + 'add_space': 'true', + }; + final response = await dio.Dio.get( + 'https://api.foss42.com/humanize/social', + queryParameters: queryParams, + ); + print(response.statusCode); + print(response.data); + } on DioException catch (e, s) { + print(e.response?.statusCode); + print(e.response?.data); + print(s); + } catch (e, s) { + print(e); + print(s); + } +} +"""; + expect(dartDioCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final headers = {'User-Agent': 'Test Agent'}; + final response = await dio.Dio.get( + 'https://api.foss42.com/humanize/social', + options: Options(headers: headers), + ); + print(response.statusCode); + print(response.data); + } on DioException catch (e, s) { + print(e.response?.statusCode); + print(e.response?.data); + print(s); + } catch (e, s) { + print(e); + print(s); + } +} +"""; + expect( + dartDioCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final queryParams = { + 'num': '8700000', + 'digits': '3', + }; + final headers = {'User-Agent': 'Test Agent'}; + final response = await dio.Dio.get( + 'https://api.foss42.com/humanize/social', + queryParameters: queryParams, + options: Options(headers: headers), + ); + print(response.statusCode); + print(response.data); + } on DioException catch (e, s) { + print(e.response?.statusCode); + print(e.response?.data); + print(s); + } catch (e, s) { + print(e); + print(s); + } +} +"""; + expect(dartDioCodeGen.getCode(requestModelEnabledRows, "https"), + expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final response = await dio.Dio.get('https://api.foss42.com/humanize/social'); + print(response.statusCode); + print(response.data); + } on DioException catch (e, s) { + print(e.response?.statusCode); + print(e.response?.data); + print(s); + } catch (e, s) { + print(e); + print(s); + } +} +"""; + expect(dartDioCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/codegen/dart_http_codegen_test.dart b/test/codegen/dart_http_codegen_test.dart index b28018c5..faa1f6bf 100644 --- a/test/codegen/dart_http_codegen_test.dart +++ b/test/codegen/dart_http_codegen_test.dart @@ -356,6 +356,7 @@ void main() async { expect(dartHttpCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import 'package:http/http.dart' as http; @@ -481,4 +482,120 @@ void main() async { dartHttpCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.foss42.com/humanize/social'); + + var queryParams = { + 'num': '8700000', + 'add_space': 'true', + }; + uri = uri.replace(queryParameters: queryParams); + + final response = await http.get(uri); + + int statusCode = response.statusCode; + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: ${response.body}'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: ${response.body}'); + } +} +"""; + expect(dartHttpCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.foss42.com/humanize/social'); + + var headers = {'User-Agent': 'Test Agent'}; + + final response = await http.get( + uri, + headers: headers, + ); + + int statusCode = response.statusCode; + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: ${response.body}'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: ${response.body}'); + } +} +"""; + expect( + dartHttpCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.foss42.com/humanize/social'); + + var queryParams = { + 'num': '8700000', + 'digits': '3', + }; + uri = uri.replace(queryParameters: queryParams); + + var headers = {'User-Agent': 'Test Agent'}; + + final response = await http.get( + uri, + headers: headers, + ); + + int statusCode = response.statusCode; + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: ${response.body}'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: ${response.body}'); + } +} +"""; + expect(dartHttpCodeGen.getCode(requestModelEnabledRows, "https"), + expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.foss42.com/humanize/social'); + + final response = await http.get(uri); + + int statusCode = response.statusCode; + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: ${response.body}'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: ${response.body}'); + } +} +"""; + expect(dartHttpCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/codegen/har_codegen_test.dart b/test/codegen/har_codegen_test.dart index cd9be868..e3c89961 100644 --- a/test/codegen/har_codegen_test.dart +++ b/test/codegen/har_codegen_test.dart @@ -240,6 +240,7 @@ void main() { expect(harCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""{ @@ -316,4 +317,86 @@ void main() { expect(harCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""{ + "method": "GET", + "url": "https://api.foss42.com/humanize/social?num=8700000&add_space=true", + "httpVersion": "HTTP/1.1", + "queryString": [ + { + "name": "num", + "value": "8700000" + }, + { + "name": "add_space", + "value": "true" + } + ], + "headers": [] +}"""; + expect( + harCodeGen.getCode(requestModelEnabledParams, "https"), expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""{ + "method": "GET", + "url": "https://api.foss42.com/humanize/social", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "User-Agent", + "value": "Test Agent" + } + ] +}"""; + expect( + harCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""{ + "method": "GET", + "url": "https://api.foss42.com/humanize/social?num=8700000&digits=3", + "httpVersion": "HTTP/1.1", + "queryString": [ + { + "name": "num", + "value": "8700000" + }, + { + "name": "digits", + "value": "3" + } + ], + "headers": [ + { + "name": "User-Agent", + "value": "Test Agent" + } + ] +}"""; + expect( + harCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""{ + "method": "GET", + "url": "https://api.foss42.com/humanize/social", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [] +}"""; + expect( + harCodeGen.getCode(requestModelDisabledRows, "https"), expectedCode); + }); + }); } diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index d809a122..49dce93b 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -324,6 +324,7 @@ axios(config) expect(axiosCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""let config = { @@ -425,4 +426,112 @@ axios(config) expect(axiosCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + params: { + "num": "8700000", + "add_space": "true" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + headers: { + "User-Agent": "Test Agent" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect( + axiosCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + params: { + "num": "8700000", + "digits": "3" + }, + headers: { + "User-Agent": "Test Agent" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect( + axiosCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get' +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index 589f59e7..9153c789 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -366,6 +366,7 @@ fetch(url, options) expect(fetchCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""let url = 'https://reqres.in/api/users/2'; @@ -486,4 +487,124 @@ fetch(url, options) expect(fetchCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = + r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; + +let options = { + method: 'GET' +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = + r"""let url = 'https://api.foss42.com/humanize/social'; + +let options = { + method: 'GET', + headers: { + "User-Agent": "Test Agent" + } +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect( + fetchCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = + r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; + +let options = { + method: 'GET', + headers: { + "User-Agent": "Test Agent" + } +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect( + fetchCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = + r"""let url = 'https://api.foss42.com/humanize/social'; + +let options = { + method: 'GET' +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index f2205a1b..d20177f9 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -369,6 +369,7 @@ fun main() { expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r'''import okhttp3.OkHttpClient @@ -497,4 +498,116 @@ fun main() { expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.HttpUrl.Companion.toHttpUrl + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + .addQueryParameter("num", "8700000") + .addQueryParameter("add_space", "true") + .build() + + val request = Request.Builder() + .url(url) + .get() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect(kotlinOkHttpCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/humanize/social" + + val request = Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect( + kotlinOkHttpCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.HttpUrl.Companion.toHttpUrl + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + .addQueryParameter("num", "8700000") + .addQueryParameter("digits", "3") + .build() + + val request = Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect(kotlinOkHttpCodeGen.getCode(requestModelEnabledRows, "https"), + expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/humanize/social" + + val request = Request.Builder() + .url(url) + .get() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect(kotlinOkHttpCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index 180edb8a..b39d571e 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -350,6 +350,7 @@ axios(config) expect(axiosCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import axios from 'axios'; @@ -459,4 +460,120 @@ axios(config) expect(axiosCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""import axios from 'axios'; + +let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + params: { + "num": "8700000", + "add_space": "true" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""import axios from 'axios'; + +let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + headers: { + "User-Agent": "Test Agent" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect( + axiosCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""import axios from 'axios'; + +let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + params: { + "num": "8700000", + "digits": "3" + }, + headers: { + "User-Agent": "Test Agent" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect( + axiosCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""import axios from 'axios'; + +let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get' +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index 1a82d8a1..d6bfbe29 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -386,6 +386,7 @@ fetch(url, options) expect(fetchCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import fetch from 'node-fetch'; @@ -514,4 +515,128 @@ fetch(url, options) expect(fetchCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""import fetch from 'node-fetch'; + +let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; + +let options = { + method: 'GET' +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""import fetch from 'node-fetch'; + +let url = 'https://api.foss42.com/humanize/social'; + +let options = { + method: 'GET', + headers: { + "User-Agent": "Test Agent" + } +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect( + fetchCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""import fetch from 'node-fetch'; + +let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; + +let options = { + method: 'GET', + headers: { + "User-Agent": "Test Agent" + } +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect( + fetchCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""import fetch from 'node-fetch'; + +let url = 'https://api.foss42.com/humanize/social'; + +let options = { + method: 'GET' +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/codegen/python_http_client_codegen_test.dart b/test/codegen/python_http_client_codegen_test.dart index f95d265d..c97777c7 100644 --- a/test/codegen/python_http_client_codegen_test.dart +++ b/test/codegen/python_http_client_codegen_test.dart @@ -285,6 +285,7 @@ print(data.decode("utf-8")) expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import http.client @@ -383,4 +384,95 @@ print(data.decode("utf-8")) expectedCode); }); }); + + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""import http.client +from urllib.parse import urlencode + +queryParams = { + "num": "8700000", + "add_space": "true" + } +queryParamsStr = '?' + urlencode(queryParams) + +conn = http.client.HTTPSConnection("api.foss42.com") +conn.request("GET", "/humanize/social" + queryParamsStr) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + pythonHttpClientCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""import http.client + +headers = { + "User-Agent": "Test Agent" + } + +conn = http.client.HTTPSConnection("api.foss42.com") +conn.request("GET", "/humanize/social", + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + pythonHttpClientCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""import http.client +from urllib.parse import urlencode + +queryParams = { + "num": "8700000", + "digits": "3" + } +queryParamsStr = '?' + urlencode(queryParams) + +headers = { + "User-Agent": "Test Agent" + } + +conn = http.client.HTTPSConnection("api.foss42.com") +conn.request("GET", "/humanize/social" + queryParamsStr, + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect(pythonHttpClientCodeGen.getCode(requestModelEnabledRows, "https"), + expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""import http.client + +conn = http.client.HTTPSConnection("api.foss42.com") +conn.request("GET", "/humanize/social") + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect(pythonHttpClientCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/codegen/python_requests_codegen_test.dart b/test/codegen/python_requests_codegen_test.dart index 67e1f629..aaeb6c45 100644 --- a/test/codegen/python_requests_codegen_test.dart +++ b/test/codegen/python_requests_codegen_test.dart @@ -248,6 +248,7 @@ print('Response Body:', response.text) expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import requests @@ -324,4 +325,83 @@ print('Response Body:', response.text) expectedCode); }); }); + group('Request with enabled Rows', () { + test('Enabled Params', () { + const expectedCode = r"""import requests + +url = 'https://api.foss42.com/humanize/social' + +params = { + "num": "8700000", + "add_space": "true" + } + +response = requests.get(url, params=params) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelEnabledParams, "https"), + expectedCode); + }); + + test('Enabled Headers', () { + const expectedCode = r"""import requests + +url = 'https://api.foss42.com/humanize/social' + +headers = { + "User-Agent": "Test Agent" + } + +response = requests.get(url, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect( + pythonRequestsCodeGen.getCode( + requestModelEnabledHeaders, + "https", + ), + expectedCode); + }); + + test('Enabled Headers and Params', () { + const expectedCode = r"""import requests + +url = 'https://api.foss42.com/humanize/social' + +params = { + "num": "8700000", + "digits": "3" + } + +headers = { + "User-Agent": "Test Agent" + } + +response = requests.get(url, params=params, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelEnabledRows, "https"), + expectedCode); + }); + + test('Disabled Headders and Params', () { + const expectedCode = r"""import requests + +url = 'https://api.foss42.com/humanize/social' + +response = requests.get(url) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelDisabledRows, "https"), + expectedCode); + }); + }); } diff --git a/test/request_models.dart b/test/request_models.dart index ede411bb..b51acaa3 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -180,3 +180,91 @@ const requestModelDelete2 = RequestModel( }""", requestBodyContentType: ContentType.json, ); + +/// Request model with enabled params +const requestModelEnabledParams = RequestModel( + id: 'enabledParams', + url: 'https://api.foss42.com/humanize/social', + method: HTTPVerb.get, + requestParams: [ + NameValueModel(name: 'num', value: '8700000'), + NameValueModel(name: 'digits', value: '3'), + NameValueModel(name: 'system', value: 'SS'), + NameValueModel(name: 'add_space', value: 'true'), + ], + isParamEnabledList: [ + true, + false, + false, + true, + ], +); + +/// Request model with enabled headers +const requestModelEnabledHeaders = RequestModel( + id: 'enabledParams', + url: 'https://api.foss42.com/humanize/social', + method: HTTPVerb.get, + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Content-Type', value: 'application/json'), + ], + isHeaderEnabledList: [ + true, + false, + ], +); + +/// Request model with enabled rows +const requestModelEnabledRows = RequestModel( + id: 'enabledRows', + url: 'https://api.foss42.com/humanize/social', + method: HTTPVerb.get, + requestParams: [ + NameValueModel(name: 'num', value: '8700000'), + NameValueModel(name: 'digits', value: '3'), + NameValueModel(name: 'system', value: 'SS'), + NameValueModel(name: 'add_space', value: 'true'), + ], + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Content-Type', value: 'application/json'), + ], + isParamEnabledList: [ + true, + true, + false, + false, + ], + isHeaderEnabledList: [ + true, + false, + ], +); + +/// Request model with disabled rows +const requestModelDisabledRows = RequestModel( + id: 'disabledRows', + url: 'https://api.foss42.com/humanize/social', + method: HTTPVerb.get, + requestParams: [ + NameValueModel(name: 'num', value: '8700000'), + NameValueModel(name: 'digits', value: '3'), + NameValueModel(name: 'system', value: 'SS'), + NameValueModel(name: 'add_space', value: 'true'), + ], + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Content-Type', value: 'application/json'), + ], + isParamEnabledList: [ + false, + false, + false, + false, + ], + isHeaderEnabledList: [ + false, + false, + ], +); From f74426f2d5fa1af3b6b56419a38b5ab4f5e5f6cf Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Wed, 27 Dec 2023 21:57:26 +0530 Subject: [PATCH 09/17] fix: renamed and moved tests --- test/codegen/curl_codegen_test.dart | 67 +++-- test/codegen/dart_dio_codegen_test.dart | 223 ++++++++-------- test/codegen/dart_http_codegen_test.dart | 227 ++++++++-------- test/codegen/har_codegen_test.dart | 159 ++++++------ test/codegen/js_axios_codegen_test.dart | 211 ++++++++------- test/codegen/js_fetch_codegen_test.dart | 235 +++++++++-------- test/codegen/kotlin_okhttp_codegen_test.dart | 222 ++++++++-------- test/codegen/nodejs_axios_codegen_test.dart | 227 ++++++++-------- test/codegen/nodejs_fetch_codegen_test.dart | 243 +++++++++--------- .../python_http_client_codegen_test.dart | 179 +++++++------ .../codegen/python_requests_codegen_test.dart | 157 ++++++----- test/request_models.dart | 176 ++++++------- 12 files changed, 1140 insertions(+), 1186 deletions(-) diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index 73bc8e85..e9bb7f60 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -54,6 +54,37 @@ void main() { --header 'User-Agent: Test Agent'"""; expect(curlCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = + r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'"""; + expect(curlCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = + r"""curl --url 'https://api.foss42.com/humanize/social' \ + --header 'User-Agent: Test Agent'"""; + expect( + curlCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = + r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&digits=3' \ + --header 'User-Agent: Test Agent'"""; + expect(curlCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = + r"""curl --url 'https://api.foss42.com/humanize/social'"""; + expect(curlCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); }); group('HEAD Request', () { @@ -145,40 +176,4 @@ void main() { expect(curlCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'"""; - expect(curlCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social' \ - --header 'User-Agent: Test Agent'"""; - expect( - curlCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&digits=3' \ - --header 'User-Agent: Test Agent'"""; - expect( - curlCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social'"""; - expect( - curlCodeGen.getCode(requestModelDisabledRows, "https"), expectedCode); - }); - }); } diff --git a/test/codegen/dart_dio_codegen_test.dart b/test/codegen/dart_dio_codegen_test.dart index fba58e8c..30b371fd 100644 --- a/test/codegen/dart_dio_codegen_test.dart +++ b/test/codegen/dart_dio_codegen_test.dart @@ -208,6 +208,115 @@ void main() async { """; expect(dartDioCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final queryParams = { + 'num': '8700000', + 'add_space': 'true', + }; + final response = await dio.Dio.get( + 'https://api.foss42.com/humanize/social', + queryParameters: queryParams, + ); + print(response.statusCode); + print(response.data); + } on DioException catch (e, s) { + print(e.response?.statusCode); + print(e.response?.data); + print(s); + } catch (e, s) { + print(e); + print(s); + } +} +"""; + expect(dartDioCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final headers = {'User-Agent': 'Test Agent'}; + final response = await dio.Dio.get( + 'https://api.foss42.com/humanize/social', + options: Options(headers: headers), + ); + print(response.statusCode); + print(response.data); + } on DioException catch (e, s) { + print(e.response?.statusCode); + print(e.response?.data); + print(s); + } catch (e, s) { + print(e); + print(s); + } +} +"""; + expect( + dartDioCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final queryParams = { + 'num': '8700000', + 'digits': '3', + }; + final headers = {'User-Agent': 'Test Agent'}; + final response = await dio.Dio.get( + 'https://api.foss42.com/humanize/social', + queryParameters: queryParams, + options: Options(headers: headers), + ); + print(response.statusCode); + print(response.data); + } on DioException catch (e, s) { + print(e.response?.statusCode); + print(e.response?.data); + print(s); + } catch (e, s) { + print(e); + print(s); + } +} +"""; + expect(dartDioCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final response = await dio.Dio.get('https://api.foss42.com/humanize/social'); + print(response.statusCode); + print(response.data); + } on DioException catch (e, s) { + print(e.response?.statusCode); + print(e.response?.data); + print(s); + } catch (e, s) { + print(e); + print(s); + } +} +"""; + expect(dartDioCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); }); group('HEAD Request', () { @@ -456,118 +565,4 @@ void main() async { dartDioCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""import 'package:dio/dio.dart' as dio; - -void main() async { - try { - final queryParams = { - 'num': '8700000', - 'add_space': 'true', - }; - final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', - queryParameters: queryParams, - ); - print(response.statusCode); - print(response.data); - } on DioException catch (e, s) { - print(e.response?.statusCode); - print(e.response?.data); - print(s); - } catch (e, s) { - print(e); - print(s); - } -} -"""; - expect(dartDioCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""import 'package:dio/dio.dart' as dio; - -void main() async { - try { - final headers = {'User-Agent': 'Test Agent'}; - final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', - options: Options(headers: headers), - ); - print(response.statusCode); - print(response.data); - } on DioException catch (e, s) { - print(e.response?.statusCode); - print(e.response?.data); - print(s); - } catch (e, s) { - print(e); - print(s); - } -} -"""; - expect( - dartDioCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""import 'package:dio/dio.dart' as dio; - -void main() async { - try { - final queryParams = { - 'num': '8700000', - 'digits': '3', - }; - final headers = {'User-Agent': 'Test Agent'}; - final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', - queryParameters: queryParams, - options: Options(headers: headers), - ); - print(response.statusCode); - print(response.data); - } on DioException catch (e, s) { - print(e.response?.statusCode); - print(e.response?.data); - print(s); - } catch (e, s) { - print(e); - print(s); - } -} -"""; - expect(dartDioCodeGen.getCode(requestModelEnabledRows, "https"), - expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""import 'package:dio/dio.dart' as dio; - -void main() async { - try { - final response = await dio.Dio.get('https://api.foss42.com/humanize/social'); - print(response.statusCode); - print(response.data); - } on DioException catch (e, s) { - print(e.response?.statusCode); - print(e.response?.data); - print(s); - } catch (e, s) { - print(e); - print(s); - } -} -"""; - expect(dartDioCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/codegen/dart_http_codegen_test.dart b/test/codegen/dart_http_codegen_test.dart index faa1f6bf..55ab070a 100644 --- a/test/codegen/dart_http_codegen_test.dart +++ b/test/codegen/dart_http_codegen_test.dart @@ -213,6 +213,117 @@ void main() async { """; expect(dartHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.foss42.com/humanize/social'); + + var queryParams = { + 'num': '8700000', + 'add_space': 'true', + }; + uri = uri.replace(queryParameters: queryParams); + + final response = await http.get(uri); + + int statusCode = response.statusCode; + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: ${response.body}'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: ${response.body}'); + } +} +"""; + expect(dartHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.foss42.com/humanize/social'); + + var headers = {'User-Agent': 'Test Agent'}; + + final response = await http.get( + uri, + headers: headers, + ); + + int statusCode = response.statusCode; + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: ${response.body}'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: ${response.body}'); + } +} +"""; + expect( + dartHttpCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.foss42.com/humanize/social'); + + var queryParams = { + 'num': '8700000', + 'digits': '3', + }; + uri = uri.replace(queryParameters: queryParams); + + var headers = {'User-Agent': 'Test Agent'}; + + final response = await http.get( + uri, + headers: headers, + ); + + int statusCode = response.statusCode; + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: ${response.body}'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: ${response.body}'); + } +} +"""; + expect(dartHttpCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.foss42.com/humanize/social'); + + final response = await http.get(uri); + + int statusCode = response.statusCode; + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: ${response.body}'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: ${response.body}'); + } +} +"""; + expect(dartHttpCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); }); group('HEAD Request', () { @@ -482,120 +593,4 @@ void main() async { dartHttpCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""import 'package:http/http.dart' as http; - -void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); - - var queryParams = { - 'num': '8700000', - 'add_space': 'true', - }; - uri = uri.replace(queryParameters: queryParams); - - final response = await http.get(uri); - - int statusCode = response.statusCode; - if (statusCode >= 200 && statusCode < 300) { - print('Status Code: $statusCode'); - print('Response Body: ${response.body}'); - } else { - print('Error Status Code: $statusCode'); - print('Error Response Body: ${response.body}'); - } -} -"""; - expect(dartHttpCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""import 'package:http/http.dart' as http; - -void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); - - var headers = {'User-Agent': 'Test Agent'}; - - final response = await http.get( - uri, - headers: headers, - ); - - int statusCode = response.statusCode; - if (statusCode >= 200 && statusCode < 300) { - print('Status Code: $statusCode'); - print('Response Body: ${response.body}'); - } else { - print('Error Status Code: $statusCode'); - print('Error Response Body: ${response.body}'); - } -} -"""; - expect( - dartHttpCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""import 'package:http/http.dart' as http; - -void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); - - var queryParams = { - 'num': '8700000', - 'digits': '3', - }; - uri = uri.replace(queryParameters: queryParams); - - var headers = {'User-Agent': 'Test Agent'}; - - final response = await http.get( - uri, - headers: headers, - ); - - int statusCode = response.statusCode; - if (statusCode >= 200 && statusCode < 300) { - print('Status Code: $statusCode'); - print('Response Body: ${response.body}'); - } else { - print('Error Status Code: $statusCode'); - print('Error Response Body: ${response.body}'); - } -} -"""; - expect(dartHttpCodeGen.getCode(requestModelEnabledRows, "https"), - expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""import 'package:http/http.dart' as http; - -void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); - - final response = await http.get(uri); - - int statusCode = response.statusCode; - if (statusCode >= 200 && statusCode < 300) { - print('Status Code: $statusCode'); - print('Response Body: ${response.body}'); - } else { - print('Error Status Code: $statusCode'); - print('Error Response Body: ${response.body}'); - } -} -"""; - expect(dartHttpCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/codegen/har_codegen_test.dart b/test/codegen/har_codegen_test.dart index e3c89961..8e6b7bb0 100644 --- a/test/codegen/har_codegen_test.dart +++ b/test/codegen/har_codegen_test.dart @@ -149,6 +149,83 @@ void main() { }"""; expect(harCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""{ + "method": "GET", + "url": "https://api.foss42.com/humanize/social?num=8700000&add_space=true", + "httpVersion": "HTTP/1.1", + "queryString": [ + { + "name": "num", + "value": "8700000" + }, + { + "name": "add_space", + "value": "true" + } + ], + "headers": [] +}"""; + expect(harCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""{ + "method": "GET", + "url": "https://api.foss42.com/humanize/social", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "User-Agent", + "value": "Test Agent" + } + ] +}"""; + expect( + harCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""{ + "method": "GET", + "url": "https://api.foss42.com/humanize/social?num=8700000&digits=3", + "httpVersion": "HTTP/1.1", + "queryString": [ + { + "name": "num", + "value": "8700000" + }, + { + "name": "digits", + "value": "3" + } + ], + "headers": [ + { + "name": "User-Agent", + "value": "Test Agent" + } + ] +}"""; + expect(harCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""{ + "method": "GET", + "url": "https://api.foss42.com/humanize/social", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [] +}"""; + expect(harCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); }); group('HEAD Request', () { @@ -317,86 +394,4 @@ void main() { expect(harCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""{ - "method": "GET", - "url": "https://api.foss42.com/humanize/social?num=8700000&add_space=true", - "httpVersion": "HTTP/1.1", - "queryString": [ - { - "name": "num", - "value": "8700000" - }, - { - "name": "add_space", - "value": "true" - } - ], - "headers": [] -}"""; - expect( - harCodeGen.getCode(requestModelEnabledParams, "https"), expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""{ - "method": "GET", - "url": "https://api.foss42.com/humanize/social", - "httpVersion": "HTTP/1.1", - "queryString": [], - "headers": [ - { - "name": "User-Agent", - "value": "Test Agent" - } - ] -}"""; - expect( - harCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""{ - "method": "GET", - "url": "https://api.foss42.com/humanize/social?num=8700000&digits=3", - "httpVersion": "HTTP/1.1", - "queryString": [ - { - "name": "num", - "value": "8700000" - }, - { - "name": "digits", - "value": "3" - } - ], - "headers": [ - { - "name": "User-Agent", - "value": "Test Agent" - } - ] -}"""; - expect( - harCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""{ - "method": "GET", - "url": "https://api.foss42.com/humanize/social", - "httpVersion": "HTTP/1.1", - "queryString": [], - "headers": [] -}"""; - expect( - harCodeGen.getCode(requestModelDisabledRows, "https"), expectedCode); - }); - }); } diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index 49dce93b..9498da1c 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -201,6 +201,109 @@ axios(config) """; expect(axiosCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + params: { + "num": "8700000", + "add_space": "true" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + headers: { + "User-Agent": "Test Agent" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect( + axiosCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + params: { + "num": "8700000", + "digits": "3" + }, + headers: { + "User-Agent": "Test Agent" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get' +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); }); group('HEAD Request', () { @@ -426,112 +529,4 @@ axios(config) expect(axiosCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', - method: 'get', - params: { - "num": "8700000", - "add_space": "true" - } -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect(axiosCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', - method: 'get', - headers: { - "User-Agent": "Test Agent" - } -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect( - axiosCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', - method: 'get', - params: { - "num": "8700000", - "digits": "3" - }, - headers: { - "User-Agent": "Test Agent" - } -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect( - axiosCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', - method: 'get' -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect(axiosCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index 9153c789..43d053f9 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -220,6 +220,121 @@ fetch(url, options) """; expect(fetchCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = + r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; + +let options = { + method: 'GET' +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = + r"""let url = 'https://api.foss42.com/humanize/social'; + +let options = { + method: 'GET', + headers: { + "User-Agent": "Test Agent" + } +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect( + fetchCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = + r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; + +let options = { + method: 'GET', + headers: { + "User-Agent": "Test Agent" + } +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = + r"""let url = 'https://api.foss42.com/humanize/social'; + +let options = { + method: 'GET' +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); }); group('HEAD Request', () { @@ -487,124 +602,4 @@ fetch(url, options) expect(fetchCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; - -let options = { - method: 'GET' -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect(fetchCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social'; - -let options = { - method: 'GET', - headers: { - "User-Agent": "Test Agent" - } -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect( - fetchCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; - -let options = { - method: 'GET', - headers: { - "User-Agent": "Test Agent" - } -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect( - fetchCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social'; - -let options = { - method: 'GET' -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect(fetchCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index d20177f9..4f3220fa 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -219,6 +219,116 @@ fun main() { expect( kotlinOkHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.HttpUrl.Companion.toHttpUrl + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + .addQueryParameter("num", "8700000") + .addQueryParameter("add_space", "true") + .build() + + val request = Request.Builder() + .url(url) + .get() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect( + kotlinOkHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/humanize/social" + + val request = Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect( + kotlinOkHttpCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.HttpUrl.Companion.toHttpUrl + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + .addQueryParameter("num", "8700000") + .addQueryParameter("digits", "3") + .build() + + val request = Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect(kotlinOkHttpCodeGen.getCode(requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/humanize/social" + + val request = Request.Builder() + .url(url) + .get() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect(kotlinOkHttpCodeGen.getCode(requestModelGet12, "https"), + expectedCode); + }); }); group('HEAD Request', () { @@ -498,116 +608,4 @@ fun main() { expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.HttpUrl.Companion.toHttpUrl - -fun main() { - val client = OkHttpClient() - - val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() - .addQueryParameter("num", "8700000") - .addQueryParameter("add_space", "true") - .build() - - val request = Request.Builder() - .url(url) - .get() - .build() - - val response = client.newCall(request).execute() - - println(response.code) - println(response.body?.string()) -} -"""; - expect(kotlinOkHttpCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""import okhttp3.OkHttpClient -import okhttp3.Request - -fun main() { - val client = OkHttpClient() - - val url = "https://api.foss42.com/humanize/social" - - val request = Request.Builder() - .url(url) - .addHeader("User-Agent", "Test Agent") - .get() - .build() - - val response = client.newCall(request).execute() - - println(response.code) - println(response.body?.string()) -} -"""; - expect( - kotlinOkHttpCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.HttpUrl.Companion.toHttpUrl - -fun main() { - val client = OkHttpClient() - - val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() - .addQueryParameter("num", "8700000") - .addQueryParameter("digits", "3") - .build() - - val request = Request.Builder() - .url(url) - .addHeader("User-Agent", "Test Agent") - .get() - .build() - - val response = client.newCall(request).execute() - - println(response.code) - println(response.body?.string()) -} -"""; - expect(kotlinOkHttpCodeGen.getCode(requestModelEnabledRows, "https"), - expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""import okhttp3.OkHttpClient -import okhttp3.Request - -fun main() { - val client = OkHttpClient() - - val url = "https://api.foss42.com/humanize/social" - - val request = Request.Builder() - .url(url) - .get() - .build() - - val response = client.newCall(request).execute() - - println(response.code) - println(response.body?.string()) -} -"""; - expect(kotlinOkHttpCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index b39d571e..519f5ab5 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -217,6 +217,117 @@ axios(config) """; expect(axiosCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""import axios from 'axios'; + +let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + params: { + "num": "8700000", + "add_space": "true" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import axios from 'axios'; + +let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + headers: { + "User-Agent": "Test Agent" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect( + axiosCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""import axios from 'axios'; + +let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get', + params: { + "num": "8700000", + "digits": "3" + }, + headers: { + "User-Agent": "Test Agent" + } +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""import axios from 'axios'; + +let config = { + url: 'https://api.foss42.com/humanize/social', + method: 'get' +}; + +axios(config) + .then(function (response) { + // handle success + console.log(response.status); + console.log(response.data); + }) + .catch(function (error) { + // handle error + console.log(error.response.status); + console.log(error); + }); +"""; + expect(axiosCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); }); group('HEAD Request', () { @@ -460,120 +571,4 @@ axios(config) expect(axiosCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""import axios from 'axios'; - -let config = { - url: 'https://api.foss42.com/humanize/social', - method: 'get', - params: { - "num": "8700000", - "add_space": "true" - } -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect(axiosCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""import axios from 'axios'; - -let config = { - url: 'https://api.foss42.com/humanize/social', - method: 'get', - headers: { - "User-Agent": "Test Agent" - } -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect( - axiosCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""import axios from 'axios'; - -let config = { - url: 'https://api.foss42.com/humanize/social', - method: 'get', - params: { - "num": "8700000", - "digits": "3" - }, - headers: { - "User-Agent": "Test Agent" - } -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect( - axiosCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""import axios from 'axios'; - -let config = { - url: 'https://api.foss42.com/humanize/social', - method: 'get' -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect(axiosCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index d6bfbe29..c06ceee5 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -230,6 +230,125 @@ fetch(url, options) """; expect(fetchCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""import fetch from 'node-fetch'; + +let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; + +let options = { + method: 'GET' +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import fetch from 'node-fetch'; + +let url = 'https://api.foss42.com/humanize/social'; + +let options = { + method: 'GET', + headers: { + "User-Agent": "Test Agent" + } +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect( + fetchCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""import fetch from 'node-fetch'; + +let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; + +let options = { + method: 'GET', + headers: { + "User-Agent": "Test Agent" + } +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""import fetch from 'node-fetch'; + +let url = 'https://api.foss42.com/humanize/social'; + +let options = { + method: 'GET' +}; + +let status; +fetch(url, options) + .then(res => { + status = res.status; + return res.json() + }) + .then(body => { + console.log(status); + console.log(body); + }) + .catch(err => { + console.log(status); + console.error('error:' + err); + }); +"""; + expect(fetchCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); }); group('HEAD Request', () { @@ -515,128 +634,4 @@ fetch(url, options) expect(fetchCodeGen.getCode(requestModelDelete2, "https"), expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""import fetch from 'node-fetch'; - -let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; - -let options = { - method: 'GET' -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect(fetchCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""import fetch from 'node-fetch'; - -let url = 'https://api.foss42.com/humanize/social'; - -let options = { - method: 'GET', - headers: { - "User-Agent": "Test Agent" - } -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect( - fetchCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""import fetch from 'node-fetch'; - -let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; - -let options = { - method: 'GET', - headers: { - "User-Agent": "Test Agent" - } -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect( - fetchCodeGen.getCode(requestModelEnabledRows, "https"), expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""import fetch from 'node-fetch'; - -let url = 'https://api.foss42.com/humanize/social'; - -let options = { - method: 'GET' -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect(fetchCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/codegen/python_http_client_codegen_test.dart b/test/codegen/python_http_client_codegen_test.dart index c97777c7..c617305c 100644 --- a/test/codegen/python_http_client_codegen_test.dart +++ b/test/codegen/python_http_client_codegen_test.dart @@ -174,6 +174,94 @@ print(data.decode("utf-8")) expect(pythonHttpClientCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""import http.client +from urllib.parse import urlencode + +queryParams = { + "num": "8700000", + "add_space": "true" + } +queryParamsStr = '?' + urlencode(queryParams) + +conn = http.client.HTTPSConnection("api.foss42.com") +conn.request("GET", "/humanize/social" + queryParamsStr) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect(pythonHttpClientCodeGen.getCode(requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import http.client + +headers = { + "User-Agent": "Test Agent" + } + +conn = http.client.HTTPSConnection("api.foss42.com") +conn.request("GET", "/humanize/social", + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + pythonHttpClientCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""import http.client +from urllib.parse import urlencode + +queryParams = { + "num": "8700000", + "digits": "3" + } +queryParamsStr = '?' + urlencode(queryParams) + +headers = { + "User-Agent": "Test Agent" + } + +conn = http.client.HTTPSConnection("api.foss42.com") +conn.request("GET", "/humanize/social" + queryParamsStr, + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect(pythonHttpClientCodeGen.getCode(requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""import http.client + +conn = http.client.HTTPSConnection("api.foss42.com") +conn.request("GET", "/humanize/social") + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect(pythonHttpClientCodeGen.getCode(requestModelGet12, "https"), + expectedCode); + }); }); group('HEAD Request', () { @@ -384,95 +472,4 @@ print(data.decode("utf-8")) expectedCode); }); }); - - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""import http.client -from urllib.parse import urlencode - -queryParams = { - "num": "8700000", - "add_space": "true" - } -queryParamsStr = '?' + urlencode(queryParams) - -conn = http.client.HTTPSConnection("api.foss42.com") -conn.request("GET", "/humanize/social" + queryParamsStr) - -res = conn.getresponse() -data = res.read() - -print(data.decode("utf-8")) -"""; - expect( - pythonHttpClientCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""import http.client - -headers = { - "User-Agent": "Test Agent" - } - -conn = http.client.HTTPSConnection("api.foss42.com") -conn.request("GET", "/humanize/social", - headers= headers) - -res = conn.getresponse() -data = res.read() - -print(data.decode("utf-8")) -"""; - expect( - pythonHttpClientCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""import http.client -from urllib.parse import urlencode - -queryParams = { - "num": "8700000", - "digits": "3" - } -queryParamsStr = '?' + urlencode(queryParams) - -headers = { - "User-Agent": "Test Agent" - } - -conn = http.client.HTTPSConnection("api.foss42.com") -conn.request("GET", "/humanize/social" + queryParamsStr, - headers= headers) - -res = conn.getresponse() -data = res.read() - -print(data.decode("utf-8")) -"""; - expect(pythonHttpClientCodeGen.getCode(requestModelEnabledRows, "https"), - expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""import http.client - -conn = http.client.HTTPSConnection("api.foss42.com") -conn.request("GET", "/humanize/social") - -res = conn.getresponse() -data = res.read() - -print(data.decode("utf-8")) -"""; - expect(pythonHttpClientCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/codegen/python_requests_codegen_test.dart b/test/codegen/python_requests_codegen_test.dart index aaeb6c45..1387accf 100644 --- a/test/codegen/python_requests_codegen_test.dart +++ b/test/codegen/python_requests_codegen_test.dart @@ -153,6 +153,84 @@ print('Response Body:', response.text) expect(pythonRequestsCodeGen.getCode(requestModelGet8, "https"), expectedCode); }); + + test('GET 9', () { + const expectedCode = r"""import requests + +url = 'https://api.foss42.com/humanize/social' + +params = { + "num": "8700000", + "add_space": "true" + } + +response = requests.get(url, params=params) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import requests + +url = 'https://api.foss42.com/humanize/social' + +headers = { + "User-Agent": "Test Agent" + } + +response = requests.get(url, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect( + pythonRequestsCodeGen.getCode( + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""import requests + +url = 'https://api.foss42.com/humanize/social' + +params = { + "num": "8700000", + "digits": "3" + } + +headers = { + "User-Agent": "Test Agent" + } + +response = requests.get(url, params=params, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""import requests + +url = 'https://api.foss42.com/humanize/social' + +response = requests.get(url) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelGet12, "https"), + expectedCode); + }); }); group('HEAD Request', () { @@ -325,83 +403,4 @@ print('Response Body:', response.text) expectedCode); }); }); - group('Request with enabled Rows', () { - test('Enabled Params', () { - const expectedCode = r"""import requests - -url = 'https://api.foss42.com/humanize/social' - -params = { - "num": "8700000", - "add_space": "true" - } - -response = requests.get(url, params=params) - -print('Status Code:', response.status_code) -print('Response Body:', response.text) -"""; - expect(pythonRequestsCodeGen.getCode(requestModelEnabledParams, "https"), - expectedCode); - }); - - test('Enabled Headers', () { - const expectedCode = r"""import requests - -url = 'https://api.foss42.com/humanize/social' - -headers = { - "User-Agent": "Test Agent" - } - -response = requests.get(url, headers=headers) - -print('Status Code:', response.status_code) -print('Response Body:', response.text) -"""; - expect( - pythonRequestsCodeGen.getCode( - requestModelEnabledHeaders, - "https", - ), - expectedCode); - }); - - test('Enabled Headers and Params', () { - const expectedCode = r"""import requests - -url = 'https://api.foss42.com/humanize/social' - -params = { - "num": "8700000", - "digits": "3" - } - -headers = { - "User-Agent": "Test Agent" - } - -response = requests.get(url, params=params, headers=headers) - -print('Status Code:', response.status_code) -print('Response Body:', response.text) -"""; - expect(pythonRequestsCodeGen.getCode(requestModelEnabledRows, "https"), - expectedCode); - }); - - test('Disabled Headders and Params', () { - const expectedCode = r"""import requests - -url = 'https://api.foss42.com/humanize/social' - -response = requests.get(url) - -print('Status Code:', response.status_code) -print('Response Body:', response.text) -"""; - expect(pythonRequestsCodeGen.getCode(requestModelDisabledRows, "https"), - expectedCode); - }); - }); } diff --git a/test/request_models.dart b/test/request_models.dart index b51acaa3..adf7e0e8 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -90,6 +90,94 @@ const requestModelGet8 = RequestModel( ], ); +/// GET request model with some params enabled +const requestModelGet9 = RequestModel( + id: 'enabledParams', + url: 'https://api.foss42.com/humanize/social', + method: HTTPVerb.get, + requestParams: [ + NameValueModel(name: 'num', value: '8700000'), + NameValueModel(name: 'digits', value: '3'), + NameValueModel(name: 'system', value: 'SS'), + NameValueModel(name: 'add_space', value: 'true'), + ], + isParamEnabledList: [ + true, + false, + false, + true, + ], +); + +/// GET Request model with some headers enabled +const requestModelGet10 = RequestModel( + id: 'enabledParams', + url: 'https://api.foss42.com/humanize/social', + method: HTTPVerb.get, + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Content-Type', value: 'application/json'), + ], + isHeaderEnabledList: [ + true, + false, + ], +); + +/// GET Request model with some headers & URL parameters enabled +const requestModelGet11 = RequestModel( + id: 'enabledRows', + url: 'https://api.foss42.com/humanize/social', + method: HTTPVerb.get, + requestParams: [ + NameValueModel(name: 'num', value: '8700000'), + NameValueModel(name: 'digits', value: '3'), + NameValueModel(name: 'system', value: 'SS'), + NameValueModel(name: 'add_space', value: 'true'), + ], + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Content-Type', value: 'application/json'), + ], + isParamEnabledList: [ + true, + true, + false, + false, + ], + isHeaderEnabledList: [ + true, + false, + ], +); + +/// Request model with all headers & URL parameters disabled +const requestModelGet12 = RequestModel( + id: 'disabledRows', + url: 'https://api.foss42.com/humanize/social', + method: HTTPVerb.get, + requestParams: [ + NameValueModel(name: 'num', value: '8700000'), + NameValueModel(name: 'digits', value: '3'), + NameValueModel(name: 'system', value: 'SS'), + NameValueModel(name: 'add_space', value: 'true'), + ], + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Content-Type', value: 'application/json'), + ], + isParamEnabledList: [ + false, + false, + false, + false, + ], + isHeaderEnabledList: [ + false, + false, + ], +); + /// Basic HEAD request model const requestModelHead1 = RequestModel( id: 'head1', @@ -180,91 +268,3 @@ const requestModelDelete2 = RequestModel( }""", requestBodyContentType: ContentType.json, ); - -/// Request model with enabled params -const requestModelEnabledParams = RequestModel( - id: 'enabledParams', - url: 'https://api.foss42.com/humanize/social', - method: HTTPVerb.get, - requestParams: [ - NameValueModel(name: 'num', value: '8700000'), - NameValueModel(name: 'digits', value: '3'), - NameValueModel(name: 'system', value: 'SS'), - NameValueModel(name: 'add_space', value: 'true'), - ], - isParamEnabledList: [ - true, - false, - false, - true, - ], -); - -/// Request model with enabled headers -const requestModelEnabledHeaders = RequestModel( - id: 'enabledParams', - url: 'https://api.foss42.com/humanize/social', - method: HTTPVerb.get, - requestHeaders: [ - NameValueModel(name: 'User-Agent', value: 'Test Agent'), - NameValueModel(name: 'Content-Type', value: 'application/json'), - ], - isHeaderEnabledList: [ - true, - false, - ], -); - -/// Request model with enabled rows -const requestModelEnabledRows = RequestModel( - id: 'enabledRows', - url: 'https://api.foss42.com/humanize/social', - method: HTTPVerb.get, - requestParams: [ - NameValueModel(name: 'num', value: '8700000'), - NameValueModel(name: 'digits', value: '3'), - NameValueModel(name: 'system', value: 'SS'), - NameValueModel(name: 'add_space', value: 'true'), - ], - requestHeaders: [ - NameValueModel(name: 'User-Agent', value: 'Test Agent'), - NameValueModel(name: 'Content-Type', value: 'application/json'), - ], - isParamEnabledList: [ - true, - true, - false, - false, - ], - isHeaderEnabledList: [ - true, - false, - ], -); - -/// Request model with disabled rows -const requestModelDisabledRows = RequestModel( - id: 'disabledRows', - url: 'https://api.foss42.com/humanize/social', - method: HTTPVerb.get, - requestParams: [ - NameValueModel(name: 'num', value: '8700000'), - NameValueModel(name: 'digits', value: '3'), - NameValueModel(name: 'system', value: 'SS'), - NameValueModel(name: 'add_space', value: 'true'), - ], - requestHeaders: [ - NameValueModel(name: 'User-Agent', value: 'Test Agent'), - NameValueModel(name: 'Content-Type', value: 'application/json'), - ], - isParamEnabledList: [ - false, - false, - false, - false, - ], - isHeaderEnabledList: [ - false, - false, - ], -); From 5fddefd21c3d1833036809f0ef2786505f088bd4 Mon Sep 17 00:00:00 2001 From: DenserMeerkat <95911940+DenserMeerkat@users.noreply.github.com> Date: Wed, 27 Dec 2023 22:06:09 +0530 Subject: [PATCH 10/17] Update pubspec.lock --- pubspec.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ba941e23..1845e975 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -189,10 +189,10 @@ packages: dependency: "direct main" description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" convert: dependency: transitive description: @@ -637,10 +637,10 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" mime: dependency: transitive description: @@ -994,10 +994,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" state_notifier: dependency: transitive description: @@ -1010,10 +1010,10 @@ packages: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" stream_transform: dependency: transitive description: @@ -1042,26 +1042,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" + sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f url: "https://pub.dev" source: hosted - version: "1.24.3" + version: "1.24.9" test_api: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.1" test_core: dependency: transitive description: name: test_core - sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" + sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a url: "https://pub.dev" source: hosted - version: "0.5.3" + version: "0.5.9" textwrap: dependency: transitive description: @@ -1210,10 +1210,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.3.0" web_socket_channel: dependency: transitive description: @@ -1280,5 +1280,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.1.0 <4.0.0" - flutter: ">=3.13.0" + dart: ">=3.2.0 <4.0.0" + flutter: ">=3.16.0" From e0fe907d194440893c5a1c964d15600284bd209c Mon Sep 17 00:00:00 2001 From: APPALA REDDI Date: Sat, 30 Dec 2023 12:35:10 +0530 Subject: [PATCH 11/17] feat: ability to override content type --- lib/consts.dart | 2 ++ .../request_pane/request_headers.dart | 18 ++++++++++++++++++ lib/utils/header_utils.dart | 11 +++++++++++ lib/widgets/headerfield.dart | 6 +++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/consts.dart b/lib/consts.dart index d881fb86..39cb0dbb 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -305,6 +305,8 @@ const kTypeVideo = 'video'; const kSubTypeDefaultViewOptions = 'all'; +const kContentType = 'Content-Type'; + const kContentTypeMap = { ContentType.json: "$kTypeApplication/$kSubTypeJson", ContentType.text: "$kTypeText/$kSubTypePlain", 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..0f2cf728 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 @@ -1,4 +1,5 @@ import 'dart:math'; +import 'package:apidash/utils/header_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:davi/davi.dart'; @@ -78,6 +79,23 @@ class EditRequestHeadersState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; + + if (row.data.name == kContentType) { + return HeaderField( + keyId: "$activeId-$idx-headers-v-$seed", + initialValue: rows[idx].value, + hintText: " Add Header Value", + onChanged: (value) { + rows[idx] = rows[idx].copyWith(value: value); + _onFieldChange(activeId!); + }, + headerSuggestionsCallback: (pattern) { + return getHeaderValueSuggestions(pattern); + }, + colorScheme: Theme.of(context).colorScheme, + ); + } + return CellField( keyId: "$activeId-$idx-headers-v-$seed", initialValue: rows[idx].value, diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index 63a456ef..de13f8b4 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -15,6 +15,7 @@ Map headers = { "Indicates the encoding transformations that have been applied to the entity body of the response.", "Content-Security-Policy": "Controls the sources from which content can be loaded on a web page to mitigate various types of attacks.", + "Content-Type": "Indicates the original media type of the resource (prior to any content encoding applied for sending)", "Cookie": "Used to send previously stored cookies back to the server.", "Cross-Origin-Embedder-Policy": "Controls whether a document is allowed to be embedded in another document.", @@ -70,3 +71,13 @@ List getHeaderSuggestions(String pattern) { ) .toList(); } + +List headerValues = ['application/json', 'text/plain']; + +List getHeaderValueSuggestions(String pattern) { + return headerValues + .where( + (element) => element.contains(pattern.toLowerCase()), + ) + .toList(); +} diff --git a/lib/widgets/headerfield.dart b/lib/widgets/headerfield.dart index 9c678ee3..4ff548e3 100644 --- a/lib/widgets/headerfield.dart +++ b/lib/widgets/headerfield.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:apidash/utils/header_utils.dart'; import 'package:flutter/material.dart'; import 'package:apidash/consts.dart'; @@ -10,12 +12,14 @@ class HeaderField extends StatefulWidget { this.hintText, this.initialValue, this.onChanged, + this.headerSuggestionsCallback, this.colorScheme, }); final String keyId; final String? hintText; final String? initialValue; final void Function(String)? onChanged; + final FutureOr> Function(String)? headerSuggestionsCallback; final ColorScheme? colorScheme; @override @@ -67,7 +71,7 @@ class _HeaderFieldState extends State { title: Text(suggestion), ); }, - suggestionsCallback: headerSuggestionCallback, + suggestionsCallback: widget.headerSuggestionsCallback ?? headerSuggestionCallback, suggestionsBoxDecoration: suggestionBoxDecorations(context), textFieldConfiguration: TextFieldConfiguration( onChanged: widget.onChanged, From e08b40cfb6b09b3842723b83a0dcf0a4d428cb32 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Mon, 1 Jan 2024 09:32:35 +0530 Subject: [PATCH 12/17] Revert "feat: ability to override content type" This reverts commit e0fe907d194440893c5a1c964d15600284bd209c. --- lib/consts.dart | 2 -- .../request_pane/request_headers.dart | 18 ------------------ lib/utils/header_utils.dart | 11 ----------- lib/widgets/headerfield.dart | 6 +----- 4 files changed, 1 insertion(+), 36 deletions(-) diff --git a/lib/consts.dart b/lib/consts.dart index 39cb0dbb..d881fb86 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -305,8 +305,6 @@ const kTypeVideo = 'video'; const kSubTypeDefaultViewOptions = 'all'; -const kContentType = 'Content-Type'; - const kContentTypeMap = { ContentType.json: "$kTypeApplication/$kSubTypeJson", ContentType.text: "$kTypeText/$kSubTypePlain", 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 0f2cf728..82138db5 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 @@ -1,5 +1,4 @@ import 'dart:math'; -import 'package:apidash/utils/header_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:davi/davi.dart'; @@ -79,23 +78,6 @@ class EditRequestHeadersState extends ConsumerState { grow: 1, cellBuilder: (_, row) { int idx = row.index; - - if (row.data.name == kContentType) { - return HeaderField( - keyId: "$activeId-$idx-headers-v-$seed", - initialValue: rows[idx].value, - hintText: " Add Header Value", - onChanged: (value) { - rows[idx] = rows[idx].copyWith(value: value); - _onFieldChange(activeId!); - }, - headerSuggestionsCallback: (pattern) { - return getHeaderValueSuggestions(pattern); - }, - colorScheme: Theme.of(context).colorScheme, - ); - } - return CellField( keyId: "$activeId-$idx-headers-v-$seed", initialValue: rows[idx].value, diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index de13f8b4..63a456ef 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -15,7 +15,6 @@ Map headers = { "Indicates the encoding transformations that have been applied to the entity body of the response.", "Content-Security-Policy": "Controls the sources from which content can be loaded on a web page to mitigate various types of attacks.", - "Content-Type": "Indicates the original media type of the resource (prior to any content encoding applied for sending)", "Cookie": "Used to send previously stored cookies back to the server.", "Cross-Origin-Embedder-Policy": "Controls whether a document is allowed to be embedded in another document.", @@ -71,13 +70,3 @@ List getHeaderSuggestions(String pattern) { ) .toList(); } - -List headerValues = ['application/json', 'text/plain']; - -List getHeaderValueSuggestions(String pattern) { - return headerValues - .where( - (element) => element.contains(pattern.toLowerCase()), - ) - .toList(); -} diff --git a/lib/widgets/headerfield.dart b/lib/widgets/headerfield.dart index 4ff548e3..9c678ee3 100644 --- a/lib/widgets/headerfield.dart +++ b/lib/widgets/headerfield.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:apidash/utils/header_utils.dart'; import 'package:flutter/material.dart'; import 'package:apidash/consts.dart'; @@ -12,14 +10,12 @@ class HeaderField extends StatefulWidget { this.hintText, this.initialValue, this.onChanged, - this.headerSuggestionsCallback, this.colorScheme, }); final String keyId; final String? hintText; final String? initialValue; final void Function(String)? onChanged; - final FutureOr> Function(String)? headerSuggestionsCallback; final ColorScheme? colorScheme; @override @@ -71,7 +67,7 @@ class _HeaderFieldState extends State { title: Text(suggestion), ); }, - suggestionsCallback: widget.headerSuggestionsCallback ?? headerSuggestionCallback, + suggestionsCallback: headerSuggestionCallback, suggestionsBoxDecoration: suggestionBoxDecorations(context), textFieldConfiguration: TextFieldConfiguration( onChanged: widget.onChanged, From a4042e12d104d1e3c55d09e0d56144f25e77d972 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Mon, 1 Jan 2024 09:33:40 +0530 Subject: [PATCH 13/17] Update header_utils.dart --- lib/utils/header_utils.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index 63a456ef..df97a08b 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -15,6 +15,8 @@ Map headers = { "Indicates the encoding transformations that have been applied to the entity body of the response.", "Content-Security-Policy": "Controls the sources from which content can be loaded on a web page to mitigate various types of attacks.", + "Content-Type": + "Indicates the original media type of the resource (prior to any content encoding applied for sending)", "Cookie": "Used to send previously stored cookies back to the server.", "Cross-Origin-Embedder-Policy": "Controls whether a document is allowed to be embedded in another document.", From 5734b79b1fceb0c3510cb56b817c7e86853b8291 Mon Sep 17 00:00:00 2001 From: APPALA REDDI Date: Mon, 1 Jan 2024 14:58:47 +0530 Subject: [PATCH 14/17] fix: set contenttype only if headers does not have one --- lib/services/http_service.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/services/http_service.dart b/lib/services/http_service.dart index 8265a299..d4cfea2f 100644 --- a/lib/services/http_service.dart +++ b/lib/services/http_service.dart @@ -28,8 +28,10 @@ Future<(http.Response?, Duration?, String?)> request( if (contentLength > 0) { body = requestBody; headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); - headers[HttpHeaders.contentTypeHeader] = - kContentTypeMap[requestModel.requestBodyContentType] ?? ""; + if (!headers.containsKey(HttpHeaders.connectionHeader)) { + headers[HttpHeaders.contentTypeHeader] = + kContentTypeMap[requestModel.requestBodyContentType] ?? ""; + } } } Stopwatch stopwatch = Stopwatch()..start(); From 6efc5d56de06d2a94ee73758e568895e06ff270d Mon Sep 17 00:00:00 2001 From: APPALA REDDI Date: Mon, 1 Jan 2024 15:03:42 +0530 Subject: [PATCH 15/17] fix: wrong header check while overriding content type --- lib/services/http_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/http_service.dart b/lib/services/http_service.dart index d4cfea2f..0b6835a2 100644 --- a/lib/services/http_service.dart +++ b/lib/services/http_service.dart @@ -28,7 +28,7 @@ Future<(http.Response?, Duration?, String?)> request( if (contentLength > 0) { body = requestBody; headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); - if (!headers.containsKey(HttpHeaders.connectionHeader)) { + if (!headers.containsKey(HttpHeaders.contentTypeHeader)) { headers[HttpHeaders.contentTypeHeader] = kContentTypeMap[requestModel.requestBodyContentType] ?? ""; } From 5eb91fbaf708ac4f01b0bd9ba89aba17d37c800d Mon Sep 17 00:00:00 2001 From: APPALA REDDI Date: Tue, 2 Jan 2024 09:22:11 +0530 Subject: [PATCH 16/17] fix: content type header presence check --- lib/services/http_service.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/services/http_service.dart b/lib/services/http_service.dart index 0b6835a2..aad8b7f3 100644 --- a/lib/services/http_service.dart +++ b/lib/services/http_service.dart @@ -28,9 +28,10 @@ Future<(http.Response?, Duration?, String?)> request( if (contentLength > 0) { body = requestBody; headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); - if (!headers.containsKey(HttpHeaders.contentTypeHeader)) { - headers[HttpHeaders.contentTypeHeader] = - kContentTypeMap[requestModel.requestBodyContentType] ?? ""; + final hasContentTypeHeader = headers.keys.any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); + if (!hasContentTypeHeader) { + headers[HttpHeaders.contentTypeHeader] = + kContentTypeMap[requestModel.requestBodyContentType] ?? ""; } } } From c765cb378bf6a48d37d56cc44054f6a43cf10e91 Mon Sep 17 00:00:00 2001 From: APPALA REDDI Date: Tue, 2 Jan 2024 09:23:04 +0530 Subject: [PATCH 17/17] refact: codegen to override content-type header --- lib/codegen/dart/http.dart | 5 ++++- lib/codegen/python/http_client.dart | 4 +++- lib/utils/har_utils.dart | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/codegen/dart/http.dart b/lib/codegen/dart/http.dart index 67184c25..602b9a73 100644 --- a/lib/codegen/dart/http.dart +++ b/lib/codegen/dart/http.dart @@ -55,8 +55,11 @@ class DartHttpCodeGen { final strContent = CodeExpression(Code('r\'\'\'$body\'\'\'')); dataExp = declareVar('body', type: refer('String')).assign(strContent); - composeHeaders.putIfAbsent(HttpHeaders.contentTypeHeader, + final hasContentTypeHeader = composeHeaders.keys.any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); + if (!hasContentTypeHeader) { + composeHeaders.putIfAbsent(HttpHeaders.contentTypeHeader, () => kContentTypeMap[contentType] ?? ''); + } } Expression? queryParamExp; diff --git a/lib/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index 83d02676..27f35380 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -102,7 +102,9 @@ print(data.decode("utf-8")) var headers = requestModel.headersMap; if (headers.isNotEmpty || hasBody) { hasHeaders = true; - if (hasBody) { + bool hasContentTypeHeader = headers.keys.any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); + + if (hasBody && !hasContentTypeHeader) { headers[HttpHeaders.contentTypeHeader] = kContentTypeMap[requestModel.requestBodyContentType] ?? ""; } diff --git a/lib/utils/har_utils.dart b/lib/utils/har_utils.dart index f0838807..94cdda8b 100644 --- a/lib/utils/har_utils.dart +++ b/lib/utils/har_utils.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:apidash/consts.dart'; import 'package:apidash/utils/utils.dart' show getValidRequestUri; import 'package:apidash/models/models.dart' show RequestModel; @@ -129,7 +130,9 @@ Map requestModelToHARJsonRequest( if (headersList != null || hasBody) { var headers = requestModel.headersMap; if (headers.isNotEmpty || hasBody) { - if (hasBody) { + bool hasContentTypeHeader = headers.keys.any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); + + if (hasBody && !hasContentTypeHeader) { var m = { "name": "Content-Type", "value": kContentTypeMap[requestModel.requestBodyContentType] ?? ""