diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..04873dba --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,18 @@ +## 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_ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 140188ac..46a9b053 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 @@ -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) + + diff --git a/README.md b/README.md index 15dc46e1..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,14 +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/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? diff --git a/analysis_options.yaml b/analysis_options.yaml index 1d5eafa4..9a1eabb4 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -3,8 +3,9 @@ include: package:flutter_lints/flutter.yaml analyzer: errors: invalid_annotation_target: ignore - enable-experiment: - - records + exclude: + - "**/*.freezed.dart" + - "**/*.g.dart" linter: rules: diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 2fb2f7ba..8061dc88 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,6 +1,7 @@ import 'package:apidash/codegen/rust/ureq.dart'; 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'; @@ -15,36 +16,45 @@ class Codegen { String? getCode( CodegenLanguage codegenLanguage, RequestModel requestModel, - String defaultUriScheme, - ) { + 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); + .getCode(rM, boundary: boundary ?? getNewUuid()); case CodegenLanguage.pythonRequests: - return PythonRequestsCodeGen().getCode(requestModel, defaultUriScheme); + return PythonRequestsCodeGen().getCode(rM, boundary: boundary); case CodegenLanguage.rustUreq: - return RustUreqCodeGen().getCode(requestModel, defaultUriScheme); + return RustUreqCodeGen().getCode(rM, 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/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 3e423743..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}, @@ -53,7 +48,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) { diff --git a/lib/codegen/js/axios.dart b/lib/codegen/js/axios.dart index 1aeee285..71456d6e 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 = { @@ -73,18 +73,16 @@ async function buildFormData(fields) { '''; String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { 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, @@ -92,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(), }); @@ -118,22 +113,21 @@ 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) { - m['Content-Type'] = 'multipart/form-data'; + if (requestModel.hasFormData) { + m[kHeaderContentType] = 'multipart/form-data'; } result += templateHeader .render({"headers": padMultilineString(kEncoder.convert(m), 2)}); } 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..2ff88a9b 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 %} """; @@ -73,29 +73,26 @@ fetch(url, options) String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { 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, "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({ @@ -108,8 +105,8 @@ fetch(url, options) if (headers.isNotEmpty) { var templateHeader = jj.Template(kTemplateHeader); var m = {}; - if (requestModel.isFormDataRequest) { - m["Content-Type"] = "multipart/form-data"; + if (requestModel.hasFormData) { + m[kHeaderContentType] = "multipart/form-data"; } for (var i in headers) { m[i["name"]] = i["value"]; @@ -124,7 +121,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 07e5a92b..c717dc97 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}}" @@ -71,20 +75,15 @@ import okhttp3.MediaType.Companion.toMediaType"""; String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { String result = ""; bool hasQuery = false; bool hasBody = false; - - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } + bool hasFormData = false; var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; @@ -108,7 +107,8 @@ import okhttp3.MediaType.Companion.toMediaType"""; var method = requestModel.method; var requestBody = requestModel.requestBody; - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { + hasFormData = true; var formDataTemplate = jj.Template(kFormDataBody); result += formDataTemplate.render({ @@ -128,7 +128,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; @@ -145,7 +146,7 @@ import okhttp3.MediaType.Companion.toMediaType"""; 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/others/curl.dart b/lib/codegen/others/curl.dart index 4ae610de..2ba59765 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 = """ \\ @@ -20,25 +21,21 @@ 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({ "method": switch (harJson["method"]) { "GET" => "", "HEAD" => " --head", - _ => " --request ${harJson["method"]} \\\n" + _ => " --request ${harJson["method"]} \\\n " }, "url": harJson["url"], }); @@ -46,33 +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"]}); } } - if (harJson['formData'] != null) { - var formDataList = harJson['formData'] as List>; - for (var formData in formDataList) { + + 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['type'] != null && - formData['name'] != null && - formData['value'] != null && - formData['name']!.isNotEmpty && - formData['value']!.isNotEmpty) { + if (formData.name.isNotEmpty && formData.value.isNotEmpty) { result += templateFormData.render({ - "name": formData["name"], + "name": formData.name, "value": - "${formData['type'] == 'file' ? '@' : ''}${formData["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; 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 4406effb..6913314a 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -2,13 +2,13 @@ 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'; class PythonHttpClientCodeGen { final String kTemplateStart = """import http.client -{% if isFormDataRequest %}import mimetypes +{% if hasFormData %}import mimetypes from codecs import encode {% endif %} """; @@ -87,30 +87,23 @@ dataList = build_data_list({{fields_list}}) body = b'\r\n'.join(dataList) '''; String? getCode( - RequestModel requestModel, - String defaultUriScheme, - ) { - String uuid = getNewUuid(); - + RequestModel requestModel, { + String? boundary, + }) { try { String result = ""; bool hasHeaders = false; 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( { - "isFormDataRequest": requestModel.isFormDataRequest, + "hasFormData": requestModel.hasFormData, }, ); var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); @@ -130,7 +123,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.hasFormData) { var contentLength = utf8.encode(requestBody).length; if (contentLength > 0) { hasBody = true; @@ -142,11 +137,11 @@ 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({ - "boundary": uuid, + "boundary": boundary, }); } @@ -162,12 +157,12 @@ 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( { "fields_list": json.encode(requestModel.formDataMapList), - "boundary": uuid, + "boundary": boundary, }, ); } @@ -184,11 +179,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/codegen/python/requests.dart b/lib/codegen/python/requests.dart index 3a5beeb6..6fb07908 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 getNewUuid, 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,25 +72,26 @@ 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, - ) { + RequestModel requestModel, { + String? boundary, + }) { try { String result = ""; bool hasQuery = false; bool hasHeaders = false; bool hasBody = false; bool hasJsonBody = false; - String uuid = getNewUuid(); - - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; @@ -117,7 +99,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 +108,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 { - 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": uuid, - }); - } - 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": uuid, - }, - ); - } + 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/lib/codegen/rust/ureq.dart b/lib/codegen/rust/ureq.dart index 3be8971c..c1c170d2 100644 --- a/lib/codegen/rust/ureq.dart +++ b/lib/codegen/rust/ureq.dart @@ -109,9 +109,9 @@ multipart/form-data; boundary={{boundary}}'''; """; String? getCode( - RequestModel requestModel, - String defaultUriScheme, - ) { + RequestModel requestModel, { + String? boundary, + }) { try { String result = ""; bool hasBody = false; @@ -119,9 +119,6 @@ multipart/form-data; boundary={{boundary}}'''; String uuid = getNewUuid(); String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } var rec = getValidRequestUri( url, @@ -132,7 +129,7 @@ multipart/form-data; boundary={{boundary}}'''; var templateStartUrl = jj.Template(kTemplateStart); result += templateStartUrl.render({ "url": stripUriParams(uri), - 'isFormDataRequest': requestModel.isFormDataRequest, + 'isFormDataRequest': requestModel.hasFormData, "method": requestModel.method.name.toLowerCase() }); @@ -145,7 +142,7 @@ multipart/form-data; boundary={{boundary}}'''; hasJsonBody = true; var templateBody = jj.Template(kTemplateJson); result += templateBody.render({"body": requestBody}); - } else if (!requestModel.isFormDataRequest) { + } else if (!requestModel.hasFormData) { hasBody = true; var templateBody = jj.Template(kTemplateBody); result += templateBody.render({"body": requestBody}); @@ -153,12 +150,12 @@ multipart/form-data; boundary={{boundary}}'''; } } - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { var formDataBodyData = jj.Template(kStringFormDataBody); result += formDataBodyData.render( { "fields_list": requestModel.formDataMapList, - "boundary": uuid, + "boundary": boundary ?? uuid, }, ); } @@ -176,13 +173,13 @@ multipart/form-data; boundary={{boundary}}'''; } var headersList = requestModel.enabledRequestHeaders; - if (headersList != null || hasBody || requestModel.isFormDataRequest) { + if (headersList != null || hasBody || requestModel.hasFormData) { var headers = requestModel.enabledHeadersMap; - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { var formHeaderTemplate = jj.Template(kTemplateFormHeaderContentType); headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ - "boundary": uuid, + "boundary": boundary ?? uuid, }); } else if (hasBody) { headers[HttpHeaders.contentTypeHeader] = @@ -194,7 +191,7 @@ multipart/form-data; boundary={{boundary}}'''; result += templateHeaders.render({"headers": headers}); } } - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { result += kStringRequestForm; } else if (hasBody) { result += kStringRequestBody; diff --git a/lib/consts.dart b/lib/consts.dart index 58e482ab..33ecf52b 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; @@ -90,6 +91,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); @@ -280,6 +284,8 @@ enum CodegenLanguage { const JsonEncoder kEncoder = JsonEncoder.withIndent(' '); const LineSplitter kSplitter = LineSplitter(); +const kHeaderContentType = "Content-Type"; + const kTypeApplication = 'application'; // application const kSubTypeJson = 'json'; @@ -310,12 +316,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; @@ -376,6 +385,7 @@ const Map>> kSubTypeDefaultViewOptions: kRawBodyViewOptions, kSubTypeCss: kCodeRawBodyViewOptions, kSubTypeHtml: kCodeRawBodyViewOptions, + kSubTypeCsv: kPreviewRawBodyViewOptions, kSubTypeJavascript: kCodeRawBodyViewOptions, kSubTypeMarkdown: kCodeRawBodyViewOptions, kSubTypeTextXml: kCodeRawBodyViewOptions, @@ -493,7 +503,10 @@ const kAudioError = const kRaiseIssue = "\nPlease 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 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 https://$kDefaultUri/"; const kLabelPlusNew = "+ New"; const kLabelSend = "Send"; const kLabelSending = "Sending.."; diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index 9154e428..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 @@ -29,6 +30,7 @@ class RequestModel { this.responseStatus, this.message, this.responseModel, + this.isWorking = false, }); final String id; @@ -47,6 +49,7 @@ class RequestModel { final int? responseStatus; final String? message; final ResponseModel? responseModel; + final bool isWorking; List? get enabledRequestHeaders => getEnabledRows(requestHeaders, isHeaderEnabledList); @@ -60,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); @@ -106,6 +127,7 @@ class RequestModel { int? responseStatus, String? message, ResponseModel? responseModel, + bool? isWorking, }) { var headers = requestHeaders ?? this.requestHeaders; var params = requestParams ?? this.requestParams; @@ -129,6 +151,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..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); @@ -156,22 +156,30 @@ 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, - isMultiPartRequest: - requestModel.requestBodyContentType == ContentType.formdata, ); late final RequestModel newRequestModel; if (responseRec.$1 == null) { newRequestModel = requestModel.copyWith( responseStatus: -1, message: responseRec.$3, + isWorking: false, ); } else { final responseModel = baseResponseModel.fromResponse( @@ -183,10 +191,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; } @@ -203,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/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); 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..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,13 +9,14 @@ class ResponsePane extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final selectedId = ref.watch(selectedIdStateProvider); - final sentRequestId = ref.watch(sentRequestIdStateProvider); + final isWorking = ref.watch( + selectedRequestModelProvider.select((value) => value?.isWorking)) ?? + false; final responseStatus = ref.watch( selectedRequestModelProvider.select((value) => value?.responseStatus)); final message = ref .watch(selectedRequestModelProvider.select((value) => value?.message)); - if (sentRequestId != null && sentRequestId == selectedId) { + if (isWorking) { return const SendingWidget(); } if (responseStatus == null) { 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, + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/screens/home_page/editor_pane/url_card.dart b/lib/screens/home_page/editor_pane/url_card.dart index 5fa4b404..012d067c 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); + }, ); } } @@ -93,10 +98,11 @@ 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.select((value) => value?.isWorking)); + return SendRequestButton( - selectedId: selectedId, - sentRequestId: sentRequestId, + isWorking: isWorking ?? false, onTap: () { ref .read(collectionStateNotifierProvider.notifier) diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index d979af80..fde7dce7 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -61,11 +61,11 @@ class SettingsPage extends ConsumerWidget { }, ), ListTile( - contentPadding: EdgeInsets.zero, + contentPadding: kPb10, hoverColor: kColorTransparent, title: const Text('Default URI Scheme'), subtitle: Text( - 'api.foss42.com → ${settings.defaultUriScheme}://api.foss42.com'), + '$kDefaultUri → ${settings.defaultUriScheme}://$kDefaultUri'), trailing: DropdownMenu( onSelected: (value) { ref @@ -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( 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: diff --git a/lib/utils/file_utils.dart b/lib/utils/file_utils.dart index 69306b7f..68554153 100644 --- a/lib/utils/file_utils.dart +++ b/lib/utils/file_utils.dart @@ -43,13 +43,18 @@ 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; } +String getFilenameFromPath(String path) { + var f = p.split(path); + return f.last; +} + String getTempFileName() { - return uuid.v1(); + return getNewUuid(); } Future pickFile() async { diff --git a/lib/utils/har_utils.dart b/lib/utils/har_utils.dart index 38913c6e..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,19 +115,37 @@ Map requestModelToHARJsonRequest( } } - var method = requestModel.method; - var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(method) && requestBody != null) { - 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"] = ""; } } @@ -135,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"] = ""; @@ -152,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/lib/utils/header_utils.dart b/lib/utils/header_utils.dart index 45a24fe9..1450cc01 100644 --- a/lib/utils/header_utils.dart +++ b/lib/utils/header_utils.dart @@ -2,6 +2,7 @@ Map headers = { "Accept": "Specifies the media types that are acceptable for the response.", "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": @@ -41,11 +42,16 @@ Map headers = { "Cross-Origin-Resource-Policy": "Controls how cross-origin requests for resources are handled.", "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.", "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.", @@ -57,9 +63,15 @@ 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": + "Used to allow the connection to be reused for further requests.", "Location": "Indicates the URL a client should redirect to for further interaction.", + "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-Authorization": + "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": @@ -68,10 +80,14 @@ 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": + "Indicates the client's preference for reduced data usage.", "Server": "Indicates the software used by the origin server.", "Strict-Transport-Security": "Instructs the browser to always use HTTPS for the given domain.", "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.", "Via": diff --git a/lib/widgets/buttons.dart b/lib/widgets/buttons.dart index 2d63ede7..f9baf0c4 100644 --- a/lib/widgets/buttons.dart +++ b/lib/widgets/buttons.dart @@ -47,36 +47,37 @@ 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 ? null : onTap, child: Row( mainAxisSize: MainAxisSize.min, - children: [ - Text( - disable - ? (selectedId == sentRequestId ? kLabelSending : kLabelBusy) - : kLabelSend, - style: kTextStyleButton, - ), - if (!disable) kHSpacer10, - if (!disable) - const Icon( - size: 16, - Icons.send, - ), - ], + children: isWorking + ? const [ + Text( + kLabelSending, + style: kTextStyleButton, + ), + ] + : const [ + Text( + kLabelSend, + style: kTextStyleButton, + ), + kHSpacer10, + Icon( + size: 16, + Icons.send, + ), + ], ), ); } diff --git a/lib/widgets/cards.dart b/lib/widgets/cards.dart index 740ddbc8..943227ce 100644 --- a/lib/widgets/cards.dart +++ b/lib/widgets/cards.dart @@ -97,6 +97,9 @@ class SidebarRequestCard extends StatelessWidget { onTapOutsideNameEditor?.call(); //FocusScope.of(context).unfocus(); }, + onFieldSubmitted: (value) { + onTapOutsideNameEditor?.call(); + }, onChanged: onChangedNameEditor, decoration: const InputDecoration( isCollapsed: true, diff --git a/lib/widgets/csv_previewer.dart b/lib/widgets/csv_previewer.dart new file mode 100644 index 00000000..17e8dd48 --- /dev/null +++ b/lib/widgets/csv_previewer.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; +import 'package:csv/csv.dart'; +import 'error_message.dart'; +import '../consts.dart'; + +class CsvPreviewer extends StatelessWidget { + const CsvPreviewer({super.key, required this.body}); + + final String body; + + @override + Widget build(BuildContext context) { + try { + 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(), + ), + ), + ) + .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/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, ), ), diff --git a/lib/widgets/headerfield.dart b/lib/widgets/headerfield.dart index 9c678ee3..5bce6c8f 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 = @@ -54,8 +55,8 @@ class _HeaderFieldState extends State { return TypeAheadField( key: Key(widget.keyId), hideOnEmpty: true, - minCharsForSuggestions: 1, - onSuggestionSelected: (value) { + controller: controller, + onSelected: (value) { setState(() { controller.text = value; }); @@ -68,19 +69,17 @@ class _HeaderFieldState extends State { ); }, suggestionsCallback: headerSuggestionCallback, - suggestionsBoxDecoration: suggestionBoxDecorations(context), - textFieldConfiguration: TextFieldConfiguration( + decorationBuilder: (context, child) => + suggestionBoxDecorations(context, child, colorScheme), + 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 +98,26 @@ class _HeaderFieldState extends State { ); } - SuggestionsBoxDecoration suggestionBoxDecorations(BuildContext context) { - return SuggestionsBoxDecoration( - elevation: 4, - constraints: const BoxConstraints(maxHeight: 400), - shape: RoundedRectangleBorder( - side: BorderSide( - color: Theme.of(context).dividerColor, - width: 1.2, + Theme suggestionBoxDecorations( + BuildContext context, Widget child, ColorScheme colorScheme) { + 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)), ), - borderRadius: const BorderRadius.vertical(bottom: Radius.circular(8)), + clipBehavior: Clip.hardEdge, + child: child, ), - clipBehavior: Clip.hardEdge, ); } - Future> headerSuggestionCallback(String pattern) async { + Future?> headerSuggestionCallback(String pattern) async { + if (pattern.isEmpty) { + return null; + } return getHeaderSuggestions(pattern); } } 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/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/lib/widgets/previewer.dart b/lib/widgets/previewer.dart index 9841ac5b..dd2f5186 100644 --- a/lib/widgets/previewer.dart +++ b/lib/widgets/previewer.dart @@ -7,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 { @@ -81,6 +82,9 @@ class _PreviewerState extends State { }, ); } + if (widget.type == kTypeText && widget.subtype == kSubTypeCsv) { + return CsvPreviewer(body: widget.body); + } if (widget.type == kTypeVideo) { // TODO: Video Player } diff --git a/lib/widgets/textfields.dart b/lib/widgets/textfields.dart index c288b0a6..da68f9e2 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, ); } } @@ -95,7 +98,6 @@ class JsonSearchField extends StatelessWidget { controller: controller, onChanged: onChanged, style: kCodeStyle, - cursorHeight: 18, decoration: const InputDecoration( isDense: true, border: InputBorder.none, diff --git a/pubspec.lock b/pubspec.lock index 2f3f7f55..4125ed98 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: @@ -306,10 +314,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 +415,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 @@ -500,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: @@ -625,6 +633,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 +693,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 +789,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 +885,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: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e + url: "https://pub.dev" + source: hosted + version: "0.10.2" pointycastle: dependency: transitive description: @@ -1178,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: @@ -1247,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: @@ -1320,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 4196d007..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 @@ -41,7 +42,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: @@ -54,6 +55,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/codegen/codegen_test.dart b/test/codegen/codegen_test.dart deleted file mode 100644 index 63102e0a..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.foss42.com'"""; - 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.foss42.com'); - 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.foss42.com'); - - 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.foss42.com", - "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.foss42.com', - 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.foss42.com'; - -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.foss42.com" - - 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.foss42.com', - 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.foss42.com'; - -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.foss42.com") -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.foss42.com' - -response = requests.get(url) - -print('Status Code:', response.status_code) -print('Response Body:', response.text) -"""; - expect( - codeGen.getCode( - CodegenLanguage.pythonRequests, requestModelGet1, "https"), - expectedCode); - }); - }); -} diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index e9bb7f60..ec0df5db 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -1,72 +1,83 @@ -import 'package:apidash/codegen/others/curl.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 curlCodeGen = cURLCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { - const expectedCode = r"""curl --url 'https://api.foss42.com'"""; - expect(curlCodeGen.getCode(requestModelGet1, "https"), expectedCode); + const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/country/data?code=US'"""; - expect(curlCodeGen.getCode(requestModelGet2, "https"), expectedCode); + r"""curl --url 'https://api.apidash.dev/country/data?code=US'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/country/data?code=IND'"""; - expect(curlCodeGen.getCode(requestModelGet3, "https"), expectedCode); + r"""curl --url 'https://api.apidash.dev/country/data?code=IND'"""; + expect(codeGen.getCode(CodegenLanguage.curl, 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'"""; - expect(curlCodeGen.getCode(requestModelGet4, "https"), expectedCode); + r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'"""; + 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.foss42.com'"""; - expect(curlCodeGen.getCode(requestModelGet7, "https"), expectedCode); + const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; + 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.foss42.com/humanize/social?num=8700000&add_space=true'"""; - expect(curlCodeGen.getCode(requestModelGet9, "https"), expectedCode); + r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'"""; + expect(codeGen.getCode(CodegenLanguage.curl, 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( + codeGen.getCode( + CodegenLanguage.curl, requestModelGet10, "https", ), @@ -75,105 +86,183 @@ 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); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { const expectedCode = - r"""curl --url 'https://api.foss42.com/humanize/social'"""; - expect(curlCodeGen.getCode(requestModelGet12, "https"), expectedCode); + r"""curl --url 'https://api.apidash.dev/humanize/social'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet12, "https"), + expectedCode); }); }); group('HEAD Request', () { test('HEAD 1', () { - const expectedCode = r"""curl --head --url 'https://api.foss42.com'"""; - expect(curlCodeGen.getCode(requestModelHead1, "https"), expectedCode); + const expectedCode = r"""curl --head --url 'https://api.apidash.dev'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { - const expectedCode = r"""curl --head --url 'http://api.foss42.com'"""; - expect(curlCodeGen.getCode(requestModelHead2, "http"), expectedCode); + const expectedCode = r"""curl --head --url 'http://api.apidash.dev'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelHead2, "http"), + expectedCode); }); }); 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" }'"""; - expect(curlCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost1, "https"), + expectedCode); }); 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" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"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', () { 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 '{ "text": "I LOVE Flutter" }'"""; - expect(curlCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, 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(codeGen.getCode(CodegenLanguage.curl, 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(codeGen.getCode(CodegenLanguage.curl, 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(codeGen.getCode(CodegenLanguage.curl, 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(codeGen.getCode(CodegenLanguage.curl, 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(codeGen.getCode(CodegenLanguage.curl, 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(codeGen.getCode(CodegenLanguage.curl, 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", "job": "zion resident" }'"""; - expect(curlCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPut1, "https"), + expectedCode); }); }); 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", "job": "accountant" }'"""; - expect(curlCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPatch1, "https"), + expectedCode); }); }); group('DELETE Request', () { test('DELETE 1', () { const expectedCode = r"""curl --request DELETE \ - --url 'https://reqres.in/api/users/2'"""; - expect(curlCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + --url 'https://reqres.in/api/users/2'"""; + expect( + codeGen.getCode(CodegenLanguage.curl, 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", "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 30b371fd..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', () { @@ -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) { @@ -25,7 +25,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -35,7 +37,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); @@ -50,7 +52,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -60,7 +64,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); @@ -75,7 +79,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -91,7 +97,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); @@ -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', () { @@ -166,7 +178,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) { @@ -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', () { @@ -219,7 +235,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); @@ -234,7 +250,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -244,7 +262,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); @@ -260,7 +278,8 @@ void main() async { } """; expect( - dartDioCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.dartDio, requestModelGet10, "https", ), @@ -278,7 +297,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), ); @@ -294,7 +313,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -302,7 +323,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) { @@ -315,7 +336,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet12, "https"), + expectedCode); }); }); @@ -325,7 +348,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) { @@ -338,7 +361,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -346,7 +371,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) { @@ -359,7 +384,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelHead2, "http"), + expectedCode); }); }); @@ -373,7 +400,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); @@ -388,7 +415,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -398,10 +427,15 @@ 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.foss42.com/case/lower', + 'https://api.apidash.dev/case/lower', data: data, ); print(response.statusCode); @@ -416,7 +450,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -430,7 +466,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, ); @@ -446,7 +482,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPost3, "https"), + expectedCode); }); }); @@ -477,7 +515,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPut1, "https"), + expectedCode); }); }); @@ -508,7 +548,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPatch1, "https"), + expectedCode); }); }); @@ -532,7 +574,9 @@ void main() async { } """; expect( - dartDioCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartDio, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -562,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 55ab070a..b8530555 100644 --- a/test/codegen/dart_http_codegen_test.dart +++ b/test/codegen/dart_http_codegen_test.dart @@ -1,17 +1,17 @@ -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', () { 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); @@ -25,14 +25,16 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { 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); @@ -50,14 +52,16 @@ void main() async { } """; - expect(dartHttpCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { 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); @@ -76,14 +80,16 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { 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', @@ -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,14 +171,16 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { 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); @@ -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,14 +225,16 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var queryParams = { 'num': '8700000', @@ -238,14 +254,16 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); var headers = {'User-Agent': 'Test Agent'}; @@ -265,7 +283,8 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelGet10, "https", ), @@ -276,7 +295,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', @@ -301,14 +320,16 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { const expectedCode = r"""import 'package:http/http.dart' as http; void main() async { - var uri = Uri.parse('https://api.foss42.com/humanize/social'); + var uri = Uri.parse('https://api.apidash.dev/humanize/social'); final response = await http.get(uri); @@ -322,7 +343,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet12, "https"), + expectedCode); }); }); @@ -331,7 +354,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); @@ -345,14 +368,16 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { 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); @@ -366,7 +391,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelHead2, "http"), + expectedCode); }); }); @@ -375,7 +402,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" @@ -399,17 +426,24 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { 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" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }'''; var headers = {'content-type': 'application/json'}; @@ -430,14 +464,16 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { 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" @@ -464,7 +500,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost3, "https"), + expectedCode); }); }); @@ -498,7 +536,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPut1, "https"), + expectedCode); }); }); @@ -533,7 +573,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPatch1, "https"), + expectedCode); }); }); @@ -557,7 +599,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -590,7 +634,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/har_codegen_test.dart b/test/codegen/har_codegen_test.dart index 8e6b7bb0..767afc98 100644 --- a/test/codegen/har_codegen_test.dart +++ b/test/codegen/har_codegen_test.dart @@ -1,26 +1,28 @@ -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', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet1, "https"), + expectedCode); }); 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": [ { @@ -30,13 +32,14 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet2, "https"), + expectedCode); }); 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": [ { @@ -46,13 +49,14 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet3, "https"), + expectedCode); }); 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": [ { @@ -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,18 +121,20 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { const expectedCode = r"""{ "method": "GET", - "url": "https://api.foss42.com", + "url": "https://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -147,13 +155,14 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet8, "https"), + expectedCode); }); 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": [ { @@ -167,13 +176,14 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet9, "https"), + expectedCode); }); 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": [ @@ -184,7 +194,8 @@ void main() { ] }"""; expect( - harCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.har, requestModelGet10, "https", ), @@ -194,7 +205,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": [ { @@ -213,18 +224,20 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet11, "https"), + expectedCode); }); 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": [] }"""; - expect(harCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet12, "https"), + expectedCode); }); }); @@ -232,23 +245,25 @@ 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": [] }"""; - expect(harCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { const expectedCode = r"""{ "method": "HEAD", - "url": "http://api.foss42.com", + "url": "http://api.apidash.dev", "httpVersion": "HTTP/1.1", "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelHead2, "http"), + expectedCode); }); }); @@ -256,7 +271,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": [ @@ -270,13 +285,14 @@ 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', () { 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": [ @@ -287,16 +303,17 @@ 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', () { 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": [ @@ -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); }); }); } diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index 9498da1c..40b420e4 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -1,14 +1,15 @@ -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', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -24,12 +25,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet1, "https"), + expectedCode); }); 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" @@ -48,12 +51,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet2, "https"), + expectedCode); }); 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" @@ -72,12 +77,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet3, "https"), + expectedCode); }); 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", @@ -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,12 +162,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -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,12 +214,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet8, "https"), + expectedCode); }); 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", @@ -224,12 +241,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet9, "https"), + expectedCode); }); 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" @@ -249,7 +268,8 @@ axios(config) }); """; expect( - axiosCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.jsAxios, requestModelGet10, "https", ), @@ -258,7 +278,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", @@ -281,12 +301,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com/humanize/social', + url: 'https://api.apidash.dev/humanize/social', method: 'get' }; @@ -302,14 +324,16 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet12, "https"), + expectedCode); }); }); group('HEAD Request', () { test('HEAD 1', () { const expectedCode = r"""let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'head' }; @@ -325,12 +349,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { const expectedCode = r"""let config = { - url: 'http://api.foss42.com', + url: 'http://api.apidash.dev', method: 'head' }; @@ -346,14 +372,16 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelHead2, "http"), + expectedCode); }); }); 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" @@ -373,17 +401,19 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost1, "https"), + expectedCode); }); 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" }, - 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) @@ -398,12 +428,14 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost2, "https"), + expectedCode); }); 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", @@ -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 43d053f9..4f070142 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -1,13 +1,14 @@ -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', () { - const expectedCode = r"""let url = 'https://api.foss42.com'; + const expectedCode = r"""let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -28,12 +29,14 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet1, "https"), + expectedCode); }); 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' @@ -54,12 +57,14 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet2, "https"), + expectedCode); }); 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' @@ -80,12 +85,14 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet3, "https"), + expectedCode); }); 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' @@ -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,11 +175,13 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet6, "https"), + expectedCode); }); 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' @@ -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,12 +233,14 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet8, "https"), + expectedCode); }); 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' @@ -244,12 +261,14 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet9, "https"), + expectedCode); }); 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', @@ -274,7 +293,8 @@ fetch(url, options) }); """; expect( - fetchCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.jsFetch, requestModelGet10, "https", ), @@ -283,7 +303,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', @@ -307,12 +327,14 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet11, "https"), + expectedCode); }); 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' @@ -333,13 +355,15 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet12, "https"), + expectedCode); }); }); 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' @@ -360,11 +384,13 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelHead1, "https"), + expectedCode); }); 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' @@ -385,13 +411,15 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelHead2, "http"), + expectedCode); }); }); 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', @@ -417,11 +445,13 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost1, "https"), + expectedCode); }); 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', @@ -429,7 +459,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; @@ -447,11 +477,13 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost2, "https"), + expectedCode); }); 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', @@ -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 4f3220fa..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', () { @@ -13,7 +14,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) @@ -27,7 +28,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -38,7 +41,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() @@ -54,7 +57,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -65,7 +70,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() @@ -81,7 +86,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet3, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -92,7 +99,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") @@ -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', () { @@ -175,7 +188,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) @@ -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', () { @@ -228,7 +245,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() @@ -245,7 +262,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -255,7 +274,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) @@ -270,7 +289,8 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet10, "https", ), @@ -285,7 +305,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() @@ -302,7 +322,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet11, "https"), expectedCode); }); @@ -313,7 +335,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) @@ -326,7 +348,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelGet12, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet12, "https"), expectedCode); }); }); @@ -339,31 +363,7 @@ import okhttp3.Request fun main() { val client = OkHttpClient() - val url = "https://api.foss42.com" - - val request = Request.Builder() - .url(url) - .head() - .build() - - val response = client.newCall(request).execute() - - println(response.code) - println(response.body?.string()) -} -"""; - expect(kotlinOkHttpCodeGen.getCode(requestModelHead1, "https"), - expectedCode); - }); - - test('HEAD 2', () { - const expectedCode = r"""import okhttp3.OkHttpClient -import okhttp3.Request - -fun main() { - val client = OkHttpClient() - - val url = "http://api.foss42.com" + val url = "https://api.apidash.dev" val request = Request.Builder() .url(url) @@ -377,7 +377,35 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelHead2, "http"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelHead1, "https"), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r"""import okhttp3.OkHttpClient +import okhttp3.Request + +fun main() { + val client = OkHttpClient() + + val url = "http://api.apidash.dev" + + val request = Request.Builder() + .url(url) + .head() + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelHead2, "http"), + expectedCode); }); }); @@ -391,7 +419,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() @@ -410,7 +438,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost1, "https"), expectedCode); }); @@ -423,12 +453,17 @@ 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() 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() @@ -442,7 +477,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost2, "https"), expectedCode); }); @@ -455,7 +492,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() @@ -475,7 +512,40 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r'''import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.MultipartBody + +fun main() { + val client = OkHttpClient() + + 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) + .addHeader("User-Agent", "Test Agent") + .post(body) + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +'''; + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost5, "https"), expectedCode); }); }); @@ -511,7 +581,9 @@ fun main() { } '''; expect( - kotlinOkHttpCodeGen.getCode(requestModelPut1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPut1, "https"), + expectedCode); }); }); @@ -545,7 +617,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPatch1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPatch1, "https"), expectedCode); }); }); @@ -571,7 +645,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelDelete1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelDelete1, "https"), expectedCode); }); @@ -604,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 519f5ab5..ab4c2bf5 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -1,16 +1,17 @@ -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', () { const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -26,14 +27,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { 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" @@ -52,14 +56,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { 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" @@ -78,14 +85,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { 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", @@ -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,14 +179,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'get' }; @@ -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,14 +237,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { 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", @@ -242,14 +267,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { 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" @@ -269,7 +297,8 @@ axios(config) }); """; expect( - axiosCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet10, "https", ), @@ -280,7 +309,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", @@ -303,14 +332,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { 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' }; @@ -326,7 +358,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet12, "https"), + expectedCode); }); }); @@ -335,7 +370,7 @@ axios(config) const expectedCode = r"""import axios from 'axios'; let config = { - url: 'https://api.foss42.com', + url: 'https://api.apidash.dev', method: 'head' }; @@ -351,14 +386,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { const expectedCode = r"""import axios from 'axios'; let config = { - url: 'http://api.foss42.com', + url: 'http://api.apidash.dev', method: 'head' }; @@ -374,7 +412,10 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelHead2, "http"), + expectedCode); }); }); @@ -383,7 +424,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" @@ -403,19 +444,22 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { 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" }, - 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) @@ -430,14 +474,17 @@ axios(config) console.log(error); }); """; - expect(axiosCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { 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", @@ -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 c06ceee5..831fd2e0 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -1,15 +1,16 @@ -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', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com'; +let url = 'https://api.apidash.dev'; let options = { method: 'GET' @@ -30,13 +31,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet1, "https"), + expectedCode); }); 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' @@ -57,13 +61,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet2, "https"), + expectedCode); }); 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' @@ -84,13 +91,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet3, "https"), + expectedCode); }); 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' @@ -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,13 +187,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet6, "https"), + expectedCode); }); 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' @@ -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,13 +250,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { const expectedCode = r"""import fetch from 'node-fetch'; -let url = 'https://api.foss42.com/humanize/social?num=8700000&add_space=true'; +let url = 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'; let options = { method: 'GET' @@ -255,13 +280,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet9, "https"), + expectedCode); }); 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', @@ -286,7 +314,8 @@ fetch(url, options) }); """; expect( - fetchCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet10, "https", ), @@ -296,7 +325,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', @@ -320,13 +349,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet11, "https"), + expectedCode); }); 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' @@ -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); }); }); @@ -355,7 +390,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' @@ -376,13 +411,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelHead1, "https"), + expectedCode); }); 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' @@ -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); }); }); @@ -411,7 +452,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', @@ -437,13 +478,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost1, "https"), + expectedCode); }); 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', @@ -451,7 +495,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; @@ -469,13 +513,16 @@ fetch(url, options) console.error('error:' + err); }); """; - expect(fetchCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost2, "https"), + expectedCode); }); 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', @@ -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 c617305c..b5774809 100644 --- a/test/codegen/python_http_client_codegen_test.dart +++ b/test/codegen/python_http_client_codegen_test.dart @@ -1,15 +1,16 @@ -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', () { 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() @@ -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); }); @@ -30,7 +33,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() @@ -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); }); @@ -51,7 +56,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() @@ -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); }); @@ -76,7 +83,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() @@ -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,14 +141,16 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet6, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet6, "https"), expectedCode); }); 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() @@ -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); }); @@ -185,7 +202,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() @@ -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); }); @@ -204,7 +223,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) @@ -214,7 +233,8 @@ data = res.read() print(data.decode("utf-8")) """; expect( - pythonHttpClientCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet10, "https", ), @@ -235,7 +255,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) @@ -244,14 +264,16 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet11, "https"), expectedCode); }); 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() @@ -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); }); }); @@ -268,7 +292,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() @@ -276,14 +300,16 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelHead1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelHead1, "https"), expectedCode); }); 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() @@ -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); }); }); @@ -308,7 +336,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) @@ -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); }); @@ -326,14 +356,19 @@ 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 = { "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) @@ -343,7 +378,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPost2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost2, "https"), expectedCode); }); @@ -359,7 +396,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) @@ -369,7 +406,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPost3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost3, "https"), expectedCode); }); }); @@ -397,7 +436,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPut1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPut1, "https"), expectedCode); }); }); @@ -425,7 +466,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPatch1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPatch1, "https"), expectedCode); }); }); @@ -442,7 +485,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelDelete1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelDelete1, "https"), expectedCode); }); @@ -468,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 1387accf..057c09c6 100644 --- a/test/codegen/python_requests_codegen_test.dart +++ b/test/codegen/python_requests_codegen_test.dart @@ -1,80 +1,89 @@ -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', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' 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); }); 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" - } + "code": "US" +} 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); }); 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" - } + "code": "IND" +} 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); }); 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", - "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) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet4, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet4, "https"), expectedCode); }); @@ -84,15 +93,17 @@ 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) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet5, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet5, "https"), expectedCode); }); @@ -102,33 +113,37 @@ 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) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet6, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet6, "https"), expectedCode); }); test('GET 7', () { const expectedCode = r"""import requests -url = 'https://api.foss42.com' +url = 'https://api.apidash.dev' 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); }); @@ -138,49 +153,53 @@ 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) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet8, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet8, "https"), expectedCode); }); 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", - "add_space": "true" - } + "num": "8700000", + "add_space": "true" +} response = requests.get(url, params=params) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet9, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet9, "https"), expectedCode); }); 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" - } + "User-Agent": "Test Agent" +} response = requests.get(url, headers=headers) @@ -188,7 +207,8 @@ print('Status Code:', response.status_code) print('Response Body:', response.text) """; expect( - pythonRequestsCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet10, "https", ), @@ -198,37 +218,41 @@ 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", - "digits": "3" - } + "num": "8700000", + "digits": "3" +} headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.get(url, params=params, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet11, "https"), expectedCode); }); 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) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet12, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet12, "https"), expectedCode); }); }); @@ -237,28 +261,32 @@ 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) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelHead1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelHead1, "https"), expectedCode); }); test('HEAD 2', () { const expectedCode = r"""import requests -url = 'http://api.foss42.com' +url = 'http://api.apidash.dev' 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); }); }); @@ -267,32 +295,39 @@ 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" }''' headers = { - "content-type": "text/plain" - } + "content-type": "text/plain" +} 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); }); 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" +"text": "I LOVE Flutter", +"flag": None, +"male": True, +"female": False, +"no": 1.2, +"arr": ["null", "true", "false", None] } response = requests.post(url, json=payload) @@ -300,29 +335,205 @@ 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); }); 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" } headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} 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); + }); + + 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( + codeGen.getCode( + CodegenLanguage.pythonRequests, 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( + codeGen.getCode( + CodegenLanguage.pythonRequests, 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( + codeGen.getCode( + CodegenLanguage.pythonRequests, 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( + codeGen.getCode( + CodegenLanguage.pythonRequests, 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( + codeGen.getCode( + CodegenLanguage.pythonRequests, 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( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost9, "https"), expectedCode); }); }); @@ -343,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); }); }); @@ -364,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); }); }); @@ -380,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); }); @@ -399,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); }); }); diff --git a/test/codegen/rust_ureq_codegen_test.dart b/test/codegen/rust_ureq_codegen_test.dart index 95b7f44b..740ba867 100644 --- a/test/codegen/rust_ureq_codegen_test.dart +++ b/test/codegen/rust_ureq_codegen_test.dart @@ -1,14 +1,15 @@ -import 'package:apidash/codegen/rust/ureq.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; import '../request_models.dart'; void main() { - final rustUreqCodeGen = RustUreqCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com"; + let url = "https://api.apidash.dev"; let response = ureq::get(url) .call()?; @@ -18,12 +19,14 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/country/data"; + let url = "https://api.apidash.dev/country/data"; let response = ureq::get(url) .query("code", "US") .call()?; @@ -34,12 +37,14 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/country/data"; + let url = "https://api.apidash.dev/country/data"; let response = ureq::get(url) .query("code", "IND") .call()?; @@ -50,12 +55,14 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/humanize/social"; + let url = "https://api.apidash.dev/humanize/social"; let response = ureq::get(url) .query("num", "8700000") .query("digits", "3") @@ -70,7 +77,9 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -86,7 +95,9 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -103,12 +114,14 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com"; + let url = "https://api.apidash.dev"; let response = ureq::get(url) .call()?; @@ -118,7 +131,9 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -135,12 +150,14 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/humanize/social"; + let url = "https://api.apidash.dev/humanize/social"; let response = ureq::get(url) .query("num", "8700000") .query("add_space", "true") @@ -152,12 +169,14 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/humanize/social"; + let url = "https://api.apidash.dev/humanize/social"; let response = ureq::get(url) .set("User-Agent", "Test Agent") .call()?; @@ -169,7 +188,8 @@ void main() { } """; expect( - rustUreqCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.rustUreq, requestModelGet10, "https", ), @@ -178,7 +198,7 @@ void main() { test('GET 11', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/humanize/social"; + let url = "https://api.apidash.dev/humanize/social"; let response = ureq::get(url) .query("num", "8700000") .query("digits", "3") @@ -191,12 +211,14 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/humanize/social"; + let url = "https://api.apidash.dev/humanize/social"; let response = ureq::get(url) .call()?; @@ -206,14 +228,16 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet12, "https"), + expectedCode); }); }); group('HEAD Request', () { test('HEAD 1', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com"; + let url = "https://api.apidash.dev"; let response = ureq::head(url) .call()?; @@ -223,12 +247,14 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { const expectedCode = r"""fn main() -> Result<(), ureq::Error> { - let url = "http://api.foss42.com"; + let url = "http://api.apidash.dev"; let response = ureq::head(url) .call()?; @@ -238,14 +264,16 @@ void main() { Ok(()) } """; - expect(rustUreqCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelHead2, "http"), + expectedCode); }); }); group('POST Request', () { test('POST 1', () { const expectedCode = r'''fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/case/lower"; + let url = "https://api.apidash.dev/case/lower"; let payload = r#"{ "text": "I LOVE Flutter" }"#; @@ -260,14 +288,21 @@ void main() { Ok(()) } '''; - expect(rustUreqCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { const expectedCode = r'''fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/case/lower"; + let url = "https://api.apidash.dev/case/lower"; let payload = ureq::json!({ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }); let response = ureq::post(url) @@ -279,12 +314,14 @@ void main() { Ok(()) } '''; - expect(rustUreqCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { const expectedCode = r'''fn main() -> Result<(), ureq::Error> { - let url = "https://api.foss42.com/case/lower"; + let url = "https://api.apidash.dev/case/lower"; let payload = ureq::json!({ "text": "I LOVE Flutter" }); @@ -299,7 +336,9 @@ void main() { Ok(()) } '''; - expect(rustUreqCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost3, "https"), + expectedCode); }); }); @@ -321,7 +360,9 @@ void main() { Ok(()) } '''; - expect(rustUreqCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPut1, "https"), + expectedCode); }); }); @@ -344,7 +385,9 @@ void main() { } '''; expect( - rustUreqCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.rustUreq, requestModelPatch1, "https"), + expectedCode); }); }); @@ -362,7 +405,9 @@ void main() { } """; expect( - rustUreqCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.rustUreq, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -383,7 +428,9 @@ void main() { } '''; expect( - rustUreqCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.rustUreq, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/models/request_model_test.dart b/test/models/request_model_test.dart index 626727de..b7dbb413 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", @@ -175,7 +175,7 @@ void main() { }); expect(requestModel.paramsMap, {}); expect(requestModel.formDataMapList, []); - expect(requestModel.isFormDataRequest, false); + expect(requestModel.hasFormData, false); expect(requestModel.hasContentTypeHeader, true); }); 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 adf7e0e8..67ff2835 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -1,17 +1,18 @@ -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 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 +22,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 +32,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 +69,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: @@ -92,8 +93,8 @@ const requestModelGet8 = RequestModel( /// GET request model with some params enabled const requestModelGet9 = RequestModel( - id: 'enabledParams', - url: 'https://api.foss42.com/humanize/social', + id: 'get9', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -111,8 +112,8 @@ const requestModelGet9 = RequestModel( /// GET Request model with some headers enabled const requestModelGet10 = RequestModel( - id: 'enabledParams', - url: 'https://api.foss42.com/humanize/social', + id: 'get10', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestHeaders: [ NameValueModel(name: 'User-Agent', value: 'Test Agent'), @@ -126,8 +127,8 @@ const requestModelGet10 = RequestModel( /// GET Request model with some headers & URL parameters enabled const requestModelGet11 = RequestModel( - id: 'enabledRows', - url: 'https://api.foss42.com/humanize/social', + id: 'get11', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -153,8 +154,8 @@ const requestModelGet11 = RequestModel( /// Request model with all headers & URL parameters disabled const requestModelGet12 = RequestModel( - id: 'disabledRows', - url: 'https://api.foss42.com/humanize/social', + id: 'get12', + url: 'https://api.apidash.dev/humanize/social', method: HTTPVerb.get, requestParams: [ NameValueModel(name: 'num', value: '8700000'), @@ -181,21 +182,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,17 +206,22 @@ 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" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }""", ); /// 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" @@ -226,6 +232,105 @@ const requestModelPost3 = RequestModel( ], ); +/// POST request model with multipart body(text) +const requestModelPost4 = RequestModel( + id: 'post4', + url: 'https://api.apidash.dev/io/form', + method: HTTPVerb.post, + requestFormDataList: [ + 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, +); + +/// POST request model with multipart body and headers +const requestModelPost5 = RequestModel( + id: 'post5', + url: 'https://api.apidash.dev/io/form', + method: HTTPVerb.post, + requestFormDataList: [ + 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'), + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body(text, file) +const requestModelPost6 = RequestModel( + id: 'post6', + url: 'https://api.apidash.dev/io/img', + method: HTTPVerb.post, + requestFormDataList: [ + FormDataModel(name: "token", value: "xyz", type: FormDataType.text), + FormDataModel( + name: "imfile", value: "/Documents/up/1.png", 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://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: "imfile", value: "/Documents/up/1.png", type: FormDataType.file), + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body and requestParams +const requestModelPost8 = RequestModel( + id: 'post8', + url: 'https://api.apidash.dev/io/form', + method: HTTPVerb.post, + requestFormDataList: [ + 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: 'size', value: '2'), + NameValueModel(name: 'len', value: '3'), + ], + requestBodyContentType: ContentType.formdata, +); + +/// POST request model with multipart body(file and text), requestParams, requestHeaders and requestBody +const requestModelPost9 = RequestModel( + id: 'post9', + 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: "imfile", value: "/Documents/up/1.png", type: FormDataType.file), + ], + requestParams: [ + NameValueModel(name: 'size', value: '2'), + NameValueModel(name: 'len', value: '3'), + ], + requestHeaders: [ + NameValueModel(name: 'User-Agent', value: 'Test Agent'), + NameValueModel(name: 'Keep-Alive', value: 'true'), + ], + requestBodyContentType: ContentType.formdata, +); + /// PUT request model const requestModelPut1 = RequestModel( id: 'put1', diff --git a/test/utils/file_utils_test.dart b/test/utils/file_utils_test.dart index 18e2816a..26e90e39 100644 --- a/test/utils/file_utils_test.dart +++ b/test/utils/file_utils_test.dart @@ -1,3 +1,4 @@ +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; import 'package:apidash/utils/file_utils.dart'; @@ -11,8 +12,13 @@ void main() { }); test('Test getShortPath', () { - String path = "A/B/C/D.csv"; - expect(getShortPath(path), ".../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', () { diff --git a/test/utils/har_utils_test.dart b/test/utils/har_utils_test.dart index 0dd16d62..9655e7c1 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': { @@ -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': [ @@ -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( @@ -282,7 +287,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 +306,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/header_utils_test.dart b/test/utils/header_utils_test.dart index 73c15721..139ba553 100644 --- a/test/utils/header_utils_test.dart +++ b/test/utils/header_utils_test.dart @@ -115,6 +115,7 @@ void main() { String pattern = "x-"; List expected = [ "Access-Control-Max-Age", + "Max-Forwards", "X-Api-Key", "X-Content-Type-Options", "X-CSRF-Token", 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/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'; 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: () {}, ), ), 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/intro_message_test.dart b/test/widgets/intro_message_test.dart index 798afad8..4e256c82 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', @@ -13,7 +20,7 @@ void main() { ), ); - await tester.pumpAndSettle(); + await tester.pump(); expect(find.text('Welcome to API Dash ⚡️'), findsOneWidget); expect(find.byType(RichText), findsAtLeastNWidgets(1)); @@ -25,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); + }); } diff --git a/test/widgets/markdown_test.dart b/test/widgets/markdown_test.dart index 79cb579a..500dca15 100644 --- a/test/widgets/markdown_test.dart +++ b/test/widgets/markdown_test.dart @@ -1,16 +1,85 @@ import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; 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 +#br +#br - ~`github repo`~ ~`Discord Server`~"""); - await tester.pumpWidget(markdown); - //expectTextStrings(tester.allWidgets, ['Data1']); - }, skip: true); +~`github repo`~ ~`Discord Server`~""", + ); + await tester.pumpWidget(const MaterialApp(home: markdown)); + + 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( + 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 has proper text rendered', + (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); + }); + + 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); + }); + }); } 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); + }); } 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); 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); + }); }