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/dart/http.dart b/lib/codegen/dart/http.dart index 67184c25..563361d8 100644 --- a/lib/codegen/dart/http.dart +++ b/lib/codegen/dart/http.dart @@ -20,8 +20,8 @@ class DartHttpCodeGen { 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, ); @@ -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/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/kotlin/okhttp.dart b/lib/codegen/kotlin/okhttp.dart index 09cd2ce9..362e31a1 100644 --- a/lib/codegen/kotlin/okhttp.dart +++ b/lib/codegen/kotlin/okhttp.dart @@ -77,7 +77,10 @@ import okhttp3.MediaType.Companion.toMediaType"""; url = "$defaultUriScheme://$url"; } - var rec = getValidRequestUri(url, requestModel.requestParams); + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); Uri? uri = rec.$1; if (uri != null) { @@ -120,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/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/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index 83d02676..0179fdae 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -71,7 +71,10 @@ print(data.decode("utf-8")) } result += kTemplateStart; - var rec = getValidRequestUri(url, requestModel.requestParams); + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); Uri? uri = rec.$1; if (uri != null) { @@ -97,12 +100,14 @@ 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) { + bool hasContentTypeHeader = headers.keys.any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); + + if (hasBody && !hasContentTypeHeader) { headers[HttpHeaders.contentTypeHeader] = kContentTypeMap[requestModel.requestBodyContentType] ?? ""; } diff --git a/lib/codegen/python/requests.dart b/lib/codegen/python/requests.dart index af8b3fbe..bb3c53c8 100644 --- a/lib/codegen/python/requests.dart +++ b/lib/codegen/python/requests.dart @@ -75,7 +75,10 @@ print('Response Body:', response.text) url = "$defaultUriScheme://$url"; } - var rec = getValidRequestUri(url, requestModel.requestParams); + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); Uri? uri = rec.$1; if (uri != null) { var templateStartUrl = jj.Template(kTemplateStart); @@ -109,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 a928dac1..df49ba1e 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -1,6 +1,7 @@ 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'; @@ -15,6 +16,8 @@ class RequestModel { this.requestTabIndex = 0, this.requestHeaders, this.requestParams, + this.isHeaderEnabledList, + this.isParamEnabledList, this.requestBodyContentType = ContentType.json, this.requestBody, this.responseStatus, @@ -30,12 +33,23 @@ class RequestModel { final int requestTabIndex; final List? requestHeaders; final List? requestParams; + final List? isHeaderEnabledList; + final List? isParamEnabledList; final ContentType requestBodyContentType; final String? requestBody; final int? responseStatus; final String? message; final ResponseModel? responseModel; + 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) ?? {}; @@ -50,6 +64,10 @@ class RequestModel { description: description, requestHeaders: requestHeaders != null ? [...requestHeaders!] : null, requestParams: requestParams != null ? [...requestParams!] : null, + isHeaderEnabledList: + isHeaderEnabledList != null ? [...isHeaderEnabledList!] : null, + isParamEnabledList: + isParamEnabledList != null ? [...isParamEnabledList!] : null, requestBodyContentType: requestBodyContentType, requestBody: requestBody, ); @@ -64,6 +82,8 @@ class RequestModel { int? requestTabIndex, List? requestHeaders, List? requestParams, + List? isHeaderEnabledList, + List? isParamEnabledList, ContentType? requestBodyContentType, String? requestBody, int? responseStatus, @@ -72,6 +92,8 @@ class RequestModel { }) { var headers = requestHeaders ?? this.requestHeaders; var params = requestParams ?? this.requestParams; + var enabledHeaders = isHeaderEnabledList ?? this.isHeaderEnabledList; + var enabledParams = isParamEnabledList ?? this.isParamEnabledList; return RequestModel( id: id ?? this.id, method: method ?? this.method, @@ -81,6 +103,8 @@ class RequestModel { requestTabIndex: requestTabIndex ?? this.requestTabIndex, requestHeaders: headers != null ? [...headers] : null, requestParams: params != null ? [...params] : null, + isHeaderEnabledList: enabledHeaders != null ? [...enabledHeaders] : null, + isParamEnabledList: enabledParams != null ? [...enabledParams] : null, requestBodyContentType: requestBodyContentType ?? this.requestBodyContentType, requestBody: requestBody ?? this.requestBody, @@ -106,6 +130,8 @@ class RequestModel { final description = data["description"] as String?; final requestHeaders = data["requestHeaders"]; final requestParams = data["requestParams"]; + final isHeaderEnabledList = data["isHeaderEnabledList"] as List?; + final isParamEnabledList = data["isParamEnabledList"] as List?; try { requestBodyContentType = ContentType.values.byName(data["requestBodyContentType"] as String); @@ -136,6 +162,8 @@ class RequestModel { requestParams: requestParams != null ? mapToRows(Map.from(requestParams)) : null, + isHeaderEnabledList: isHeaderEnabledList, + isParamEnabledList: isParamEnabledList, requestBodyContentType: requestBodyContentType, requestBody: requestBody, responseStatus: responseStatus, @@ -153,6 +181,8 @@ class RequestModel { "description": description, "requestHeaders": rowsToMap(requestHeaders), "requestParams": rowsToMap(requestParams), + "isHeaderEnabledList": isHeaderEnabledList, + "isParamEnabledList": isParamEnabledList, "requestBodyContentType": requestBodyContentType.name, "requestBody": requestBody, "responseStatus": includeResponse ? responseStatus : null, @@ -171,7 +201,9 @@ class RequestModel { "Request Description: $description", "Request Tab Index: ${requestTabIndex.toString()}", "Request Headers: ${requestHeaders.toString()}", + "Enabled Headers: ${isHeaderEnabledList.toString()}", "Request Params: ${requestParams.toString()}", + "Enabled Params: ${isParamEnabledList.toString()}", "Request Body Content Type: ${requestBodyContentType.toString()}", "Request Body: ${requestBody.toString()}", "Response Status: $responseStatus", @@ -192,6 +224,8 @@ class RequestModel { other.requestTabIndex == requestTabIndex && listEquals(other.requestHeaders, requestHeaders) && listEquals(other.requestParams, requestParams) && + listEquals(other.isHeaderEnabledList, isHeaderEnabledList) && + listEquals(other.isParamEnabledList, isParamEnabledList) && other.requestBodyContentType == requestBodyContentType && other.requestBody == requestBody && other.responseStatus == responseStatus && @@ -211,6 +245,8 @@ class RequestModel { requestTabIndex, requestHeaders, requestParams, + isHeaderEnabledList, + isParamEnabledList, requestBodyContentType, requestBody, responseStatus, diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index e0273a34..8e5b305a 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? isHeaderEnabledList, + List? isParamEnabledList, ContentType? requestBodyContentType, String? requestBody, int? responseStatus, @@ -137,12 +139,13 @@ class CollectionStateNotifier requestTabIndex: requestTabIndex, requestHeaders: requestHeaders, requestParams: requestParams, + isHeaderEnabledList: isHeaderEnabledList, + isParamEnabledList: isParamEnabledList, 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..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 @@ -16,6 +16,7 @@ class EditRequestHeaders extends ConsumerStatefulWidget { class EditRequestHeadersState extends ConsumerState { late List rows; + late List isRowEnabledList; 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, + isHeaderEnabledList: isRowEnabledList, + ); } @override @@ -42,10 +45,31 @@ class EditRequestHeadersState extends ConsumerState { kNameValueEmptyModel, ] : rH; + isRowEnabledList = + ref.read(activeRequestModelProvider)?.isHeaderEnabledList ?? + 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: isRowEnabledList[idx], + onChanged: (value) { + setState(() { + isRowEnabledList[idx] = value!; + }); + _onFieldChange(activeId!); + }, + colorScheme: Theme.of(context).colorScheme, + ); + }, + ), DaviColumn( name: 'Header Name', grow: 1, @@ -106,9 +130,11 @@ class EditRequestHeadersState extends ConsumerState { rows = [ kNameValueEmptyModel, ]; + isRowEnabledList = [true]; }); } else { rows.removeAt(row.index); + isRowEnabledList.removeAt(row.index); } _onFieldChange(activeId!); }, @@ -143,6 +169,7 @@ class EditRequestHeadersState extends ConsumerState { child: ElevatedButton.icon( onPressed: () { 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 9a8961c6..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 @@ -17,6 +17,7 @@ class EditRequestURLParams extends ConsumerStatefulWidget { class EditRequestURLParamsState extends ConsumerState { late List rows; + late List isRowEnabledList; 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, + isParamEnabledList: isRowEnabledList, + ); } @override @@ -43,10 +46,32 @@ class EditRequestURLParamsState extends ConsumerState { kNameValueEmptyModel, ] : rP; + isRowEnabledList = + ref.read(activeRequestModelProvider)?.isParamEnabledList ?? + 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: isRowEnabledList[idx], + onChanged: (value) { + setState(() { + isRowEnabledList[idx] = value!; + }); + _onFieldChange(activeId!); + }, + colorScheme: Theme.of(context).colorScheme, + ); + }, + ), DaviColumn( name: 'URL Parameter', grow: 1, @@ -107,9 +132,11 @@ class EditRequestURLParamsState extends ConsumerState { rows = [ kNameValueEmptyModel, ]; + isRowEnabledList = [true]; }); } else { rows.removeAt(row.index); + isRowEnabledList.removeAt(row.index); } _onFieldChange(activeId!); }, @@ -144,6 +171,7 @@ class EditRequestURLParamsState extends ConsumerState { child: ElevatedButton.icon( onPressed: () { rows.add(kNameValueEmptyModel); + isRowEnabledList.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..54d9c387 100644 --- a/lib/services/http_service.dart +++ b/lib/services/http_service.dart @@ -12,12 +12,12 @@ Future<(http.Response?, Duration?, String?)> request( }) async { (Uri?, String?) uriRec = getValidRequestUri( requestModel.url, - requestModel.requestParams, + 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 { @@ -28,8 +28,11 @@ Future<(http.Response?, Duration?, String?)> request( if (contentLength > 0) { body = requestBody; headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); - headers[HttpHeaders.contentTypeHeader] = + final hasContentTypeHeader = headers.keys.any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); + if (!hasContentTypeHeader) { + headers[HttpHeaders.contentTypeHeader] = kContentTypeMap[requestModel.requestBodyContentType] ?? ""; + } } } Stopwatch stopwatch = Stopwatch()..start(); diff --git a/lib/utils/convert_utils.dart b/lib/utils/convert_utils.dart index e12f2dcc..94e6c878 100644 --- a/lib/utils/convert_utils.dart +++ b/lib/utils/convert_utils.dart @@ -109,3 +109,13 @@ Uint8List jsonMapToBytes(Map? map) { return bytes; } } + +List? getEnabledRows( + List? rows, List? isRowEnabledList) { + if (rows == null || isRowEnabledList == null) { + return rows; + } + List finalRows = + 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 f0838807..b35c02a9 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; @@ -74,13 +75,14 @@ Map requestModelToHARJsonRequest( RequestModel requestModel, { defaultUriScheme = kDefaultUriScheme, bool exportMode = false, + bool useEnabled = false, }) { Map json = {}; bool hasBody = false; var rec = getValidRequestUri( requestModel.url, - requestModel.requestParams, + requestModel.enabledRequestParams, defaultUriScheme: defaultUriScheme, ); @@ -125,11 +127,16 @@ Map requestModelToHARJsonRequest( } } - var headersList = requestModel.requestHeaders; + var headersList = useEnabled + ? requestModel.enabledRequestHeaders + : requestModel.requestHeaders; if (headersList != null || hasBody) { - var headers = requestModel.headersMap; + var headers = + useEnabled ? requestModel.enabledHeadersMap : 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] ?? "" diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index da76647d..45a24fe9 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -32,7 +32,7 @@ Map headers = { "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 before any content-encoding applied for sending.", + "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.", 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 a4921bdc..8c288953 100644 --- a/lib/widgets/widgets.dart +++ b/lib/widgets/widgets.dart @@ -1,5 +1,6 @@ export 'buttons.dart'; export 'cards.dart'; +export 'checkbox.dart'; export 'code_previewer.dart'; export 'codegen_previewer.dart'; export 'dropdowns.dart'; diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index b67c8fa2..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', () { @@ -100,6 +131,7 @@ void main() { expect(curlCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""curl --request PUT \ diff --git a/test/codegen/dart_dio_codegen_test.dart b/test/codegen/dart_dio_codegen_test.dart index 6f1e3149..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', () { @@ -340,6 +449,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; diff --git a/test/codegen/dart_http_codegen_test.dart b/test/codegen/dart_http_codegen_test.dart index b28018c5..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', () { @@ -356,6 +467,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; diff --git a/test/codegen/har_codegen_test.dart b/test/codegen/har_codegen_test.dart index cd9be868..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', () { @@ -240,6 +317,7 @@ void main() { expect(harCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""{ diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index d809a122..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', () { @@ -324,6 +427,7 @@ axios(config) expect(axiosCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""let config = { diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index 589f59e7..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', () { @@ -366,6 +481,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'; diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index f2205a1b..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', () { @@ -369,6 +479,7 @@ fun main() { expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r'''import okhttp3.OkHttpClient diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index 180edb8a..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', () { @@ -350,6 +461,7 @@ axios(config) expect(axiosCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import axios from 'axios'; diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index 1a82d8a1..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', () { @@ -386,6 +505,7 @@ fetch(url, options) expect(fetchCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import fetch from 'node-fetch'; diff --git a/test/codegen/python_http_client_codegen_test.dart b/test/codegen/python_http_client_codegen_test.dart index f95d265d..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', () { @@ -285,6 +373,7 @@ print(data.decode("utf-8")) expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import http.client diff --git a/test/codegen/python_requests_codegen_test.dart b/test/codegen/python_requests_codegen_test.dart index 67e1f629..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', () { @@ -248,6 +326,7 @@ print('Response Body:', response.text) expectedCode); }); }); + group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import requests diff --git a/test/models/request_model_test.dart b/test/models/request_model_test.dart index 1f03e809..b1b56bfd 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' }, + 'isHeaderEnabledList': null, 'requestParams': null, + 'isParamEnabledList': 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", diff --git a/test/request_models.dart b/test/request_models.dart index ede411bb..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', diff --git a/test/utils/convert_utils_test.dart b/test/utils/convert_utils_test.dart index 26be2c10..53ec1c84 100644 --- a/test/utils/convert_utils_test.dart +++ b/test/utils/convert_utils_test.dart @@ -127,4 +127,39 @@ 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([], []), []); + }); + 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', () { + expect(getEnabledRows([kvRow1, kvRow2, kvRow3, kvRow4], null), + [kvRow1, kvRow2, kvRow3, kvRow4]); + }); + test('Testing for list with all enabled', () { + expect( + getEnabledRows( + [kvRow1, kvRow2, kvRow3, kvRow4], [true, true, true, true]), + [kvRow1, kvRow2, kvRow3, kvRow4]); + }); + test('Testing for list with all disabled', () { + expect( + getEnabledRows( + [kvRow1, kvRow2, kvRow3, kvRow4], [false, false, false, false]), + []); + }); + test('Testing for list with some disabled', () { + expect( + getEnabledRows( + [kvRow1, kvRow2, kvRow3, kvRow4], [true, false, true, false]), + [kvRow1, kvRow3]); + }); + }); }