From 693b4bda70449d411d8debc50906ce487f7170d9 Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Fri, 23 Feb 2024 13:50:29 +0530 Subject: [PATCH 01/85] fix: remove redundant body payload from codegen --- lib/codegen/python/http_client.dart | 4 +++- lib/codegen/python/requests.dart | 2 +- lib/utils/har_utils.dart | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index 4406effb..196b10df 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -130,7 +130,9 @@ body = b'\r\n'.join(dataList) var method = requestModel.method; var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(method) && requestBody != null) { + if (kMethodsWithBody.contains(method) && + requestBody != null && + !requestModel.isFormDataRequest) { var contentLength = utf8.encode(requestBody).length; if (contentLength > 0) { hasBody = true; diff --git a/lib/codegen/python/requests.dart b/lib/codegen/python/requests.dart index 3a5beeb6..cd79ccde 100644 --- a/lib/codegen/python/requests.dart +++ b/lib/codegen/python/requests.dart @@ -140,7 +140,7 @@ print('Response Body:', response.text) hasJsonBody = true; var templateBody = jj.Template(kTemplateJson); result += templateBody.render({"body": requestBody}); - } else { + } else if (!requestModel.isFormDataRequest) { hasBody = true; var templateBody = jj.Template(kTemplateBody); result += templateBody.render({"body": requestBody}); diff --git a/lib/utils/har_utils.dart b/lib/utils/har_utils.dart index 38913c6e..b5e1de72 100644 --- a/lib/utils/har_utils.dart +++ b/lib/utils/har_utils.dart @@ -112,7 +112,9 @@ Map requestModelToHARJsonRequest( var method = requestModel.method; var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(method) && requestBody != null) { + if (kMethodsWithBody.contains(method) && + requestBody != null && + !requestModel.isFormDataRequest) { var contentLength = utf8.encode(requestBody).length; if (contentLength > 0) { hasBody = true; From bff2ca892dbaeb39df4147f21893aded4f70a1b0 Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Fri, 23 Feb 2024 19:19:32 +0530 Subject: [PATCH 02/85] fix: redundant dart(http) codegen --- lib/codegen/dart/http.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/codegen/dart/http.dart b/lib/codegen/dart/http.dart index 3e423743..42c44ecb 100644 --- a/lib/codegen/dart/http.dart +++ b/lib/codegen/dart/http.dart @@ -53,7 +53,9 @@ class DartHttpCodeGen { declareVar('uri').assign(refer('Uri.parse').call([literalString(url)])); Expression? dataExp; - if (kMethodsWithBody.contains(method) && (body?.isNotEmpty ?? false)) { + if (kMethodsWithBody.contains(method) && + (body?.isNotEmpty ?? false) && + contentType != ContentType.formdata) { final strContent = CodeExpression(Code('r\'\'\'$body\'\'\'')); dataExp = declareVar('body', type: refer('String')).assign(strContent); if (!hasContentTypeHeader) { From a9c688bf9ad395e5831226dd8d5bb20084d091f0 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 24 Feb 2024 03:01:43 +0530 Subject: [PATCH 03/85] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 140188ac..58fd388d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -83,7 +83,7 @@ In case you have already setup Flutter, make sure to switch to `stable` branch a 1. Fork the project. 2. Create a clone of the forked project on your computer to run it locally. 3. Based on your desktop environment, enable Windows, macOS or Linux for the project. Select the same target device. -4. This project uses [Records feature in Dart](https://github.com/dart-lang/language/blob/main/accepted/future-releases/records/records-feature-specification.md), so to run the project execute the following command: +4. Run the project by executing the following command: ``` flutter run From 1937659e6f0922c82e5b5b6766d3b7f6cb8f496d Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 24 Feb 2024 06:35:11 +0530 Subject: [PATCH 04/85] Update request_models.dart --- test/request_models.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/request_models.dart b/test/request_models.dart index adf7e0e8..d7f7df21 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -92,7 +92,7 @@ const requestModelGet8 = RequestModel( /// GET request model with some params enabled const requestModelGet9 = RequestModel( - id: 'enabledParams', + id: 'get9', url: 'https://api.foss42.com/humanize/social', method: HTTPVerb.get, requestParams: [ @@ -111,7 +111,7 @@ const requestModelGet9 = RequestModel( /// GET Request model with some headers enabled const requestModelGet10 = RequestModel( - id: 'enabledParams', + id: 'get10', url: 'https://api.foss42.com/humanize/social', method: HTTPVerb.get, requestHeaders: [ @@ -126,7 +126,7 @@ const requestModelGet10 = RequestModel( /// GET Request model with some headers & URL parameters enabled const requestModelGet11 = RequestModel( - id: 'enabledRows', + id: 'get11', url: 'https://api.foss42.com/humanize/social', method: HTTPVerb.get, requestParams: [ @@ -153,7 +153,7 @@ const requestModelGet11 = RequestModel( /// Request model with all headers & URL parameters disabled const requestModelGet12 = RequestModel( - id: 'disabledRows', + id: 'get12', url: 'https://api.foss42.com/humanize/social', method: HTTPVerb.get, requestParams: [ From 2c515b03cb7b0f88c94ff8fe0721d8249147b052 Mon Sep 17 00:00:00 2001 From: Chinmay Chaudhari Date: Sat, 24 Feb 2024 08:52:05 +0530 Subject: [PATCH 05/85] Changed consts.dart --- lib/consts.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/consts.dart b/lib/consts.dart index f8f9f97c..84620491 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -375,6 +375,7 @@ const Map>> kSubTypeDefaultViewOptions: kRawBodyViewOptions, kSubTypeCss: kCodeRawBodyViewOptions, kSubTypeHtml: kCodeRawBodyViewOptions, + kSubTypeCsv: kPreviewCodeRawBodyViewOptions, kSubTypeJavascript: kCodeRawBodyViewOptions, kSubTypeMarkdown: kCodeRawBodyViewOptions, kSubTypeTextXml: kCodeRawBodyViewOptions, @@ -492,6 +493,10 @@ const kAudioError = const kRaiseIssue = "\nPlease raise an issue in API Dash GitHub repo so that we can resolve it."; +const kCsvError = + "There seems to be an issue rendering this CSV image. Please raise an issue in API Dash GitHub repo so that we can resolve it."; + + const kHintTextUrlCard = "Enter API endpoint like api.foss42.com/country/codes"; const kLabelPlusNew = "+ New"; const kLabelSend = "Send"; From 4a519cfa0ab8c4e389af160a86d184f0a75d96ac Mon Sep 17 00:00:00 2001 From: Chinmay Chaudhari Date: Sat, 24 Feb 2024 09:07:40 +0530 Subject: [PATCH 06/85] csv added --- lib/widgets/csv_previewer.dart | 49 ++++++++++++++++++++++++++++++++ lib/widgets/previewer.dart | 9 ++++++ pubspec.yaml | 1 + test/widgets/previewer_test.dart | 22 ++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 lib/widgets/csv_previewer.dart diff --git a/lib/widgets/csv_previewer.dart b/lib/widgets/csv_previewer.dart new file mode 100644 index 00000000..cdfc45b0 --- /dev/null +++ b/lib/widgets/csv_previewer.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:csv/csv.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash/widgets/widgets.dart'; + +class CsvPreviewer extends StatelessWidget { + const CsvPreviewer({Key? key, required this.body}) : super(key: key); + + final String body; + + @override + Widget build(BuildContext context) { + try { + final List> csvData = const CsvToListConverter().convert(body, eol: '\n'); + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + columns: csvData[0] + .map( + (item) => DataColumn( + label: Text( + item.toString(), + ), + ), + ) + .toList(), + rows: csvData + .skip(1) + .map( + (csvrow) => DataRow( + cells: csvrow + .map( + (csvItem) => DataCell( + Text( + csvItem.toString(), + ), + ), + ) + .toList(), + ), + ) + .toList(), + ), + ); + } catch (e) { + return const ErrorMessage(message: kCsvError); + } + } +} diff --git a/lib/widgets/previewer.dart b/lib/widgets/previewer.dart index 9841ac5b..6a6eb828 100644 --- a/lib/widgets/previewer.dart +++ b/lib/widgets/previewer.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:apidash/widgets/csv_previewer.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:printing/printing.dart'; @@ -81,6 +82,13 @@ class _PreviewerState extends State { }, ); } + if (widget.type == kTypeText && widget.subtype == kSubTypeCsv) { + try { + return CsvPreviewer(body: widget.body); + } catch (e) { + return const ErrorMessage(message: kCsvError); + } + } if (widget.type == kTypeVideo) { // TODO: Video Player } @@ -89,4 +97,5 @@ class _PreviewerState extends State { : "$kMimeTypeRaiseIssueStart${widget.type}/${widget.subtype}$kMimeTypeRaiseIssue"; return ErrorMessage(message: message); } + } diff --git a/pubspec.yaml b/pubspec.yaml index 4196d007..a95361b4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,6 +54,7 @@ dependencies: code_builder: ^4.9.0 dart_style: ^2.3.4 json_text_field: ^1.1.0 + csv: ^5.1.1 dev_dependencies: flutter_test: diff --git a/test/widgets/previewer_test.dart b/test/widgets/previewer_test.dart index 0d2f68cd..c26793bb 100644 --- a/test/widgets/previewer_test.dart +++ b/test/widgets/previewer_test.dart @@ -231,4 +231,26 @@ void main() { await tester.pumpAndSettle(); expect(find.text(kSvgError), findsOneWidget); }); + + testWidgets('Testing when type/subtype is text/csv', (tester) async { + String csvDataString = + 'Id,Name,Age\n1,John Doe,40\n2,Dbestech,41\n3,Voldermort,71\n4,Joe Biden,80\n5,Ryo Hanamura,35'; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Previewer( + type: kTypeText, + subtype: kSubTypeCsv, + bytes: Uint8List.fromList([]), + body: csvDataString, + ), + ), + ), + ); + + expect(find.byType(DataTable), findsOneWidget); + expect(find.text('John Doe'), findsOneWidget); + expect(find.text('41'), findsOneWidget); + }); } From 714a33ca370a627010656e92611d76a5ea3504c4 Mon Sep 17 00:00:00 2001 From: Chinmay Chaudhari Date: Sat, 24 Feb 2024 09:47:47 +0530 Subject: [PATCH 07/85] fixed typo --- lib/consts.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/consts.dart b/lib/consts.dart index 84620491..8d04c2eb 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -494,7 +494,7 @@ const kRaiseIssue = "\nPlease raise an issue in API Dash GitHub repo so that we can resolve it."; const kCsvError = - "There seems to be an issue rendering this CSV image. Please raise an issue in API Dash GitHub repo so that we can resolve it."; + "There seems to be an issue rendering this CSV. Please raise an issue in API Dash GitHub repo so that we can resolve it."; const kHintTextUrlCard = "Enter API endpoint like api.foss42.com/country/codes"; From 7e1ca33a28921789f0720542e63b2c520e553fcf Mon Sep 17 00:00:00 2001 From: ch1nru5t Date: Sat, 24 Feb 2024 12:48:53 +0530 Subject: [PATCH 08/85] fixed curl code gen error for empty url --- lib/codegen/others/curl.dart | 65 +++++++++++++++++++---------- pubspec.lock | 40 ++++++++++++++---- test/codegen/curl_codegen_test.dart | 5 ++- 3 files changed, 78 insertions(+), 32 deletions(-) diff --git a/lib/codegen/others/curl.dart b/lib/codegen/others/curl.dart index 4ae610de..638e9da5 100644 --- a/lib/codegen/others/curl.dart +++ b/lib/codegen/others/curl.dart @@ -1,6 +1,7 @@ -import 'package:jinja/jinja.dart' as jj; -import 'package:apidash/utils/utils.dart' show requestModelToHARJsonRequest; import 'package:apidash/models/models.dart' show RequestModel; +import 'package:jinja/jinja.dart' as jj; + +import '../../consts.dart'; // ignore: camel_case_types class cURLCodeGen { @@ -29,30 +30,48 @@ class cURLCodeGen { if (!url.contains("://") && url.isNotEmpty) { url = "$defaultUriScheme://$url"; } + if (requestModel.enabledParamsMap.isNotEmpty) { + if (!url.contains('?')) { + url += "?"; + } else { + url += "&"; + } + for (MapEntry entry + in requestModel.enabledParamsMap.entries) { + url += "${Uri.encodeFull(entry.key)}=${Uri.encodeFull(entry.value)}&"; + } + url = url.substring(0, url.length - 1); + } var rM = requestModel.copyWith(url: url); - - var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); - var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ - "method": switch (harJson["method"]) { + "method": switch (rM.method.name.toUpperCase()) { "GET" => "", "HEAD" => " --head", - _ => " --request ${harJson["method"]} \\\n" + _ => " --request ${rM.method.name.toUpperCase()} \\\n" }, - "url": harJson["url"], + "url": rM.url, }); - var headers = harJson["headers"]; - if (headers.isNotEmpty) { - for (var item in headers) { - var templateHeader = jj.Template(kTemplateHeader); - result += templateHeader - .render({"name": item["name"], "value": item["value"]}); - } + Map headers = rM.enabledHeadersMap; + if (rM.requestBody != null && + rM.requestBody!.isNotEmpty && + rM.method != HTTPVerb.get && + rM.requestBodyContentType != ContentType.formdata) { + var templateHeader = jj.Template(kTemplateHeader); + result += templateHeader.render({ + "name": "Content-Type", + "value": rM.requestBodyContentType.header + }); } - if (harJson['formData'] != null) { - var formDataList = harJson['formData'] as List>; + for (MapEntry header in headers.entries) { + var templateHeader = jj.Template(kTemplateHeader); + result += + templateHeader.render({"name": header.key, "value": header.value}); + } + + if (rM.requestBodyContentType == ContentType.formdata) { + List> formDataList = rM.formDataMapList; for (var formData in formDataList) { var templateFormData = jj.Template(kTemplateFormData); if (formData['type'] != null && @@ -67,11 +86,13 @@ class cURLCodeGen { }); } } - } - - if (harJson["postData"]?["text"] != null) { - var templateBody = jj.Template(kTemplateBody); - result += templateBody.render({"body": harJson["postData"]["text"]}); + } else { + if (rM.requestBody != null && + rM.requestBody!.isNotEmpty && + rM.method != HTTPVerb.get) { + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": rM.requestBody}); + } } return result; } catch (e) { diff --git a/pubspec.lock b/pubspec.lock index 2f3f7f55..1737f75f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -625,6 +625,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -661,26 +685,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" mime: dependency: transitive description: @@ -757,10 +781,10 @@ packages: dependency: "direct main" description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_parsing: dependency: transitive description: diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index e9bb7f60..b62de8b4 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -1,7 +1,8 @@ import 'package:apidash/codegen/others/curl.dart'; -import '../request_models.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; + void main() { final curlCodeGen = cURLCodeGen(); @@ -19,7 +20,7 @@ void main() { test('GET 3', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/country/data?code=IND'"""; + r"""curl --url 'https://api.foss42.com/country/data?code=US&code=IND'"""; expect(curlCodeGen.getCode(requestModelGet3, "https"), expectedCode); }); From 2702760cd0863e625b1c39a3b3bfb244ed558aec Mon Sep 17 00:00:00 2001 From: Delwin Mathew <84124091+opxdelwin@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:20:39 +0530 Subject: [PATCH 09/85] add analysis workflow --- .github/workflows/analyze.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/analyze.yml diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml new file mode 100644 index 00000000..0d5b1fb6 --- /dev/null +++ b/.github/workflows/analyze.yml @@ -0,0 +1,22 @@ +name: "Code Analysis" +on: [ push ] + + +jobs: + Flutter-Analyze: + runs-on: ubuntu-latest + steps: + - run: pwd + - name: Checkout Code + uses: actions/checkout@v3 + + - name: Get Flutter Env + uses: subosito/flutter-action@v2 + with: + channel: 'stable' + - run: flutter --version + + - name: Code Analysis + run: | + flutter pub get + flutter analyze From d22608ac0101c9f21f72f84cdf1e5b39f4d89030 Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Mon, 26 Feb 2024 01:36:19 +0530 Subject: [PATCH 10/85] feat: update flutter_typeahead --- lib/widgets/headerfield.dart | 40 +++++++++---------- pubspec.lock | 76 +++++++++++++++++++++++++++++------- pubspec.yaml | 2 +- 3 files changed, 82 insertions(+), 36 deletions(-) diff --git a/lib/widgets/headerfield.dart b/lib/widgets/headerfield.dart index 9c678ee3..52dd8ec5 100644 --- a/lib/widgets/headerfield.dart +++ b/lib/widgets/headerfield.dart @@ -1,6 +1,6 @@ +import 'package:apidash/consts.dart'; import 'package:apidash/utils/header_utils.dart'; import 'package:flutter/material.dart'; -import 'package:apidash/consts.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; class HeaderField extends StatefulWidget { @@ -41,6 +41,7 @@ class _HeaderFieldState extends State { @override void didUpdateWidget(HeaderField oldWidget) { + super.didUpdateWidget(oldWidget); if (oldWidget.initialValue != widget.initialValue) { controller.text = widget.initialValue ?? ""; controller.selection = @@ -53,9 +54,9 @@ class _HeaderFieldState extends State { var colorScheme = widget.colorScheme ?? Theme.of(context).colorScheme; return TypeAheadField( key: Key(widget.keyId), - hideOnEmpty: true, - minCharsForSuggestions: 1, - onSuggestionSelected: (value) { + hideOnEmpty: false, + controller: controller, + onSelected: (value) { setState(() { controller.text = value; }); @@ -68,19 +69,16 @@ class _HeaderFieldState extends State { ); }, suggestionsCallback: headerSuggestionCallback, - suggestionsBoxDecoration: suggestionBoxDecorations(context), - textFieldConfiguration: TextFieldConfiguration( + decorationBuilder: suggestionBoxDecorations, + constraints: const BoxConstraints(maxHeight: 400), + builder: (context, controller, focusNode) => TextField( onChanged: widget.onChanged, controller: controller, - style: kCodeStyle.copyWith( - color: colorScheme.onSurface, - ), + focusNode: focusNode, + style: kCodeStyle.copyWith(color: colorScheme.onSurface), decoration: InputDecoration( hintStyle: kCodeStyle.copyWith( - color: colorScheme.outline.withOpacity( - kHintOpacity, - ), - ), + color: colorScheme.outline.withOpacity(kHintOpacity)), hintText: widget.hintText, focusedBorder: UnderlineInputBorder( borderSide: BorderSide( @@ -99,22 +97,22 @@ class _HeaderFieldState extends State { ); } - SuggestionsBoxDecoration suggestionBoxDecorations(BuildContext context) { - return SuggestionsBoxDecoration( + Material suggestionBoxDecorations(BuildContext context, Widget child) { + return Material( elevation: 4, - constraints: const BoxConstraints(maxHeight: 400), shape: RoundedRectangleBorder( - side: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.2, - ), + side: BorderSide(color: Theme.of(context).dividerColor, width: 1.2), borderRadius: const BorderRadius.vertical(bottom: Radius.circular(8)), ), clipBehavior: Clip.hardEdge, + child: child, ); } - Future> headerSuggestionCallback(String pattern) async { + Future?> headerSuggestionCallback(String pattern) async { + if (pattern.isEmpty) { + return null; + } return getHeaderSuggestions(pattern); } } diff --git a/pubspec.lock b/pubspec.lock index 2f3f7f55..70dda7d5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -306,10 +306,10 @@ packages: dependency: transitive description: name: flutter_keyboard_visibility - sha256: "4983655c26ab5b959252ee204c2fffa4afeb4413cd030455194ec0caa3b8e7cb" + sha256: "98664be7be0e3ffca00de50f7f6a287ab62c763fc8c762e0a21584584a3ff4f8" url: "https://pub.dev" source: hosted - version: "5.4.1" + version: "6.0.0" flutter_keyboard_visibility_linux: dependency: transitive description: @@ -407,10 +407,10 @@ packages: dependency: "direct main" description: name: flutter_typeahead - sha256: b9942bd5b7611a6ec3f0730c477146cffa4cd4b051077983ba67ddfc9e7ee818 + sha256: d64712c65db240b1057559b952398ebb6e498077baeebf9b0731dade62438a6d url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "5.2.0" flutter_web_plugins: dependency: transitive description: flutter @@ -625,6 +625,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -661,26 +685,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" mime: dependency: transitive description: @@ -757,10 +781,10 @@ packages: dependency: "direct main" description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -853,10 +877,34 @@ packages: dependency: transitive description: name: pointer_interceptor - sha256: adf7a637f97c077041d36801b43be08559fd4322d2127b3f20bb7be1b9eebc22 + sha256: bd18321519718678d5fa98ad3a3359cbc7a31f018554eab80b73d08a7f0c165a url: "https://pub.dev" source: hosted - version: "0.9.3+7" + version: "0.10.1" + pointer_interceptor_ios: + dependency: transitive + description: + name: pointer_interceptor_ios + sha256: "2e73c39452830adc4695757130676a39412a3b7f3c34e3f752791b5384770877" + url: "https://pub.dev" + source: hosted + version: "0.10.0+2" + pointer_interceptor_platform_interface: + dependency: transitive + description: + name: pointer_interceptor_platform_interface + sha256: "0597b0560e14354baeb23f8375cd612e8bd4841bf8306ecb71fcd0bb78552506" + url: "https://pub.dev" + source: hosted + version: "0.10.0+1" + pointer_interceptor_web: + dependency: transitive + description: + name: pointer_interceptor_web + sha256: "9386e064097fd16419e935c23f08f35b58e6aaec155dd39bd6a003b88f9c14b4" + url: "https://pub.dev" + source: hosted + version: "0.10.1+2" pointycastle: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4196d007..075d9695 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: json_annotation: ^4.8.1 printing: ^5.11.1 package_info_plus: ^4.1.0 - flutter_typeahead: ^4.8.0 + flutter_typeahead: ^5.2.0 provider: ^6.0.5 json_data_explorer: git: From 5f3309f358dbb20c307045ed6cff0c98649cd16e Mon Sep 17 00:00:00 2001 From: Yousef Rabia Date: Sun, 25 Feb 2024 23:02:47 +0200 Subject: [PATCH 11/85] UI Spacing Issue in Settings Screen --- lib/consts.dart | 3 +++ lib/screens/settings_page.dart | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/consts.dart b/lib/consts.dart index f8f9f97c..90096f83 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -90,6 +90,9 @@ const kP8CollectionPane = EdgeInsets.only( //right: 4.0, // bottom: 8.0, ); +const kPb10 = EdgeInsets.only( + bottom: 10, +); const kPr8CollectionPane = EdgeInsets.only(right: 8.0); const kpsV5 = EdgeInsets.symmetric(vertical: 2); const kHSpacer4 = SizedBox(width: 4); diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index d979af80..4a7cb302 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -61,7 +61,7 @@ class SettingsPage extends ConsumerWidget { }, ), ListTile( - contentPadding: EdgeInsets.zero, + contentPadding: kPb10, hoverColor: kColorTransparent, title: const Text('Default URI Scheme'), subtitle: Text( @@ -82,7 +82,7 @@ class SettingsPage extends ConsumerWidget { }).toList()), ), ListTile( - contentPadding: EdgeInsets.zero, + contentPadding: kPb10, hoverColor: kColorTransparent, title: const Text('Default Code Generator'), trailing: DropdownMenu( From d2a9fa5b0e15a7be0d668dd096763f3ba3601729 Mon Sep 17 00:00:00 2001 From: PCoder23 Date: Mon, 26 Feb 2024 04:07:26 +0530 Subject: [PATCH 12/85] search field alignment --- lib/widgets/textfields.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/widgets/textfields.dart b/lib/widgets/textfields.dart index c288b0a6..12102fc6 100644 --- a/lib/widgets/textfields.dart +++ b/lib/widgets/textfields.dart @@ -95,7 +95,6 @@ class JsonSearchField extends StatelessWidget { controller: controller, onChanged: onChanged, style: kCodeStyle, - cursorHeight: 18, decoration: const InputDecoration( isDense: true, border: InputBorder.none, From e497f8dfaa5a61e58109484a6bf9266aa064298f Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Mon, 26 Feb 2024 04:13:33 +0530 Subject: [PATCH 13/85] Update har_utils_test.dart --- test/utils/har_utils_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/utils/har_utils_test.dart b/test/utils/har_utils_test.dart index 0dd16d62..e3319fad 100644 --- a/test/utils/har_utils_test.dart +++ b/test/utils/har_utils_test.dart @@ -68,7 +68,7 @@ void main() { }, { 'startedDateTime': 'ABC', - 'comment': 'id:enabledRows', + 'comment': 'id:get11', 'serverIPAddress': '', 'time': 0, 'timings': { From 11515a988b6b2daadb577f28f2780e41a49620bb Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Mon, 26 Feb 2024 03:51:44 +0530 Subject: [PATCH 14/85] fix: colors not changing in headers suggestion list --- lib/widgets/headerfield.dart | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/widgets/headerfield.dart b/lib/widgets/headerfield.dart index 52dd8ec5..dbe45886 100644 --- a/lib/widgets/headerfield.dart +++ b/lib/widgets/headerfield.dart @@ -54,7 +54,7 @@ class _HeaderFieldState extends State { var colorScheme = widget.colorScheme ?? Theme.of(context).colorScheme; return TypeAheadField( key: Key(widget.keyId), - hideOnEmpty: false, + hideOnEmpty: true, controller: controller, onSelected: (value) { setState(() { @@ -65,11 +65,15 @@ class _HeaderFieldState extends State { itemBuilder: (context, String suggestion) { return ListTile( dense: true, - title: Text(suggestion), + title: Text( + suggestion, + style: TextStyle(color: colorScheme.inverseSurface), + ), ); }, suggestionsCallback: headerSuggestionCallback, - decorationBuilder: suggestionBoxDecorations, + decorationBuilder: (context, child) => + suggestionBoxDecorations(context, child, colorScheme), constraints: const BoxConstraints(maxHeight: 400), builder: (context, controller, focusNode) => TextField( onChanged: widget.onChanged, @@ -97,9 +101,11 @@ class _HeaderFieldState extends State { ); } - Material suggestionBoxDecorations(BuildContext context, Widget child) { + Material suggestionBoxDecorations( + BuildContext context, Widget child, ColorScheme colorScheme) { return Material( elevation: 4, + color: colorScheme.surface, shape: RoundedRectangleBorder( side: BorderSide(color: Theme.of(context).dividerColor, width: 1.2), borderRadius: const BorderRadius.vertical(bottom: Radius.circular(8)), From 32242500be61eebacc6b21dc37e478b5231043f1 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Mon, 26 Feb 2024 05:43:36 +0530 Subject: [PATCH 15/85] Create pull_request_template.md --- .github/pull_request_template.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..721b55e6 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,19 @@ +## PR Description + +_Add your description_ + +## Related Issues + +- Related Issue # +- Closes # + +### Checklist +- [ ] I have gone through the [contributing guide](https://github.com/foss42/apidash/blob/main/CONTRIBUTING.md) +- [ ] I have run the tests (`flutter test`) and all tests are passing + +## Added/updated tests? +_We encourage you to add relevant test cases._ + +- [ ] Yes +- [ ] No, and this is why: _please replace this line with details on why tests have not been included_ +- [ ] I need help with writing tests From 79b9c312dee740ca2a3efa5e89ee8dc4531a9649 Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Mon, 26 Feb 2024 06:46:50 +0530 Subject: [PATCH 16/85] fix(headers list): scrollbar color not changing in darkmode --- lib/widgets/headerfield.dart | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/widgets/headerfield.dart b/lib/widgets/headerfield.dart index dbe45886..be1a7171 100644 --- a/lib/widgets/headerfield.dart +++ b/lib/widgets/headerfield.dart @@ -75,6 +75,25 @@ class _HeaderFieldState extends State { decorationBuilder: (context, child) => suggestionBoxDecorations(context, child, colorScheme), constraints: const BoxConstraints(maxHeight: 400), + listBuilder: (context, children) => Theme( + data: ThemeData( + scrollbarTheme: ScrollbarThemeData( + thumbColor: MaterialStateProperty.all(colorScheme.inverseSurface), + trackColor: MaterialStateProperty.all( + colorScheme.inverseSurface.withOpacity(0.3)), + ), + ), + child: ListView.builder( + shrinkWrap: true, + itemCount: children.length, + itemBuilder: (context, index) { + return Container( + margin: const EdgeInsets.all(8), + child: children[index], + ); + }, + ), + ), builder: (context, controller, focusNode) => TextField( onChanged: widget.onChanged, controller: controller, From b802ca7f84537e719b653babba71bfca0ceeb51e Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Mon, 26 Feb 2024 09:01:48 +0530 Subject: [PATCH 17/85] fix(headers list): some colorscheme fixes --- lib/widgets/headerfield.dart | 44 ++++++++++-------------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/lib/widgets/headerfield.dart b/lib/widgets/headerfield.dart index be1a7171..5bce6c8f 100644 --- a/lib/widgets/headerfield.dart +++ b/lib/widgets/headerfield.dart @@ -65,35 +65,13 @@ class _HeaderFieldState extends State { itemBuilder: (context, String suggestion) { return ListTile( dense: true, - title: Text( - suggestion, - style: TextStyle(color: colorScheme.inverseSurface), - ), + title: Text(suggestion), ); }, suggestionsCallback: headerSuggestionCallback, decorationBuilder: (context, child) => suggestionBoxDecorations(context, child, colorScheme), constraints: const BoxConstraints(maxHeight: 400), - listBuilder: (context, children) => Theme( - data: ThemeData( - scrollbarTheme: ScrollbarThemeData( - thumbColor: MaterialStateProperty.all(colorScheme.inverseSurface), - trackColor: MaterialStateProperty.all( - colorScheme.inverseSurface.withOpacity(0.3)), - ), - ), - child: ListView.builder( - shrinkWrap: true, - itemCount: children.length, - itemBuilder: (context, index) { - return Container( - margin: const EdgeInsets.all(8), - child: children[index], - ); - }, - ), - ), builder: (context, controller, focusNode) => TextField( onChanged: widget.onChanged, controller: controller, @@ -120,17 +98,19 @@ class _HeaderFieldState extends State { ); } - Material suggestionBoxDecorations( + Theme suggestionBoxDecorations( BuildContext context, Widget child, ColorScheme colorScheme) { - return Material( - elevation: 4, - color: colorScheme.surface, - shape: RoundedRectangleBorder( - side: BorderSide(color: Theme.of(context).dividerColor, width: 1.2), - borderRadius: const BorderRadius.vertical(bottom: Radius.circular(8)), + return Theme( + data: ThemeData(colorScheme: colorScheme), + child: Material( + elevation: 4, + shape: RoundedRectangleBorder( + side: BorderSide(color: Theme.of(context).dividerColor, width: 1.2), + borderRadius: const BorderRadius.vertical(bottom: Radius.circular(8)), + ), + clipBehavior: Clip.hardEdge, + child: child, ), - clipBehavior: Clip.hardEdge, - child: child, ); } From 3cf677e89bfa8040187ad9db8cba6a7c6796c30a Mon Sep 17 00:00:00 2001 From: Elise Date: Sun, 25 Feb 2024 21:17:19 -0800 Subject: [PATCH 18/85] Fix Kotlin codegen to import MultipartBody --- lib/codegen/kotlin/okhttp.dart | 11 ++++++-- test/codegen/kotlin_okhttp_codegen_test.dart | 27 ++++++++++++++++++++ test/request_models.dart | 14 +++++++++- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/lib/codegen/kotlin/okhttp.dart b/lib/codegen/kotlin/okhttp.dart index 07e5a92b..bd8f0489 100644 --- a/lib/codegen/kotlin/okhttp.dart +++ b/lib/codegen/kotlin/okhttp.dart @@ -7,7 +7,7 @@ import 'package:apidash/consts.dart'; class KotlinOkHttpCodeGen { final String kTemplateStart = """import okhttp3.OkHttpClient -import okhttp3.Request{{importForQuery}}{{importForBody}} +import okhttp3.Request{{importForQuery}}{{importForBody}}{{importForFormData}} fun main() { val client = OkHttpClient() @@ -23,6 +23,10 @@ import okhttp3.HttpUrl.Companion.toHttpUrl"""; import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.MediaType.Companion.toMediaType"""; + final String kStringImportForFormData = """ + +import okhttp3.MultipartBody"""; + final String kTemplateUrl = ''' val url = "{{url}}" @@ -77,6 +81,7 @@ import okhttp3.MediaType.Companion.toMediaType"""; String result = ""; bool hasQuery = false; bool hasBody = false; + bool hasFormData = false; String url = requestModel.url; if (!url.contains("://") && url.isNotEmpty) { @@ -109,6 +114,7 @@ import okhttp3.MediaType.Companion.toMediaType"""; var method = requestModel.method; var requestBody = requestModel.requestBody; if (requestModel.isFormDataRequest) { + hasFormData = true; var formDataTemplate = jj.Template(kFormDataBody); result += formDataTemplate.render({ @@ -128,7 +134,8 @@ import okhttp3.MediaType.Companion.toMediaType"""; var templateStart = jj.Template(kTemplateStart); var stringStart = templateStart.render({ "importForQuery": hasQuery ? kStringImportForQuery : "", - "importForBody": hasBody ? kStringImportForBody : "" + "importForBody": hasBody ? kStringImportForBody : "", + "importForFormData": hasFormData ? kStringImportForFormData : "" }); result = stringStart + result; diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index 4f3220fa..ef8ca190 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -478,6 +478,33 @@ fun main() { expect(kotlinOkHttpCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); + + test('POST 4', () { + const expectedCode = r'''import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.MultipartBody + +fun main() { + val client = OkHttpClient() + + val url = "https://api.foss42.com/case/lower" + val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("text","I LOVE Flutter") + .build() + val request = Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .post(body) + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +'''; + expect(kotlinOkHttpCodeGen.getCode(requestModelPost4, "https"), + expectedCode); + }); }); group('PUT Request', () { diff --git a/test/request_models.dart b/test/request_models.dart index d7f7df21..e19c08a0 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -1,4 +1,4 @@ -import 'package:apidash/models/models.dart' show NameValueModel, RequestModel; +import 'package:apidash/models/models.dart' show NameValueModel, RequestModel, FormDataModel; import 'package:apidash/consts.dart'; /// Basic GET request model @@ -226,6 +226,18 @@ const requestModelPost3 = RequestModel( ], ); +/// POST request model with FormData +const requestModelPost4 = RequestModel( + id: 'post3', + url: 'https://api.foss42.com/case/lower', + method: HTTPVerb.post, + requestFormDataList: [FormDataModel(name: "text", value: "I LOVE Flutter", type: FormDataType.text)], + requestBodyContentType: ContentType.formdata, + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + ], +); + /// PUT request model const requestModelPut1 = RequestModel( id: 'put1', From dcc72f1cccd2e209764675abee81547902539b13 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Tue, 27 Feb 2024 10:40:09 +0530 Subject: [PATCH 19/85] Update analysis_options.yaml --- analysis_options.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 1d5eafa4..bde061bb 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -3,8 +3,6 @@ include: package:flutter_lints/flutter.yaml analyzer: errors: invalid_annotation_target: ignore - enable-experiment: - - records linter: rules: From bc29b1afc39e1646cb78cb9b223c1e87aab8bb91 Mon Sep 17 00:00:00 2001 From: PCoder23 Date: Tue, 27 Feb 2024 17:28:33 +0530 Subject: [PATCH 20/85] added more headers --- lib/utils/header_utils.dart | 58 ++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index 45a24fe9..20f975cb 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -1,5 +1,9 @@ + Map headers = { + "Age": "It is a response header. It defines the times in seconds of the object that have been in the proxy cache.", "Accept": "Specifies the media types that are acceptable for the response.", + "Accept-charset": + "It is a request type header. This header is used to indicate what character set are acceptable for the response from the server.", "Accept-Encoding": "Indicates the encoding methods the client can understand.", "Access-Control-Allow-Headers": @@ -16,11 +20,19 @@ Map headers = { "Used in preflight requests during CORS to indicate the HTTP method that will be used in the actual request.", "Accept-Language": "Specifies the preferred natural language and locale for the response.", + "Accept-CH": + "It is a response-type header. It specify which Client Hints headers client should include in subsequent requests.", + "Accept-CH-Lifetime": + "It is a response-type header used to specify persistence of Accept-CH header value.", "Authorization": "Contains credentials for authenticating the client with the server.", "Authorization Bearer Token": "Often used for token-based authentication.", + "Alt-Svc": + "It is use to reach the website in an alternate way.", "Cache-Control": "Provides directives for caching mechanisms in both requests and responses.", + "Clear-Site-Data": + "It is a response-type header. This header is used in deleting the browsing data which is in the requesting website.", "Connection": "Informs whether the connection stays open or close after the current transaction finishes.", "Content-Disposition": @@ -30,7 +42,7 @@ Map headers = { "Content-Length": "Indicates the size of the message body sent to the recipient in bytes.", "Content-Security-Policy": - "Controls the sources from which content can be loaded on a web page to mitigate various types of attacks.", + "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.", @@ -40,9 +52,18 @@ Map headers = { "Controls which documents are allowed to open a new window or access the current window.", "Cross-Origin-Resource-Policy": "Controls how cross-origin requests for resources are handled.", + "Content-DPR": + "It is a response-type header. It is used to define the ratio between physical pixels over CSS pixels of the selected image response.", + "DPR": "It is response-type header, It is used to defines the ratio of the physical pixels over the CSS pixels of the current window of the device.", + "Device-Memory": + "It is used to specify the approximate ram left on the client device.", "Date": "Indicates the date and time at which the message was sent.", "DNT": "Informs websites whether the user's preference is to opt out of online tracking.", + "Early-Data": + "It is a request-type header. This header is used indicate that the request has been conveyed in early data.", + "ETag": + "It is a response-type header used as an identifier for a specific version of a resource.", "Expect": "Indicates certain expectations that need to be met by the server.", "Expires": "Contains the date/time after which the response is considered expired", @@ -57,9 +78,22 @@ Map headers = { "Used in conjunction with the Range header to conditionally request a partial resource.", "If-Unmodified-Since": "Used for conditional requests, allows the server to respond based on certain conditions.", + "Keep-Alive": + "It is a general-type header used to inform that how long a persistent connection should stay open.", + "Last-Modified": + "The last modified response header is a header sent by the server specifying the date of the last modification of the requested source. This is the formal definition of Last-Modified of HTTP headers.", "Location": "Indicates the URL a client should redirect to for further interaction.", + "Large-Allocation": + "It is a response-type header that informs supported browsers (currently only Firefox) about the needs of a memory that allows them to make sure that the large-allocation succeeds and also start a new process using some unfragmented memory.", + "Link": + "It is entity-type header used to serializing one or more links in HTTP headers.", "Origin": "Specifies the origin of a cross-origin request.", + "Proxy-Authenticate": "It is a response header gives access to a resource file by defining an authorization method. It allows the proxy server to transmit the request further by authenticating it.", + "Proxy-Authorization": + "It is a request type of header. This header contains the credentials to authenticate between the user agent and the user-specified server.", + "Pragma": + "It is general-type header, but response behavior is not specified and thus implementation-specific.", "Range": "Used to request only part of a resource, typically in the context of downloading large files.", "Referer": @@ -68,14 +102,34 @@ Map headers = { "Specifies how much information the browser should include in the Referer header when navigating to other pages.", "Retry-After": "Informs the client how long it should wait before making another request after a server has responded with a rate-limiting status code.", + "Save-Data": + "It is used to reduce the usage of the data on the client side.", "Server": "Indicates the software used by the origin server.", + "Server-Timing": + "It is a response-type header. This header is used to communicate between two or more metrics and descriptions for a given request-response cycle from the user agent.", + "SourceMap": + "It is a response-type header used to map original source from the transformed source. For example, the JavaScript resources are transformed to some other source from its original by the browsers at the time of execution.", "Strict-Transport-Security": "Instructs the browser to always use HTTPS for the given domain.", + "Timing-Allow-Origin": + "It is a response type header. It specify origins that are allowed to see values of attributes retrieved via features of the Resource Timing API.", + "TK": + "It is a response type header, it indicates the tracking status.", "TE": "Specifies the transfer encodings that are acceptable to the client.", "User-Agent": "Identifies the client software and version making the request.", + "Vary": + "It is response-type header. It is used by the server to indicate which headers it used when selecting a representation of a resource in a content negotiation algorithm.", "Via": "Indicates intermediate proxies or gateways through which the request or response has passed.", + "Viewport-Width": + "It is used to indicates the layout viewport width in CSS pixels.", + "Width": + "It is a request-type header. This header is used indicates the desired resource width in physical pixels.", + "Warnings": + "It is a general type header that is used to inform possible problems to the client.", + "WWW-Authenticate": + "It is a response header that defines the authentication method. It should be used to gain access to a resource.", "X-Api-Key": "Used to authenticate requests to an API with an API key.", "X-Content-Type-Options": "Used to prevent browsers from MIME-sniffing a response.", @@ -89,6 +143,8 @@ Map headers = { "Indicates whether the request was made with JavaScript using XMLHttpRequest.", "X-XSS-Protection": "Enables or disables the browser's built-in cross-site scripting (XSS) filter.", + "X-DNS-Prefetch-Control": + "It is response-type header that is used to control the DNS prefetch." }; List getHeaderSuggestions(String pattern) { From 4e3b4a1f9ce72163d067bbe7078bbe438840cdfb Mon Sep 17 00:00:00 2001 From: PCoder23 Date: Tue, 27 Feb 2024 17:54:54 +0530 Subject: [PATCH 21/85] updated header test --- test/utils/header_utils_test.dart | 42 ++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/test/utils/header_utils_test.dart b/test/utils/header_utils_test.dart index 73c15721..5605c66b 100644 --- a/test/utils/header_utils_test.dart +++ b/test/utils/header_utils_test.dart @@ -1,6 +1,36 @@ import 'package:apidash/utils/header_utils.dart'; import 'package:test/test.dart'; +// new headers +// X-DNS-Proxy-Authenticate +// Proxy-Authorization +// WWW-Authenticate +// Age +// Clear-Site-Data +// Pragma +// Warnings +// Accept-CH +// Accept-CH-Lifetime +// Content-DPR +// DPR +// Device-Memory +// Early-Data +// Save-Data +// Viewport-Width +// Width +// Last-Modified +// ETag +// Vary +// Keep-Alive +// Accept-charset +// Timing-Allow-Origin +// TK +// Alt-Svc +// Large-Allocation +// Link +// Server-Timing +// SourceMap +// X-DNS-Prefetch-Control void main() { group("Testing getHeaderSuggestions function", () { test("Testing using Allow-Headers", () { @@ -17,7 +47,7 @@ void main() { test("Testing using Allow-Origin", () { String pattern = "Allow-Origin"; - List expected = ["Access-Control-Allow-Origin"]; + List expected = ["Access-Control-Allow-Origin", "Timing-Allow-Origin"]; expect(getHeaderSuggestions(pattern), expected); }); @@ -93,7 +123,8 @@ void main() { List expected = [ "Access-Control-Allow-Headers", "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin" + "Access-Control-Allow-Origin", + "Timing-Allow-Origin" ]; expect(getHeaderSuggestions(pattern), expected); }); @@ -106,6 +137,7 @@ void main() { 'Content-Length', 'Content-Security-Policy', 'Content-Type', + "Content-DPR", 'X-Content-Type-Options' ]; expect(getHeaderSuggestions(pattern), expected); @@ -121,7 +153,8 @@ void main() { "X-Forwarded-For", "X-Frame-Options", "X-Requested-With", - "X-XSS-Protection" + "X-XSS-Protection", + "X-DNS-Prefetch-Control", ]; expect(getHeaderSuggestions(pattern), expected); }); @@ -133,7 +166,8 @@ void main() { 'Cross-Origin-Embedder-Policy', 'Cross-Origin-Opener-Policy', 'Cross-Origin-Resource-Policy', - 'Origin' + 'Origin', + 'Timing-Allow-Origin' ]; expect(getHeaderSuggestions(pattern), expected); }); From 993621793a672c80b7fbc92bdaa846136fc342f7 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Tue, 27 Feb 2024 21:43:15 +0530 Subject: [PATCH 22/85] Delete analyze.yml --- .github/workflows/analyze.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/analyze.yml diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml deleted file mode 100644 index 0d5b1fb6..00000000 --- a/.github/workflows/analyze.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: "Code Analysis" -on: [ push ] - - -jobs: - Flutter-Analyze: - runs-on: ubuntu-latest - steps: - - run: pwd - - name: Checkout Code - uses: actions/checkout@v3 - - - name: Get Flutter Env - uses: subosito/flutter-action@v2 - with: - channel: 'stable' - - run: flutter --version - - - name: Code Analysis - run: | - flutter pub get - flutter analyze From 6acca4cf87ce92b6624fc58f0040888b1e79b0cf Mon Sep 17 00:00:00 2001 From: PCoder23 Date: Thu, 29 Feb 2024 12:44:37 +0530 Subject: [PATCH 23/85] corrected added headers --- lib/utils/header_utils.dart | 70 +++++++------------------------ test/utils/header_utils_test.dart | 45 +++----------------- 2 files changed, 21 insertions(+), 94 deletions(-) diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index 20f975cb..101738a0 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -1,11 +1,8 @@ - Map headers = { - "Age": "It is a response header. It defines the times in seconds of the object that have been in the proxy cache.", "Accept": "Specifies the media types that are acceptable for the response.", - "Accept-charset": - "It is a request type header. This header is used to indicate what character set are acceptable for the response from the server.", "Accept-Encoding": "Indicates the encoding methods the client can understand.", + "Accept-Charset": "Specifies the character sets that are acceptable.", "Access-Control-Allow-Headers": "Specifies a list of HTTP headers that can be used in an actual request after a preflight request including the Access-Control-Request-Headers header is made.", "Access-Control-Allow-Methods": @@ -20,19 +17,11 @@ Map headers = { "Used in preflight requests during CORS to indicate the HTTP method that will be used in the actual request.", "Accept-Language": "Specifies the preferred natural language and locale for the response.", - "Accept-CH": - "It is a response-type header. It specify which Client Hints headers client should include in subsequent requests.", - "Accept-CH-Lifetime": - "It is a response-type header used to specify persistence of Accept-CH header value.", "Authorization": "Contains credentials for authenticating the client with the server.", "Authorization Bearer Token": "Often used for token-based authentication.", - "Alt-Svc": - "It is use to reach the website in an alternate way.", "Cache-Control": "Provides directives for caching mechanisms in both requests and responses.", - "Clear-Site-Data": - "It is a response-type header. This header is used in deleting the browsing data which is in the requesting website.", "Connection": "Informs whether the connection stays open or close after the current transaction finishes.", "Content-Disposition": @@ -42,7 +31,7 @@ Map headers = { "Content-Length": "Indicates the size of the message body sent to the recipient in bytes.", "Content-Security-Policy": - "Controls the sources from which content can be loaded on a web page to mitigate various types of attacks.", + "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.", @@ -52,21 +41,17 @@ Map headers = { "Controls which documents are allowed to open a new window or access the current window.", "Cross-Origin-Resource-Policy": "Controls how cross-origin requests for resources are handled.", - "Content-DPR": - "It is a response-type header. It is used to define the ratio between physical pixels over CSS pixels of the selected image response.", - "DPR": "It is response-type header, It is used to defines the ratio of the physical pixels over the CSS pixels of the current window of the device.", - "Device-Memory": - "It is used to specify the approximate ram left on the client device.", "Date": "Indicates the date and time at which the message was sent.", + "Device-Memory": + "Indicates the approximate amount of device memory in gigabytes.", "DNT": "Informs websites whether the user's preference is to opt out of online tracking.", - "Early-Data": - "It is a request-type header. This header is used indicate that the request has been conveyed in early data.", - "ETag": - "It is a response-type header used as an identifier for a specific version of a resource.", "Expect": "Indicates certain expectations that need to be met by the server.", "Expires": "Contains the date/time after which the response is considered expired", + "Forwarded": + "Contains information from the client-facing side of proxy servers that is altered or lost when a proxy is involved in the path of the request.", + "From": "Contains an Internet email address for a human user who controls the requesting user agent.", "Host": "Specifies the domain name of the server and the port number.", "If-Match": "Used for conditional requests, allows the server to respond based on certain conditions.", @@ -79,21 +64,14 @@ Map headers = { "If-Unmodified-Since": "Used for conditional requests, allows the server to respond based on certain conditions.", "Keep-Alive": - "It is a general-type header used to inform that how long a persistent connection should stay open.", - "Last-Modified": - "The last modified response header is a header sent by the server specifying the date of the last modification of the requested source. This is the formal definition of Last-Modified of HTTP headers.", + "Used to allow the connection to be reused for further requests.", "Location": "Indicates the URL a client should redirect to for further interaction.", - "Large-Allocation": - "It is a response-type header that informs supported browsers (currently only Firefox) about the needs of a memory that allows them to make sure that the large-allocation succeeds and also start a new process using some unfragmented memory.", - "Link": - "It is entity-type header used to serializing one or more links in HTTP headers.", + "Max-Forwards": + "Indicates the remaining number of times a request can be forwarded by proxies.", "Origin": "Specifies the origin of a cross-origin request.", - "Proxy-Authenticate": "It is a response header gives access to a resource file by defining an authorization method. It allows the proxy server to transmit the request further by authenticating it.", "Proxy-Authorization": - "It is a request type of header. This header contains the credentials to authenticate between the user agent and the user-specified server.", - "Pragma": - "It is general-type header, but response behavior is not specified and thus implementation-specific.", + "Contains credentials for authenticating a client with a proxy server.", "Range": "Used to request only part of a resource, typically in the context of downloading large files.", "Referer": @@ -103,33 +81,17 @@ Map headers = { "Retry-After": "Informs the client how long it should wait before making another request after a server has responded with a rate-limiting status code.", "Save-Data": - "It is used to reduce the usage of the data on the client side.", + "Indicates the client's preference for reduced data usage.", "Server": "Indicates the software used by the origin server.", - "Server-Timing": - "It is a response-type header. This header is used to communicate between two or more metrics and descriptions for a given request-response cycle from the user agent.", - "SourceMap": - "It is a response-type header used to map original source from the transformed source. For example, the JavaScript resources are transformed to some other source from its original by the browsers at the time of execution.", "Strict-Transport-Security": "Instructs the browser to always use HTTPS for the given domain.", - "Timing-Allow-Origin": - "It is a response type header. It specify origins that are allowed to see values of attributes retrieved via features of the Resource Timing API.", - "TK": - "It is a response type header, it indicates the tracking status.", "TE": "Specifies the transfer encodings that are acceptable to the client.", + "Upgrade-Insecure-Requests": + "Instructs the browser to prefer secure connections when available.", "User-Agent": "Identifies the client software and version making the request.", - "Vary": - "It is response-type header. It is used by the server to indicate which headers it used when selecting a representation of a resource in a content negotiation algorithm.", "Via": "Indicates intermediate proxies or gateways through which the request or response has passed.", - "Viewport-Width": - "It is used to indicates the layout viewport width in CSS pixels.", - "Width": - "It is a request-type header. This header is used indicates the desired resource width in physical pixels.", - "Warnings": - "It is a general type header that is used to inform possible problems to the client.", - "WWW-Authenticate": - "It is a response header that defines the authentication method. It should be used to gain access to a resource.", "X-Api-Key": "Used to authenticate requests to an API with an API key.", "X-Content-Type-Options": "Used to prevent browsers from MIME-sniffing a response.", @@ -143,8 +105,6 @@ Map headers = { "Indicates whether the request was made with JavaScript using XMLHttpRequest.", "X-XSS-Protection": "Enables or disables the browser's built-in cross-site scripting (XSS) filter.", - "X-DNS-Prefetch-Control": - "It is response-type header that is used to control the DNS prefetch." }; List getHeaderSuggestions(String pattern) { @@ -153,4 +113,4 @@ List getHeaderSuggestions(String pattern) { (element) => element.toLowerCase().contains(pattern.toLowerCase()), ) .toList(); -} +} \ No newline at end of file diff --git a/test/utils/header_utils_test.dart b/test/utils/header_utils_test.dart index 5605c66b..79e6ffd1 100644 --- a/test/utils/header_utils_test.dart +++ b/test/utils/header_utils_test.dart @@ -1,36 +1,6 @@ import 'package:apidash/utils/header_utils.dart'; import 'package:test/test.dart'; -// new headers -// X-DNS-Proxy-Authenticate -// Proxy-Authorization -// WWW-Authenticate -// Age -// Clear-Site-Data -// Pragma -// Warnings -// Accept-CH -// Accept-CH-Lifetime -// Content-DPR -// DPR -// Device-Memory -// Early-Data -// Save-Data -// Viewport-Width -// Width -// Last-Modified -// ETag -// Vary -// Keep-Alive -// Accept-charset -// Timing-Allow-Origin -// TK -// Alt-Svc -// Large-Allocation -// Link -// Server-Timing -// SourceMap -// X-DNS-Prefetch-Control void main() { group("Testing getHeaderSuggestions function", () { test("Testing using Allow-Headers", () { @@ -47,7 +17,7 @@ void main() { test("Testing using Allow-Origin", () { String pattern = "Allow-Origin"; - List expected = ["Access-Control-Allow-Origin", "Timing-Allow-Origin"]; + List expected = ["Access-Control-Allow-Origin"]; expect(getHeaderSuggestions(pattern), expected); }); @@ -123,8 +93,7 @@ void main() { List expected = [ "Access-Control-Allow-Headers", "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin", - "Timing-Allow-Origin" + "Access-Control-Allow-Origin" ]; expect(getHeaderSuggestions(pattern), expected); }); @@ -137,7 +106,6 @@ void main() { 'Content-Length', 'Content-Security-Policy', 'Content-Type', - "Content-DPR", 'X-Content-Type-Options' ]; expect(getHeaderSuggestions(pattern), expected); @@ -147,14 +115,14 @@ void main() { String pattern = "x-"; List expected = [ "Access-Control-Max-Age", + "Max-Forwards", "X-Api-Key", "X-Content-Type-Options", "X-CSRF-Token", "X-Forwarded-For", "X-Frame-Options", "X-Requested-With", - "X-XSS-Protection", - "X-DNS-Prefetch-Control", + "X-XSS-Protection" ]; expect(getHeaderSuggestions(pattern), expected); }); @@ -166,10 +134,9 @@ void main() { 'Cross-Origin-Embedder-Policy', 'Cross-Origin-Opener-Policy', 'Cross-Origin-Resource-Policy', - 'Origin', - 'Timing-Allow-Origin' + 'Origin' ]; expect(getHeaderSuggestions(pattern), expected); }); }); -} +} \ No newline at end of file From 51be09b076d770c02bed24224e82f934a3380c12 Mon Sep 17 00:00:00 2001 From: PCoder23 Date: Thu, 29 Feb 2024 20:52:17 +0530 Subject: [PATCH 24/85] added the line back --- lib/utils/header_utils.dart | 2 +- test/utils/header_utils_test.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index 101738a0..1450cc01 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -113,4 +113,4 @@ List getHeaderSuggestions(String pattern) { (element) => element.toLowerCase().contains(pattern.toLowerCase()), ) .toList(); -} \ No newline at end of file +} diff --git a/test/utils/header_utils_test.dart b/test/utils/header_utils_test.dart index 79e6ffd1..139ba553 100644 --- a/test/utils/header_utils_test.dart +++ b/test/utils/header_utils_test.dart @@ -139,4 +139,4 @@ void main() { expect(getHeaderSuggestions(pattern), expected); }); }); -} \ No newline at end of file +} From ad05c3f32708b47e8312d078d0eef26f03988b27 Mon Sep 17 00:00:00 2001 From: Chinmay Chaudhari Date: Thu, 29 Feb 2024 23:27:31 +0530 Subject: [PATCH 25/85] Added vertical scrolling --- lib/widgets/csv_previewer.dart | 52 ++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/lib/widgets/csv_previewer.dart b/lib/widgets/csv_previewer.dart index cdfc45b0..d3b88261 100644 --- a/lib/widgets/csv_previewer.dart +++ b/lib/widgets/csv_previewer.dart @@ -11,36 +11,40 @@ class CsvPreviewer extends StatelessWidget { @override Widget build(BuildContext context) { try { - final List> csvData = const CsvToListConverter().convert(body, eol: '\n'); - return SingleChildScrollView( + final List> csvData = + const CsvToListConverter().convert(body, eol: '\n'); + return SingleChildScrollView( + scrollDirection: Axis.vertical, + child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: DataTable( columns: csvData[0] - .map( - (item) => DataColumn( - label: Text( - item.toString(), + .map( + (item) => DataColumn( + label: Text( + item.toString(), + ), ), - ), - ) - .toList(), + ) + .toList(), rows: csvData - .skip(1) - .map( - (csvrow) => DataRow( - cells: csvrow - .map( - (csvItem) => DataCell( - Text( - csvItem.toString(), - ), - ), - ) - .toList(), - ), - ) - .toList(), + .skip(1) + .map( + (csvrow) => DataRow( + cells: csvrow + .map( + (csvItem) => DataCell( + Text( + csvItem.toString(), + ), + ), + ) + .toList(), + ), + ) + .toList(), ), + ), ); } catch (e) { return const ErrorMessage(message: kCsvError); From dc25c6a70edacdcd7820f5e2eeba64a906406cc8 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Fri, 1 Mar 2024 01:10:49 +0530 Subject: [PATCH 26/85] Updated csv_previewer --- analysis_options.yaml | 3 +++ lib/consts.dart | 3 +-- lib/widgets/csv_previewer.dart | 6 +++--- lib/widgets/json_previewer.dart | 1 + lib/widgets/previewer.dart | 9 ++------- pubspec.lock | 8 ++++++++ test/widget_test.dart | 3 +++ 7 files changed, 21 insertions(+), 12 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index bde061bb..9a1eabb4 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -3,6 +3,9 @@ include: package:flutter_lints/flutter.yaml analyzer: errors: invalid_annotation_target: ignore + exclude: + - "**/*.freezed.dart" + - "**/*.g.dart" linter: rules: diff --git a/lib/consts.dart b/lib/consts.dart index 4aba147f..d157b7fa 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -378,7 +378,7 @@ const Map>> kSubTypeDefaultViewOptions: kRawBodyViewOptions, kSubTypeCss: kCodeRawBodyViewOptions, kSubTypeHtml: kCodeRawBodyViewOptions, - kSubTypeCsv: kPreviewCodeRawBodyViewOptions, + kSubTypeCsv: kPreviewRawBodyViewOptions, kSubTypeJavascript: kCodeRawBodyViewOptions, kSubTypeMarkdown: kCodeRawBodyViewOptions, kSubTypeTextXml: kCodeRawBodyViewOptions, @@ -499,7 +499,6 @@ const kRaiseIssue = const kCsvError = "There seems to be an issue rendering this CSV. Please raise an issue in API Dash GitHub repo so that we can resolve it."; - const kHintTextUrlCard = "Enter API endpoint like api.foss42.com/country/codes"; const kLabelPlusNew = "+ New"; const kLabelSend = "Send"; diff --git a/lib/widgets/csv_previewer.dart b/lib/widgets/csv_previewer.dart index d3b88261..17e8dd48 100644 --- a/lib/widgets/csv_previewer.dart +++ b/lib/widgets/csv_previewer.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:csv/csv.dart'; -import 'package:apidash/consts.dart'; -import 'package:apidash/widgets/widgets.dart'; +import 'error_message.dart'; +import '../consts.dart'; class CsvPreviewer extends StatelessWidget { - const CsvPreviewer({Key? key, required this.body}) : super(key: key); + const CsvPreviewer({super.key, required this.body}); final String body; diff --git a/lib/widgets/json_previewer.dart b/lib/widgets/json_previewer.dart index 078a9721..46d066bf 100644 --- a/lib/widgets/json_previewer.dart +++ b/lib/widgets/json_previewer.dart @@ -154,6 +154,7 @@ class _JsonPreviewerState extends State { @override void didUpdateWidget(JsonPreviewer oldWidget) { + super.didUpdateWidget(oldWidget); if (oldWidget.code != widget.code) { store.buildNodes(widget.code, areAllCollapsed: true); store.expandAll(); diff --git a/lib/widgets/previewer.dart b/lib/widgets/previewer.dart index 6a6eb828..dd2f5186 100644 --- a/lib/widgets/previewer.dart +++ b/lib/widgets/previewer.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'package:apidash/widgets/csv_previewer.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:printing/printing.dart'; @@ -8,6 +7,7 @@ import 'package:vector_graphics_compiler/vector_graphics_compiler.dart'; import 'error_message.dart'; import 'uint8_audio_player.dart'; import 'json_previewer.dart'; +import 'csv_previewer.dart'; import '../consts.dart'; class Previewer extends StatefulWidget { @@ -83,11 +83,7 @@ class _PreviewerState extends State { ); } if (widget.type == kTypeText && widget.subtype == kSubTypeCsv) { - try { - return CsvPreviewer(body: widget.body); - } catch (e) { - return const ErrorMessage(message: kCsvError); - } + return CsvPreviewer(body: widget.body); } if (widget.type == kTypeVideo) { // TODO: Video Player @@ -97,5 +93,4 @@ class _PreviewerState extends State { : "$kMimeTypeRaiseIssueStart${widget.type}/${widget.subtype}$kMimeTypeRaiseIssue"; return ErrorMessage(message: message); } - } diff --git a/pubspec.lock b/pubspec.lock index 70dda7d5..f48a9105 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -217,6 +217,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + csv: + dependency: "direct main" + description: + name: csv + sha256: "63ed2871dd6471193dffc52c0e6c76fb86269c00244d244297abbb355c84a86e" + url: "https://pub.dev" + source: hosted + version: "5.1.1" dart_style: dependency: "direct main" description: diff --git a/test/widget_test.dart b/test/widget_test.dart index 48eb1d93..3f806c72 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,3 +1,6 @@ +// ignore_for_file: unused_import +// TODO: Added ignore to calculate code coverage + import 'package:apidash/main.dart'; import 'package:apidash/app.dart'; import 'package:apidash/common/utils.dart'; From e6b71bd5a0ff7720444b278c2aa13cf39c4e239a Mon Sep 17 00:00:00 2001 From: Chinmay Chaudhari Date: Fri, 1 Mar 2024 01:56:27 +0530 Subject: [PATCH 27/85] Added tests for CustomMarkDown --- test/widgets/markdown_test.dart | 38 +++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index 79cb579a..f32cb237 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -4,13 +4,43 @@ import 'package:apidash/widgets/markdown.dart'; void main() { testWidgets('Testing CustomMarkdown', (tester) async { - const markdown = CustomMarkdown(data: """Is a markdown ~`star on github`~ + const markdown = CustomMarkdown( + data: """Is a markdown ~`star on github`~ #br #br - ~`github repo`~ ~`Discord Server`~"""); - await tester.pumpWidget(markdown); - //expectTextStrings(tester.allWidgets, ['Data1']); + ~`github repo`~ ~`Discord Server`~""", + ); + await tester.pumpWidget(const MaterialApp(home: markdown)); }, skip: true); + + group('CustomMarkdown Widget Tests', () { + testWidgets('CustomMarkdown renders correctly', + (WidgetTester tester) async { + await tester.pumpWidget(const MaterialApp( + home: CustomMarkdown( + data: '# Hello World\nThis is some *markdown* text.', + ), + )); + + final headlineTextFinder = find.text('Hello World'); + final markdownTextFinder = find.text('This is some markdown text.'); + + expect(headlineTextFinder, findsOneWidget); + expect(markdownTextFinder, findsOneWidget); + }); + + testWidgets('CustomMarkdown onTapLink callback works', + (WidgetTester tester) async { + await tester.pumpWidget(const MaterialApp( + home: CustomMarkdown( + data: '[Link Text](https://apidash.dev/)', + ), + )); + + await tester.tap(find.text('Link Text')); + await tester.pump(); + }); + }); } From 03bf55149be46de682b6865a41d34e99e1aa3d4b Mon Sep 17 00:00:00 2001 From: Chinmay Chaudhari Date: Fri, 1 Mar 2024 07:24:54 +0530 Subject: [PATCH 28/85] Removed skip = true --- test/widgets/markdown_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index f32cb237..eb537e5f 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -13,7 +13,7 @@ void main() { ~`github repo`~ ~`Discord Server`~""", ); await tester.pumpWidget(const MaterialApp(home: markdown)); - }, skip: true); + }); group('CustomMarkdown Widget Tests', () { testWidgets('CustomMarkdown renders correctly', From e1f8a1b04121591ed656d2066434b7cb5f56edbb Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Fri, 1 Mar 2024 10:56:59 +0530 Subject: [PATCH 29/85] feat(tests): add more tests for codegen with multipart body --- test/request_models.dart | 102 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) diff --git a/test/request_models.dart b/test/request_models.dart index d7f7df21..c8764bca 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -1,4 +1,5 @@ -import 'package:apidash/models/models.dart' show NameValueModel, RequestModel; +import 'package:apidash/models/models.dart' + show FormDataModel, NameValueModel, RequestModel; import 'package:apidash/consts.dart'; /// Basic GET request model @@ -226,6 +227,105 @@ const requestModelPost3 = RequestModel( ], ); +/// POST request model with multipart body(text) +const requestModelPost4 = RequestModel( + id: 'post4', + url: 'https://oshi.at', + method: HTTPVerb.post, + requestFormDataList: [ + FormDataModel( + name: "text", value: "some textual string", type: FormDataType.file) + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body and headers +const requestModelPost5 = RequestModel( + id: 'post5', + url: 'https://oshi.at', + method: HTTPVerb.post, + requestFormDataList: [ + FormDataModel( + name: "text", value: "some textual string", type: FormDataType.text) + ], + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body(file) +const requestModelPost6 = RequestModel( + id: 'post6', + url: 'https://oshi.at', + method: HTTPVerb.post, + requestFormDataList: [ + FormDataModel(name: "f", value: "/path/to/file", type: FormDataType.file) + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body and requestBody (the requestBody shouldn't be in codegen) +const requestModelPost7 = RequestModel( + id: 'post7', + url: 'https://oshi.at', + method: HTTPVerb.post, + requestBody: r"""{ +"text": "I LOVE Flutter" +}""", + requestFormDataList: [ + FormDataModel( + name: "text", value: "some textual string", type: FormDataType.text) + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body and requestParams +const requestModelPost8 = RequestModel( + id: 'post8', + url: 'https://oshi.at', + method: HTTPVerb.post, + requestFormDataList: [ + FormDataModel( + name: "text", value: "some textual string", type: FormDataType.text) + ], + requestParams: [ + NameValueModel(name: 'num', value: '8700000'), + NameValueModel(name: 'digits', value: '3'), + NameValueModel(name: 'system', value: 'SS'), + NameValueModel(name: 'add_space', value: 'true'), + NameValueModel(name: 'trailing_zeros', value: 'true'), + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body(file and text), requestParams, requestHeaders and requestBody +const requestModelPost9 = RequestModel( + id: 'post9', + url: 'https://oshi.at', + method: HTTPVerb.post, + requestBody: r"""{ +"text": "I LOVE Flutter" +}""", + requestFormDataList: [ + FormDataModel( + name: "text", value: "some textual string", type: FormDataType.text), + FormDataModel(name: "f", value: "/path/to/file", type: FormDataType.file) + ], + requestParams: [ + NameValueModel(name: 'num', value: '8700000'), + NameValueModel(name: 'digits', value: '3'), + NameValueModel(name: 'system', value: 'SS'), + NameValueModel(name: 'add_space', value: 'true'), + NameValueModel(name: 'trailing_zeros', value: 'true'), + ], + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Content-Type', value: 'multipart/form-data'), + ], + requestBodyContentType: ContentType.formdata, +); + /// PUT request model const requestModelPut1 = RequestModel( id: 'put1', From 7dbe0b5d5fe5a4b0ed8c765cd6d290fdf76f63f3 Mon Sep 17 00:00:00 2001 From: Delwin Mathew <84124091+opxdelwin@users.noreply.github.com> Date: Fri, 1 Mar 2024 12:22:52 +0530 Subject: [PATCH 30/85] [feat] send multiple API requests in parallel --- lib/models/request_model.dart | 4 ++++ lib/providers/collection_providers.dart | 22 ++++++++++++++----- .../details_card/response_pane.dart | 5 ++--- .../home_page/editor_pane/url_card.dart | 6 ++--- lib/widgets/buttons.dart | 17 +++++--------- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index 9154e428..a8d3569a 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -29,6 +29,7 @@ class RequestModel { this.responseStatus, this.message, this.responseModel, + this.isWorking = false, }); final String id; @@ -47,6 +48,7 @@ class RequestModel { final int? responseStatus; final String? message; final ResponseModel? responseModel; + final bool isWorking; List? get enabledRequestHeaders => getEnabledRows(requestHeaders, isHeaderEnabledList); @@ -106,6 +108,7 @@ class RequestModel { int? responseStatus, String? message, ResponseModel? responseModel, + bool? isWorking, }) { var headers = requestHeaders ?? this.requestHeaders; var params = requestParams ?? this.requestParams; @@ -129,6 +132,7 @@ class RequestModel { responseStatus: responseStatus ?? this.responseStatus, message: message ?? this.message, responseModel: responseModel ?? this.responseModel, + isWorking: isWorking ?? this.isWorking, ); } diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 0432b0e4..a1afa070 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -156,11 +156,20 @@ class CollectionStateNotifier } Future sendRequest(String id) async { - ref.read(sentRequestIdStateProvider.notifier).state = id; ref.read(codePaneVisibleStateProvider.notifier).state = false; - final defaultUriScheme = - ref.read(settingsProvider.select((value) => value.defaultUriScheme)); + final defaultUriScheme = ref.read( + settingsProvider.select( + (value) => value.defaultUriScheme, + ), + ); + RequestModel requestModel = state![id]!; + + // set current model's isWorking to true and update state + var map = {...state!}; + map[id] = requestModel.copyWith(isWorking: true); + state = map; + (http.Response?, Duration?, String?)? responseRec = await request( requestModel, defaultUriScheme: defaultUriScheme, @@ -172,6 +181,7 @@ class CollectionStateNotifier newRequestModel = requestModel.copyWith( responseStatus: -1, message: responseRec.$3, + isWorking: false, ); } else { final responseModel = baseResponseModel.fromResponse( @@ -183,10 +193,12 @@ class CollectionStateNotifier responseStatus: statusCode, message: kResponseCodeReasons[statusCode], responseModel: responseModel, + isWorking: false, ); } - ref.read(sentRequestIdStateProvider.notifier).state = null; - var map = {...state!}; + + // update state with response data + map = {...state!}; map[id] = newRequestModel; state = map; } diff --git a/lib/screens/home_page/editor_pane/details_card/response_pane.dart b/lib/screens/home_page/editor_pane/details_card/response_pane.dart index e7fc9f09..3e344117 100644 --- a/lib/screens/home_page/editor_pane/details_card/response_pane.dart +++ b/lib/screens/home_page/editor_pane/details_card/response_pane.dart @@ -9,13 +9,12 @@ class ResponsePane extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final selectedId = ref.watch(selectedIdStateProvider); - final sentRequestId = ref.watch(sentRequestIdStateProvider); final responseStatus = ref.watch( selectedRequestModelProvider.select((value) => value?.responseStatus)); + final isWorking = ref.watch(selectedRequestModelProvider)?.isWorking; final message = ref .watch(selectedRequestModelProvider.select((value) => value?.message)); - if (sentRequestId != null && sentRequestId == selectedId) { + if (isWorking == true) { return const SendingWidget(); } if (responseStatus == null) { diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index 5fa4b404..8e00f377 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -93,10 +93,10 @@ class SendButton extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final selectedId = ref.watch(selectedIdStateProvider); - final sentRequestId = ref.watch(sentRequestIdStateProvider); + final isWorking = ref.watch(selectedRequestModelProvider)?.isWorking; + return SendRequestButton( - selectedId: selectedId, - sentRequestId: sentRequestId, + isWorking: isWorking, onTap: () { ref .read(collectionStateNotifierProvider.notifier) diff --git a/lib/widgets/buttons.dart b/lib/widgets/buttons.dart index 2d63ede7..2dc28ba6 100644 --- a/lib/widgets/buttons.dart +++ b/lib/widgets/buttons.dart @@ -47,31 +47,26 @@ class CopyButton extends StatelessWidget { class SendRequestButton extends StatelessWidget { const SendRequestButton({ super.key, - required this.selectedId, - required this.sentRequestId, + required this.isWorking, required this.onTap, }); - final String? selectedId; - final String? sentRequestId; + final bool? isWorking; final void Function() onTap; @override Widget build(BuildContext context) { - bool disable = sentRequestId != null; return FilledButton( - onPressed: disable ? null : onTap, + onPressed: isWorking == true ? null : onTap, child: Row( mainAxisSize: MainAxisSize.min, children: [ Text( - disable - ? (selectedId == sentRequestId ? kLabelSending : kLabelBusy) - : kLabelSend, + isWorking == true ? kLabelSending : kLabelSend, style: kTextStyleButton, ), - if (!disable) kHSpacer10, - if (!disable) + if (isWorking == false) kHSpacer10, + if (isWorking == false) const Icon( size: 16, Icons.send, From 0c22abc9da9aa5be2f900e1d055146a744f4c6f9 Mon Sep 17 00:00:00 2001 From: Delwin Mathew <84124091+opxdelwin@users.noreply.github.com> Date: Fri, 1 Mar 2024 13:02:24 +0530 Subject: [PATCH 31/85] [refactor] remove unused UI provider --- lib/providers/ui_providers.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/providers/ui_providers.dart b/lib/providers/ui_providers.dart index ef576974..2fddb2ad 100644 --- a/lib/providers/ui_providers.dart +++ b/lib/providers/ui_providers.dart @@ -3,7 +3,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; final navRailIndexStateProvider = StateProvider((ref) => 0); final selectedIdEditStateProvider = StateProvider((ref) => null); -final sentRequestIdStateProvider = StateProvider((ref) => null); final codePaneVisibleStateProvider = StateProvider((ref) => false); final saveDataStateProvider = StateProvider((ref) => false); final clearDataStateProvider = StateProvider((ref) => false); From 3331d2aa72b52c9b9d3812df50b530ed44d98183 Mon Sep 17 00:00:00 2001 From: Delwin Mathew <84124091+opxdelwin@users.noreply.github.com> Date: Fri, 1 Mar 2024 13:16:14 +0530 Subject: [PATCH 32/85] [refactor] fix old buttons_tests --- test/widgets/buttons_test.dart | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/test/widgets/buttons_test.dart b/test/widgets/buttons_test.dart index bc568308..2b961e07 100644 --- a/test/widgets/buttons_test.dart +++ b/test/widgets/buttons_test.dart @@ -36,8 +36,7 @@ void main() { theme: kThemeDataLight, home: Scaffold( body: SendRequestButton( - selectedId: '1', - sentRequestId: null, + isWorking: false, onTap: () { changedValue = 'Send'; }, @@ -55,7 +54,8 @@ void main() { expect(changedValue, 'Send'); }); - testWidgets('Testing for Send Request button when sentRequestId is not null', + testWidgets( + 'Testing for Send Request button when RequestModel is viewed and is waiting for response', (tester) async { await tester.pumpWidget( MaterialApp( @@ -63,32 +63,7 @@ void main() { theme: kThemeDataLight, home: Scaffold( body: SendRequestButton( - selectedId: '1', - sentRequestId: '2', - onTap: () {}, - ), - ), - ), - ); - - expect(find.byIcon(Icons.send), findsNothing); - expect(find.text(kLabelBusy), findsOneWidget); - final button1 = find.byType(FilledButton); - expect(button1, findsOneWidget); - - expect(tester.widget(button1).enabled, isFalse); - }); - - testWidgets('Testing for Send Request button when sentRequestId = selectedId', - (tester) async { - await tester.pumpWidget( - MaterialApp( - title: 'Send Request button', - theme: kThemeDataLight, - home: Scaffold( - body: SendRequestButton( - selectedId: '1', - sentRequestId: '1', + isWorking: true, onTap: () {}, ), ), From 77432e187d94c72b15f3db9dec73a7f0fc02387a Mon Sep 17 00:00:00 2001 From: Chinmay Chaudhari Date: Fri, 1 Mar 2024 14:43:03 +0530 Subject: [PATCH 33/85] Link test updated --- test/widgets/markdown_test.dart | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index eb537e5f..7f10fa8f 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -33,14 +33,22 @@ void main() { testWidgets('CustomMarkdown onTapLink callback works', (WidgetTester tester) async { - await tester.pumpWidget(const MaterialApp( - home: CustomMarkdown( - data: '[Link Text](https://apidash.dev/)', + bool linkTapped = false; + await tester.pumpWidget(MaterialApp( + home: GestureDetector( + onTap: () { + linkTapped = true; + }, + child: const CustomMarkdown( + data: '[Link Text](https://apidash.dev/)', + ), ), )); await tester.tap(find.text('Link Text')); await tester.pump(); + + expect(linkTapped, true); }); }); } From e14446f2e34cb737dce76b280c86d1cc8dc23d91 Mon Sep 17 00:00:00 2001 From: Yousef Rabia Date: Fri, 1 Mar 2024 17:18:42 +0200 Subject: [PATCH 34/85] Replace `tester.pumpAndSettle();` with `tester.pump();` Replacing `tester.pumpAndSettle();` with `tester.pump();` resolves an issue where `pumpAndSettle()` waits for all animations to complete, causing an infinite loop with `CircularProgressIndicator`. Using `pump()` ensures efficient frame building without unnecessary animation waiting. --- test/widgets/intro_message_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/widgets/intro_message_test.dart b/test/widgets/intro_message_test.dart index 798afad8..11ca1ad5 100644 --- a/test/widgets/intro_message_test.dart +++ b/test/widgets/intro_message_test.dart @@ -13,7 +13,7 @@ void main() { ), ); - await tester.pumpAndSettle(); + await tester.pump(); expect(find.text('Welcome to API Dash ⚡️'), findsOneWidget); expect(find.byType(RichText), findsAtLeastNWidgets(1)); From 1db5d88125d0d584d28f5cd21b1ed00b4c68be2f Mon Sep 17 00:00:00 2001 From: Yousef Rabia Date: Fri, 1 Mar 2024 17:20:40 +0200 Subject: [PATCH 35/85] Ensure introData() Function Works During Testing by Using `setMockInitialValues` --- test/widgets/intro_message_test.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/widgets/intro_message_test.dart b/test/widgets/intro_message_test.dart index 11ca1ad5..d5e543bd 100644 --- a/test/widgets/intro_message_test.dart +++ b/test/widgets/intro_message_test.dart @@ -1,9 +1,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:apidash/widgets/intro_message.dart'; +import 'package:package_info_plus/package_info_plus.dart'; void main() { testWidgets('Testing Intro Message', (tester) async { + PackageInfo.setMockInitialValues( + appName: 'API Dash', + packageName: 'dev.apidash.apidash', + version: '1.0.0', + buildNumber: '1', + buildSignature: 'buildSignature'); await tester.pumpWidget( const MaterialApp( title: 'Intro Message', From 00f008d8a2e479ac20d980530ef10b4cb0bcc884 Mon Sep 17 00:00:00 2001 From: Yousef Rabia Date: Fri, 1 Mar 2024 17:21:13 +0200 Subject: [PATCH 36/85] remove `skip:true` --- test/widgets/intro_message_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/widgets/intro_message_test.dart b/test/widgets/intro_message_test.dart index d5e543bd..4e256c82 100644 --- a/test/widgets/intro_message_test.dart +++ b/test/widgets/intro_message_test.dart @@ -32,5 +32,5 @@ void main() { expect(find.byIcon(Icons.star), findsOneWidget); expect(find.text('Star on GitHub'), findsOneWidget); await tester.tap(find.byIcon(Icons.star)); - }, skip: true); + }); } From fe23daa3cdadf717e7c7faf29c2464aaf32d038b Mon Sep 17 00:00:00 2001 From: Chinmay Date: Sat, 2 Mar 2024 09:00:16 +0530 Subject: [PATCH 37/85] removed unnecesary testcase --- test/widgets/markdown_test.dart | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index 7f10fa8f..435f1ac4 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:apidash/widgets/markdown.dart'; @@ -30,25 +31,5 @@ void main() { expect(headlineTextFinder, findsOneWidget); expect(markdownTextFinder, findsOneWidget); }); - - testWidgets('CustomMarkdown onTapLink callback works', - (WidgetTester tester) async { - bool linkTapped = false; - await tester.pumpWidget(MaterialApp( - home: GestureDetector( - onTap: () { - linkTapped = true; - }, - child: const CustomMarkdown( - data: '[Link Text](https://apidash.dev/)', - ), - ), - )); - - await tester.tap(find.text('Link Text')); - await tester.pump(); - - expect(linkTapped, true); - }); }); } From 7e2f9e1144a536c1597415af78680770fa32dd70 Mon Sep 17 00:00:00 2001 From: Chinmay Date: Sat, 2 Mar 2024 18:11:45 +0530 Subject: [PATCH 38/85] Modified the tests --- test/widgets/markdown_test.dart | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index 435f1ac4..146bf956 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -31,5 +31,24 @@ void main() { expect(headlineTextFinder, findsOneWidget); expect(markdownTextFinder, findsOneWidget); }); + + testWidgets('CustomMarkdown onTapLink callback works', + (WidgetTester tester) async { + await tester.pumpWidget(MaterialApp( + home: GestureDetector( + child: const CustomMarkdown( + data: '[Link Text](https://apidash.dev/)', + ), + ), + )); + + await tester.tap(find.text('Link Text')); + await tester.pump(); + + + expect(find.text('Link Text'), findsOneWidget); + + expect(find.text('https://apidash.dev/'), findsNothing); + }); }); } From 0a8b75b9fd38a7b7c7b89e713bc2993f44dd4e51 Mon Sep 17 00:00:00 2001 From: Chinmay Date: Sat, 2 Mar 2024 18:36:47 +0530 Subject: [PATCH 39/85] Added test cases for Custom markdown working --- lib/widgets/markdown.dart | 10 +++++++--- test/widgets/markdown_test.dart | 25 +++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/lib/widgets/markdown.dart b/lib/widgets/markdown.dart index c1467fba..ce06efa0 100644 --- a/lib/widgets/markdown.dart +++ b/lib/widgets/markdown.dart @@ -9,9 +9,12 @@ class CustomMarkdown extends StatelessWidget { super.key, required this.data, this.padding = const EdgeInsets.all(16.0), + this.onTapLink, }); + final String data; final EdgeInsets padding; + final void Function(String text, String? href, String title)? onTapLink; @override Widget build(BuildContext context) { @@ -25,9 +28,10 @@ class CustomMarkdown extends StatelessWidget { data: data, selectable: true, extensionSet: md.ExtensionSet.gitHubFlavored, - onTapLink: (text, href, title) { - launchUrl(Uri.parse(href ?? "")); - }, + onTapLink: onTapLink ?? + (text, href, title) { + launchUrl(Uri.parse(href ?? "")); + }, builders: { "inlineButton": InlineButton(), }, diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index 146bf956..f9a9ec17 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -1,5 +1,7 @@ +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:apidash/widgets/markdown.dart'; @@ -32,7 +34,7 @@ void main() { expect(markdownTextFinder, findsOneWidget); }); - testWidgets('CustomMarkdown onTapLink callback works', + testWidgets('CustomMarkdown has proper text rendered', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( home: GestureDetector( @@ -45,10 +47,29 @@ void main() { await tester.tap(find.text('Link Text')); await tester.pump(); - expect(find.text('Link Text'), findsOneWidget); expect(find.text('https://apidash.dev/'), findsNothing); }); + + testWidgets('CustomMarkdown creates hyperlink', + (WidgetTester tester) async { + bool linkTapped = false; + await tester.pumpWidget(MaterialApp( + home: CustomMarkdown( + data: '[Link Text](https://apidash.dev/)', + onTapLink: (text, href, title) { + linkTapped = true; + expect(text, 'Link Text'); + expect(href, 'https://apidash.dev/'); + }, + ), + )); + expect(find.byType(Markdown), findsOneWidget); + final markdownWidget = tester.widget(find.byType(Markdown)); + expect(markdownWidget.data, '[Link Text](https://apidash.dev/)'); + await tester.tap(find.text('Link Text')); + expect(linkTapped, true); + }); }); } From 81218d9fe75130d9a3866b3f05166672bb46c502 Mon Sep 17 00:00:00 2001 From: Chinmay Date: Sat, 2 Mar 2024 18:39:51 +0530 Subject: [PATCH 40/85] Removed unused changed --- test/widgets/markdown_test.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index f9a9ec17..5a620950 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -1,6 +1,4 @@ -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:apidash/widgets/markdown.dart'; From f2810865f2d003f64e6f70eb87f74a2cf65a21c2 Mon Sep 17 00:00:00 2001 From: Chinmay Date: Sat, 2 Mar 2024 20:49:06 +0530 Subject: [PATCH 41/85] Csv Added in readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 15dc46e1..7907373d 100644 --- a/README.md +++ b/README.md @@ -185,6 +185,10 @@ Here is the complete list of mimetypes that are syntax highlighted in API Dash: | `text/html` | `.html` | Only syntax highlighting, no web preview. | | `text/javascript` | `.js` | | | `text/markdown` | `.md` | | +| `text/csv` | `. +csv` | +Renders CSV in table format. + | ## What's new in v0.3.0? From 30698ffce4f5014a766b4e88b592b60951df2a2d Mon Sep 17 00:00:00 2001 From: Chinmay Date: Sat, 2 Mar 2024 20:52:27 +0530 Subject: [PATCH 42/85] Table format corrected --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 7907373d..6742de06 100644 --- a/README.md +++ b/README.md @@ -185,10 +185,7 @@ Here is the complete list of mimetypes that are syntax highlighted in API Dash: | `text/html` | `.html` | Only syntax highlighting, no web preview. | | `text/javascript` | `.js` | | | `text/markdown` | `.md` | | -| `text/csv` | `. -csv` | -Renders CSV in table format. - | +| `text/csv` | `.csv` | Renders CSV in tabular form | ## What's new in v0.3.0? From d95d497c9c8478217ebf6a1ccdebe2791f665cbc Mon Sep 17 00:00:00 2001 From: Chinmay Date: Sat, 2 Mar 2024 20:53:12 +0530 Subject: [PATCH 43/85] Type fixed --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6742de06..ab08478a 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ Here is the complete list of mimetypes that are syntax highlighted in API Dash: | `text/html` | `.html` | Only syntax highlighting, no web preview. | | `text/javascript` | `.js` | | | `text/markdown` | `.md` | | -| `text/csv` | `.csv` | Renders CSV in tabular form | +| `text/csv` | `.csv` | Renders CSV in tabular format | ## What's new in v0.3.0? From e20ead29344acd6478b4f6cc619d87922aa1ae74 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sun, 3 Mar 2024 06:35:50 +0530 Subject: [PATCH 44/85] Update README.md --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ab08478a..d8b258e5 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ Here is the complete list of mimetypes that can be directly previewed in API Das | File Type | Mimetype | Extension | Comment | | --------- | -------------------------- | ----------------- | -------- | | PDF | `application/pdf` | `.pdf` | | +| CSV | `text/csv` | `.csv` | Can be improved | | Image | `image/apng` | `.apng` | Animated | | Image | `image/avif` | `.avif` | | | Image | `image/bmp` | `.bmp` | | @@ -177,15 +178,14 @@ Here is the complete list of mimetypes that are syntax highlighted in API Dash: | ------------------ | --------- | ------------------------------------------------------------------------------------------------------------------ | | `application/json` | `.json` | Other mimetypes like `application/geo+json`, `application/vcard+json` that are based on `json` are also supported. | | `application/xml` | `.xml` | Other mimetypes like `application/xhtml+xml`, `application/vcard+xml` that are based on `xml` are also supported. | -| `text/xml` | `.xml` | | -| `application/yaml` | `.yaml` | Others - `application/x-yaml` or `application/x-yml` | -| `text/yaml` | `.yaml` | Others - `text/yml` | -| `application/sql` | `.sql` | | -| `text/css` | `.css` | | -| `text/html` | `.html` | Only syntax highlighting, no web preview. | -| `text/javascript` | `.js` | | -| `text/markdown` | `.md` | | -| `text/csv` | `.csv` | Renders CSV in tabular format | +| `text/xml` | `.xml` | | +| `application/yaml` | `.yaml` | Others - `application/x-yaml` or `application/x-yml` | +| `text/yaml` | `.yaml` | Others - `text/yml` | +| `application/sql` | `.sql` | | +| `text/css` | `.css` | | +| `text/html` | `.html` | Only syntax highlighting, no web preview. | +| `text/javascript` | `.js` | | +| `text/markdown` | `.md` | | ## What's new in v0.3.0? From f0ff324b697c473b33a294cdd3ae588b10ca24b7 Mon Sep 17 00:00:00 2001 From: Chinmay Date: Sun, 3 Mar 2024 10:06:49 +0530 Subject: [PATCH 45/85] Added check for inline button test-failing --- test/widgets/markdown_test.dart | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index 5a620950..c3e0c343 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -4,19 +4,21 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:apidash/widgets/markdown.dart'; void main() { - testWidgets('Testing CustomMarkdown', (tester) async { - const markdown = CustomMarkdown( - data: """Is a markdown ~`star on github`~ + group('CustomMarkdown Widget Tests', () { + testWidgets('Testing CustomMarkdown buttons and tags renders', (tester) async { + const markdown = CustomMarkdown( + data: """Is a markdown ~`star on github`~ #br #br ~`github repo`~ ~`Discord Server`~""", - ); - await tester.pumpWidget(const MaterialApp(home: markdown)); - }); + ); + await tester.pumpWidget(const MaterialApp(home: markdown)); - group('CustomMarkdown Widget Tests', () { + expect(find.byType(InlineButton), findsNWidgets(3)); + expect(find.text('#br'), findsNothing); + }); testWidgets('CustomMarkdown renders correctly', (WidgetTester tester) async { await tester.pumpWidget(const MaterialApp( @@ -58,8 +60,8 @@ void main() { data: '[Link Text](https://apidash.dev/)', onTapLink: (text, href, title) { linkTapped = true; - expect(text, 'Link Text'); - expect(href, 'https://apidash.dev/'); + expect(text, 'Link Text'); + expect(href, 'https://apidash.dev/'); }, ), )); From 6a886df6694a42d60a5465988f6b7b1a827e81c5 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 3 Mar 2024 13:35:07 +0530 Subject: [PATCH 46/85] Update pull_request_template.md --- .github/pull_request_template.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 721b55e6..04873dba 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -16,4 +16,3 @@ _We encourage you to add relevant test cases._ - [ ] Yes - [ ] No, and this is why: _please replace this line with details on why tests have not been included_ -- [ ] I need help with writing tests From cd9a3d555a73671b30792db1053e344113b8d1df Mon Sep 17 00:00:00 2001 From: Delwin Mathew <84124091+opxdelwin@users.noreply.github.com> Date: Sun, 3 Mar 2024 20:50:39 +0530 Subject: [PATCH 47/85] [fix] text obscuring error This occurs due to padding, externally added specific padding only to bottom. --- lib/widgets/form_data_field.dart | 46 +++++++++++++++++--------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/lib/widgets/form_data_field.dart b/lib/widgets/form_data_field.dart index eb4c8862..29f210c4 100644 --- a/lib/widgets/form_data_field.dart +++ b/lib/widgets/form_data_field.dart @@ -46,32 +46,34 @@ class _FormDataFieldState extends State { color: colorScheme.onSurface, ), decoration: InputDecoration( - hintStyle: kCodeStyle.copyWith( - color: colorScheme.outline.withOpacity( + hintStyle: kCodeStyle.copyWith( + color: colorScheme.outline.withOpacity( + kHintOpacity, + ), + ), + hintText: widget.hintText, + contentPadding: const EdgeInsets.only(bottom: 16), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: colorScheme.primary.withOpacity( kHintOpacity, ), ), - hintText: widget.hintText, - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: colorScheme.primary.withOpacity( - kHintOpacity, - ), - ), + ), + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: colorScheme.surfaceVariant, ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: colorScheme.surfaceVariant, - ), - ), - suffixIcon: DropdownButtonFormData( - formDataType: widget.formDataType, - onChanged: (p0) { - if (widget.onFormDataTypeChanged != null) { - widget.onFormDataTypeChanged!(p0); - } - }, - )), + ), + suffixIcon: DropdownButtonFormData( + formDataType: widget.formDataType, + onChanged: (p0) { + if (widget.onFormDataTypeChanged != null) { + widget.onFormDataTypeChanged!(p0); + } + }, + ), + ), onChanged: widget.onChanged, ), ), From b84035888bd3ecd3f51885c87bb3c5d99341a653 Mon Sep 17 00:00:00 2001 From: Delwin Mathew <84124091+opxdelwin@users.noreply.github.com> Date: Sun, 3 Mar 2024 21:12:07 +0530 Subject: [PATCH 48/85] [feat] press enter to send request Triggers `sendRequest` when enter is clicked and `URLField` is in focus. --- lib/screens/home_page/editor_pane/url_card.dart | 5 +++++ lib/widgets/textfields.dart | 3 +++ 2 files changed, 8 insertions(+) diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index 5fa4b404..3d92ba1b 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -81,6 +81,11 @@ class URLTextField extends ConsumerWidget { .read(collectionStateNotifierProvider.notifier) .update(selectedId, url: value); }, + onFieldSubmitted: (value) { + ref + .read(collectionStateNotifierProvider.notifier) + .sendRequest(selectedId); + }, ); } } diff --git a/lib/widgets/textfields.dart b/lib/widgets/textfields.dart index c288b0a6..a79ec991 100644 --- a/lib/widgets/textfields.dart +++ b/lib/widgets/textfields.dart @@ -7,11 +7,13 @@ class URLField extends StatelessWidget { required this.selectedId, this.initialValue, this.onChanged, + this.onFieldSubmitted, }); final String selectedId; final String? initialValue; final void Function(String)? onChanged; + final void Function(String)? onFieldSubmitted; @override Widget build(BuildContext context) { @@ -29,6 +31,7 @@ class URLField extends StatelessWidget { border: InputBorder.none, ), onChanged: onChanged, + onFieldSubmitted: onFieldSubmitted, ); } } From 27bb3d8ff53dd5a1068924b31bb2baf7640e4db8 Mon Sep 17 00:00:00 2001 From: Delwin Mathew <84124091+opxdelwin@users.noreply.github.com> Date: Sun, 3 Mar 2024 21:28:42 +0530 Subject: [PATCH 49/85] [tests] add enter key test --- test/widgets/textfields_test.dart | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/widgets/textfields_test.dart b/test/widgets/textfields_test.dart index 652ec8ec..88aa6392 100644 --- a/test/widgets/textfields_test.dart +++ b/test/widgets/textfields_test.dart @@ -57,4 +57,41 @@ void main() { await tester.pumpAndSettle(); expect(find.text('entering 123 for cell field'), findsOneWidget); }); + + testWidgets('URL Field sends request on enter keystroke', (tester) async { + bool wasSubmitCalled = false; + + void testSubmit(String val) { + wasSubmitCalled = true; + } + + await tester.pumpWidget( + MaterialApp( + title: 'URL Field', + theme: kThemeDataDark, + home: Scaffold( + body: Column(children: [ + URLField( + selectedId: '2', + onFieldSubmitted: testSubmit, + ) + ]), + ), + ), + ); + + // ensure URLField is blank + expect(find.byType(TextFormField), findsOneWidget); + expect(find.textContaining('Enter API endpoint '), findsOneWidget); + expect(wasSubmitCalled, false); + + // modify value and press enter + var txtForm = find.byKey(const Key("url-2")); + await tester.enterText(txtForm, 'entering 123'); + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pump(); + + // check if value was updated + expect(wasSubmitCalled, true); + }); } From cb64d18068420e6da7ec0ed7a63e283cbdc9b8b3 Mon Sep 17 00:00:00 2001 From: Delwin Mathew <84124091+opxdelwin@users.noreply.github.com> Date: Sun, 3 Mar 2024 21:54:57 +0530 Subject: [PATCH 50/85] [fix] enter saves edits to model --- lib/widgets/cards.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/widgets/cards.dart b/lib/widgets/cards.dart index 740ddbc8..6a48e26b 100644 --- a/lib/widgets/cards.dart +++ b/lib/widgets/cards.dart @@ -97,6 +97,12 @@ class SidebarRequestCard extends StatelessWidget { onTapOutsideNameEditor?.call(); //FocusScope.of(context).unfocus(); }, + onFieldSubmitted: (value) { + // As new name is being contantly updated by + // [onChangedNameEditor], stop editing by + // calling this fn + onTapOutsideNameEditor?.call(); + }, onChanged: onChangedNameEditor, decoration: const InputDecoration( isCollapsed: true, From 744157d5a297581768674dce22354f39ce885bf1 Mon Sep 17 00:00:00 2001 From: Mohammed Abdul Razak Wahab Date: Tue, 5 Mar 2024 00:18:55 +0530 Subject: [PATCH 51/85] test fix --- lib/utils/file_utils.dart | 2 +- test/utils/file_utils_test.dart | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/utils/file_utils.dart b/lib/utils/file_utils.dart index 69306b7f..41a6d4a3 100644 --- a/lib/utils/file_utils.dart +++ b/lib/utils/file_utils.dart @@ -43,7 +43,7 @@ String getShortPath(String path) { var f = p.split(path); if (f.length > 2) { f = f.sublist(f.length - 2); - return ".../${p.joinAll(f)}"; + return p.join("...", p.joinAll(f)); } return path; } diff --git a/test/utils/file_utils_test.dart b/test/utils/file_utils_test.dart index 18e2816a..35411d44 100644 --- a/test/utils/file_utils_test.dart +++ b/test/utils/file_utils_test.dart @@ -1,5 +1,6 @@ import 'package:test/test.dart'; import 'package:apidash/utils/file_utils.dart'; +import 'package:path/path.dart' as p; void main() { group( @@ -12,7 +13,7 @@ void main() { test('Test getShortPath', () { String path = "A/B/C/D.csv"; - expect(getShortPath(path), ".../C/D.csv"); + expect(getShortPath(path), p.join("...", "C", "D.csv")); }); test('Test getTempFileName', () { From dbc1e7f036a2971332d7433d65608e8bacb7f79e Mon Sep 17 00:00:00 2001 From: Ye Min Naing Date: Wed, 6 Mar 2024 15:38:48 +0700 Subject: [PATCH 52/85] Update dependencies in pubspec.lock file --- pubspec.lock | 58 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 190d8316..0834851c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -205,10 +205,10 @@ packages: dependency: transitive description: name: coverage - sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" + sha256: "8acabb8306b57a409bf4c83522065672ee13179297a6bb0cb9ead73948df7c76" url: "https://pub.dev" source: hosted - version: "1.6.4" + version: "1.7.2" crypto: dependency: transitive description: @@ -585,6 +585,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -621,26 +645,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" mime: dependency: transitive description: @@ -717,10 +741,10 @@ packages: dependency: "direct main" description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -1194,10 +1218,10 @@ packages: dependency: transitive description: name: vm_service - sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 url: "https://pub.dev" source: hosted - version: "11.10.0" + version: "13.0.0" watcher: dependency: transitive description: @@ -1206,14 +1230,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" - web: - dependency: transitive - description: - name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 - url: "https://pub.dev" - source: hosted - version: "0.3.0" web_socket_channel: dependency: transitive description: @@ -1280,5 +1296,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" + dart: ">=3.2.0-0 <4.0.0" flutter: ">=3.13.0" From 4c35edea0c80e7b0f81fd650fcbc1bf2e3797780 Mon Sep 17 00:00:00 2001 From: Ye Min Naing Date: Wed, 6 Mar 2024 17:07:18 +0700 Subject: [PATCH 53/85] Add keyboard listener to URLField --- .../home_page/editor_pane/url_card.dart | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index 753fb34a..5b87a5ec 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:apidash/providers/providers.dart'; import 'package:apidash/widgets/widgets.dart'; @@ -103,18 +104,31 @@ class _URLTextFieldState extends ConsumerState { @override Widget build(BuildContext context) { final activeId = ref.watch(activeIdStateProvider); - return URLField( - activeId: activeId!, - initialValue: ref - .read(collectionStateNotifierProvider.notifier) - .getRequestModel(activeId) - ?.url, - onChanged: (value) { - ref - .read(collectionStateNotifierProvider.notifier) - .update(activeId, url: value); - }, - ); + return Focus( + autofocus: true, + child: KeyboardListener( + focusNode: FocusNode(), + onKeyEvent: (KeyEvent event) { + if (event is KeyDownEvent && + event.logicalKey == LogicalKeyboardKey.enter) { + ref + .read(collectionStateNotifierProvider.notifier) + .sendRequest(activeId); + } + }, + child: URLField( + activeId: activeId!, + initialValue: ref + .read(collectionStateNotifierProvider.notifier) + .getRequestModel(activeId) + ?.url, + onChanged: (value) { + ref + .read(collectionStateNotifierProvider.notifier) + .update(activeId, url: value); + }, + ), + )); } } From 189f0b60d46ed4b3b969f54e02ebfdfbd7847735 Mon Sep 17 00:00:00 2001 From: Apoorv Dwivedi Date: Thu, 7 Mar 2024 00:06:00 +0530 Subject: [PATCH 54/85] Added `Troubleshooting Common Issues` section to CONTRIBUTING.md --- CONTRIBUTING.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 58fd388d..46a9b053 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -128,3 +128,23 @@ flutter test test/widgets/codegen_previewer_test.dart ### How to add a new package to pubspec.yaml? Instead of copy pasting from pub.dev, it is recommended that you use `flutter pub add package_name` to add a new package to `pubspec.yaml`. You can read more [here](https://docs.flutter.dev/packages-and-plugins/using-packages#adding-a-package-dependency-to-an-app-using-flutter-pub-add). + +## Troubleshooting Common Issues + +### Network Connection Issues on macOS + +If you encounter a network connection error similar to the following while running your Flutter app on macOS: + +``` +ClientException with SocketException: Connection failed (OS Error: Operation not permitted, errno = 1) +``` +Add below key to `macos/Runner/DebugProfile.entitlements` and `macos/Runner/Release.entitlements`. + +``` + com.apple.security.network.client + +``` + +You can read more [here](https://docs.flutter.dev/platform-integration/macos/building#setting-up-entitlements) + + From 96be5453f88c438f2ca03efaefc461fabd5d2554 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Fri, 8 Mar 2024 10:30:33 +0530 Subject: [PATCH 55/85] Migrate to API Dash APIs --- lib/consts.dart | 3 +- lib/screens/settings_page.dart | 2 +- test/codegen/codegen_test.dart | 22 +++++++-------- test/codegen/curl_codegen_test.dart | 28 +++++++++---------- test/codegen/dart_dio_codegen_test.dart | 28 +++++++++---------- test/codegen/dart_http_codegen_test.dart | 28 +++++++++---------- test/codegen/har_codegen_test.dart | 28 +++++++++---------- test/codegen/js_axios_codegen_test.dart | 28 +++++++++---------- test/codegen/js_fetch_codegen_test.dart | 28 +++++++++---------- test/codegen/kotlin_okhttp_codegen_test.dart | 28 +++++++++---------- test/codegen/nodejs_axios_codegen_test.dart | 28 +++++++++---------- test/codegen/nodejs_fetch_codegen_test.dart | 28 +++++++++---------- .../python_http_client_codegen_test.dart | 28 +++++++++---------- .../codegen/python_requests_codegen_test.dart | 28 +++++++++---------- test/models/request_model_test.dart | 10 +++---- test/models/response_model_test.dart | 8 +++--- test/request_models.dart | 28 +++++++++---------- test/utils/har_utils_test.dart | 10 +++---- test/utils/http_utils_test.dart | 24 ++++++++-------- test/widgets/cards_test.dart | 12 ++++---- test/widgets/code_previewer_test.dart | 2 +- test/widgets/codegen_previewer_test.dart | 2 +- test/widgets/response_widgets_test.dart | 4 +-- 23 files changed, 218 insertions(+), 217 deletions(-) diff --git a/lib/consts.dart b/lib/consts.dart index d157b7fa..d7c2689c 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -499,7 +499,8 @@ const kRaiseIssue = const kCsvError = "There seems to be an issue rendering this CSV. Please raise an issue in API Dash GitHub repo so that we can resolve it."; -const kHintTextUrlCard = "Enter API endpoint like api.foss42.com/country/codes"; +const kHintTextUrlCard = + "Enter API endpoint like api.apidash.dev/country/codes"; const kLabelPlusNew = "+ New"; const kLabelSend = "Send"; const kLabelSending = "Sending.."; diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index 4a7cb302..44e67330 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -65,7 +65,7 @@ class SettingsPage extends ConsumerWidget { hoverColor: kColorTransparent, title: const Text('Default URI Scheme'), subtitle: Text( - 'api.foss42.com → ${settings.defaultUriScheme}://api.foss42.com'), + 'api.apidash.dev → ${settings.defaultUriScheme}://api.apidash.dev'), trailing: DropdownMenu( onSelected: (value) { ref diff --git a/test/codegen/codegen_test.dart b/test/codegen/codegen_test.dart index 63102e0a..2e5b58a6 100644 --- a/test/codegen/codegen_test.dart +++ b/test/codegen/codegen_test.dart @@ -8,7 +8,7 @@ void main() { group('Test various Code generators', () { test('cURL', () { - const expectedCode = r"""curl --url 'https://api.foss42.com'"""; + const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet1, "https"), expectedCode); }); @@ -18,7 +18,7 @@ void main() { void main() async { try { - final response = await dio.Dio.get('https://api.foss42.com'); + final response = await dio.Dio.get('https://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -40,7 +40,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com'); + var uri = Uri.parse('https://api.apidash.dev'); final response = await http.get(uri); @@ -62,7 +62,7 @@ void main() async { test('HAR', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -73,7 +73,7 @@ void main() async { test('JS Axios', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -95,7 +95,7 @@ axios(config) }); test('JS Fetch', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -128,7 +128,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -151,7 +151,7 @@ fun main() { const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -176,7 +176,7 @@ axios(config) test('Nodejs Fetch', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -206,7 +206,7 @@ fetch(url, options) test('Python http.client', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "") res = conn.getresponse() @@ -223,7 +223,7 @@ print(data.decode("utf-8")) test('Python requests', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' response = requests.get(url) diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index e9bb7f60..212a82ce 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -7,25 +7,25 @@ void main() { group('GET Request', () { test('GET 1', () { - const expectedCode = r"""curl --url 'https://api.foss42.com'"""; + const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; expect(curlCodeGen.getCode(requestModelGet1, "https"), expectedCode); }); test('GET 2', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/country/data?code=US'"""; + r"""curl --url 'https://api.apidash.dev/country/data?code=US'"""; expect(curlCodeGen.getCode(requestModelGet2, "https"), expectedCode); }); test('GET 3', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/country/data?code=IND'"""; + r"""curl --url 'https://api.apidash.dev/country/data?code=IND'"""; expect(curlCodeGen.getCode(requestModelGet3, "https"), expectedCode); }); test('GET 4', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'"""; + r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'"""; expect(curlCodeGen.getCode(requestModelGet4, "https"), expectedCode); }); @@ -44,7 +44,7 @@ void main() { }); test('GET 7', () { - const expectedCode = r"""curl --url 'https://api.foss42.com'"""; + const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; expect(curlCodeGen.getCode(requestModelGet7, "https"), expectedCode); }); @@ -57,13 +57,13 @@ void main() { test('GET 9', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'"""; + r"""curl --url 'https://api.apidash.dev/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' \ + r"""curl --url 'https://api.apidash.dev/humanize/social' \ --header 'User-Agent: Test Agent'"""; expect( curlCodeGen.getCode( @@ -75,26 +75,26 @@ void main() { test('GET 11', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social?num=8700000&digits=3' \ + r"""curl --url 'https://api.apidash.dev/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'"""; + r"""curl --url 'https://api.apidash.dev/humanize/social'"""; expect(curlCodeGen.getCode(requestModelGet12, "https"), expectedCode); }); }); group('HEAD Request', () { test('HEAD 1', () { - const expectedCode = r"""curl --head --url 'https://api.foss42.com'"""; + const expectedCode = r"""curl --head --url 'https://api.apidash.dev'"""; expect(curlCodeGen.getCode(requestModelHead1, "https"), expectedCode); }); test('HEAD 2', () { - const expectedCode = r"""curl --head --url 'http://api.foss42.com'"""; + const expectedCode = r"""curl --head --url 'http://api.apidash.dev'"""; expect(curlCodeGen.getCode(requestModelHead2, "http"), expectedCode); }); }); @@ -102,7 +102,7 @@ void main() { group('POST Request', () { test('POST 1', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.foss42.com/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: text/plain' \ --data '{ "text": "I LOVE Flutter" @@ -112,7 +112,7 @@ void main() { test('POST 2', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.foss42.com/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: application/json' \ --data '{ "text": "I LOVE Flutter" @@ -122,7 +122,7 @@ void main() { test('POST 3', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.foss42.com/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: application/json' \ --header 'User-Agent: Test Agent' \ --data '{ diff --git a/test/codegen/dart_dio_codegen_test.dart b/test/codegen/dart_dio_codegen_test.dart index 30b371fd..5b981fde 100644 --- a/test/codegen/dart_dio_codegen_test.dart +++ b/test/codegen/dart_dio_codegen_test.dart @@ -12,7 +12,7 @@ void main() { void main() async { try { - final response = await dio.Dio.get('https://api.foss42.com'); + final response = await dio.Dio.get('https://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -35,7 +35,7 @@ void main() async { try { final queryParams = {'code': 'US'}; final response = await dio.Dio.get( - 'https://api.foss42.com/country/data', + 'https://api.apidash.dev/country/data', queryParameters: queryParams, ); print(response.statusCode); @@ -60,7 +60,7 @@ void main() async { try { final queryParams = {'code': 'IND'}; final response = await dio.Dio.get( - 'https://api.foss42.com/country/data?code=US', + 'https://api.apidash.dev/country/data?code=US', queryParameters: queryParams, ); print(response.statusCode); @@ -91,7 +91,7 @@ void main() async { 'trailing_zeros': 'true', }; final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', + 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, ); print(response.statusCode); @@ -166,7 +166,7 @@ void main() async { void main() async { try { - final response = await dio.Dio.get('https://api.foss42.com'); + final response = await dio.Dio.get('https://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -219,7 +219,7 @@ void main() async { 'add_space': 'true', }; final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', + 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, ); print(response.statusCode); @@ -244,7 +244,7 @@ void main() async { try { final headers = {'User-Agent': 'Test Agent'}; final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', + 'https://api.apidash.dev/humanize/social', options: Options(headers: headers), ); print(response.statusCode); @@ -278,7 +278,7 @@ void main() async { }; final headers = {'User-Agent': 'Test Agent'}; final response = await dio.Dio.get( - 'https://api.foss42.com/humanize/social', + 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, options: Options(headers: headers), ); @@ -302,7 +302,7 @@ void main() async { void main() async { try { - final response = await dio.Dio.get('https://api.foss42.com/humanize/social'); + final response = await dio.Dio.get('https://api.apidash.dev/humanize/social'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -325,7 +325,7 @@ void main() async { void main() async { try { - final response = await dio.Dio.head('https://api.foss42.com'); + final response = await dio.Dio.head('https://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -346,7 +346,7 @@ void main() async { void main() async { try { - final response = await dio.Dio.head('http://api.foss42.com'); + final response = await dio.Dio.head('http://api.apidash.dev'); print(response.statusCode); print(response.data); } on DioException catch (e, s) { @@ -373,7 +373,7 @@ void main() async { "text": "I LOVE Flutter" }'''; final response = await dio.Dio.post( - 'https://api.foss42.com/case/lower', + 'https://api.apidash.dev/case/lower', data: data, ); print(response.statusCode); @@ -401,7 +401,7 @@ void main() async { "text": "I LOVE Flutter" }'''); final response = await dio.Dio.post( - 'https://api.foss42.com/case/lower', + 'https://api.apidash.dev/case/lower', data: data, ); print(response.statusCode); @@ -430,7 +430,7 @@ void main() async { "text": "I LOVE Flutter" }'''); final response = await dio.Dio.post( - 'https://api.foss42.com/case/lower', + 'https://api.apidash.dev/case/lower', options: Options(headers: headers), data: data, ); diff --git a/test/codegen/dart_http_codegen_test.dart b/test/codegen/dart_http_codegen_test.dart index 55ab070a..790658b1 100644 --- a/test/codegen/dart_http_codegen_test.dart +++ b/test/codegen/dart_http_codegen_test.dart @@ -11,7 +11,7 @@ void main() { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com'); + var uri = Uri.parse('https://api.apidash.dev'); final response = await http.get(uri); @@ -32,7 +32,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/data'); + var uri = Uri.parse('https://api.apidash.dev/country/data'); var queryParams = {'code': 'US'}; uri = uri.replace(queryParameters: queryParams); @@ -57,7 +57,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/data?code=US'); + var uri = Uri.parse('https://api.apidash.dev/country/data?code=US'); var queryParams = {'code': 'IND'}; var urlQueryParams = Map.from(uri.queryParameters); @@ -83,7 +83,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var queryParams = { 'num': '8700000', @@ -168,7 +168,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com'); + var uri = Uri.parse('https://api.apidash.dev'); final response = await http.get(uri); @@ -218,7 +218,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var queryParams = { 'num': '8700000', @@ -245,7 +245,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var headers = {'User-Agent': 'Test Agent'}; @@ -276,7 +276,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var queryParams = { 'num': '8700000', @@ -308,7 +308,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); final response = await http.get(uri); @@ -331,7 +331,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com'); + var uri = Uri.parse('https://api.apidash.dev'); final response = await http.head(uri); @@ -352,7 +352,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('http://api.foss42.com'); + var uri = Uri.parse('http://api.apidash.dev'); final response = await http.head(uri); @@ -375,7 +375,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/case/lower'); + var uri = Uri.parse('https://api.apidash.dev/case/lower'); String body = r'''{ "text": "I LOVE Flutter" @@ -406,7 +406,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/case/lower'); + var uri = Uri.parse('https://api.apidash.dev/case/lower'); String body = r'''{ "text": "I LOVE Flutter" @@ -437,7 +437,7 @@ void main() async { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/case/lower'); + var uri = Uri.parse('https://api.apidash.dev/case/lower'); String body = r'''{ "text": "I LOVE Flutter" diff --git a/test/codegen/har_codegen_test.dart b/test/codegen/har_codegen_test.dart index 8e6b7bb0..ea40bf93 100644 --- a/test/codegen/har_codegen_test.dart +++ b/test/codegen/har_codegen_test.dart @@ -9,7 +9,7 @@ void main() { test('GET 1', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -20,7 +20,7 @@ void main() { test('GET 2', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/country/data?code=US", + "url": "https://api.apidash.dev/country/data?code=US", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -36,7 +36,7 @@ void main() { test('GET 3', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/country/data?code=IND", + "url": "https://api.apidash.dev/country/data?code=IND", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -52,7 +52,7 @@ void main() { test('GET 4', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", + "url": "https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -121,7 +121,7 @@ void main() { test('GET 7', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -153,7 +153,7 @@ void main() { test('GET 9', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social?num=8700000&add_space=true", + "url": "https://api.apidash.dev/humanize/social?num=8700000&add_space=true", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -173,7 +173,7 @@ void main() { test('GET 10', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social", + "url": "https://api.apidash.dev/humanize/social", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [ @@ -194,7 +194,7 @@ void main() { test('GET 11', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social?num=8700000&digits=3", + "url": "https://api.apidash.dev/humanize/social?num=8700000&digits=3", "httpVersion": "HTTP/1.1", "queryString": [ { @@ -219,7 +219,7 @@ void main() { test('GET 12', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com/humanize/social", + "url": "https://api.apidash.dev/humanize/social", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -232,7 +232,7 @@ void main() { test('HEAD 1', () { const expectedCode = r"""{ "method": "HEAD", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -243,7 +243,7 @@ void main() { test('HEAD 2', () { const expectedCode = r"""{ "method": "HEAD", - "url": "http://api.foss42.com", + "url": "http://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] @@ -256,7 +256,7 @@ void main() { test('POST 1', () { const expectedCode = r"""{ "method": "POST", - "url": "https://api.foss42.com/case/lower", + "url": "https://api.apidash.dev/case/lower", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [ @@ -276,7 +276,7 @@ void main() { test('POST 2', () { const expectedCode = r"""{ "method": "POST", - "url": "https://api.foss42.com/case/lower", + "url": "https://api.apidash.dev/case/lower", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [ @@ -296,7 +296,7 @@ void main() { test('POST 3', () { const expectedCode = r"""{ "method": "POST", - "url": "https://api.foss42.com/case/lower", + "url": "https://api.apidash.dev/case/lower", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [ diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index 9498da1c..c364dbdb 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -8,7 +8,7 @@ void main() { group('GET Request', () { test('GET 1', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -29,7 +29,7 @@ axios(config) test('GET 2', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: 'get', params: { "code": "US" @@ -53,7 +53,7 @@ axios(config) test('GET 3', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: 'get', params: { "code": "IND" @@ -77,7 +77,7 @@ axios(config) test('GET 4', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -156,7 +156,7 @@ axios(config) test('GET 7', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -204,7 +204,7 @@ axios(config) test('GET 9', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -229,7 +229,7 @@ axios(config) test('GET 10', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', headers: { "User-Agent": "Test Agent" @@ -258,7 +258,7 @@ axios(config) test('GET 11', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -286,7 +286,7 @@ axios(config) test('GET 12', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get' }; @@ -309,7 +309,7 @@ axios(config) group('HEAD Request', () { test('HEAD 1', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'head' }; @@ -330,7 +330,7 @@ axios(config) test('HEAD 2', () { const expectedCode = r"""let config = { - url: 'http://api.foss42.com', + url: 'http://api.apidash.dev', method: 'head' }; @@ -353,7 +353,7 @@ axios(config) group('POST Request', () { test('POST 1', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "text/plain" @@ -378,7 +378,7 @@ axios(config) test('POST 2', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "application/json" @@ -403,7 +403,7 @@ axios(config) test('POST 3', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "application/json", diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index 43d053f9..c29f93b9 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -7,7 +7,7 @@ void main() { group('GET Request', () { test('GET 1', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -33,7 +33,7 @@ fetch(url, options) test('GET 2', () { const expectedCode = - r"""let url = 'https://api.foss42.com/country/data?code=US'; + r"""let url = 'https://api.apidash.dev/country/data?code=US'; let options = { method: 'GET' @@ -59,7 +59,7 @@ fetch(url, options) test('GET 3', () { const expectedCode = - r"""let url = 'https://api.foss42.com/country/data?code=IND'; + r"""let url = 'https://api.apidash.dev/country/data?code=IND'; let options = { method: 'GET' @@ -85,7 +85,7 @@ fetch(url, options) test('GET 4', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; + r"""let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; let options = { method: 'GET' @@ -168,7 +168,7 @@ fetch(url, options) }); test('GET 7', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -223,7 +223,7 @@ fetch(url, options) test('GET 9', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; + r"""let url = 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'; let options = { method: 'GET' @@ -249,7 +249,7 @@ fetch(url, options) test('GET 10', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social'; + r"""let url = 'https://api.apidash.dev/humanize/social'; let options = { method: 'GET', @@ -283,7 +283,7 @@ fetch(url, options) test('GET 11', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; + r"""let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3'; let options = { method: 'GET', @@ -312,7 +312,7 @@ fetch(url, options) test('GET 12', () { const expectedCode = - r"""let url = 'https://api.foss42.com/humanize/social'; + r"""let url = 'https://api.apidash.dev/humanize/social'; let options = { method: 'GET' @@ -339,7 +339,7 @@ fetch(url, options) group('HEAD Request', () { test('HEAD 1', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'HEAD' @@ -364,7 +364,7 @@ fetch(url, options) }); test('HEAD 2', () { - const expectedCode = r"""let url = 'http://api.foss42.com'; + const expectedCode = r"""let url = 'http://api.apidash.dev'; let options = { method: 'HEAD' @@ -391,7 +391,7 @@ fetch(url, options) group('POST Request', () { test('POST 1', () { - const expectedCode = r"""let url = 'https://api.foss42.com/case/lower'; + const expectedCode = r"""let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', @@ -421,7 +421,7 @@ fetch(url, options) }); test('POST 2', () { - const expectedCode = r"""let url = 'https://api.foss42.com/case/lower'; + const expectedCode = r"""let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', @@ -451,7 +451,7 @@ fetch(url, options) }); test('POST 3', () { - const expectedCode = r"""let url = 'https://api.foss42.com/case/lower'; + const expectedCode = r"""let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index 4f3220fa..bedb94c6 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -13,7 +13,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -38,7 +38,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/country/data".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/country/data".toHttpUrl().newBuilder() .addQueryParameter("code", "US") .build() @@ -65,7 +65,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/country/data".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/country/data".toHttpUrl().newBuilder() .addQueryParameter("code", "IND") .build() @@ -92,7 +92,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/humanize/social".toHttpUrl().newBuilder() .addQueryParameter("num", "8700000") .addQueryParameter("digits", "3") .addQueryParameter("system", "SS") @@ -175,7 +175,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -228,7 +228,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/humanize/social".toHttpUrl().newBuilder() .addQueryParameter("num", "8700000") .addQueryParameter("add_space", "true") .build() @@ -255,7 +255,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social" + val url = "https://api.apidash.dev/humanize/social" val request = Request.Builder() .url(url) @@ -285,7 +285,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social".toHttpUrl().newBuilder() + val url = "https://api.apidash.dev/humanize/social".toHttpUrl().newBuilder() .addQueryParameter("num", "8700000") .addQueryParameter("digits", "3") .build() @@ -313,7 +313,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/humanize/social" + val url = "https://api.apidash.dev/humanize/social" val request = Request.Builder() .url(url) @@ -339,7 +339,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -363,7 +363,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "http://api.foss42.com" + val url = "http://api.apidash.dev" val request = Request.Builder() .url(url) @@ -391,7 +391,7 @@ import okhttp3.MediaType.Companion.toMediaType fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/case/lower" + val url = "https://api.apidash.dev/case/lower" val mediaType = "text/plain".toMediaType() @@ -423,7 +423,7 @@ import okhttp3.MediaType.Companion.toMediaType fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/case/lower" + val url = "https://api.apidash.dev/case/lower" val mediaType = "application/json".toMediaType() @@ -455,7 +455,7 @@ import okhttp3.MediaType.Companion.toMediaType fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/case/lower" + val url = "https://api.apidash.dev/case/lower" val mediaType = "application/json".toMediaType() diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index 519f5ab5..d4a12902 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -10,7 +10,7 @@ void main() { const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -33,7 +33,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: 'get', params: { "code": "US" @@ -59,7 +59,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: 'get', params: { "code": "IND" @@ -85,7 +85,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -170,7 +170,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -222,7 +222,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -249,7 +249,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', headers: { "User-Agent": "Test Agent" @@ -280,7 +280,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { "num": "8700000", @@ -310,7 +310,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get' }; @@ -335,7 +335,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'head' }; @@ -358,7 +358,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'http://api.foss42.com', + url: 'http://api.apidash.dev', method: 'head' }; @@ -383,7 +383,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "text/plain" @@ -410,7 +410,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "application/json" @@ -437,7 +437,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { "Content-Type": "application/json", diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index c06ceee5..592610ee 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -9,7 +9,7 @@ void main() { test('GET 1', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -36,7 +36,7 @@ fetch(url, options) test('GET 2', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/country/data?code=US'; +let url = 'https://api.apidash.dev/country/data?code=US'; let options = { method: 'GET' @@ -63,7 +63,7 @@ fetch(url, options) test('GET 3', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/country/data?code=IND'; +let url = 'https://api.apidash.dev/country/data?code=IND'; let options = { method: 'GET' @@ -90,7 +90,7 @@ fetch(url, options) test('GET 4', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; +let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; let options = { method: 'GET' @@ -177,7 +177,7 @@ fetch(url, options) test('GET 7', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -234,7 +234,7 @@ fetch(url, options) 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 url = 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'; let options = { method: 'GET' @@ -261,7 +261,7 @@ fetch(url, options) test('GET 10', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social'; +let url = 'https://api.apidash.dev/humanize/social'; let options = { method: 'GET', @@ -296,7 +296,7 @@ fetch(url, options) test('GET 11', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social?num=8700000&digits=3'; +let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3'; let options = { method: 'GET', @@ -326,7 +326,7 @@ fetch(url, options) test('GET 12', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social'; +let url = 'https://api.apidash.dev/humanize/social'; let options = { method: 'GET' @@ -355,7 +355,7 @@ fetch(url, options) test('HEAD 1', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'HEAD' @@ -382,7 +382,7 @@ fetch(url, options) test('HEAD 2', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'http://api.foss42.com'; +let url = 'http://api.apidash.dev'; let options = { method: 'HEAD' @@ -411,7 +411,7 @@ fetch(url, options) test('POST 1', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/case/lower'; +let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', @@ -443,7 +443,7 @@ fetch(url, options) test('POST 2', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/case/lower'; +let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', @@ -475,7 +475,7 @@ fetch(url, options) test('POST 3', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/case/lower'; +let url = 'https://api.apidash.dev/case/lower'; let options = { method: 'POST', diff --git a/test/codegen/python_http_client_codegen_test.dart b/test/codegen/python_http_client_codegen_test.dart index c617305c..0ca712c2 100644 --- a/test/codegen/python_http_client_codegen_test.dart +++ b/test/codegen/python_http_client_codegen_test.dart @@ -9,7 +9,7 @@ void main() { test('GET 1', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "") res = conn.getresponse() @@ -30,7 +30,7 @@ queryParams = { } queryParamsStr = '?' + urlencode(queryParams) -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/country/data" + queryParamsStr) res = conn.getresponse() @@ -51,7 +51,7 @@ queryParams = { } queryParamsStr = '?' + urlencode(queryParams) -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/country/data" + queryParamsStr) res = conn.getresponse() @@ -76,7 +76,7 @@ queryParams = { } queryParamsStr = '?' + urlencode(queryParams) -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social" + queryParamsStr) res = conn.getresponse() @@ -137,7 +137,7 @@ print(data.decode("utf-8")) test('GET 7', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "") res = conn.getresponse() @@ -185,7 +185,7 @@ queryParams = { } queryParamsStr = '?' + urlencode(queryParams) -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social" + queryParamsStr) res = conn.getresponse() @@ -204,7 +204,7 @@ headers = { "User-Agent": "Test Agent" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social", headers= headers) @@ -235,7 +235,7 @@ headers = { "User-Agent": "Test Agent" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social" + queryParamsStr, headers= headers) @@ -251,7 +251,7 @@ print(data.decode("utf-8")) test('GET 12', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social") res = conn.getresponse() @@ -268,7 +268,7 @@ print(data.decode("utf-8")) test('HEAD 1', () { const expectedCode = r"""import http.client -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("HEAD", "") res = conn.getresponse() @@ -283,7 +283,7 @@ print(data.decode("utf-8")) test('HEAD 2', () { const expectedCode = r"""import http.client -conn = http.client.HTTPConnection("api.foss42.com") +conn = http.client.HTTPConnection("api.apidash.dev") conn.request("HEAD", "") res = conn.getresponse() @@ -308,7 +308,7 @@ headers = { "content-type": "text/plain" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", body= body, headers= headers) @@ -333,7 +333,7 @@ headers = { "content-type": "application/json" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", body= body, headers= headers) @@ -359,7 +359,7 @@ headers = { "content-type": "application/json" } -conn = http.client.HTTPSConnection("api.foss42.com") +conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", body= body, headers= headers) diff --git a/test/codegen/python_requests_codegen_test.dart b/test/codegen/python_requests_codegen_test.dart index 1387accf..3ed0a38a 100644 --- a/test/codegen/python_requests_codegen_test.dart +++ b/test/codegen/python_requests_codegen_test.dart @@ -9,7 +9,7 @@ void main() { test('GET 1', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' response = requests.get(url) @@ -23,7 +23,7 @@ print('Response Body:', response.text) test('GET 2', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/country/data' +url = 'https://api.apidash.dev/country/data' params = { "code": "US" @@ -41,7 +41,7 @@ print('Response Body:', response.text) test('GET 3', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/country/data' +url = 'https://api.apidash.dev/country/data' params = { "code": "IND" @@ -59,7 +59,7 @@ print('Response Body:', response.text) test('GET 4', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' params = { "num": "8700000", @@ -121,7 +121,7 @@ print('Response Body:', response.text) test('GET 7', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' response = requests.get(url) @@ -157,7 +157,7 @@ print('Response Body:', response.text) test('GET 9', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' params = { "num": "8700000", @@ -176,7 +176,7 @@ print('Response Body:', response.text) test('GET 10', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' headers = { "User-Agent": "Test Agent" @@ -198,7 +198,7 @@ print('Response Body:', response.text) test('GET 11', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' params = { "num": "8700000", @@ -221,7 +221,7 @@ print('Response Body:', response.text) test('GET 12', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/humanize/social' +url = 'https://api.apidash.dev/humanize/social' response = requests.get(url) @@ -237,7 +237,7 @@ print('Response Body:', response.text) test('HEAD 1', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' response = requests.head(url) @@ -251,7 +251,7 @@ print('Response Body:', response.text) test('HEAD 2', () { const expectedCode = r"""import requests -url = 'http://api.foss42.com' +url = 'http://api.apidash.dev' response = requests.head(url) @@ -267,7 +267,7 @@ print('Response Body:', response.text) test('POST 1', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/case/lower' +url = 'https://api.apidash.dev/case/lower' payload = r'''{ "text": "I LOVE Flutter" @@ -289,7 +289,7 @@ print('Response Body:', response.text) test('POST 2', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/case/lower' +url = 'https://api.apidash.dev/case/lower' payload = { "text": "I LOVE Flutter" @@ -307,7 +307,7 @@ print('Response Body:', response.text) test('POST 3', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com/case/lower' +url = 'https://api.apidash.dev/case/lower' payload = { "text": "I LOVE Flutter" diff --git a/test/models/request_model_test.dart b/test/models/request_model_test.dart index 626727de..1bb40ec7 100644 --- a/test/models/request_model_test.dart +++ b/test/models/request_model_test.dart @@ -52,7 +52,7 @@ void main() { RequestModel requestModel = RequestModel( id: '1', method: HTTPVerb.post, - url: 'api.foss42.com/case/lower', + url: 'api.apidash.dev/case/lower', name: 'foss42 api', requestHeaders: const [ NameValueModel(name: 'content-length', value: '18'), @@ -69,7 +69,7 @@ void main() { RequestModel requestModelDup = const RequestModel( id: '1', method: HTTPVerb.post, - url: 'api.foss42.com/case/lower', + url: 'api.apidash.dev/case/lower', name: 'foss42 api', requestHeaders: [ NameValueModel(name: 'content-length', value: '18'), @@ -84,7 +84,7 @@ void main() { RequestModel requestModelCopy = const RequestModel( id: '1', method: HTTPVerb.post, - url: 'api.foss42.com/case/lower', + url: 'api.apidash.dev/case/lower', name: 'foss42 api (copy)', requestHeaders: [ NameValueModel(name: 'content-length', value: '18'), @@ -99,7 +99,7 @@ void main() { Map requestModelAsJson = { "id": '1', "method": 'post', - "url": 'api.foss42.com/case/lower', + "url": 'api.apidash.dev/case/lower', "name": 'foss42 api', 'description': '', "requestHeaders": { @@ -138,7 +138,7 @@ void main() { final requestModeDupString = [ "Request Id: 1", "Request Method: post", - "Request URL: api.foss42.com/case/lower", + "Request URL: api.apidash.dev/case/lower", "Request Name: foss42 api", "Request Description: ", "Request Tab Index: 0", diff --git a/test/models/response_model_test.dart b/test/models/response_model_test.dart index 1122b833..d3553a27 100644 --- a/test/models/response_model_test.dart +++ b/test/models/response_model_test.dart @@ -81,19 +81,19 @@ void main() { test('Testing fromResponse', () async { final response = await http.get( - Uri.parse('https://api.foss42.com/'), + Uri.parse('https://api.apidash.dev/'), ); final responseData = responseModel.fromResponse(response: response); expect(responseData.statusCode, 200); expect(responseData.body, - '{"message":"Check out https://foss42.com for API docs to get started."}'); + '{"data":"Check out https://api.apidash.dev/docs to get started."}'); expect(responseData.formattedBody, '''{ - "message": "Check out https://foss42.com for API docs to get started." + "data": "Check out https://api.apidash.dev/docs to get started." }'''); }); test('Testing fromResponse for contentType not Json', () async { final response = await http.get( - Uri.parse('https://foss42.com/'), + Uri.parse('https://apidash.dev/'), ); final responseData = responseModel.fromResponse(response: response); expect(responseData.statusCode, 200); diff --git a/test/request_models.dart b/test/request_models.dart index d7f7df21..2009c792 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -4,14 +4,14 @@ import 'package:apidash/consts.dart'; /// Basic GET request model const requestModelGet1 = RequestModel( id: 'get1', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.get, ); /// GET request model with query params const requestModelGet2 = RequestModel( id: 'get2', - url: 'https://api.foss42.com/country/data', + url: 'https://api.apidash.dev/country/data', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'code', value: 'US'), @@ -21,7 +21,7 @@ const requestModelGet2 = RequestModel( /// GET request model with override query params const requestModelGet3 = RequestModel( id: 'get3', - url: 'https://api.foss42.com/country/data?code=US', + url: 'https://api.apidash.dev/country/data?code=US', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'code', value: 'IND'), @@ -31,7 +31,7 @@ const requestModelGet3 = RequestModel( /// GET request model with different types of query params const requestModelGet4 = RequestModel( id: 'get4', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -68,7 +68,7 @@ const requestModelGet6 = RequestModel( /// GET request model with body const requestModelGet7 = RequestModel( id: 'get7', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.get, requestBodyContentType: ContentType.text, requestBody: @@ -93,7 +93,7 @@ const requestModelGet8 = RequestModel( /// GET request model with some params enabled const requestModelGet9 = RequestModel( id: 'get9', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -112,7 +112,7 @@ const requestModelGet9 = RequestModel( /// GET Request model with some headers enabled const requestModelGet10 = RequestModel( id: 'get10', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestHeaders: [ NameValueModel(name: 'User-Agent', value: 'Test Agent'), @@ -127,7 +127,7 @@ const requestModelGet10 = RequestModel( /// GET Request model with some headers & URL parameters enabled const requestModelGet11 = RequestModel( id: 'get11', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -154,7 +154,7 @@ const requestModelGet11 = RequestModel( /// Request model with all headers & URL parameters disabled const requestModelGet12 = RequestModel( id: 'get12', - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -181,21 +181,21 @@ const requestModelGet12 = RequestModel( /// Basic HEAD request model const requestModelHead1 = RequestModel( id: 'head1', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.head, ); /// Without URI Scheme (pass default as http) const requestModelHead2 = RequestModel( id: 'head2', - url: 'api.foss42.com', + url: 'api.apidash.dev', method: HTTPVerb.head, ); /// Basic POST request model (txt body) const requestModelPost1 = RequestModel( id: 'post1', - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: HTTPVerb.post, requestBody: r"""{ "text": "I LOVE Flutter" @@ -205,7 +205,7 @@ const requestModelPost1 = RequestModel( /// POST request model with JSON body const requestModelPost2 = RequestModel( id: 'post2', - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: HTTPVerb.post, requestBody: r"""{ "text": "I LOVE Flutter" @@ -215,7 +215,7 @@ const requestModelPost2 = RequestModel( /// POST request model with headers const requestModelPost3 = RequestModel( id: 'post3', - url: 'https://api.foss42.com/case/lower', + url: 'https://api.apidash.dev/case/lower', method: HTTPVerb.post, requestBody: r"""{ "text": "I LOVE Flutter" diff --git a/test/utils/har_utils_test.dart b/test/utils/har_utils_test.dart index e3319fad..174ab180 100644 --- a/test/utils/har_utils_test.dart +++ b/test/utils/har_utils_test.dart @@ -101,7 +101,7 @@ void main() { 'request': { 'method': 'GET', 'url': - 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true', + 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true', 'httpVersion': 'HTTP/1.1', 'queryString': [ {'name': 'num', 'value': '8700000', 'comment': ''}, @@ -162,7 +162,7 @@ void main() { }, 'request': { 'method': 'POST', - 'url': 'https://api.foss42.com/case/lower', + 'url': 'https://api.apidash.dev/case/lower', 'httpVersion': 'HTTP/1.1', 'queryString': [], 'headers': [ @@ -252,7 +252,7 @@ void main() { test('Test requestModelToHARJsonRequest exportMode=true', () { Map expectedResult = { 'method': 'POST', - 'url': 'https://api.foss42.com/case/lower', + 'url': 'https://api.apidash.dev/case/lower', 'httpVersion': 'HTTP/1.1', 'queryString': [], 'headers': [ @@ -282,7 +282,7 @@ void main() { Map expectedResult = { 'method': 'GET', 'url': - 'https://api.foss42.com/humanize/social?num=8700000&digits=3&system=SS&add_space=true', + 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true', 'httpVersion': 'HTTP/1.1', 'queryString': [ {'name': 'num', 'value': '8700000'}, @@ -301,7 +301,7 @@ void main() { test('Test requestModelToHARJsonRequest useEnabled=true', () { Map expectedResult = { 'method': 'GET', - 'url': 'https://api.foss42.com/humanize/social?num=8700000&digits=3', + 'url': 'https://api.apidash.dev/humanize/social?num=8700000&digits=3', 'httpVersion': 'HTTP/1.1', 'queryString': [ {'name': 'num', 'value': '8700000'}, diff --git a/test/utils/http_utils_test.dart b/test/utils/http_utils_test.dart index 55129bcc..2b660fcb 100644 --- a/test/utils/http_utils_test.dart +++ b/test/utils/http_utils_test.dart @@ -19,14 +19,14 @@ void main() { }); test('Testing getRequestTitleFromUrl using url3', () { - String url3 = "https://api.foss42.com/country/codes"; - String title3Expected = "api.foss42.com/country/codes"; + String url3 = "https://api.apidash.dev/country/codes"; + String title3Expected = "api.apidash.dev/country/codes"; expect(getRequestTitleFromUrl(url3), title3Expected); }); test('Testing getRequestTitleFromUrl using url4', () { - String url4 = "api.foss42.com/country/data"; - String title4Expected = "api.foss42.com/country/data"; + String url4 = "api.apidash.dev/country/data"; + String title4Expected = "api.apidash.dev/country/data"; expect(getRequestTitleFromUrl(url4), title4Expected); }); @@ -175,11 +175,11 @@ void main() { group("Testing getValidRequestUri", () { test('Testing getValidRequestUri for normal values', () { - String url1 = "https://api.foss42.com/country/data"; + String url1 = "https://api.apidash.dev/country/data"; const kvRow1 = NameValueModel(name: "code", value: "US"); Uri uri1Expected = Uri( scheme: 'https', - host: 'api.foss42.com', + host: 'api.apidash.dev', path: 'country/data', queryParameters: {'code': 'US'}); expect(getValidRequestUri(url1, [kvRow1]), (uri1Expected, null)); @@ -193,11 +193,11 @@ void main() { expect(getValidRequestUri("", [kvRow3]), (null, "URL is missing!")); }); test('Testing getValidRequestUri when https is not provided in url', () { - String url4 = "api.foss42.com/country/data"; + String url4 = "api.apidash.dev/country/data"; const kvRow4 = NameValueModel(name: "code", value: "US"); Uri uri4Expected = Uri( scheme: 'https', - host: 'api.foss42.com', + host: 'api.apidash.dev', path: 'country/data', queryParameters: {'code': 'US'}); expect(getValidRequestUri(url4, [kvRow4]), (uri4Expected, null)); @@ -217,20 +217,20 @@ void main() { }); test('Testing getValidRequestUri when query params in both url and kvrow', () { - String url6 = "api.foss42.com/country/data?code=IND"; + String url6 = "api.apidash.dev/country/data?code=IND"; const kvRow6 = NameValueModel(name: "code", value: "US"); Uri uri6Expected = Uri( scheme: 'https', - host: 'api.foss42.com', + host: 'api.apidash.dev', path: 'country/data', queryParameters: {'code': 'US'}); expect(getValidRequestUri(url6, [kvRow6]), (uri6Expected, null)); }); test('Testing getValidRequestUri when kvrow is null', () { - String url7 = "api.foss42.com/country/data?code=US"; + String url7 = "api.apidash.dev/country/data?code=US"; Uri uri7Expected = Uri( scheme: 'https', - host: 'api.foss42.com', + host: 'api.apidash.dev', path: 'country/data', queryParameters: {'code': 'US'}); expect(getValidRequestUri(url7, null), (uri7Expected, null)); diff --git a/test/widgets/cards_test.dart b/test/widgets/cards_test.dart index e364d5eb..ae62ef55 100644 --- a/test/widgets/cards_test.dart +++ b/test/widgets/cards_test.dart @@ -17,7 +17,7 @@ void main() { SidebarRequestCard( id: '23', selectedId: '2', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.get, onTap: () { changedValue = 'Single Tapped'; @@ -34,11 +34,11 @@ void main() { expect(find.byType(InkWell), findsOneWidget); - expect(find.text('api.foss42.com'), findsOneWidget); - expect(find.widgetWithText(SizedBox, 'api.foss42.com'), findsOneWidget); - expect(find.widgetWithText(Card, 'api.foss42.com'), findsOneWidget); + expect(find.text('api.apidash.dev'), findsOneWidget); + expect(find.widgetWithText(SizedBox, 'api.apidash.dev'), findsOneWidget); + expect(find.widgetWithText(Card, 'api.apidash.dev'), findsOneWidget); await tester.pumpAndSettle(); - var tappable = find.widgetWithText(Card, 'api.foss42.com'); + var tappable = find.widgetWithText(Card, 'api.apidash.dev'); await tester.tap(tappable); await tester.pumpAndSettle(const Duration(seconds: 2)); expect(changedValue, 'Single Tapped'); @@ -63,7 +63,7 @@ void main() { id: '2', selectedId: '2', editRequestId: '2', - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: HTTPVerb.get, onTapOutsideNameEditor: () { changedValue = 'Tapped Outside'; diff --git a/test/widgets/code_previewer_test.dart b/test/widgets/code_previewer_test.dart index 6fd77b4f..56bb3384 100644 --- a/test/widgets/code_previewer_test.dart +++ b/test/widgets/code_previewer_test.dart @@ -9,7 +9,7 @@ void main() { String code = r'''import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/codes'); + var uri = Uri.parse('https://api.apidash.dev/country/codes'); final response = await http.get(uri); diff --git a/test/widgets/codegen_previewer_test.dart b/test/widgets/codegen_previewer_test.dart index 8310087e..cc337d2c 100644 --- a/test/widgets/codegen_previewer_test.dart +++ b/test/widgets/codegen_previewer_test.dart @@ -9,7 +9,7 @@ void main() { String code = r'''import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/codes'); + var uri = Uri.parse('https://api.apidash.dev/country/codes'); final response = await http.get(uri); diff --git a/test/widgets/response_widgets_test.dart b/test/widgets/response_widgets_test.dart index 1aebc539..7877a285 100644 --- a/test/widgets/response_widgets_test.dart +++ b/test/widgets/response_widgets_test.dart @@ -201,7 +201,7 @@ void main() { RequestModel requestModel = const RequestModel( id: '1', method: HTTPVerb.post, - url: 'api.foss42.com/case/lower', + url: 'api.apidash.dev/case/lower', name: 'foss42 api', requestHeaders: [ NameValueModel(name: 'content-length', value: '18'), @@ -372,7 +372,7 @@ void main() { String code = r'''import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/country/codes'); + var uri = Uri.parse('https://api.apidash.dev/country/codes'); final response = await http.get(uri); From 94ccf7598d3504f992f7640f32a81657f2c5514b Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Fri, 8 Mar 2024 11:46:43 +0530 Subject: [PATCH 56/85] Update test case 1 --- test/widgets/markdown_test.dart | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index c3e0c343..500dca15 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -5,20 +5,30 @@ import 'package:apidash/widgets/markdown.dart'; void main() { group('CustomMarkdown Widget Tests', () { - testWidgets('Testing CustomMarkdown buttons and tags renders', (tester) async { + testWidgets('Testing CustomMarkdown buttons and tags renders', + (tester) async { const markdown = CustomMarkdown( data: """Is a markdown ~`star on github`~ - #br - #br +#br +#br - ~`github repo`~ ~`Discord Server`~""", +~`github repo`~ ~`Discord Server`~""", ); await tester.pumpWidget(const MaterialApp(home: markdown)); - expect(find.byType(InlineButton), findsNWidgets(3)); + expect(find.byIcon(Icons.star), findsOneWidget); + expect(find.text("star on github"), findsOneWidget); + + expect(find.byIcon(Icons.discord), findsOneWidget); + expect(find.text("Discord Server"), findsOneWidget); + + expect(find.byIcon(Icons.code_rounded), findsOneWidget); + expect(find.text("github repo"), findsOneWidget); + expect(find.text('#br'), findsNothing); }); + testWidgets('CustomMarkdown renders correctly', (WidgetTester tester) async { await tester.pumpWidget(const MaterialApp( From f1d666fd722764c07b0efad931864acb5fccf026 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Fri, 8 Mar 2024 11:59:15 +0530 Subject: [PATCH 57/85] Fix web compilation --- pubspec.lock | 22 +++++++++++----------- pubspec.yaml | 3 ++- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index f48a9105..4125ed98 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -508,10 +508,10 @@ packages: dependency: "direct main" description: name: http - sha256: d4872660c46d929f6b8a9ef4e7a7eff7e49bbf0c4ec3f385ee32df5119175139 + sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" http_multi_server: dependency: transitive description: @@ -909,10 +909,10 @@ packages: dependency: transitive description: name: pointer_interceptor_web - sha256: "9386e064097fd16419e935c23f08f35b58e6aaec155dd39bd6a003b88f9c14b4" + sha256: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e url: "https://pub.dev" source: hosted - version: "0.10.1+2" + version: "0.10.2" pointycastle: dependency: transitive description: @@ -1234,10 +1234,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "7286aec002c8feecc338cc33269e96b73955ab227456e9fb2a91f7fab8a358e9" + sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.0" url_launcher_windows: dependency: transitive description: @@ -1303,13 +1303,13 @@ packages: source: hosted version: "1.1.0" web: - dependency: transitive + dependency: "direct main" description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.5.1" web_socket_channel: dependency: transitive description: @@ -1376,5 +1376,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.3 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8441a0f5..ab250f26 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,11 +5,12 @@ version: 0.3.0+3 environment: sdk: ">=3.0.0 <4.0.0" - flutter: ">=3.7.2" + flutter: ">=3.16.0" dependencies: flutter: sdk: flutter + web: ^0.5.0 multi_split_view: ^2.4.0 url_launcher: ^6.1.12 flutter_riverpod: ^2.3.7 From 890a446ea201f882d79a21227928460d38f71206 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 8 Mar 2024 13:26:07 +0530 Subject: [PATCH 58/85] Fix test to check platform specific results --- test/utils/file_utils_test.dart | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/test/utils/file_utils_test.dart b/test/utils/file_utils_test.dart index 35411d44..26e90e39 100644 --- a/test/utils/file_utils_test.dart +++ b/test/utils/file_utils_test.dart @@ -1,6 +1,6 @@ +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; import 'package:apidash/utils/file_utils.dart'; -import 'package:path/path.dart' as p; void main() { group( @@ -12,8 +12,13 @@ void main() { }); test('Test getShortPath', () { - String path = "A/B/C/D.csv"; - expect(getShortPath(path), p.join("...", "C", "D.csv")); + if (kIsWindows) { + String path = r"A\B\C\D.csv"; + expect(getShortPath(path), r"...\C\D.csv"); + } else { + String path = "A/B/C/D.csv"; + expect(getShortPath(path), ".../C/D.csv"); + } }); test('Test getTempFileName', () { From b1e7cfa134f2fb47944bf6adae356402993acffa Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Fri, 8 Mar 2024 18:17:09 +0530 Subject: [PATCH 59/85] Update editor_request.dart --- .../home_page/editor_pane/editor_request.dart | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/lib/screens/home_page/editor_pane/editor_request.dart b/lib/screens/home_page/editor_pane/editor_request.dart index ce567483..90a60349 100644 --- a/lib/screens/home_page/editor_pane/editor_request.dart +++ b/lib/screens/home_page/editor_pane/editor_request.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:apidash/providers/collection_providers.dart'; import 'package:apidash/consts.dart'; import 'details_card/details_card.dart'; import 'url_card.dart'; @@ -10,6 +12,7 @@ class RequestEditor extends StatelessWidget { Widget build(BuildContext context) { return const Column( children: [ + RequestEditorTopBar(), EditorPaneRequestURLCard(), kVSpacer10, Expanded( @@ -19,3 +22,91 @@ class RequestEditor extends StatelessWidget { ); } } + +class RequestEditorTopBar extends ConsumerWidget { + const RequestEditorTopBar({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final id = ref.watch(selectedIdStateProvider); + final name = + ref.watch(selectedRequestModelProvider.select((value) => value?.name)); + return Padding( + padding: const EdgeInsets.only( + left: 12.0, + top: 4.0, + right: 8.0, + bottom: 4.0, + ), + child: Row( + children: [ + Expanded( + child: Text( + name ?? "", + style: Theme.of(context).textTheme.bodyMedium, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + const SizedBox( + width: 6, + ), + SizedBox( + width: 90, + height: 24, + child: FilledButton.tonalIcon( + style: const ButtonStyle( + padding: MaterialStatePropertyAll(EdgeInsets.zero), + ), + onPressed: () { + showDialog( + context: context, + builder: (context) { + final controller = + TextEditingController(text: name ?? ""); + controller.selection = TextSelection( + baseOffset: 0, extentOffset: controller.text.length); + return AlertDialog( + title: const Text('Rename Request'), + content: TextField( + autofocus: true, + controller: controller, + decoration: + const InputDecoration(hintText: "Enter new name"), + ), + actions: [ + OutlinedButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text('CANCEL')), + FilledButton( + onPressed: () { + final val = controller.text.trim(); + ref + .read(collectionStateNotifierProvider + .notifier) + .update(id!, name: val); + Navigator.pop(context); + controller.dispose(); + }, + child: const Text('OK')), + ], + ); + }); + }, + icon: const Icon( + Icons.edit, + size: 12, + ), + label: Text( + "Rename", + style: Theme.of(context).textTheme.bodySmall, + ), + ), + ) + ], + ), + ); + } +} From 8f0de897a567e88a2ea93fcde98bc8ec4ceae30a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 9 Mar 2024 09:57:44 +0530 Subject: [PATCH 60/85] Update url_card.dart --- lib/screens/home_page/editor_pane/url_card.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index cf3d5ad9..b306cf81 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -69,7 +69,7 @@ class URLTextField extends ConsumerWidget { }); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { final activeId = ref.watch(activeIdStateProvider); return Focus( autofocus: true, From c4a77a9e37c666e9a85efd530ebcae46a0e2508c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 9 Mar 2024 09:59:08 +0530 Subject: [PATCH 61/85] Update url_card.dart --- lib/screens/home_page/editor_pane/url_card.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index b306cf81..3da87791 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -70,7 +70,7 @@ class URLTextField extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final activeId = ref.watch(activeIdStateProvider); + final selectedId = ref.watch(selectedIdStateProvider); return Focus( autofocus: true, child: KeyboardListener( @@ -80,19 +80,19 @@ class URLTextField extends ConsumerWidget { event.logicalKey == LogicalKeyboardKey.enter) { ref .read(collectionStateNotifierProvider.notifier) - .sendRequest(activeId); + .sendRequest(selectedId); } }, child: URLField( - activeId: activeId!, + selectedId: selectedId!, initialValue: ref .read(collectionStateNotifierProvider.notifier) - .getRequestModel(activeId) + .getRequestModel(selectedId) ?.url, onChanged: (value) { ref .read(collectionStateNotifierProvider.notifier) - .update(activeId, url: value); + .update(selectedId, url: value); }, ), )); From 1abc29a39c8dffe8db3099bf692616093b466f81 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 9 Mar 2024 10:27:22 +0530 Subject: [PATCH 62/85] Revert "Merge pull request #260 from thargyi74/resolve-issue-252" This reverts commit 1f41abf7ce85554f14e79ff16da6a594664030f5, reversing changes made to 0b8184eafab1e26eea1d4064e52ddee88981fceb. --- .../home_page/editor_pane/url_card.dart | 38 ++++++------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index 3da87791..5fa4b404 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:apidash/providers/providers.dart'; import 'package:apidash/widgets/widgets.dart'; @@ -71,31 +70,18 @@ class URLTextField extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final selectedId = ref.watch(selectedIdStateProvider); - return Focus( - autofocus: true, - child: KeyboardListener( - focusNode: FocusNode(), - onKeyEvent: (KeyEvent event) { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - ref - .read(collectionStateNotifierProvider.notifier) - .sendRequest(selectedId); - } - }, - child: URLField( - selectedId: selectedId!, - initialValue: ref - .read(collectionStateNotifierProvider.notifier) - .getRequestModel(selectedId) - ?.url, - onChanged: (value) { - ref - .read(collectionStateNotifierProvider.notifier) - .update(selectedId, url: value); - }, - ), - )); + return URLField( + selectedId: selectedId!, + initialValue: ref + .read(collectionStateNotifierProvider.notifier) + .getRequestModel(selectedId) + ?.url, + onChanged: (value) { + ref + .read(collectionStateNotifierProvider.notifier) + .update(selectedId, url: value); + }, + ); } } From 58f5ae06e4fe1905b8a19b111773080206b641ca Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 9 Mar 2024 12:06:25 +0530 Subject: [PATCH 63/85] Cleanup --- lib/widgets/cards.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/widgets/cards.dart b/lib/widgets/cards.dart index 6a48e26b..943227ce 100644 --- a/lib/widgets/cards.dart +++ b/lib/widgets/cards.dart @@ -98,9 +98,6 @@ class SidebarRequestCard extends StatelessWidget { //FocusScope.of(context).unfocus(); }, onFieldSubmitted: (value) { - // As new name is being contantly updated by - // [onChangedNameEditor], stop editing by - // calling this fn onTapOutsideNameEditor?.call(); }, onChanged: onChangedNameEditor, From 6972ca82b5b9b4226cd495f8ceb364ec80b49a86 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 9 Mar 2024 14:58:01 +0530 Subject: [PATCH 64/85] fixes --- .../details_card/response_pane.dart | 6 ++-- .../home_page/editor_pane/url_card.dart | 5 +-- lib/widgets/buttons.dart | 34 +++++++++++-------- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/lib/screens/home_page/editor_pane/details_card/response_pane.dart b/lib/screens/home_page/editor_pane/details_card/response_pane.dart index 3e344117..548d17a8 100644 --- a/lib/screens/home_page/editor_pane/details_card/response_pane.dart +++ b/lib/screens/home_page/editor_pane/details_card/response_pane.dart @@ -9,12 +9,14 @@ class ResponsePane extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final isWorking = ref.watch( + selectedRequestModelProvider.select((value) => value?.isWorking)) ?? + false; final responseStatus = ref.watch( selectedRequestModelProvider.select((value) => value?.responseStatus)); - final isWorking = ref.watch(selectedRequestModelProvider)?.isWorking; final message = ref .watch(selectedRequestModelProvider.select((value) => value?.message)); - if (isWorking == true) { + if (isWorking) { return const SendingWidget(); } if (responseStatus == null) { diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index 8e00f377..f9d1b72f 100644 --- a/lib/screens/home_page/editor_pane/url_card.dart +++ b/lib/screens/home_page/editor_pane/url_card.dart @@ -93,10 +93,11 @@ class SendButton extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final selectedId = ref.watch(selectedIdStateProvider); - final isWorking = ref.watch(selectedRequestModelProvider)?.isWorking; + final isWorking = ref.watch( + selectedRequestModelProvider.select((value) => value?.isWorking)); return SendRequestButton( - isWorking: isWorking, + isWorking: isWorking ?? false, onTap: () { ref .read(collectionStateNotifierProvider.notifier) diff --git a/lib/widgets/buttons.dart b/lib/widgets/buttons.dart index 2dc28ba6..f9baf0c4 100644 --- a/lib/widgets/buttons.dart +++ b/lib/widgets/buttons.dart @@ -51,27 +51,33 @@ class SendRequestButton extends StatelessWidget { required this.onTap, }); - final bool? isWorking; + final bool isWorking; final void Function() onTap; @override Widget build(BuildContext context) { return FilledButton( - onPressed: isWorking == true ? null : onTap, + onPressed: isWorking ? null : onTap, child: Row( mainAxisSize: MainAxisSize.min, - children: [ - Text( - isWorking == true ? kLabelSending : kLabelSend, - style: kTextStyleButton, - ), - if (isWorking == false) kHSpacer10, - if (isWorking == false) - const Icon( - size: 16, - Icons.send, - ), - ], + children: isWorking + ? const [ + Text( + kLabelSending, + style: kTextStyleButton, + ), + ] + : const [ + Text( + kLabelSend, + style: kTextStyleButton, + ), + kHSpacer10, + Icon( + size: 16, + Icons.send, + ), + ], ), ); } From 8e9e668d0fe0732a921aa64b6fed90c216bf4086 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 9 Mar 2024 20:06:42 +0530 Subject: [PATCH 65/85] Migrate to api.apidash.dev --- test/request_models.dart | 56 ++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/test/request_models.dart b/test/request_models.dart index c8764bca..7b086041 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -230,11 +230,12 @@ const requestModelPost3 = RequestModel( /// POST request model with multipart body(text) const requestModelPost4 = RequestModel( id: 'post4', - url: 'https://oshi.at', + url: 'https://api.apidash.dev/io/form', method: HTTPVerb.post, requestFormDataList: [ - FormDataModel( - name: "text", value: "some textual string", type: FormDataType.file) + FormDataModel(name: "text", value: "API", type: FormDataType.text), + FormDataModel(name: "sep", value: "|", type: FormDataType.text), + FormDataModel(name: "times", value: "3", type: FormDataType.text), ], requestBodyContentType: ContentType.formdata, ); @@ -242,11 +243,12 @@ const requestModelPost4 = RequestModel( /// POST request model with multipart body and headers const requestModelPost5 = RequestModel( id: 'post5', - url: 'https://oshi.at', + url: 'https://api.apidash.dev/io/form', method: HTTPVerb.post, requestFormDataList: [ - FormDataModel( - name: "text", value: "some textual string", type: FormDataType.text) + FormDataModel(name: "text", value: "API", type: FormDataType.text), + FormDataModel(name: "sep", value: "|", type: FormDataType.text), + FormDataModel(name: "times", value: "3", type: FormDataType.text), ], requestHeaders: [ NameValueModel(name: 'User-Agent', value: 'Test Agent'), @@ -254,13 +256,15 @@ const requestModelPost5 = RequestModel( requestBodyContentType: ContentType.formdata, ); -/// POST request model with multipart body(file) +/// POST request model with multipart body(text, file) const requestModelPost6 = RequestModel( id: 'post6', - url: 'https://oshi.at', + url: 'https://api.apidash.dev/io/img', method: HTTPVerb.post, requestFormDataList: [ - FormDataModel(name: "f", value: "/path/to/file", type: FormDataType.file) + FormDataModel(name: "token", value: "xyz", type: FormDataType.text), + FormDataModel( + name: "imfile", value: "/Documents/up/1.png", type: FormDataType.file), ], requestBodyContentType: ContentType.formdata, ); @@ -268,14 +272,15 @@ const requestModelPost6 = RequestModel( /// POST request model with multipart body and requestBody (the requestBody shouldn't be in codegen) const requestModelPost7 = RequestModel( id: 'post7', - url: 'https://oshi.at', + url: 'https://api.apidash.dev/io/img', method: HTTPVerb.post, requestBody: r"""{ "text": "I LOVE Flutter" }""", requestFormDataList: [ + FormDataModel(name: "token", value: "xyz", type: FormDataType.text), FormDataModel( - name: "text", value: "some textual string", type: FormDataType.text) + name: "imfile", value: "/Documents/up/1.png", type: FormDataType.file), ], requestBodyContentType: ContentType.formdata, ); @@ -283,18 +288,16 @@ const requestModelPost7 = RequestModel( /// POST request model with multipart body and requestParams const requestModelPost8 = RequestModel( id: 'post8', - url: 'https://oshi.at', + url: 'https://api.apidash.dev/io/form', method: HTTPVerb.post, requestFormDataList: [ - FormDataModel( - name: "text", value: "some textual string", type: FormDataType.text) + FormDataModel(name: "text", value: "API", type: FormDataType.text), + FormDataModel(name: "sep", value: "|", type: FormDataType.text), + FormDataModel(name: "times", value: "3", type: FormDataType.text), ], requestParams: [ - NameValueModel(name: 'num', value: '8700000'), - NameValueModel(name: 'digits', value: '3'), - NameValueModel(name: 'system', value: 'SS'), - NameValueModel(name: 'add_space', value: 'true'), - NameValueModel(name: 'trailing_zeros', value: 'true'), + NameValueModel(name: 'size', value: '2'), + NameValueModel(name: 'len', value: '3'), ], requestBodyContentType: ContentType.formdata, ); @@ -302,26 +305,23 @@ const requestModelPost8 = RequestModel( /// POST request model with multipart body(file and text), requestParams, requestHeaders and requestBody const requestModelPost9 = RequestModel( id: 'post9', - url: 'https://oshi.at', + url: 'https://api.apidash.dev/io/img', method: HTTPVerb.post, requestBody: r"""{ "text": "I LOVE Flutter" }""", requestFormDataList: [ + FormDataModel(name: "token", value: "xyz", type: FormDataType.text), FormDataModel( - name: "text", value: "some textual string", type: FormDataType.text), - FormDataModel(name: "f", value: "/path/to/file", type: FormDataType.file) + name: "imfile", value: "/Documents/up/1.png", type: FormDataType.file), ], requestParams: [ - NameValueModel(name: 'num', value: '8700000'), - NameValueModel(name: 'digits', value: '3'), - NameValueModel(name: 'system', value: 'SS'), - NameValueModel(name: 'add_space', value: 'true'), - NameValueModel(name: 'trailing_zeros', value: 'true'), + NameValueModel(name: 'size', value: '2'), + NameValueModel(name: 'len', value: '3'), ], requestHeaders: [ NameValueModel(name: 'User-Agent', value: 'Test Agent'), - NameValueModel(name: 'Content-Type', value: 'multipart/form-data'), + NameValueModel(name: 'Keep-Alive', value: 'true'), ], requestBodyContentType: ContentType.formdata, ); From 750a5af12be260302f9b5ee2dcf5fed51f295e9c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 9 Mar 2024 21:22:25 +0530 Subject: [PATCH 66/85] fix test case --- test/codegen/kotlin_okhttp_codegen_test.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index acca0a66..1b9ac764 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -479,7 +479,7 @@ fun main() { expectedCode); }); - test('POST 4', () { + test('POST 5', () { const expectedCode = r'''import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.MultipartBody @@ -487,8 +487,10 @@ import okhttp3.MultipartBody fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com/case/lower" - val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("text","I LOVE Flutter") + val url = "https://api.apidash.dev/io/form" + val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("text","API") + .addFormDataPart("sep","|") + .addFormDataPart("times","3") .build() val request = Request.Builder() .url(url) @@ -502,7 +504,7 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost4, "https"), + expect(kotlinOkHttpCodeGen.getCode(requestModelPost5, "https"), expectedCode); }); }); From 1b4a5caa7ae5160926f2b9a1203ca27d75c20950 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 10 Mar 2024 05:33:53 +0530 Subject: [PATCH 67/85] Update cURL codegen --- lib/codegen/others/curl.dart | 45 ++++++++++--------- test/codegen/curl_codegen_test.dart | 68 ++++++++++++++++++++++++++--- 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/lib/codegen/others/curl.dart b/lib/codegen/others/curl.dart index 4ae610de..6c0e02fc 100644 --- a/lib/codegen/others/curl.dart +++ b/lib/codegen/others/curl.dart @@ -1,6 +1,7 @@ import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' show requestModelToHARJsonRequest; import 'package:apidash/models/models.dart' show RequestModel; +import 'package:apidash/consts.dart'; // ignore: camel_case_types class cURLCodeGen { @@ -11,7 +12,7 @@ class cURLCodeGen { --header '{{name}}: {{value}}' """; String kTemplateFormData = """ \\ - --form '{{name}}: {{value}}' + --form '{{name}}={{value}}' """; String kTemplateBody = """ \\ @@ -38,7 +39,7 @@ class cURLCodeGen { "method": switch (harJson["method"]) { "GET" => "", "HEAD" => " --head", - _ => " --request ${harJson["method"]} \\\n" + _ => " --request ${harJson["method"]} \\\n " }, "url": harJson["url"], }); @@ -51,27 +52,31 @@ class cURLCodeGen { .render({"name": item["name"], "value": item["value"]}); } } - if (harJson['formData'] != null) { - var formDataList = harJson['formData'] as List>; - for (var formData in formDataList) { - var templateFormData = jj.Template(kTemplateFormData); - if (formData['type'] != null && - formData['name'] != null && - formData['value'] != null && - formData['name']!.isNotEmpty && - formData['value']!.isNotEmpty) { - result += templateFormData.render({ - "name": formData["name"], - "value": - "${formData['type'] == 'file' ? '@' : ''}${formData["value"]}", - }); + + var method = requestModel.method; + if (kMethodsWithBody.contains(method)) { + if (harJson['formData'] != null) { + var formDataList = harJson['formData'] as List>; + for (var formData in formDataList) { + var templateFormData = jj.Template(kTemplateFormData); + if (formData['type'] != null && + formData['name'] != null && + formData['value'] != null && + formData['name']!.isNotEmpty && + formData['value']!.isNotEmpty) { + result += templateFormData.render({ + "name": formData["name"], + "value": + "${formData['type'] == 'file' ? '@' : ''}${formData["value"]}", + }); + } } } - } - if (harJson["postData"]?["text"] != null) { - var templateBody = jj.Template(kTemplateBody); - result += templateBody.render({"body": harJson["postData"]["text"]}); + if (harJson["postData"]?["text"] != null) { + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": harJson["postData"]["text"]}); + } } return result; } catch (e) { diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index 212a82ce..cde41db3 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -102,7 +102,7 @@ void main() { group('POST Request', () { test('POST 1', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.apidash.dev/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: text/plain' \ --data '{ "text": "I LOVE Flutter" @@ -112,7 +112,7 @@ void main() { test('POST 2', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.apidash.dev/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: application/json' \ --data '{ "text": "I LOVE Flutter" @@ -122,7 +122,7 @@ void main() { test('POST 3', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.apidash.dev/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: application/json' \ --header 'User-Agent: Test Agent' \ --data '{ @@ -130,12 +130,66 @@ void main() { }'"""; expect(curlCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); + + test('POST 4', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/form' \ + --form 'text=API' \ + --form 'sep=|' \ + --form 'times=3'"""; + expect(curlCodeGen.getCode(requestModelPost4, "https"), expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/form' \ + --header 'User-Agent: Test Agent' \ + --form 'text=API' \ + --form 'sep=|' \ + --form 'times=3'"""; + expect(curlCodeGen.getCode(requestModelPost5, "https"), expectedCode); + }); + + test('POST 6', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/img' \ + --form 'token=xyz' \ + --form 'imfile=@/Documents/up/1.png'"""; + expect(curlCodeGen.getCode(requestModelPost6, "https"), expectedCode); + }); + + test('POST 7', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/img' \ + --form 'token=xyz' \ + --form 'imfile=@/Documents/up/1.png'"""; + expect(curlCodeGen.getCode(requestModelPost7, "https"), expectedCode); + }); + + test('POST 8', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/form?size=2&len=3' \ + --form 'text=API' \ + --form 'sep=|' \ + --form 'times=3'"""; + expect(curlCodeGen.getCode(requestModelPost8, "https"), expectedCode); + }); + + test('POST 9', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/img?size=2&len=3' \ + --header 'User-Agent: Test Agent' \ + --header 'Keep-Alive: true' \ + --form 'token=xyz' \ + --form 'imfile=@/Documents/up/1.png'"""; + expect(curlCodeGen.getCode(requestModelPost9, "https"), expectedCode); + }); }); group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""curl --request PUT \ - --url 'https://reqres.in/api/users/2' \ + --url 'https://reqres.in/api/users/2' \ --header 'Content-Type: application/json' \ --data '{ "name": "morpheus", @@ -148,7 +202,7 @@ void main() { group('PATCH Request', () { test('PATCH 1', () { const expectedCode = r"""curl --request PATCH \ - --url 'https://reqres.in/api/users/2' \ + --url 'https://reqres.in/api/users/2' \ --header 'Content-Type: application/json' \ --data '{ "name": "marfeus", @@ -161,13 +215,13 @@ void main() { group('DELETE Request', () { test('DELETE 1', () { const expectedCode = r"""curl --request DELETE \ - --url 'https://reqres.in/api/users/2'"""; + --url 'https://reqres.in/api/users/2'"""; expect(curlCodeGen.getCode(requestModelDelete1, "https"), expectedCode); }); test('DELETE 2', () { const expectedCode = r"""curl --request DELETE \ - --url 'https://reqres.in/api/users/2' \ + --url 'https://reqres.in/api/users/2' \ --header 'Content-Type: application/json' \ --data '{ "name": "marfeus", From beb6d52c79ae59ca703b057b35cf4b7258df8cca Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 10 Mar 2024 06:06:28 +0530 Subject: [PATCH 68/85] Fix multipart request --- lib/providers/collection_providers.dart | 2 - lib/services/http_service.dart | 75 +++++++++++++------------ 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index a1afa070..8768773d 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -173,8 +173,6 @@ class CollectionStateNotifier (http.Response?, Duration?, String?)? responseRec = await request( requestModel, defaultUriScheme: defaultUriScheme, - isMultiPartRequest: - requestModel.requestBodyContentType == ContentType.formdata, ); late final RequestModel newRequestModel; if (responseRec.$1 == null) { diff --git a/lib/services/http_service.dart b/lib/services/http_service.dart index c5a7b4ce..dec0b516 100644 --- a/lib/services/http_service.dart +++ b/lib/services/http_service.dart @@ -9,7 +9,6 @@ import 'package:apidash/consts.dart'; Future<(http.Response?, Duration?, String?)> request( RequestModel requestModel, { String defaultUriScheme = kDefaultUriScheme, - bool isMultiPartRequest = false, }) async { (Uri?, String?) uriRec = getValidRequestUri( requestModel.url, @@ -22,44 +21,48 @@ Future<(http.Response?, Duration?, String?)> request( http.Response response; String? body; try { - var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(requestModel.method) && - requestBody != null) { - var contentLength = utf8.encode(requestBody).length; - if (contentLength > 0) { - body = requestBody; - headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); - if (!requestModel.hasContentTypeHeader) { - headers[HttpHeaders.contentTypeHeader] = - requestModel.requestBodyContentType.header; - } - } - } Stopwatch stopwatch = Stopwatch()..start(); - if (isMultiPartRequest) { - var multiPartRequest = http.MultipartRequest( - requestModel.method.name.toUpperCase(), - requestUrl, - ); - multiPartRequest.headers.addAll(headers); - for (FormDataModel formData - in (requestModel.requestFormDataList ?? [])) { - if (formData.type == FormDataType.text) { - multiPartRequest.fields.addAll({formData.name: formData.value}); - } else { - multiPartRequest.files.add( - await http.MultipartFile.fromPath( - formData.name, - formData.value, - ), - ); + var isMultiPartRequest = + requestModel.requestBodyContentType == ContentType.formdata; + if (kMethodsWithBody.contains(requestModel.method)) { + var requestBody = requestModel.requestBody; + if (requestBody != null && !isMultiPartRequest) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + body = requestBody; + headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); + if (!requestModel.hasContentTypeHeader) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.requestBodyContentType.header; + } } } - http.StreamedResponse multiPartResponse = await multiPartRequest.send(); - stopwatch.stop(); - http.Response convertedMultiPartResponse = - await convertStreamedResponse(multiPartResponse); - return (convertedMultiPartResponse, stopwatch.elapsed, null); + if (isMultiPartRequest) { + var multiPartRequest = http.MultipartRequest( + requestModel.method.name.toUpperCase(), + requestUrl, + ); + multiPartRequest.headers.addAll(headers); + for (var formData + in (requestModel.requestFormDataList ?? [])) { + if (formData.type == FormDataType.text) { + multiPartRequest.fields.addAll({formData.name: formData.value}); + } else { + multiPartRequest.files.add( + await http.MultipartFile.fromPath( + formData.name, + formData.value, + ), + ); + } + } + http.StreamedResponse multiPartResponse = + await multiPartRequest.send(); + stopwatch.stop(); + http.Response convertedMultiPartResponse = + await convertStreamedResponse(multiPartResponse); + return (convertedMultiPartResponse, stopwatch.elapsed, null); + } } switch (requestModel.method) { case HTTPVerb.get: From 28516cd1c92ec4b2604b572cf79b70fdc33ac226 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 10 Mar 2024 06:59:31 +0530 Subject: [PATCH 69/85] Revert "fixed curl code gen error for empty url" This reverts commit 7e1ca33a28921789f0720542e63b2c520e553fcf. --- lib/codegen/others/curl.dart | 65 ++++++++++------------------- pubspec.lock | 40 ++++-------------- test/codegen/curl_codegen_test.dart | 5 +-- 3 files changed, 32 insertions(+), 78 deletions(-) diff --git a/lib/codegen/others/curl.dart b/lib/codegen/others/curl.dart index 638e9da5..4ae610de 100644 --- a/lib/codegen/others/curl.dart +++ b/lib/codegen/others/curl.dart @@ -1,7 +1,6 @@ -import 'package:apidash/models/models.dart' show RequestModel; import 'package:jinja/jinja.dart' as jj; - -import '../../consts.dart'; +import 'package:apidash/utils/utils.dart' show requestModelToHARJsonRequest; +import 'package:apidash/models/models.dart' show RequestModel; // ignore: camel_case_types class cURLCodeGen { @@ -30,48 +29,30 @@ class cURLCodeGen { if (!url.contains("://") && url.isNotEmpty) { url = "$defaultUriScheme://$url"; } - if (requestModel.enabledParamsMap.isNotEmpty) { - if (!url.contains('?')) { - url += "?"; - } else { - url += "&"; - } - for (MapEntry entry - in requestModel.enabledParamsMap.entries) { - url += "${Uri.encodeFull(entry.key)}=${Uri.encodeFull(entry.value)}&"; - } - url = url.substring(0, url.length - 1); - } var rM = requestModel.copyWith(url: url); + + var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ - "method": switch (rM.method.name.toUpperCase()) { + "method": switch (harJson["method"]) { "GET" => "", "HEAD" => " --head", - _ => " --request ${rM.method.name.toUpperCase()} \\\n" + _ => " --request ${harJson["method"]} \\\n" }, - "url": rM.url, + "url": harJson["url"], }); - Map headers = rM.enabledHeadersMap; - if (rM.requestBody != null && - rM.requestBody!.isNotEmpty && - rM.method != HTTPVerb.get && - rM.requestBodyContentType != ContentType.formdata) { - var templateHeader = jj.Template(kTemplateHeader); - result += templateHeader.render({ - "name": "Content-Type", - "value": rM.requestBodyContentType.header - }); + var headers = harJson["headers"]; + if (headers.isNotEmpty) { + for (var item in headers) { + var templateHeader = jj.Template(kTemplateHeader); + result += templateHeader + .render({"name": item["name"], "value": item["value"]}); + } } - for (MapEntry header in headers.entries) { - var templateHeader = jj.Template(kTemplateHeader); - result += - templateHeader.render({"name": header.key, "value": header.value}); - } - - if (rM.requestBodyContentType == ContentType.formdata) { - List> formDataList = rM.formDataMapList; + if (harJson['formData'] != null) { + var formDataList = harJson['formData'] as List>; for (var formData in formDataList) { var templateFormData = jj.Template(kTemplateFormData); if (formData['type'] != null && @@ -86,13 +67,11 @@ class cURLCodeGen { }); } } - } else { - if (rM.requestBody != null && - rM.requestBody!.isNotEmpty && - rM.method != HTTPVerb.get) { - var templateBody = jj.Template(kTemplateBody); - result += templateBody.render({"body": rM.requestBody}); - } + } + + if (harJson["postData"]?["text"] != null) { + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": harJson["postData"]["text"]}); } return result; } catch (e) { diff --git a/pubspec.lock b/pubspec.lock index 1737f75f..2f3f7f55 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -625,30 +625,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" - url: "https://pub.dev" - source: hosted - version: "10.0.0" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 - url: "https://pub.dev" - source: hosted - version: "2.0.1" lints: dependency: transitive description: @@ -685,26 +661,26 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.10.0" mime: dependency: transitive description: @@ -781,10 +757,10 @@ packages: dependency: "direct main" description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.8.3" path_parsing: dependency: transitive description: diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index b62de8b4..e9bb7f60 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -1,7 +1,6 @@ import 'package:apidash/codegen/others/curl.dart'; -import 'package:test/test.dart'; - import '../request_models.dart'; +import 'package:test/test.dart'; void main() { final curlCodeGen = cURLCodeGen(); @@ -20,7 +19,7 @@ void main() { test('GET 3', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/country/data?code=US&code=IND'"""; + r"""curl --url 'https://api.foss42.com/country/data?code=IND'"""; expect(curlCodeGen.getCode(requestModelGet3, "https"), expectedCode); }); From d23019a43d911ecad964d03635ae0877b2cded4e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 10 Mar 2024 07:02:23 +0530 Subject: [PATCH 70/85] Accept test change --- test/codegen/curl_codegen_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index e9bb7f60..6ba9c01b 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -1,6 +1,6 @@ +import 'package:test/test.dart'; import 'package:apidash/codegen/others/curl.dart'; import '../request_models.dart'; -import 'package:test/test.dart'; void main() { final curlCodeGen = cURLCodeGen(); From f9c32cddfd296719aebf84b3b4b9c494c5f55dca Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 10 Mar 2024 23:10:19 +0530 Subject: [PATCH 71/85] replace by getNewUuid --- lib/providers/collection_providers.dart | 8 ++++---- lib/utils/file_utils.dart | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index 8768773d..4ecc51ab 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -3,7 +3,7 @@ import 'settings_providers.dart'; import 'ui_providers.dart'; import '../models/models.dart'; import '../services/services.dart' show hiveHandler, HiveHandler, request; -import '../utils/utils.dart' show uuid, collectionToHAR; +import '../utils/utils.dart' show getNewUuid, collectionToHAR; import '../consts.dart'; import 'package:http/http.dart' as http; @@ -54,7 +54,7 @@ class CollectionStateNotifier } void add() { - final id = uuid.v1(); + final id = getNewUuid(); final newRequestModel = RequestModel( id: id, ); @@ -97,7 +97,7 @@ class CollectionStateNotifier } void duplicate(String id) { - final newId = uuid.v1(); + final newId = getNewUuid(); var itemIds = ref.read(requestSequenceProvider); int idx = itemIds.indexOf(id); @@ -213,7 +213,7 @@ class CollectionStateNotifier bool loadData() { var ids = hiveHandler.getIds(); if (ids == null || ids.length == 0) { - String newId = uuid.v1(); + String newId = getNewUuid(); state = { newId: RequestModel( id: newId, diff --git a/lib/utils/file_utils.dart b/lib/utils/file_utils.dart index 41a6d4a3..4f5c2228 100644 --- a/lib/utils/file_utils.dart +++ b/lib/utils/file_utils.dart @@ -49,7 +49,7 @@ String getShortPath(String path) { } String getTempFileName() { - return uuid.v1(); + return getNewUuid(); } Future pickFile() async { From 5776d9b840d3a566f753be99e9896fee77727020 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 10 Mar 2024 23:27:00 +0530 Subject: [PATCH 72/85] set boundary --- lib/codegen/codegen.dart | 14 ++++++++++---- lib/codegen/python/http_client.dart | 9 ++++----- lib/codegen/python/requests.dart | 8 ++++---- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 1aec7144..d39e4d10 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,5 +1,6 @@ import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; +import 'package:apidash/utils/utils.dart' show getNewUuid; import 'dart/http.dart'; import 'dart/dio.dart'; import 'kotlin/okhttp.dart'; @@ -14,8 +15,12 @@ class Codegen { String? getCode( CodegenLanguage codegenLanguage, RequestModel requestModel, - String defaultUriScheme, - ) { + String defaultUriScheme, { + String? boundary, + }) { + if (requestModel.isFormDataRequest) { + boundary = boundary ?? getNewUuid(); + } switch (codegenLanguage) { case CodegenLanguage.curl: return cURLCodeGen().getCode(requestModel, defaultUriScheme); @@ -39,9 +44,10 @@ class Codegen { return KotlinOkHttpCodeGen().getCode(requestModel, defaultUriScheme); case CodegenLanguage.pythonHttpClient: return PythonHttpClientCodeGen() - .getCode(requestModel, defaultUriScheme); + .getCode(requestModel, defaultUriScheme, boundary); case CodegenLanguage.pythonRequests: - return PythonRequestsCodeGen().getCode(requestModel, defaultUriScheme); + return PythonRequestsCodeGen() + .getCode(requestModel, defaultUriScheme, boundary); } } } diff --git a/lib/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index 196b10df..c9082bb1 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' - show getNewUuid, getValidRequestUri, padMultilineString; + show getValidRequestUri, padMultilineString; import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; @@ -89,9 +89,8 @@ body = b'\r\n'.join(dataList) String? getCode( RequestModel requestModel, String defaultUriScheme, + String? boundary, ) { - String uuid = getNewUuid(); - try { String result = ""; bool hasHeaders = false; @@ -148,7 +147,7 @@ body = b'\r\n'.join(dataList) var formHeaderTemplate = jj.Template(kTemplateFormHeaderContentType); headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ - "boundary": uuid, + "boundary": boundary, }); } @@ -169,7 +168,7 @@ body = b'\r\n'.join(dataList) result += formDataBodyData.render( { "fields_list": json.encode(requestModel.formDataMapList), - "boundary": uuid, + "boundary": boundary, }, ); } diff --git a/lib/codegen/python/requests.dart b/lib/codegen/python/requests.dart index cd79ccde..b9ea1bca 100644 --- a/lib/codegen/python/requests.dart +++ b/lib/codegen/python/requests.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/consts.dart'; import 'package:apidash/utils/utils.dart' - show getNewUuid, getValidRequestUri, padMultilineString, stripUriParams; + show getValidRequestUri, padMultilineString, stripUriParams; import 'package:apidash/models/models.dart' show RequestModel; class PythonRequestsCodeGen { @@ -94,6 +94,7 @@ print('Response Body:', response.text) String? getCode( RequestModel requestModel, String defaultUriScheme, + String? boundary, ) { try { String result = ""; @@ -101,7 +102,6 @@ print('Response Body:', response.text) bool hasHeaders = false; bool hasBody = false; bool hasJsonBody = false; - String uuid = getNewUuid(); String url = requestModel.url; if (!url.contains("://") && url.isNotEmpty) { @@ -155,7 +155,7 @@ print('Response Body:', response.text) var formHeaderTemplate = jj.Template(kTemplateFormHeaderContentType); headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ - "boundary": uuid, + "boundary": boundary, }); } if (headers.isNotEmpty || hasBody) { @@ -175,7 +175,7 @@ print('Response Body:', response.text) result += formDataBodyData.render( { "fields_list": json.encode(requestModel.formDataMapList), - "boundary": uuid, + "boundary": boundary, }, ); } From 5af2fe885e8bbd458b82d8a8b6bd66b1769d1873 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 01:50:33 +0530 Subject: [PATCH 73/85] Update file_utils.dart --- lib/utils/file_utils.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/utils/file_utils.dart b/lib/utils/file_utils.dart index 4f5c2228..68554153 100644 --- a/lib/utils/file_utils.dart +++ b/lib/utils/file_utils.dart @@ -48,6 +48,11 @@ String getShortPath(String path) { return path; } +String getFilenameFromPath(String path) { + var f = p.split(path); + return f.last; +} + String getTempFileName() { return getNewUuid(); } From 20d99e02586350ef569fd82649ef3e517518157b Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 01:50:57 +0530 Subject: [PATCH 74/85] Update POST Model 2 --- test/request_models.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/request_models.dart b/test/request_models.dart index 0c3d85e2..67ff2835 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -209,7 +209,12 @@ const requestModelPost2 = RequestModel( url: 'https://api.apidash.dev/case/lower', method: HTTPVerb.post, requestBody: r"""{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }""", ); From e517e9d919ddc4a42ef90070d53167f8eb355598 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 01:51:12 +0530 Subject: [PATCH 75/85] Update request_model_test.dart --- test/models/request_model_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/models/request_model_test.dart b/test/models/request_model_test.dart index 1bb40ec7..b7dbb413 100644 --- a/test/models/request_model_test.dart +++ b/test/models/request_model_test.dart @@ -175,7 +175,7 @@ void main() { }); expect(requestModel.paramsMap, {}); expect(requestModel.formDataMapList, []); - expect(requestModel.isFormDataRequest, false); + expect(requestModel.hasFormData, false); expect(requestModel.hasContentTypeHeader, true); }); From e8fd13cbcef2ad3a65153bc3089b2b6060b94cb7 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 01:52:24 +0530 Subject: [PATCH 76/85] Update Python requests codegen --- lib/codegen/codegen.dart | 64 +++-- lib/codegen/codegen_utils.dart | 15 ++ lib/codegen/python/requests.dart | 144 ++++++----- .../codegen/python_requests_codegen_test.dart | 235 +++++++++++++++--- 4 files changed, 331 insertions(+), 127 deletions(-) create mode 100644 lib/codegen/codegen_utils.dart diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index d39e4d10..f6fdaa5f 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -18,36 +18,64 @@ class Codegen { String defaultUriScheme, { String? boundary, }) { - if (requestModel.isFormDataRequest) { - boundary = boundary ?? getNewUuid(); - } switch (codegenLanguage) { case CodegenLanguage.curl: - return cURLCodeGen().getCode(requestModel, defaultUriScheme); + return cURLCodeGen().getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.har: - return HARCodeGen().getCode(requestModel, defaultUriScheme); + return HARCodeGen().getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.dartHttp: - return DartHttpCodeGen().getCode(requestModel, defaultUriScheme); + return DartHttpCodeGen().getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.dartDio: - return DartDioCodeGen().getCode(requestModel, defaultUriScheme); + return DartDioCodeGen().getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.jsAxios: - return AxiosCodeGen().getCode(requestModel, defaultUriScheme); + return AxiosCodeGen().getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.jsFetch: - return FetchCodeGen().getCode(requestModel, defaultUriScheme); + return FetchCodeGen().getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.nodejsAxios: - return AxiosCodeGen(isNodeJs: true) - .getCode(requestModel, defaultUriScheme); + return AxiosCodeGen(isNodeJs: true).getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.nodejsFetch: - return FetchCodeGen(isNodeJs: true) - .getCode(requestModel, defaultUriScheme); + return FetchCodeGen(isNodeJs: true).getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.kotlinOkHttp: - return KotlinOkHttpCodeGen().getCode(requestModel, defaultUriScheme); + return KotlinOkHttpCodeGen().getCode( + requestModel, + defaultUriScheme, + ); case CodegenLanguage.pythonHttpClient: - return PythonHttpClientCodeGen() - .getCode(requestModel, defaultUriScheme, boundary); + return PythonHttpClientCodeGen().getCode( + requestModel, + defaultUriScheme, + boundary: boundary ?? getNewUuid(), + ); case CodegenLanguage.pythonRequests: - return PythonRequestsCodeGen() - .getCode(requestModel, defaultUriScheme, boundary); + return PythonRequestsCodeGen().getCode( + requestModel, + defaultUriScheme, + boundary: boundary, + ); } } } diff --git a/lib/codegen/codegen_utils.dart b/lib/codegen/codegen_utils.dart new file mode 100644 index 00000000..2d7a1846 --- /dev/null +++ b/lib/codegen/codegen_utils.dart @@ -0,0 +1,15 @@ +String jsonToPyDict(String jsonString) { + Map replaceWithMap = { + "null": "None", + "true": "True", + "false": "False" + }; + String pyDict = jsonString; + for (var k in replaceWithMap.keys) { + RegExp regExp = RegExp(k + r'(?=([^"]*"[^"]*")*[^"]*$)'); + pyDict = pyDict.replaceAllMapped(regExp, (match) { + return replaceWithMap[match.group(0)] ?? match.group(0)!; + }); + } + return pyDict; +} diff --git a/lib/codegen/python/requests.dart b/lib/codegen/python/requests.dart index b9ea1bca..8a700122 100644 --- a/lib/codegen/python/requests.dart +++ b/lib/codegen/python/requests.dart @@ -1,15 +1,14 @@ import 'dart:io'; -import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/consts.dart'; import 'package:apidash/utils/utils.dart' - show getValidRequestUri, padMultilineString, stripUriParams; + show getValidRequestUri, stripUriParams, getFilenameFromPath; import 'package:apidash/models/models.dart' show RequestModel; +import '../codegen_utils.dart'; class PythonRequestsCodeGen { final String kTemplateStart = """import requests -{% if isFormDataRequest %}import mimetypes -from codecs import encode +{% if hasFormData %}from requests_toolbelt.multipart.encoder import MultipartEncoder {% endif %} url = '{{url}}' @@ -20,7 +19,6 @@ url = '{{url}}' params = {{params}} """; - int kParamsPadding = 9; String kTemplateBody = """ @@ -39,44 +37,27 @@ payload = {{body}} headers = {{headers}} """; - String kTemplateFormHeaderContentType = ''' -multipart/form-data; boundary={{boundary}}'''; - - int kHeadersPadding = 10; String kTemplateRequest = """ response = requests.{{method}}(url """; - final String kStringFormDataBody = r''' + final String kTemplateFormDataBody = r''' -def build_data_list(fields): - dataList = [] - for field in fields: - name = field.get('name', '') - value = field.get('value', '') - type_ = field.get('type', 'text') +payload = MultipartEncoder({ +{{formdata_payload}} +}{% if boundary != '' %}, + boundary="{{boundary}}" +{% endif %}) - dataList.append(encode('--{{boundary}}')) - if type_ == 'text': - dataList.append(encode(f'Content-Disposition: form-data; name="{name}"')) - dataList.append(encode('Content-Type: text/plain')) - dataList.append(encode('')) - dataList.append(encode(value)) - elif type_ == 'file': - dataList.append(encode(f'Content-Disposition: form-data; name="{name}"; filename="{value}"')) - dataList.append(encode(f'Content-Type: {mimetypes.guess_type(value)[0] or "application/octet-stream"}')) - dataList.append(encode('')) - dataList.append(open(value, 'rb').read()) - dataList.append(encode('--{{boundary}}--')) - dataList.append(encode('')) - return dataList - -dataList = build_data_list({{fields_list}}) -payload = b'\r\n'.join(dataList) '''; + String kTemplateFormDataRowText = r""" "{{name}}": "{{value}}","""; + + String kTemplateFormDataRowFile = + r""" "{{name}}": ("{{filename}}", open("{{path}}", "rb")),"""; + String kStringRequestParams = """, params=params"""; String kStringRequestBody = """, data=payload"""; @@ -91,11 +72,18 @@ print('Status Code:', response.status_code) print('Response Body:', response.text) """; + String kStringFormDataContentType = "payload.content_type"; + + String refactorHeaderString(String headerString) { + return headerString.replaceAll( + '"$kStringFormDataContentType"', kStringFormDataContentType); + } + String? getCode( RequestModel requestModel, - String defaultUriScheme, + String defaultUriScheme, { String? boundary, - ) { + }) { try { String result = ""; bool hasQuery = false; @@ -117,7 +105,7 @@ print('Response Body:', response.text) var templateStartUrl = jj.Template(kTemplateStart); result += templateStartUrl.render({ "url": stripUriParams(uri), - 'isFormDataRequest': requestModel.isFormDataRequest + 'hasFormData': requestModel.hasFormData }); if (uri.hasQuery) { @@ -126,77 +114,85 @@ print('Response Body:', response.text) hasQuery = true; var templateParams = jj.Template(kTemplateParams); var paramsString = kEncoder.convert(params); - paramsString = padMultilineString(paramsString, kParamsPadding); result += templateParams.render({"params": paramsString}); } } - var method = requestModel.method; - var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(method) && requestBody != null) { - var contentLength = utf8.encode(requestBody).length; - if (contentLength > 0) { - if (requestModel.requestBodyContentType == ContentType.json) { - hasJsonBody = true; - var templateBody = jj.Template(kTemplateJson); - result += templateBody.render({"body": requestBody}); - } else if (!requestModel.isFormDataRequest) { - hasBody = true; - var templateBody = jj.Template(kTemplateBody); - result += templateBody.render({"body": requestBody}); + if (requestModel.hasFormData) { + hasBody = true; + List formdataPayload = []; + for (var item in requestModel.formDataList) { + if (item.type == FormDataType.text) { + formdataPayload.add(jj.Template(kTemplateFormDataRowText).render({ + "name": item.name, + "value": item.value, + })); + } + if (item.type == FormDataType.file) { + formdataPayload.add(jj.Template(kTemplateFormDataRowFile).render({ + "name": item.name, + "filename": getFilenameFromPath(item.value), + "path": item.value, + })); } } + var formDataBodyData = jj.Template(kTemplateFormDataBody); + result += formDataBodyData.render( + { + "formdata_payload": formdataPayload.join("\n"), + "boundary": boundary ?? '', + }, + ); + } else if (requestModel.hasJsonData) { + hasJsonBody = true; + var templateBody = jj.Template(kTemplateJson); + var pyDict = jsonToPyDict(requestModel.requestBody ?? ""); + result += templateBody.render({"body": pyDict}); + } else if (requestModel.hasTextData) { + hasBody = true; + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": requestModel.requestBody}); } var headersList = requestModel.enabledRequestHeaders; if (headersList != null || hasBody) { var headers = requestModel.enabledHeadersMap; - if (requestModel.isFormDataRequest) { - var formHeaderTemplate = - jj.Template(kTemplateFormHeaderContentType); - headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ - "boundary": boundary, - }); - } - if (headers.isNotEmpty || hasBody) { - hasHeaders = true; - if (hasBody) { + if (hasBody) { + if (requestModel.hasFormData) { + headers[HttpHeaders.contentTypeHeader] = + kStringFormDataContentType; + } else { headers[HttpHeaders.contentTypeHeader] = requestModel.requestBodyContentType.header; } + } + if (headers.isNotEmpty) { + hasHeaders = true; var headersString = kEncoder.convert(headers); - headersString = padMultilineString(headersString, kHeadersPadding); + headersString = refactorHeaderString(headersString); var templateHeaders = jj.Template(kTemplateHeaders); result += templateHeaders.render({"headers": headersString}); } } - if (requestModel.isFormDataRequest) { - var formDataBodyData = jj.Template(kStringFormDataBody); - result += formDataBodyData.render( - { - "fields_list": json.encode(requestModel.formDataMapList), - "boundary": boundary, - }, - ); - } + var templateRequest = jj.Template(kTemplateRequest); result += templateRequest.render({ - "method": method.name.toLowerCase(), + "method": requestModel.method.name.toLowerCase(), }); if (hasQuery) { result += kStringRequestParams; } - if (hasBody || requestModel.isFormDataRequest) { + if (hasBody) { result += kStringRequestBody; } - if (hasJsonBody || requestModel.isFormDataRequest) { + if (hasJsonBody) { result += kStringRequestJson; } - if (hasHeaders || requestModel.isFormDataRequest) { + if (hasHeaders) { result += kStringRequestHeaders; } diff --git a/test/codegen/python_requests_codegen_test.dart b/test/codegen/python_requests_codegen_test.dart index 3ed0a38a..babe65d6 100644 --- a/test/codegen/python_requests_codegen_test.dart +++ b/test/codegen/python_requests_codegen_test.dart @@ -26,8 +26,8 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/country/data' params = { - "code": "US" - } + "code": "US" +} response = requests.get(url, params=params) @@ -44,8 +44,8 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/country/data' params = { - "code": "IND" - } + "code": "IND" +} response = requests.get(url, params=params) @@ -62,12 +62,12 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/humanize/social' params = { - "num": "8700000", - "digits": "3", - "system": "SS", - "add_space": "true", - "trailing_zeros": "true" - } + "num": "8700000", + "digits": "3", + "system": "SS", + "add_space": "true", + "trailing_zeros": "true" +} response = requests.get(url, params=params) @@ -84,8 +84,8 @@ print('Response Body:', response.text) url = 'https://api.github.com/repos/foss42/apidash' headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.get(url, headers=headers) @@ -102,12 +102,12 @@ print('Response Body:', response.text) url = 'https://api.github.com/repos/foss42/apidash' params = { - "raw": "true" - } + "raw": "true" +} headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.get(url, params=params, headers=headers) @@ -138,12 +138,12 @@ print('Response Body:', response.text) url = 'https://api.github.com/repos/foss42/apidash' params = { - "raw": "true" - } + "raw": "true" +} headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.get(url, params=params, headers=headers) @@ -160,9 +160,9 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/humanize/social' params = { - "num": "8700000", - "add_space": "true" - } + "num": "8700000", + "add_space": "true" +} response = requests.get(url, params=params) @@ -179,8 +179,8 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/humanize/social' headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.get(url, headers=headers) @@ -201,13 +201,13 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/humanize/social' params = { - "num": "8700000", - "digits": "3" - } + "num": "8700000", + "digits": "3" +} headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.get(url, params=params, headers=headers) @@ -274,8 +274,8 @@ payload = r'''{ }''' headers = { - "content-type": "text/plain" - } + "content-type": "text/plain" +} response = requests.post(url, data=payload, headers=headers) @@ -292,7 +292,12 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/case/lower' payload = { -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": None, +"male": True, +"female": False, +"no": 1.2, +"arr": ["null", "true", "false", None] } response = requests.post(url, json=payload) @@ -314,8 +319,8 @@ payload = { } headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.post(url, json=payload, headers=headers) @@ -325,6 +330,166 @@ print('Response Body:', response.text) expect(pythonRequestsCodeGen.getCode(requestModelPost3, "https"), expectedCode); }); + + test('POST 4', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/form' + +payload = MultipartEncoder({ + "text": "API", + "sep": "|", + "times": "3", +}) + +headers = { + "content-type": payload.content_type +} + +response = requests.post(url, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelPost4, "https"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/form' + +payload = MultipartEncoder({ + "text": "API", + "sep": "|", + "times": "3", +}) + +headers = { + "User-Agent": "Test Agent", + "content-type": payload.content_type +} + +response = requests.post(url, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelPost5, "https"), + expectedCode); + }); + + test('POST 6', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/img' + +payload = MultipartEncoder({ + "token": "xyz", + "imfile": ("1.png", open("/Documents/up/1.png", "rb")), +}) + +headers = { + "content-type": payload.content_type +} + +response = requests.post(url, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelPost6, "https"), + expectedCode); + }); + + test('POST 7', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/img' + +payload = MultipartEncoder({ + "token": "xyz", + "imfile": ("1.png", open("/Documents/up/1.png", "rb")), +}) + +headers = { + "content-type": payload.content_type +} + +response = requests.post(url, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelPost7, "https"), + expectedCode); + }); + + test('POST 8', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/form' + +params = { + "size": "2", + "len": "3" +} + +payload = MultipartEncoder({ + "text": "API", + "sep": "|", + "times": "3", +}) + +headers = { + "content-type": payload.content_type +} + +response = requests.post(url, params=params, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelPost8, "https"), + expectedCode); + }); + + test('POST 9', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/img' + +params = { + "size": "2", + "len": "3" +} + +payload = MultipartEncoder({ + "token": "xyz", + "imfile": ("1.png", open("/Documents/up/1.png", "rb")), +}) + +headers = { + "User-Agent": "Test Agent", + "Keep-Alive": "true", + "content-type": payload.content_type +} + +response = requests.post(url, params=params, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect(pythonRequestsCodeGen.getCode(requestModelPost9, "https"), + expectedCode); + }); }); group('PUT Request', () { From 4d4380f3aab9f1b168c3dc133d93464e9fdb2868 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 01:53:06 +0530 Subject: [PATCH 77/85] Update request model --- lib/codegen/js/axios.dart | 14 ++++++-------- lib/codegen/js/fetch.dart | 10 +++++----- lib/codegen/kotlin/okhttp.dart | 4 ++-- lib/codegen/python/http_client.dart | 18 +++++++++--------- lib/models/request_model.dart | 21 ++++++++++++++++++++- 5 files changed, 42 insertions(+), 25 deletions(-) diff --git a/lib/codegen/js/axios.dart b/lib/codegen/js/axios.dart index 1aeee285..424aa710 100644 --- a/lib/codegen/js/axios.dart +++ b/lib/codegen/js/axios.dart @@ -12,7 +12,7 @@ class AxiosCodeGen { String kStringImportNode = """{% if isNodeJs %}import axios from 'axios'; -{% endif %}{% if isFormDataRequest and isNodeJs %}const fs = require('fs');{% endif %} +{% endif %}{% if hasFormData and isNodeJs %}const fs = require('fs');{% endif %} """; String kTemplateStart = """let config = { @@ -78,13 +78,12 @@ async function buildFormData(fields) { try { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); String importsData = kNodejsImportTemplate.render({ - "isFormDataRequest": requestModel.isFormDataRequest, + "hasFormData": requestModel.hasFormData, "isNodeJs": isNodeJs, }); String result = importsData; - if (requestModel.isFormDataRequest && - requestModel.formDataMapList.isNotEmpty) { + if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); var renderedMultiPartBody = templateMultiPartBody.render({ "isNodeJs": isNodeJs, @@ -118,13 +117,13 @@ async function buildFormData(fields) { } var headers = harJson["headers"]; - if (headers.isNotEmpty || requestModel.isFormDataRequest) { + if (headers.isNotEmpty || requestModel.hasFormData) { var templateHeader = jj.Template(kTemplateHeader); var m = {}; for (var i in headers) { m[i["name"]] = i["value"]; } - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { m['Content-Type'] = 'multipart/form-data'; } result += templateHeader @@ -132,8 +131,7 @@ async function buildFormData(fields) { } var templateBody = jj.Template(kTemplateBody); - if (requestModel.isFormDataRequest && - requestModel.formDataMapList.isNotEmpty) { + if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { var getFieldDataTemplate = jj.Template(kGetFormDataTemplate); result += templateBody.render({ diff --git a/lib/codegen/js/fetch.dart b/lib/codegen/js/fetch.dart index 4ef2e551..3241e311 100644 --- a/lib/codegen/js/fetch.dart +++ b/lib/codegen/js/fetch.dart @@ -12,7 +12,7 @@ class FetchCodeGen { String kStringImportNode = """ import fetch from 'node-fetch'; -{% if isFormDataRequest %}const fs = require('fs');{% endif %} +{% if hasFormData %}const fs = require('fs');{% endif %} """; @@ -78,11 +78,11 @@ fetch(url, options) try { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); String importsData = kNodejsImportTemplate.render({ - "isFormDataRequest": requestModel.isFormDataRequest, + "hasFormData": requestModel.hasFormData, }); String result = isNodeJs ? importsData : ""; - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); result += templateMultiPartBody.render({ "isNodeJs": isNodeJs, @@ -108,7 +108,7 @@ fetch(url, options) if (headers.isNotEmpty) { var templateHeader = jj.Template(kTemplateHeader); var m = {}; - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { m["Content-Type"] = "multipart/form-data"; } for (var i in headers) { @@ -124,7 +124,7 @@ fetch(url, options) result += templateBody.render({ "body": kEncoder.convert(harJson["postData"]["text"]), }); - } else if (requestModel.isFormDataRequest) { + } else if (requestModel.hasFormData) { var templateBody = jj.Template(kTemplateBody); result += templateBody.render({ "body": 'payload', diff --git a/lib/codegen/kotlin/okhttp.dart b/lib/codegen/kotlin/okhttp.dart index bd8f0489..856d8f0c 100644 --- a/lib/codegen/kotlin/okhttp.dart +++ b/lib/codegen/kotlin/okhttp.dart @@ -113,7 +113,7 @@ import okhttp3.MultipartBody"""; var method = requestModel.method; var requestBody = requestModel.requestBody; - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { hasFormData = true; var formDataTemplate = jj.Template(kFormDataBody); @@ -152,7 +152,7 @@ import okhttp3.MultipartBody"""; var templateRequestEnd = jj.Template(kTemplateRequestEnd); result += templateRequestEnd.render({ "method": method.name.toLowerCase(), - "hasBody": (hasBody || requestModel.isFormDataRequest) ? "body" : "", + "hasBody": (hasBody || requestModel.hasFormData) ? "body" : "", }); } return result; diff --git a/lib/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index c9082bb1..1d042e96 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -8,7 +8,7 @@ import 'package:apidash/consts.dart'; class PythonHttpClientCodeGen { final String kTemplateStart = """import http.client -{% if isFormDataRequest %}import mimetypes +{% if hasFormData %}import mimetypes from codecs import encode {% endif %} """; @@ -88,9 +88,9 @@ body = b'\r\n'.join(dataList) '''; String? getCode( RequestModel requestModel, - String defaultUriScheme, + String defaultUriScheme, { String? boundary, - ) { + }) { try { String result = ""; bool hasHeaders = false; @@ -105,7 +105,7 @@ body = b'\r\n'.join(dataList) var templateStartUrl = jj.Template(kTemplateStart); result += templateStartUrl.render( { - "isFormDataRequest": requestModel.isFormDataRequest, + "hasFormData": requestModel.hasFormData, }, ); var rec = getValidRequestUri( @@ -131,7 +131,7 @@ body = b'\r\n'.join(dataList) var requestBody = requestModel.requestBody; if (kMethodsWithBody.contains(method) && requestBody != null && - !requestModel.isFormDataRequest) { + !requestModel.hasFormData) { var contentLength = utf8.encode(requestBody).length; if (contentLength > 0) { hasBody = true; @@ -143,7 +143,7 @@ body = b'\r\n'.join(dataList) var headersList = requestModel.enabledRequestHeaders; if (headersList != null || hasBody) { var headers = requestModel.enabledHeadersMap; - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { var formHeaderTemplate = jj.Template(kTemplateFormHeaderContentType); headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ @@ -163,7 +163,7 @@ body = b'\r\n'.join(dataList) result += templateHeaders.render({"headers": headersString}); } } - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { var formDataBodyData = jj.Template(kStringFormDataBody); result += formDataBodyData.render( { @@ -185,11 +185,11 @@ body = b'\r\n'.join(dataList) "queryParamsStr": hasQuery ? " + queryParamsStr" : "", }); - if (hasBody || requestModel.isFormDataRequest) { + if (hasBody || requestModel.hasFormData) { result += kStringRequestBody; } - if (hasHeaders || requestModel.isFormDataRequest) { + if (hasHeaders || requestModel.hasFormData) { result += kStringRequestHeaders; } diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index a8d3569a..290681f6 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:convert'; import 'package:flutter/foundation.dart'; import '../utils/utils.dart' show @@ -62,9 +63,27 @@ class RequestModel { Map get headersMap => rowsToMap(requestHeaders) ?? {}; Map get paramsMap => rowsToMap(requestParams) ?? {}; + bool get hasFormDataContentType => + requestBodyContentType == ContentType.formdata; + bool get hasJsonContentType => requestBodyContentType == ContentType.json; + bool get hasTextContentType => requestBodyContentType == ContentType.text; + int get contentLength => utf8.encode(requestBody ?? "").length; + bool get hasJsonData => + kMethodsWithBody.contains(method) && + hasJsonContentType && + contentLength > 0; + bool get hasTextData => + kMethodsWithBody.contains(method) && + hasTextContentType && + contentLength > 0; + bool get hasFormData => + kMethodsWithBody.contains(method) && + hasFormDataContentType && + (requestFormDataList ?? []).isNotEmpty; + List get formDataList => + requestFormDataList ?? []; List> get formDataMapList => rowsToFormDataMapList(requestFormDataList) ?? []; - bool get isFormDataRequest => requestBodyContentType == ContentType.formdata; bool get hasContentTypeHeader => enabledHeadersMap.keys .any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); From 2d5186bdf8f7d355178602a5024c186b3fd864fa Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 02:04:01 +0530 Subject: [PATCH 78/85] Update for POST 2 --- test/codegen/dart_dio_codegen_test.dart | 7 ++++++- test/codegen/kotlin_okhttp_codegen_test.dart | 7 ++++++- test/codegen/python_http_client_codegen_test.dart | 7 ++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/test/codegen/dart_dio_codegen_test.dart b/test/codegen/dart_dio_codegen_test.dart index 5b981fde..1576070c 100644 --- a/test/codegen/dart_dio_codegen_test.dart +++ b/test/codegen/dart_dio_codegen_test.dart @@ -398,7 +398,12 @@ import 'dart:convert' as convert; void main() async { try { final data = convert.json.decode(r'''{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }'''); final response = await dio.Dio.post( 'https://api.apidash.dev/case/lower', diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index 1b9ac764..3170028f 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -428,7 +428,12 @@ fun main() { val mediaType = "application/json".toMediaType() val body = """{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }""".toRequestBody(mediaType) val request = Request.Builder() diff --git a/test/codegen/python_http_client_codegen_test.dart b/test/codegen/python_http_client_codegen_test.dart index 0ca712c2..0665e186 100644 --- a/test/codegen/python_http_client_codegen_test.dart +++ b/test/codegen/python_http_client_codegen_test.dart @@ -326,7 +326,12 @@ print(data.decode("utf-8")) const expectedCode = r"""import http.client body = r'''{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }''' headers = { From 9be445072cfaf93919cd54d0a90443576a29479b Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 02:06:21 +0530 Subject: [PATCH 79/85] Update har_utils_test.dart --- test/utils/har_utils_test.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/utils/har_utils_test.dart b/test/utils/har_utils_test.dart index 174ab180..9655e7c1 100644 --- a/test/utils/har_utils_test.dart +++ b/test/utils/har_utils_test.dart @@ -261,14 +261,19 @@ void main() { 'postData': { 'mimeType': 'application/json', 'text': '{\n' - '"text": "I LOVE Flutter"\n' + '"text": "I LOVE Flutter",\n' + '"flag": null,\n' + '"male": true,\n' + '"female": false,\n' + '"no": 1.2,\n' + '"arr": ["null", "true", "false", null]\n' '}', 'comment': '' }, 'comment': '', 'cookies': [], 'headersSize': -1, - 'bodySize': 28 + 'bodySize': 124 }; expect( requestModelToHARJsonRequest( From fc7a051285bfe4293f447c0a91efeaa704036d6a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 02:24:35 +0530 Subject: [PATCH 80/85] POST 2 test updates --- test/codegen/curl_codegen_test.dart | 7 ++++++- test/codegen/dart_http_codegen_test.dart | 7 ++++++- test/codegen/js_axios_codegen_test.dart | 2 +- test/codegen/js_fetch_codegen_test.dart | 2 +- test/codegen/nodejs_axios_codegen_test.dart | 2 +- test/codegen/nodejs_fetch_codegen_test.dart | 2 +- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index 4481e819..29f9a406 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -115,7 +115,12 @@ void main() { --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: application/json' \ --data '{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }'"""; expect(curlCodeGen.getCode(requestModelPost2, "https"), expectedCode); }); diff --git a/test/codegen/dart_http_codegen_test.dart b/test/codegen/dart_http_codegen_test.dart index 790658b1..696646b0 100644 --- a/test/codegen/dart_http_codegen_test.dart +++ b/test/codegen/dart_http_codegen_test.dart @@ -409,7 +409,12 @@ void main() async { var uri = Uri.parse('https://api.apidash.dev/case/lower'); String body = r'''{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }'''; var headers = {'content-type': 'application/json'}; diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index c364dbdb..cf2d5a18 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -383,7 +383,7 @@ axios(config) headers: { "Content-Type": "application/json" }, - data: "{\n\"text\": \"I LOVE Flutter\"\n}" + data: "{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n}" }; axios(config) diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index c29f93b9..2c2ec049 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -429,7 +429,7 @@ let options = { "Content-Type": "application/json" }, body: -"{\n\"text\": \"I LOVE Flutter\"\n}" +"{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n}" }; let status; diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index d4a12902..f3e77570 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -415,7 +415,7 @@ let config = { headers: { "Content-Type": "application/json" }, - data: "{\n\"text\": \"I LOVE Flutter\"\n}" + data: "{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n}" }; axios(config) diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index 592610ee..0c98ac35 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -451,7 +451,7 @@ let options = { "Content-Type": "application/json" }, body: -"{\n\"text\": \"I LOVE Flutter\"\n}" +"{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n}" }; let status; From cb8bfebecdbe118e853a576dc44a4890d38398c7 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 05:19:03 +0530 Subject: [PATCH 81/85] Refactor codegen --- lib/codegen/codegen.dart | 68 ++++------- lib/codegen/dart/dio.dart | 7 +- lib/codegen/dart/http.dart | 7 +- lib/codegen/js/axios.dart | 16 +-- lib/codegen/js/fetch.dart | 13 +- lib/codegen/kotlin/okhttp.dart | 8 +- lib/codegen/others/har.dart | 6 +- lib/codegen/python/http_client.dart | 10 +- lib/codegen/python/requests.dart | 10 +- test/codegen/curl_codegen_test.dart | 88 +++++++++----- test/codegen/dart_dio_codegen_test.dart | 89 ++++++++++---- test/codegen/dart_http_codegen_test.dart | 89 ++++++++++---- test/codegen/js_axios_codegen_test.dart | 92 ++++++++++---- test/codegen/js_fetch_codegen_test.dart | 92 ++++++++++---- test/codegen/kotlin_okhttp_codegen_test.dart | 92 ++++++++++---- test/codegen/nodejs_axios_codegen_test.dart | 110 +++++++++++++---- test/codegen/nodejs_fetch_codegen_test.dart | 110 +++++++++++++---- .../python_http_client_codegen_test.dart | 90 ++++++++++---- .../codegen/python_requests_codegen_test.dart | 114 +++++++++++++----- 19 files changed, 759 insertions(+), 352 deletions(-) diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index f6fdaa5f..ad348e24 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -18,64 +18,40 @@ class Codegen { String defaultUriScheme, { String? boundary, }) { + String url = requestModel.url; + + if (url.isEmpty) { + url = kDefaultUri; + } + if (!url.contains("://") && url.isNotEmpty) { + url = "$defaultUriScheme://$url"; + } + var rM = requestModel.copyWith(url: url); + switch (codegenLanguage) { case CodegenLanguage.curl: - return cURLCodeGen().getCode( - requestModel, - defaultUriScheme, - ); + return cURLCodeGen().getCode(rM); case CodegenLanguage.har: - return HARCodeGen().getCode( - requestModel, - defaultUriScheme, - ); + return HARCodeGen().getCode(rM, defaultUriScheme, boundary: boundary); case CodegenLanguage.dartHttp: - return DartHttpCodeGen().getCode( - requestModel, - defaultUriScheme, - ); + return DartHttpCodeGen().getCode(rM); case CodegenLanguage.dartDio: - return DartDioCodeGen().getCode( - requestModel, - defaultUriScheme, - ); + return DartDioCodeGen().getCode(rM); case CodegenLanguage.jsAxios: - return AxiosCodeGen().getCode( - requestModel, - defaultUriScheme, - ); + return AxiosCodeGen().getCode(rM); case CodegenLanguage.jsFetch: - return FetchCodeGen().getCode( - requestModel, - defaultUriScheme, - ); + return FetchCodeGen().getCode(rM); case CodegenLanguage.nodejsAxios: - return AxiosCodeGen(isNodeJs: true).getCode( - requestModel, - defaultUriScheme, - ); + return AxiosCodeGen(isNodeJs: true).getCode(rM); case CodegenLanguage.nodejsFetch: - return FetchCodeGen(isNodeJs: true).getCode( - requestModel, - defaultUriScheme, - ); + return FetchCodeGen(isNodeJs: true).getCode(rM); case CodegenLanguage.kotlinOkHttp: - return KotlinOkHttpCodeGen().getCode( - requestModel, - defaultUriScheme, - ); + return KotlinOkHttpCodeGen().getCode(rM); case CodegenLanguage.pythonHttpClient: - return PythonHttpClientCodeGen().getCode( - requestModel, - defaultUriScheme, - boundary: boundary ?? getNewUuid(), - ); + return PythonHttpClientCodeGen() + .getCode(rM, boundary: boundary ?? getNewUuid()); case CodegenLanguage.pythonRequests: - return PythonRequestsCodeGen().getCode( - requestModel, - defaultUriScheme, - boundary: boundary, - ); + return PythonRequestsCodeGen().getCode(rM, boundary: boundary); } } } diff --git a/lib/codegen/dart/dio.dart b/lib/codegen/dart/dio.dart index c4a7ed8e..c05b0b68 100644 --- a/lib/codegen/dart/dio.dart +++ b/lib/codegen/dart/dio.dart @@ -8,15 +8,10 @@ import 'shared.dart'; class DartDioCodeGen { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } final next = generatedDartCode( - url: url, + url: requestModel.url, method: requestModel.method, queryParams: requestModel.enabledParamsMap, headers: requestModel.enabledHeadersMap, diff --git a/lib/codegen/dart/http.dart b/lib/codegen/dart/http.dart index 42c44ecb..89e8062c 100644 --- a/lib/codegen/dart/http.dart +++ b/lib/codegen/dart/http.dart @@ -9,15 +9,10 @@ import 'shared.dart'; class DartHttpCodeGen { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } final next = generatedDartCode( - url: url, + url: requestModel.url, method: requestModel.method, queryParams: requestModel.enabledParamsMap, headers: {...requestModel.enabledHeadersMap}, diff --git a/lib/codegen/js/axios.dart b/lib/codegen/js/axios.dart index 424aa710..71456d6e 100644 --- a/lib/codegen/js/axios.dart +++ b/lib/codegen/js/axios.dart @@ -73,7 +73,6 @@ async function buildFormData(fields) { '''; String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); @@ -91,17 +90,14 @@ async function buildFormData(fields) { result += renderedMultiPartBody; } - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var rM = requestModel.copyWith(url: url); - - var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + var harJson = requestModelToHARJsonRequest( + requestModel, + useEnabled: true, + ); var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ - "url": stripUrlParams(url), + "url": stripUrlParams(requestModel.url), "method": harJson["method"].toLowerCase(), }); @@ -124,7 +120,7 @@ async function buildFormData(fields) { m[i["name"]] = i["value"]; } if (requestModel.hasFormData) { - m['Content-Type'] = 'multipart/form-data'; + m[kHeaderContentType] = 'multipart/form-data'; } result += templateHeader .render({"headers": padMultilineString(kEncoder.convert(m), 2)}); diff --git a/lib/codegen/js/fetch.dart b/lib/codegen/js/fetch.dart index 3241e311..2ff88a9b 100644 --- a/lib/codegen/js/fetch.dart +++ b/lib/codegen/js/fetch.dart @@ -73,7 +73,6 @@ fetch(url, options) String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); @@ -89,13 +88,11 @@ fetch(url, options) "fields_list": json.encode(requestModel.formDataMapList), }); } - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var rM = requestModel.copyWith(url: url); - var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + var harJson = requestModelToHARJsonRequest( + requestModel, + useEnabled: true, + ); var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ @@ -109,7 +106,7 @@ fetch(url, options) var templateHeader = jj.Template(kTemplateHeader); var m = {}; if (requestModel.hasFormData) { - m["Content-Type"] = "multipart/form-data"; + m[kHeaderContentType] = "multipart/form-data"; } for (var i in headers) { m[i["name"]] = i["value"]; diff --git a/lib/codegen/kotlin/okhttp.dart b/lib/codegen/kotlin/okhttp.dart index 856d8f0c..c717dc97 100644 --- a/lib/codegen/kotlin/okhttp.dart +++ b/lib/codegen/kotlin/okhttp.dart @@ -75,7 +75,6 @@ import okhttp3.MultipartBody"""; String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { String result = ""; @@ -83,13 +82,8 @@ import okhttp3.MultipartBody"""; bool hasBody = false; bool hasFormData = false; - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; diff --git a/lib/codegen/others/har.dart b/lib/codegen/others/har.dart index 77d78f58..72ab8731 100644 --- a/lib/codegen/others/har.dart +++ b/lib/codegen/others/har.dart @@ -5,13 +5,15 @@ import 'package:apidash/models/models.dart' show RequestModel; class HARCodeGen { String? getCode( RequestModel requestModel, - String defaultUriScheme, - ) { + String defaultUriScheme, { + String? boundary, + }) { try { var harString = kEncoder.convert(requestModelToHARJsonRequest( requestModel, defaultUriScheme: defaultUriScheme, useEnabled: true, + boundary: boundary, )); return harString; } catch (e) { diff --git a/lib/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index 1d042e96..6913314a 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -87,8 +87,7 @@ dataList = build_data_list({{fields_list}}) body = b'\r\n'.join(dataList) '''; String? getCode( - RequestModel requestModel, - String defaultUriScheme, { + RequestModel requestModel, { String? boundary, }) { try { @@ -97,11 +96,6 @@ body = b'\r\n'.join(dataList) bool hasQuery = false; bool hasBody = false; - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var templateStartUrl = jj.Template(kTemplateStart); result += templateStartUrl.render( { @@ -109,7 +103,7 @@ body = b'\r\n'.join(dataList) }, ); var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); diff --git a/lib/codegen/python/requests.dart b/lib/codegen/python/requests.dart index 8a700122..6fb07908 100644 --- a/lib/codegen/python/requests.dart +++ b/lib/codegen/python/requests.dart @@ -80,8 +80,7 @@ print('Response Body:', response.text) } String? getCode( - RequestModel requestModel, - String defaultUriScheme, { + RequestModel requestModel, { String? boundary, }) { try { @@ -91,13 +90,8 @@ print('Response Body:', response.text) bool hasBody = false; bool hasJsonBody = false; - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index 29f9a406..ec0df5db 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -1,64 +1,74 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; -import 'package:apidash/codegen/others/curl.dart'; import '../request_models.dart'; void main() { - final curlCodeGen = cURLCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; - expect(curlCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/country/data?code=US'"""; - expect(curlCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/country/data?code=IND'"""; - expect(curlCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'"""; - expect(curlCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { const expectedCode = r"""curl --url 'https://api.github.com/repos/foss42/apidash' \ --header 'User-Agent: Test Agent'"""; - expect(curlCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { const expectedCode = r"""curl --url 'https://api.github.com/repos/foss42/apidash?raw=true' \ --header 'User-Agent: Test Agent'"""; - expect(curlCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; - expect(curlCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { const expectedCode = r"""curl --url 'https://api.github.com/repos/foss42/apidash?raw=true' \ --header 'User-Agent: Test Agent'"""; - expect(curlCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'"""; - expect(curlCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -66,7 +76,8 @@ void main() { r"""curl --url 'https://api.apidash.dev/humanize/social' \ --header 'User-Agent: Test Agent'"""; expect( - curlCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.curl, requestModelGet10, "https", ), @@ -77,25 +88,29 @@ void main() { const expectedCode = r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&digits=3' \ --header 'User-Agent: Test Agent'"""; - expect(curlCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/humanize/social'"""; - expect(curlCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet12, "https"), + expectedCode); }); }); group('HEAD Request', () { test('HEAD 1', () { const expectedCode = r"""curl --head --url 'https://api.apidash.dev'"""; - expect(curlCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { const expectedCode = r"""curl --head --url 'http://api.apidash.dev'"""; - expect(curlCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelHead2, "http"), + expectedCode); }); }); @@ -107,7 +122,8 @@ void main() { --data '{ "text": "I LOVE Flutter" }'"""; - expect(curlCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -122,7 +138,8 @@ void main() { "no": 1.2, "arr": ["null", "true", "false", null] }'"""; - expect(curlCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -133,7 +150,8 @@ void main() { --data '{ "text": "I LOVE Flutter" }'"""; - expect(curlCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost3, "https"), + expectedCode); }); test('POST 4', () { @@ -142,7 +160,8 @@ void main() { --form 'text=API' \ --form 'sep=|' \ --form 'times=3'"""; - expect(curlCodeGen.getCode(requestModelPost4, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost4, "https"), + expectedCode); }); test('POST 5', () { @@ -152,7 +171,8 @@ void main() { --form 'text=API' \ --form 'sep=|' \ --form 'times=3'"""; - expect(curlCodeGen.getCode(requestModelPost5, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost5, "https"), + expectedCode); }); test('POST 6', () { @@ -160,7 +180,8 @@ void main() { --url 'https://api.apidash.dev/io/img' \ --form 'token=xyz' \ --form 'imfile=@/Documents/up/1.png'"""; - expect(curlCodeGen.getCode(requestModelPost6, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost6, "https"), + expectedCode); }); test('POST 7', () { @@ -168,7 +189,8 @@ void main() { --url 'https://api.apidash.dev/io/img' \ --form 'token=xyz' \ --form 'imfile=@/Documents/up/1.png'"""; - expect(curlCodeGen.getCode(requestModelPost7, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost7, "https"), + expectedCode); }); test('POST 8', () { @@ -177,7 +199,8 @@ void main() { --form 'text=API' \ --form 'sep=|' \ --form 'times=3'"""; - expect(curlCodeGen.getCode(requestModelPost8, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost8, "https"), + expectedCode); }); test('POST 9', () { @@ -187,7 +210,8 @@ void main() { --header 'Keep-Alive: true' \ --form 'token=xyz' \ --form 'imfile=@/Documents/up/1.png'"""; - expect(curlCodeGen.getCode(requestModelPost9, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost9, "https"), + expectedCode); }); }); @@ -200,7 +224,8 @@ void main() { "name": "morpheus", "job": "zion resident" }'"""; - expect(curlCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPut1, "https"), + expectedCode); }); }); @@ -213,7 +238,8 @@ void main() { "name": "marfeus", "job": "accountant" }'"""; - expect(curlCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPatch1, "https"), + expectedCode); }); }); @@ -221,7 +247,9 @@ void main() { test('DELETE 1', () { const expectedCode = r"""curl --request DELETE \ --url 'https://reqres.in/api/users/2'"""; - expect(curlCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.curl, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -232,7 +260,9 @@ void main() { "name": "marfeus", "job": "accountant" }'"""; - expect(curlCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.curl, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/dart_dio_codegen_test.dart b/test/codegen/dart_dio_codegen_test.dart index 1576070c..84ae29d4 100644 --- a/test/codegen/dart_dio_codegen_test.dart +++ b/test/codegen/dart_dio_codegen_test.dart @@ -1,10 +1,10 @@ -import 'package:apidash/codegen/dart/dio.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; - import '../request_models.dart'; void main() { - final dartDioCodeGen = DartDioCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -25,7 +25,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -50,7 +52,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -75,7 +79,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -106,7 +112,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -131,7 +139,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -158,7 +168,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -179,7 +191,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -206,7 +220,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -234,7 +250,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -260,7 +278,8 @@ void main() async { } """; expect( - dartDioCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.dartDio, requestModelGet10, "https", ), @@ -294,7 +313,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -315,7 +336,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet12, "https"), + expectedCode); }); }); @@ -338,7 +361,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -359,7 +384,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelHead2, "http"), + expectedCode); }); }); @@ -388,7 +415,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -421,7 +450,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -451,7 +482,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPost3, "https"), + expectedCode); }); }); @@ -482,7 +515,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPut1, "https"), + expectedCode); }); }); @@ -513,7 +548,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPatch1, "https"), + expectedCode); }); }); @@ -537,7 +574,9 @@ void main() async { } """; expect( - dartDioCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartDio, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -567,7 +606,9 @@ void main() async { } """; expect( - dartDioCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartDio, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/dart_http_codegen_test.dart b/test/codegen/dart_http_codegen_test.dart index 696646b0..b8530555 100644 --- a/test/codegen/dart_http_codegen_test.dart +++ b/test/codegen/dart_http_codegen_test.dart @@ -1,10 +1,10 @@ -import 'package:apidash/codegen/dart/http.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; - import '../request_models.dart'; void main() { - final dartHttpCodeGen = DartHttpCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -25,7 +25,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -50,7 +52,9 @@ void main() async { } """; - expect(dartHttpCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -76,7 +80,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -106,7 +112,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -132,7 +140,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -161,7 +171,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -182,7 +194,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -211,7 +225,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -238,7 +254,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -265,7 +283,8 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelGet10, "https", ), @@ -301,7 +320,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -322,7 +343,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet12, "https"), + expectedCode); }); }); @@ -345,7 +368,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -366,7 +391,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelHead2, "http"), + expectedCode); }); }); @@ -399,7 +426,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -435,7 +464,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -469,7 +500,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost3, "https"), + expectedCode); }); }); @@ -503,7 +536,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPut1, "https"), + expectedCode); }); }); @@ -538,7 +573,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPatch1, "https"), + expectedCode); }); }); @@ -562,7 +599,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -595,7 +634,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index cf2d5a18..40b420e4 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/js/axios.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final axiosCodeGen = AxiosCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -24,7 +25,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -48,7 +51,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -72,7 +77,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -100,7 +107,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -124,7 +133,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -151,7 +162,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -172,7 +185,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -199,7 +214,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -224,7 +241,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -249,7 +268,8 @@ axios(config) }); """; expect( - axiosCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.jsAxios, requestModelGet10, "https", ), @@ -281,7 +301,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -302,7 +324,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet12, "https"), + expectedCode); }); }); @@ -325,7 +349,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -346,7 +372,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelHead2, "http"), + expectedCode); }); }); @@ -373,7 +401,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -398,7 +428,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -424,7 +456,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost3, "https"), + expectedCode); }); }); @@ -451,7 +485,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPut1, "https"), + expectedCode); }); }); @@ -478,7 +514,9 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPatch1, "https"), + expectedCode); }); }); @@ -501,7 +539,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -526,7 +567,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index 2c2ec049..4f070142 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/js/fetch.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final fetchCodeGen = FetchCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -28,7 +29,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -54,7 +57,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -80,7 +85,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -106,7 +113,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -135,7 +144,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -164,7 +175,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -189,7 +202,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -218,7 +233,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -244,7 +261,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -274,7 +293,8 @@ fetch(url, options) }); """; expect( - fetchCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.jsFetch, requestModelGet10, "https", ), @@ -307,7 +327,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -333,7 +355,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet12, "https"), + expectedCode); }); }); @@ -360,7 +384,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -385,7 +411,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelHead2, "http"), + expectedCode); }); }); @@ -417,7 +445,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -447,7 +477,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -478,7 +510,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost3, "https"), + expectedCode); }); }); @@ -510,7 +544,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPut1, "https"), + expectedCode); }); }); @@ -542,7 +578,9 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPatch1, "https"), + expectedCode); }); }); @@ -569,7 +607,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -599,7 +640,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index 3170028f..f91f183c 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/kotlin/okhttp.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; import '../request_models.dart'; void main() { - final kotlinOkHttpCodeGen = KotlinOkHttpCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -27,7 +28,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -54,7 +57,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -81,7 +86,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet3, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -112,7 +119,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet4, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -137,7 +146,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet5, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -165,7 +176,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet6, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -189,7 +202,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet7, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -217,7 +232,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -245,7 +262,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -270,7 +289,8 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet10, "https", ), @@ -302,7 +322,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet11, "https"), expectedCode); }); @@ -326,7 +348,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelGet12, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet12, "https"), expectedCode); }); }); @@ -352,7 +376,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelHead1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelHead1, "https"), expectedCode); }); @@ -377,7 +403,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelHead2, "http"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelHead2, "http"), + expectedCode); }); }); @@ -410,7 +438,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost1, "https"), expectedCode); }); @@ -447,7 +477,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost2, "https"), expectedCode); }); @@ -480,7 +512,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost3, "https"), expectedCode); }); @@ -509,7 +543,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost5, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost5, "https"), expectedCode); }); }); @@ -545,7 +581,9 @@ fun main() { } '''; expect( - kotlinOkHttpCodeGen.getCode(requestModelPut1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPut1, "https"), + expectedCode); }); }); @@ -579,7 +617,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPatch1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPatch1, "https"), expectedCode); }); }); @@ -605,7 +645,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelDelete1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelDelete1, "https"), expectedCode); }); @@ -638,7 +680,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelDelete2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelDelete2, "https"), expectedCode); }); }); diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index f3e77570..ab4c2bf5 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/js/axios.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final axiosCodeGen = AxiosCodeGen(isNodeJs: true); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -26,7 +27,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -52,7 +56,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -78,7 +85,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -108,7 +118,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -134,7 +147,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -163,7 +179,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -186,7 +205,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -215,7 +237,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -242,7 +267,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -269,7 +297,8 @@ axios(config) }); """; expect( - axiosCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet10, "https", ), @@ -303,7 +332,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -326,7 +358,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet12, "https"), + expectedCode); }); }); @@ -351,7 +386,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -374,7 +412,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelHead2, "http"), + expectedCode); }); }); @@ -403,7 +444,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -430,7 +474,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -458,7 +505,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPost3, "https"), + expectedCode); }); }); @@ -487,7 +537,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPut1, "https"), + expectedCode); }); }); @@ -516,7 +569,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPatch1, "https"), + expectedCode); }); }); @@ -541,7 +597,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -568,7 +627,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index 0c98ac35..831fd2e0 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/js/fetch.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final fetchCodeGen = FetchCodeGen(isNodeJs: true); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -30,7 +31,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -57,7 +61,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -84,7 +91,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -111,7 +121,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -141,7 +154,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -171,7 +187,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -198,7 +217,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -228,7 +250,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -255,7 +280,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -286,7 +314,8 @@ fetch(url, options) }); """; expect( - fetchCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet10, "https", ), @@ -320,7 +349,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -347,7 +379,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet12, "https"), + expectedCode); }); }); @@ -376,7 +411,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -403,7 +441,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelHead2, "http"), + expectedCode); }); }); @@ -437,7 +478,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -469,7 +513,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -502,7 +549,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost3, "https"), + expectedCode); }); }); @@ -536,7 +586,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPut1, "https"), + expectedCode); }); }); @@ -570,7 +623,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPatch1, "https"), + expectedCode); }); }); @@ -599,7 +655,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -631,7 +690,10 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/python_http_client_codegen_test.dart b/test/codegen/python_http_client_codegen_test.dart index 0665e186..b5774809 100644 --- a/test/codegen/python_http_client_codegen_test.dart +++ b/test/codegen/python_http_client_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/python/http_client.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final pythonHttpClientCodeGen = PythonHttpClientCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -17,7 +18,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet1, "https"), expectedCode); }); @@ -38,7 +41,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet2, "https"), expectedCode); }); @@ -59,7 +64,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet3, "https"), expectedCode); }); @@ -84,7 +91,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet4, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet4, "https"), expectedCode); }); @@ -104,7 +113,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet5, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet5, "https"), expectedCode); }); @@ -130,7 +141,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet6, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet6, "https"), expectedCode); }); @@ -145,7 +158,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet7, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet7, "https"), expectedCode); }); @@ -171,7 +186,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet8, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet8, "https"), expectedCode); }); @@ -193,7 +210,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet9, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet9, "https"), expectedCode); }); @@ -214,7 +233,8 @@ data = res.read() print(data.decode("utf-8")) """; expect( - pythonHttpClientCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet10, "https", ), @@ -244,7 +264,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet11, "https"), expectedCode); }); @@ -259,7 +281,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet12, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet12, "https"), expectedCode); }); }); @@ -276,7 +300,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelHead1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelHead1, "https"), expectedCode); }); @@ -291,7 +317,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelHead2, "http"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelHead2, "http"), expectedCode); }); }); @@ -318,7 +346,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPost1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost1, "https"), expectedCode); }); @@ -348,7 +378,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPost2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost2, "https"), expectedCode); }); @@ -374,7 +406,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPost3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost3, "https"), expectedCode); }); }); @@ -402,7 +436,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPut1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPut1, "https"), expectedCode); }); }); @@ -430,7 +466,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPatch1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPatch1, "https"), expectedCode); }); }); @@ -447,7 +485,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelDelete1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelDelete1, "https"), expectedCode); }); @@ -473,7 +513,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelDelete2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelDelete2, "https"), expectedCode); }); }); diff --git a/test/codegen/python_requests_codegen_test.dart b/test/codegen/python_requests_codegen_test.dart index babe65d6..057c09c6 100644 --- a/test/codegen/python_requests_codegen_test.dart +++ b/test/codegen/python_requests_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/python/requests.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final pythonRequestsCodeGen = PythonRequestsCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -16,7 +17,9 @@ response = requests.get(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet1, "https"), expectedCode); }); @@ -34,7 +37,9 @@ response = requests.get(url, params=params) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet2, "https"), expectedCode); }); @@ -52,7 +57,9 @@ response = requests.get(url, params=params) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet3, "https"), expectedCode); }); @@ -74,7 +81,9 @@ response = requests.get(url, params=params) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet4, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet4, "https"), expectedCode); }); @@ -92,7 +101,9 @@ response = requests.get(url, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet5, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet5, "https"), expectedCode); }); @@ -114,7 +125,9 @@ response = requests.get(url, params=params, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet6, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet6, "https"), expectedCode); }); @@ -128,7 +141,9 @@ response = requests.get(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet7, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet7, "https"), expectedCode); }); @@ -150,7 +165,9 @@ response = requests.get(url, params=params, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet8, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet8, "https"), expectedCode); }); @@ -169,7 +186,9 @@ response = requests.get(url, params=params) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet9, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet9, "https"), expectedCode); }); @@ -188,7 +207,8 @@ print('Status Code:', response.status_code) print('Response Body:', response.text) """; expect( - pythonRequestsCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet10, "https", ), @@ -214,7 +234,9 @@ response = requests.get(url, params=params, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet11, "https"), expectedCode); }); @@ -228,7 +250,9 @@ response = requests.get(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet12, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet12, "https"), expectedCode); }); }); @@ -244,7 +268,9 @@ response = requests.head(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelHead1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelHead1, "https"), expectedCode); }); @@ -258,7 +284,9 @@ response = requests.head(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelHead2, "http"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelHead2, "http"), expectedCode); }); }); @@ -282,7 +310,9 @@ response = requests.post(url, data=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost1, "https"), expectedCode); }); @@ -305,7 +335,9 @@ response = requests.post(url, json=payload) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost2, "https"), expectedCode); }); @@ -327,7 +359,9 @@ response = requests.post(url, json=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost3, "https"), expectedCode); }); @@ -352,7 +386,9 @@ response = requests.post(url, data=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost4, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost4, "https"), expectedCode); }); @@ -378,7 +414,9 @@ response = requests.post(url, data=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost5, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost5, "https"), expectedCode); }); @@ -402,7 +440,9 @@ response = requests.post(url, data=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost6, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost6, "https"), expectedCode); }); @@ -426,7 +466,9 @@ response = requests.post(url, data=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost7, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost7, "https"), expectedCode); }); @@ -456,7 +498,9 @@ response = requests.post(url, params=params, data=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost8, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost8, "https"), expectedCode); }); @@ -487,7 +531,9 @@ response = requests.post(url, params=params, data=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost9, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost9, "https"), expectedCode); }); }); @@ -508,7 +554,9 @@ response = requests.put(url, json=payload) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPut1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPut1, "https"), expectedCode); }); }); @@ -529,7 +577,9 @@ response = requests.patch(url, json=payload) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPatch1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPatch1, "https"), expectedCode); }); }); @@ -545,7 +595,9 @@ response = requests.delete(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelDelete1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelDelete1, "https"), expectedCode); }); @@ -564,7 +616,9 @@ response = requests.delete(url, json=payload) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelDelete2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelDelete2, "https"), expectedCode); }); }); From 11a38fcb541fc2b1a3d4f237a9456c876e728f8a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 05:19:37 +0530 Subject: [PATCH 82/85] Add default uri --- lib/consts.dart | 11 ++++++++--- lib/screens/settings_page.dart | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/consts.dart b/lib/consts.dart index d7c2689c..40f51633 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -8,6 +8,7 @@ import 'package:davi/davi.dart'; const kDiscordUrl = "https://bit.ly/heyfoss"; const kGitUrl = "https://github.com/foss42/apidash"; const kIssueUrl = "$kGitUrl/issues"; +const kDefaultUri = "api.apidash.dev"; final kIsMacOS = !kIsWeb && Platform.isMacOS; final kIsWindows = !kIsWeb && Platform.isWindows; @@ -282,6 +283,8 @@ enum CodegenLanguage { const JsonEncoder kEncoder = JsonEncoder.withIndent(' '); const LineSplitter kSplitter = LineSplitter(); +const kHeaderContentType = "Content-Type"; + const kTypeApplication = 'application'; // application const kSubTypeJson = 'json'; @@ -312,12 +315,15 @@ const kSubTypeSvg = 'svg+xml'; const kTypeAudio = 'audio'; const kTypeVideo = 'video'; +const kTypeMultipart = "multipart"; +const kSubTypeFormData = "form-data"; + const kSubTypeDefaultViewOptions = 'all'; enum ContentType { json("$kTypeApplication/$kSubTypeJson"), text("$kTypeText/$kSubTypePlain"), - formdata("multipart/form-data"); + formdata("$kTypeMultipart/$kSubTypeFormData"); const ContentType(this.header); final String header; @@ -499,8 +505,7 @@ const kRaiseIssue = const kCsvError = "There seems to be an issue rendering this CSV. Please raise an issue in API Dash GitHub repo so that we can resolve it."; -const kHintTextUrlCard = - "Enter API endpoint like api.apidash.dev/country/codes"; +const kHintTextUrlCard = "Enter API endpoint like https://$kDefaultUri/"; const kLabelPlusNew = "+ New"; const kLabelSend = "Send"; const kLabelSending = "Sending.."; diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index 44e67330..fde7dce7 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -65,7 +65,7 @@ class SettingsPage extends ConsumerWidget { hoverColor: kColorTransparent, title: const Text('Default URI Scheme'), subtitle: Text( - 'api.apidash.dev → ${settings.defaultUriScheme}://api.apidash.dev'), + '$kDefaultUri → ${settings.defaultUriScheme}://$kDefaultUri'), trailing: DropdownMenu( onSelected: (value) { ref From e4f0633eca28e8426cbaf46b4ca9039c7a8bd2e9 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 05:20:15 +0530 Subject: [PATCH 83/85] Update curl.dart --- lib/codegen/others/curl.dart | 50 +++++++++++++++--------------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/lib/codegen/others/curl.dart b/lib/codegen/others/curl.dart index 6c0e02fc..2ba59765 100644 --- a/lib/codegen/others/curl.dart +++ b/lib/codegen/others/curl.dart @@ -21,18 +21,14 @@ class cURLCodeGen { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { String result = ""; - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var rM = requestModel.copyWith(url: url); - - var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + var harJson = requestModelToHARJsonRequest( + requestModel, + useEnabled: true, + ); var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ @@ -47,37 +43,31 @@ class cURLCodeGen { var headers = harJson["headers"]; if (headers.isNotEmpty) { for (var item in headers) { + if (requestModel.hasFormData && item["name"] == kHeaderContentType) { + continue; + } var templateHeader = jj.Template(kTemplateHeader); result += templateHeader .render({"name": item["name"], "value": item["value"]}); } } - var method = requestModel.method; - if (kMethodsWithBody.contains(method)) { - if (harJson['formData'] != null) { - var formDataList = harJson['formData'] as List>; - for (var formData in formDataList) { - var templateFormData = jj.Template(kTemplateFormData); - if (formData['type'] != null && - formData['name'] != null && - formData['value'] != null && - formData['name']!.isNotEmpty && - formData['value']!.isNotEmpty) { - result += templateFormData.render({ - "name": formData["name"], - "value": - "${formData['type'] == 'file' ? '@' : ''}${formData["value"]}", - }); - } + if (requestModel.hasJsonData || requestModel.hasTextData) { + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": requestModel.requestBody}); + } else if (requestModel.hasFormData) { + for (var formData in requestModel.formDataList) { + var templateFormData = jj.Template(kTemplateFormData); + if (formData.name.isNotEmpty && formData.value.isNotEmpty) { + result += templateFormData.render({ + "name": formData.name, + "value": + "${formData.type == FormDataType.file ? '@' : ''}${formData.value}", + }); } } - - if (harJson["postData"]?["text"] != null) { - var templateBody = jj.Template(kTemplateBody); - result += templateBody.render({"body": harJson["postData"]["text"]}); - } } + return result; } catch (e) { return null; From 67fcc66aa2f8aa3a00f24202c76cf8466fca960b Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 05:23:27 +0530 Subject: [PATCH 84/85] Update HAR codegen --- lib/utils/har_utils.dart | 61 ++++-- test/codegen/har_codegen_test.dart | 306 ++++++++++++++++++++++++++--- 2 files changed, 321 insertions(+), 46 deletions(-) diff --git a/lib/utils/har_utils.dart b/lib/utils/har_utils.dart index b5e1de72..86ada7fe 100644 --- a/lib/utils/har_utils.dart +++ b/lib/utils/har_utils.dart @@ -1,6 +1,10 @@ +// http://www.softwareishard.com/blog/har-12-spec/ +// https://github.com/ahmadnassri/har-spec/blob/master/versions/1.2.md + import 'dart:convert'; import 'package:apidash/consts.dart'; -import 'package:apidash/utils/utils.dart' show getValidRequestUri; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri, getNewUuid, getFilenameFromPath; import 'package:apidash/models/models.dart' show RequestModel; import 'package:package_info_plus/package_info_plus.dart'; @@ -75,6 +79,7 @@ Map requestModelToHARJsonRequest( defaultUriScheme = kDefaultUriScheme, bool exportMode = false, bool useEnabled = false, + String? boundary, }) { Map json = {}; bool hasBody = false; @@ -110,21 +115,37 @@ Map requestModelToHARJsonRequest( } } - var method = requestModel.method; - var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(method) && - requestBody != null && - !requestModel.isFormDataRequest) { - var contentLength = utf8.encode(requestBody).length; - if (contentLength > 0) { - hasBody = true; - json["postData"] = {}; - json["postData"]["mimeType"] = - requestModel.requestBodyContentType.header; - json["postData"]["text"] = requestBody; - if (exportMode) { - json["postData"]["comment"] = ""; + if (requestModel.hasJsonData || requestModel.hasTextData) { + hasBody = true; + json["postData"] = {}; + json["postData"]["mimeType"] = requestModel.requestBodyContentType.header; + json["postData"]["text"] = requestModel.requestBody; + if (exportMode) { + json["postData"]["comment"] = ""; + } + } + + if (requestModel.hasFormData) { + boundary = boundary ?? getNewUuid(); + hasBody = true; + json["postData"] = {}; + json["postData"]["mimeType"] = + "${requestModel.requestBodyContentType.header}; boundary=$boundary"; + json["postData"]["params"] = []; + for (var item in requestModel.formDataList) { + Map d = exportMode ? {"comment": ""} : {}; + if (item.type == FormDataType.text) { + d["name"] = item.name; + d["value"] = item.value; } + if (item.type == FormDataType.file) { + d["name"] = item.name; + d["fileName"] = getFilenameFromPath(item.value); + } + json["postData"]["params"].add(d); + } + if (exportMode) { + json["postData"]["comment"] = ""; } } @@ -137,8 +158,8 @@ Map requestModelToHARJsonRequest( if (headers.isNotEmpty || hasBody) { if (hasBody && !requestModel.hasContentTypeHeader) { var m = { - "name": "Content-Type", - "value": requestModel.requestBodyContentType.header + "name": kHeaderContentType, + "value": json["postData"]["mimeType"] }; if (exportMode) { m["comment"] = ""; @@ -154,14 +175,12 @@ Map requestModelToHARJsonRequest( } } } - if (requestModel.isFormDataRequest) { - json["formData"] = requestModel.formDataMapList; - } if (exportMode) { json["comment"] = ""; json["cookies"] = []; json["headersSize"] = -1; - json["bodySize"] = hasBody ? utf8.encode(requestBody!).length : 0; + json["bodySize"] = + hasBody ? utf8.encode(json["postData"]["text"] ?? "").length : 0; } } return json; diff --git a/test/codegen/har_codegen_test.dart b/test/codegen/har_codegen_test.dart index ea40bf93..767afc98 100644 --- a/test/codegen/har_codegen_test.dart +++ b/test/codegen/har_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/others/har.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final harCodeGen = HARCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -14,7 +15,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -30,7 +32,8 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -46,7 +49,8 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -78,7 +82,8 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -94,7 +99,8 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -115,7 +121,8 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -126,7 +133,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -147,7 +155,8 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -167,7 +176,8 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -184,7 +194,8 @@ void main() { ] }"""; expect( - harCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.har, requestModelGet10, "https", ), @@ -213,7 +224,8 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -224,7 +236,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet12, "https"), + expectedCode); }); }); @@ -237,7 +250,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -248,7 +262,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelHead2, "http"), + expectedCode); }); }); @@ -270,7 +285,8 @@ void main() { "text": "{\n\"text\": \"I LOVE Flutter\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -287,10 +303,11 @@ void main() { ], "postData": { "mimeType": "application/json", - "text": "{\n\"text\": \"I LOVE Flutter\"\n}" + "text": "{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n}" } }"""; - expect(harCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -314,7 +331,242 @@ void main() { "text": "{\n\"text\": \"I LOVE Flutter\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=d43e2510-a25e-1f08-b0a5-591aeb704467" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=d43e2510-a25e-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "text", + "value": "API" + }, + { + "name": "sep", + "value": "|" + }, + { + "name": "times", + "value": "3" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost4, "https", + boundary: "d43e2510-a25e-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=ce268b20-a3e6-1f08-b0a5-591aeb704467" + }, + { + "name": "User-Agent", + "value": "Test Agent" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=ce268b20-a3e6-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "text", + "value": "API" + }, + { + "name": "sep", + "value": "|" + }, + { + "name": "times", + "value": "3" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost5, "https", + boundary: "ce268b20-a3e6-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 6', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=c90d21a0-a44d-1f08-b0a5-591aeb704467" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=c90d21a0-a44d-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "token", + "value": "xyz" + }, + { + "name": "imfile", + "fileName": "1.png" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost6, "https", + boundary: "c90d21a0-a44d-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 7', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=4ac86770-a4dc-1f08-b0a5-591aeb704467" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=4ac86770-a4dc-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "token", + "value": "xyz" + }, + { + "name": "imfile", + "fileName": "1.png" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost7, "https", + boundary: "4ac86770-a4dc-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 8', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/form?size=2&len=3", + "httpVersion": "HTTP/1.1", + "queryString": [ + { + "name": "size", + "value": "2" + }, + { + "name": "len", + "value": "3" + } + ], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=78403a20-a54a-1f08-b0a5-591aeb704467" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=78403a20-a54a-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "text", + "value": "API" + }, + { + "name": "sep", + "value": "|" + }, + { + "name": "times", + "value": "3" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost8, "https", + boundary: "78403a20-a54a-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 9', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/img?size=2&len=3", + "httpVersion": "HTTP/1.1", + "queryString": [ + { + "name": "size", + "value": "2" + }, + { + "name": "len", + "value": "3" + } + ], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=2d9cd390-a593-1f08-b0a5-591aeb704467" + }, + { + "name": "User-Agent", + "value": "Test Agent" + }, + { + "name": "Keep-Alive", + "value": "true" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=2d9cd390-a593-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "token", + "value": "xyz" + }, + { + "name": "imfile", + "fileName": "1.png" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost9, "https", + boundary: "2d9cd390-a593-1f08-b0a5-591aeb704467"), + expectedCode); }); }); @@ -336,7 +588,8 @@ void main() { "text": "{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPut1, "https"), + expectedCode); }); }); @@ -358,7 +611,8 @@ void main() { "text": "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPatch1, "https"), + expectedCode); }); }); @@ -371,7 +625,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -391,7 +646,8 @@ void main() { "text": "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelDelete2, "https"), + expectedCode); }); }); } From 897160f388d52f7225edc60a7f6cfe5465e2ad1f Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Tue, 12 Mar 2024 12:04:07 +0530 Subject: [PATCH 85/85] Removed as it is not required after refactoring --- test/codegen/codegen_test.dart | 239 --------------------------------- 1 file changed, 239 deletions(-) delete mode 100644 test/codegen/codegen_test.dart diff --git a/test/codegen/codegen_test.dart b/test/codegen/codegen_test.dart deleted file mode 100644 index 2e5b58a6..00000000 --- a/test/codegen/codegen_test.dart +++ /dev/null @@ -1,239 +0,0 @@ -import 'package:apidash/codegen/codegen.dart'; -import 'package:apidash/consts.dart'; -import '../request_models.dart'; -import 'package:test/test.dart'; - -void main() { - final codeGen = Codegen(); - - group('Test various Code generators', () { - test('cURL', () { - const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; - expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet1, "https"), - expectedCode); - }); - - test('Dart Dio', () { - const expectedCode = r"""import 'package:dio/dio.dart' as dio; - -void main() async { - try { - final response = await dio.Dio.get('https://api.apidash.dev'); - 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( - codeGen.getCode(CodegenLanguage.dartDio, requestModelGet1, "https"), - expectedCode); - }); - - test('Dart HTTP', () { - const expectedCode = r"""import 'package:http/http.dart' as http; - -void main() async { - var uri = Uri.parse('https://api.apidash.dev'); - - 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( - codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet1, "https"), - expectedCode); - }); - - test('HAR', () { - const expectedCode = r"""{ - "method": "GET", - "url": "https://api.apidash.dev", - "httpVersion": "HTTP/1.1", - "queryString": [], - "headers": [] -}"""; - expect(codeGen.getCode(CodegenLanguage.har, requestModelGet1, "https"), - expectedCode); - }); - - test('JS Axios', () { - const expectedCode = r"""let config = { - url: 'https://api.apidash.dev', - 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( - codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet1, "https"), - expectedCode); - }); - - test('JS Fetch', () { - const expectedCode = r"""let url = 'https://api.apidash.dev'; - -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( - codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet1, "https"), - expectedCode); - }); - - test('Kotlin OkHttp', () { - const expectedCode = r"""import okhttp3.OkHttpClient -import okhttp3.Request - -fun main() { - val client = OkHttpClient() - - val url = "https://api.apidash.dev" - - val request = Request.Builder() - .url(url) - .get() - .build() - - val response = client.newCall(request).execute() - - println(response.code) - println(response.body?.string()) -} -"""; - expect( - codeGen.getCode( - CodegenLanguage.kotlinOkHttp, requestModelGet1, "https"), - expectedCode); - }); - - test('NodeJs Axios', () { - const expectedCode = r"""import axios from 'axios'; - -let config = { - url: 'https://api.apidash.dev', - 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( - codeGen.getCode( - CodegenLanguage.nodejsAxios, requestModelGet1, "https"), - expectedCode); - }); - - test('Nodejs Fetch', () { - const expectedCode = r"""import fetch from 'node-fetch'; - -let url = 'https://api.apidash.dev'; - -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( - codeGen.getCode( - CodegenLanguage.nodejsFetch, requestModelGet1, "https"), - expectedCode); - }); - - test('Python http.client', () { - const expectedCode = r"""import http.client - -conn = http.client.HTTPSConnection("api.apidash.dev") -conn.request("GET", "") - -res = conn.getresponse() -data = res.read() - -print(data.decode("utf-8")) -"""; - expect( - codeGen.getCode( - CodegenLanguage.pythonHttpClient, requestModelGet1, "https"), - expectedCode); - }); - - test('Python requests', () { - const expectedCode = r"""import requests - -url = 'https://api.apidash.dev' - -response = requests.get(url) - -print('Status Code:', response.status_code) -print('Response Body:', response.text) -"""; - expect( - codeGen.getCode( - CodegenLanguage.pythonRequests, requestModelGet1, "https"), - expectedCode); - }); - }); -}