Merge remote-tracking branch 'upstream/main' into add-rust-reqwest-codegen

- Merged upstream
- Made required changes with respect to upstream
- Fixed tests
This commit is contained in:
Tanish2002
2024-03-12 18:37:56 +05:30
69 changed files with 2639 additions and 1262 deletions

18
.github/pull_request_template.md vendored Normal file
View File

@ -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_

View File

@ -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`.
```
<key>com.apple.security.network.client</key>
<true/>
```
You can read more [here](https://docs.flutter.dev/platform-integration/macos/building#setting-up-entitlements)

View File

@ -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?

View File

@ -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:

View File

@ -1,5 +1,6 @@
import 'package:apidash/models/models.dart' show RequestModel;
import 'package:apidash/consts.dart';
import 'package:apidash/utils/utils.dart' show getNewUuid;
import 'dart/http.dart';
import 'dart/dio.dart';
import 'kotlin/okhttp.dart';
@ -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.rustReqwest:
return RustReqwestCodeGen().getCode(requestModel, defaultUriScheme);
return RustReqwestCodeGen().getCode(rM);
}
}
}

View File

@ -0,0 +1,15 @@
String jsonToPyDict(String jsonString) {
Map<String, String> 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;
}

View File

@ -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,

View File

@ -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) {

View File

@ -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({

View File

@ -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',

View File

@ -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;

View File

@ -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<Map<String, dynamic>>;
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;

View File

@ -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) {

View File

@ -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;
}

View File

@ -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<String> 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;
}

View File

@ -82,7 +82,6 @@ class RustReqwestCodeGen {
String? getCode(
RequestModel requestModel,
String defaultUriScheme,
) {
try {
String result = "";
@ -90,9 +89,6 @@ class RustReqwestCodeGen {
bool hasJsonBody = false;
String url = requestModel.url;
if (!url.contains("://") && url.isNotEmpty) {
url = "$defaultUriScheme://$url";
}
var rec = getValidRequestUri(
url,
@ -103,7 +99,7 @@ class RustReqwestCodeGen {
var templateStartUrl = jj.Template(kTemplateStart);
result += templateStartUrl.render({
"url": stripUriParams(uri),
'isFormDataRequest': requestModel.isFormDataRequest,
'isFormDataRequest': requestModel.hasFormData,
'isJson': requestModel.requestBodyContentType == ContentType.json
});
@ -116,7 +112,7 @@ class RustReqwestCodeGen {
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});
@ -124,7 +120,7 @@ class RustReqwestCodeGen {
}
}
if (requestModel.isFormDataRequest) {
if (requestModel.hasFormData) {
var formDataBodyData = jj.Template(kStringFormDataBody);
result += formDataBodyData.render(
{
@ -162,7 +158,7 @@ class RustReqwestCodeGen {
}
}
if (hasBody && !requestModel.isFormDataRequest) {
if (hasBody && !requestModel.hasFormData) {
result += kStringRequestBody;
}
@ -170,7 +166,7 @@ class RustReqwestCodeGen {
result += kStringRequestJson;
}
if (requestModel.isFormDataRequest) {
if (requestModel.hasFormData) {
result += kStringRequestForm;
}

View File

@ -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<String, Map<String, List<ResponseBodyView>>>
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..";

View File

@ -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<NameValueModel>? get enabledRequestHeaders =>
getEnabledRows(requestHeaders, isHeaderEnabledList);
@ -60,9 +63,27 @@ class RequestModel {
Map<String, String> get headersMap => rowsToMap(requestHeaders) ?? {};
Map<String, String> 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 ?? <FormDataModel>[]).isNotEmpty;
List<FormDataModel> get formDataList =>
requestFormDataList ?? <FormDataModel>[];
List<Map<String, dynamic>> 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,
);
}

View File

@ -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<void> 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,

View File

@ -3,7 +3,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
final navRailIndexStateProvider = StateProvider<int>((ref) => 0);
final selectedIdEditStateProvider = StateProvider<String?>((ref) => null);
final sentRequestIdStateProvider = StateProvider<String?>((ref) => null);
final codePaneVisibleStateProvider = StateProvider<bool>((ref) => false);
final saveDataStateProvider = StateProvider<bool>((ref) => false);
final clearDataStateProvider = StateProvider<bool>((ref) => false);

View File

@ -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) {

View File

@ -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: <Widget>[
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,
),
),
)
],
),
);
}
}

View File

@ -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)

View File

@ -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(

View File

@ -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 ?? <FormDataModel>[])) {
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:

View File

@ -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<FilePickerResult?> pickFile() async {

View File

@ -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<String, dynamic> requestModelToHARJsonRequest(
defaultUriScheme = kDefaultUriScheme,
bool exportMode = false,
bool useEnabled = false,
String? boundary,
}) {
Map<String, dynamic> json = {};
bool hasBody = false;
@ -110,19 +115,37 @@ Map<String, dynamic> 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<String, String> 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<String, dynamic> 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<String, dynamic> 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;

View File

@ -2,6 +2,7 @@ Map<String, String> 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<String, String> 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<String, String> 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<String, String> 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":

View File

@ -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,
),
],
),
);
}

View File

@ -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,

View File

@ -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<List<dynamic>> 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);
}
}
}

View File

@ -46,32 +46,34 @@ class _FormDataFieldState extends State<FormDataField> {
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,
),
),

View File

@ -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<HeaderField> {
@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<HeaderField> {
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<HeaderField> {
);
},
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<HeaderField> {
);
}
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<List<String>> headerSuggestionCallback(String pattern) async {
Future<List<String>?> headerSuggestionCallback(String pattern) async {
if (pattern.isEmpty) {
return null;
}
return getHeaderSuggestions(pattern);
}
}

View File

@ -154,6 +154,7 @@ class _JsonPreviewerState extends State<JsonPreviewer> {
@override
void didUpdateWidget(JsonPreviewer oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.code != widget.code) {
store.buildNodes(widget.code, areAllCollapsed: true);
store.expandAll();

View File

@ -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(),
},

View File

@ -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<Previewer> {
},
);
}
if (widget.type == kTypeText && widget.subtype == kSubTypeCsv) {
return CsvPreviewer(body: widget.body);
}
if (widget.type == kTypeVideo) {
// TODO: Video Player
}

View File

@ -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,

View File

@ -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"

View File

@ -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:

View File

@ -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);
});
});
}

View File

@ -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);
});
});
}

View File

@ -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);
});
});
}

View File

@ -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<String, String>.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);
});
});
}

View File

@ -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);
});
});
}

View File

@ -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);
});
});
}

View File

@ -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);
});
});
}

View File

@ -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);
});
});

View File

@ -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);
});
});
}

View File

@ -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);
});
});
}

View File

@ -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);
});
});

View File

@ -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);
});
});

View File

@ -1,16 +1,17 @@
import 'package:apidash/codegen/rust/reqwest.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 rustReqwestCodeGen = RustReqwestCodeGen();
final codeGen = Codegen();
group('GET Request', () {
test('GET 1', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com";
let url = "https://api.apidash.dev";
let response = client
.get(url)
@ -23,14 +24,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet1, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet1, "https"),
expectedCode);
});
test('GET 2', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/country/data";
let url = "https://api.apidash.dev/country/data";
let response = client
.get(url)
@ -44,14 +47,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet2, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet2, "https"),
expectedCode);
});
test('GET 3', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/country/data";
let url = "https://api.apidash.dev/country/data";
let response = client
.get(url)
@ -65,14 +70,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet3, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet3, "https"),
expectedCode);
});
test('GET 4', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/humanize/social";
let url = "https://api.apidash.dev/humanize/social";
let response = client
.get(url)
@ -86,7 +93,9 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet4, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet4, "https"),
expectedCode);
});
test('GET 5', () {
@ -107,7 +116,9 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet5, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet5, "https"),
expectedCode);
});
test('GET 6', () {
@ -129,14 +140,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet6, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet6, "https"),
expectedCode);
});
test('GET 7', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com";
let url = "https://api.apidash.dev";
let response = client
.get(url)
@ -149,7 +162,9 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet7, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet7, "https"),
expectedCode);
});
test('GET 8', () {
@ -171,14 +186,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet8, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet8, "https"),
expectedCode);
});
test('GET 9', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/humanize/social";
let url = "https://api.apidash.dev/humanize/social";
let response = client
.get(url)
@ -192,14 +209,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet9, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet9, "https"),
expectedCode);
});
test('GET 10', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/humanize/social";
let url = "https://api.apidash.dev/humanize/social";
let response = client
.get(url)
@ -213,7 +232,8 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(
codeGen.getCode(
CodegenLanguage.rustReqwest,
requestModelGet10,
"https",
),
@ -224,7 +244,7 @@ void main() {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/humanize/social";
let url = "https://api.apidash.dev/humanize/social";
let response = client
.get(url)
@ -239,14 +259,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet11, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet11, "https"),
expectedCode);
});
test('GET 12', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/humanize/social";
let url = "https://api.apidash.dev/humanize/social";
let response = client
.get(url)
@ -259,7 +281,9 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelGet12, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelGet12, "https"),
expectedCode);
});
});
@ -268,7 +292,7 @@ void main() {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com";
let url = "https://api.apidash.dev";
let response = client
.head(url)
@ -281,14 +305,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelHead1, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelHead1, "https"),
expectedCode);
});
test('HEAD 2', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "http://api.foss42.com";
let url = "http://api.apidash.dev";
let response = client
.head(url)
@ -301,7 +327,9 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelHead2, "http"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelHead2, "http"),
expectedCode);
});
});
@ -310,7 +338,7 @@ void main() {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/case/lower";
let url = "https://api.apidash.dev/case/lower";
let payload = r#"{
"text": "I LOVE Flutter"
@ -329,17 +357,24 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelPost1, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelPost1, "https"),
expectedCode);
});
test('POST 2', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/case/lower";
let url = "https://api.apidash.dev/case/lower";
let payload = serde_json::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 = client
@ -354,14 +389,16 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelPost2, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelPost2, "https"),
expectedCode);
});
test('POST 3', () {
const expectedCode =
r"""fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let url = "https://api.foss42.com/case/lower";
let url = "https://api.apidash.dev/case/lower";
let payload = serde_json::json!({
"text": "I LOVE Flutter"
@ -380,7 +417,9 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelPost3, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelPost3, "https"),
expectedCode);
});
});
@ -408,7 +447,9 @@ void main() {
}
""";
expect(
rustReqwestCodeGen.getCode(requestModelPut1, "https"), expectedCode);
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelPut1, "https"),
expectedCode);
});
});
@ -435,7 +476,9 @@ void main() {
Ok(())
}
""";
expect(rustReqwestCodeGen.getCode(requestModelPatch1, "https"),
expect(
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelPatch1, "https"),
expectedCode);
});
});
@ -457,7 +500,9 @@ void main() {
Ok(())
}
""";
expect(rustReqwestCodeGen.getCode(requestModelDelete1, "https"),
expect(
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelDelete1, "https"),
expectedCode);
});
@ -483,7 +528,9 @@ void main() {
Ok(())
}
""";
expect(rustReqwestCodeGen.getCode(requestModelDelete2, "https"),
expect(
codeGen.getCode(
CodegenLanguage.rustReqwest, requestModelDelete2, "https"),
expectedCode);
});
});

View File

@ -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<String, dynamic> 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);
});

View File

@ -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);

View File

@ -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',

View File

@ -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', () {

View File

@ -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<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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'},

View File

@ -115,6 +115,7 @@ void main() {
String pattern = "x-";
List<String> expected = [
"Access-Control-Max-Age",
"Max-Forwards",
"X-Api-Key",
"X-Content-Type-Options",
"X-CSRF-Token",

View File

@ -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));

View File

@ -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';

View File

@ -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<FilledButton>(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: () {},
),
),

View File

@ -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';

View File

@ -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);

View File

@ -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);

View File

@ -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);
});
}

View File

@ -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, <String>['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<Markdown>(find.byType(Markdown));
expect(markdownWidget.data, '[Link Text](https://apidash.dev/)');
await tester.tap(find.text('Link Text'));
expect(linkTapped, true);
});
});
}

View File

@ -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);
});
}

View File

@ -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);

View File

@ -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);
});
}