diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 46a9b053..211eaf06 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -129,21 +129,28 @@ flutter test test/widgets/codegen_previewer_test.dart 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 +## Platform-specific Additional Instructions -### Network Connection Issues on macOS +### macOS -If you encounter a network connection error similar to the following while running your Flutter app on macOS: +Add below keys to `macos/Runner/DebugProfile.entitlements` and `macos/Runner/Release.entitlements`. + +``` + com.apple.security.network.server + + com.apple.security.network.client + + com.apple.security.files.downloads.read-write + + com.apple.security.files.user-selected.read-write + +``` + +If not added, you can encounter a network connection error similar to the following while running your Flutter app on macOS: ``` ClientException with SocketException: Connection failed (OS Error: Operation not permitted, errno = 1) ``` -Add below key to `macos/Runner/DebugProfile.entitlements` and `macos/Runner/Release.entitlements`. - -``` - com.apple.security.network.client - -``` You can read more [here](https://docs.flutter.dev/platform-integration/macos/building#setting-up-entitlements) diff --git a/README.md b/README.md index d8b258e5..f6f73d62 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,17 @@ [![Discord Server Invite](https://img.shields.io/badge/DISCORD-JOIN%20SERVER-5663F7?style=for-the-badge&logo=discord&logoColor=white)](https://bit.ly/heyfoss) -We are participating in GSoC 2024 🎉 [More Details ...](https://summerofcode.withgoogle.com/programs/2024/organizations/api-dash) +🚨 We are participating in GSoC 2024 🎉 + +GSoC + +| | Link | +|--|--| +| Learn about GSoC | [Link](https://summerofcode.withgoogle.com) | +| Organization page on GSoC | [Link](https://summerofcode.withgoogle.com/programs/2024/organizations/api-dash) | +| Project Ideas List | [Link](https://github.com/foss42/apidash/discussions/112) | +| Application Guide | [Link](https://github.com/foss42/apidash/discussions/111) | +| Discord Channel | [Link](https://discord.com/invite/2s49SCNfyJ) | ### Please support this initiative by giving this project a Star ⭐️ @@ -113,18 +123,28 @@ API Dash can be downloaded from the links below: API Dash currently supports API integration code generation for the following languages/libraries. -| Language | Library | -| ---------------------- | ------------- | -| cURL | | -| HAR | | -| Dart | `http` | -| JavaScript | `axios` | -| JavaScript | `fetch` | -| JavaScript (`node.js`) | `axios` | -| JavaScript (`node.js`) | `fetch` | -| Python | `http.client` | -| Python | `requests` | -| Kotlin | `okhttp3` | +| Language | Library | Comment/Issues | +| ---------------------- | ------------- | ------- | +| cURL | | | +| HAR | | | +| Dart | `http` | | +| Dart | `dio` | | +| Go | `net/http` | | +| JavaScript | `axios` | | +| JavaScript | `fetch` | | +| JavaScript (`node.js`) | `axios` | | +| JavaScript (`node.js`) | `fetch` | | +| Python | `requests` | | +| Python | `http.client` | | +| Kotlin | `okhttp3` | | +| Rust | `reqwest` | | +| Rust | `ureq` | | +| Rust | `Actix Client` | | +| Java | `asynchttpclient` | https://github.com/foss42/apidash/issues/136 | +| Java | `HttpClient` | https://github.com/foss42/apidash/issues/137 | +| Java | `okhttp3` | | +| Julia | `HTTP` | https://github.com/foss42/apidash/issues/154 | +| PHP | `guzzle` | https://github.com/foss42/apidash/issues/143 | We welcome contributions to support other programming languages/libraries/frameworks. Please check out more details [here](https://github.com/foss42/apidash/discussions/80). diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index db4334a0..6b5c5be3 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -1,50 +1,87 @@ import 'package:apidash/codegen/rust/curl-rust.dart'; import 'package:apidash/models/models.dart' show RequestModel; import 'package:apidash/consts.dart'; +import 'package:apidash/utils/utils.dart' show getNewUuid; import 'dart/http.dart'; import 'dart/dio.dart'; +import 'go/http.dart'; import 'kotlin/okhttp.dart'; +import 'php/guzzle.dart'; import 'python/http_client.dart'; import 'python/requests.dart'; +import 'rust/actix.dart'; +import 'rust/reqwest.dart'; +import 'rust/ureq.dart'; import 'js/axios.dart'; import 'js/fetch.dart'; import 'others/har.dart'; import 'others/curl.dart'; +import 'julia/http.dart'; +import 'java/okhttp.dart'; +import 'java/async_http_client.dart'; +import 'java/httpclient.dart'; 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.goHttp: + return GoHttpCodeGen().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.javaAsyncHttpClient: + return JavaAsyncHttpClientGen().getCode(rM); + case CodegenLanguage.javaHttpClient: + return JavaHttpClientCodeGen().getCode(rM); + case CodegenLanguage.javaOkHttp: + return JavaOkHttpCodeGen().getCode(rM); + case CodegenLanguage.juliaHttp: + return JuliaHttpClientCodeGen().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.rustActix: + return RustActixCodeGen().getCode(rM, boundary: boundary); + case CodegenLanguage.rustReqwest: + return RustReqwestCodeGen().getCode(rM); case CodegenLanguage.rustCurl: - return RustCurlCodeGen().getCode(requestModel, defaultUriScheme); + return RustCurlCodeGen().getCode(rM); + case CodegenLanguage.rustUreq: + return RustUreqCodeGen().getCode(rM, boundary: boundary); + case CodegenLanguage.phpGuzzle: + return PhpGuzzleCodeGen().getCode(rM); } } } diff --git a/lib/codegen/codegen_utils.dart b/lib/codegen/codegen_utils.dart new file mode 100644 index 00000000..2d7a1846 --- /dev/null +++ b/lib/codegen/codegen_utils.dart @@ -0,0 +1,15 @@ +String jsonToPyDict(String jsonString) { + Map replaceWithMap = { + "null": "None", + "true": "True", + "false": "False" + }; + String pyDict = jsonString; + for (var k in replaceWithMap.keys) { + RegExp regExp = RegExp(k + r'(?=([^"]*"[^"]*")*[^"]*$)'); + pyDict = pyDict.replaceAllMapped(regExp, (match) { + return replaceWithMap[match.group(0)] ?? match.group(0)!; + }); + } + return pyDict; +} diff --git a/lib/codegen/dart/dio.dart b/lib/codegen/dart/dio.dart index c4a7ed8e..e9590f79 100644 --- a/lib/codegen/dart/dio.dart +++ b/lib/codegen/dart/dio.dart @@ -8,15 +8,10 @@ import 'shared.dart'; class DartDioCodeGen { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } final next = generatedDartCode( - url: url, + url: requestModel.url, method: requestModel.method, queryParams: requestModel.enabledParamsMap, headers: requestModel.enabledHeadersMap, @@ -60,12 +55,17 @@ class DartDioCodeGen { final List> formDataList = ${json.encode(formData)}; for (var formField in formDataList) { if (formField['type'] == 'file') { - formData.files.add(MapEntry( - formField['name'], - await MultipartFile.fromFile(formField['value'], filename: formField['value']), + if (formField['value'] != null) { + data.files.add(MapEntry( + formField['name']!, + await dio.MultipartFile.fromFile(formField['value']!, + filename: formField['value']!), )); + } } else { - formData.fields.add(MapEntry(formField['name'], formField['value'])); + if (formField['value'] != null) { + data.fields.add(MapEntry(formField['name']!, formField['value']!)); + } } } '''); @@ -84,16 +84,16 @@ class DartDioCodeGen { dataExp = declareFinal('data').assign(strContent); // when add new type of [ContentType], need update [dataExp]. case ContentType.formdata: - dataExp = declareFinal('data').assign(refer('FormData()')); + dataExp = declareFinal('data').assign(refer('dio.FormData()')); } } final responseExp = declareFinal('response').assign(InvokeExpression.newOf( - refer('dio.Dio'), + refer('dio.Dio()'), [literalString(url)], { if (queryParamExp != null) 'queryParameters': refer('queryParams'), if (headerExp != null) - 'options': refer('Options').newInstance( + 'options': refer('dio.Options').newInstance( [], {'headers': refer('headers')}, ), @@ -117,7 +117,7 @@ class DartDioCodeGen { refer('print').call([refer('response').property('data')]), ], onError: { - 'DioException': [ + 'dio.DioException': [ refer('print').call([ refer('e').property('response').nullSafeProperty('statusCode'), ]), diff --git a/lib/codegen/dart/http.dart b/lib/codegen/dart/http.dart index 3e423743..8419757c 100644 --- a/lib/codegen/dart/http.dart +++ b/lib/codegen/dart/http.dart @@ -9,15 +9,10 @@ import 'shared.dart'; class DartHttpCodeGen { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } final next = generatedDartCode( - url: url, + url: requestModel.url, method: requestModel.method, queryParams: requestModel.enabledParamsMap, headers: {...requestModel.enabledHeadersMap}, @@ -53,7 +48,9 @@ class DartHttpCodeGen { declareVar('uri').assign(refer('Uri.parse').call([literalString(url)])); Expression? dataExp; - if (kMethodsWithBody.contains(method) && (body?.isNotEmpty ?? false)) { + if (kMethodsWithBody.contains(method) && + (body?.isNotEmpty ?? false) && + contentType != ContentType.formdata) { final strContent = CodeExpression(Code('r\'\'\'$body\'\'\'')); dataExp = declareVar('body', type: refer('String')).assign(strContent); if (!hasContentTypeHeader) { @@ -125,17 +122,29 @@ class DartHttpCodeGen { final addHeaders = refer('request.headers.addAll').call([refer('headers')]); const multiPartList = Code(''' - for (Map formData in formDataList){ - if (formData['type'] == 'text') { - request.fields.addAll({formData['name']: formData['value']}); - } else { - request.files.add( - await http.MultipartFile.fromPath( - formData['name'], - formData['value'], - ), - ); - } + for (var formData in formDataList) { + if (formData != null) { + final name = formData['name']; + final value = formData['value']; + final type = formData['type']; + + if (name != null && value != null && type != null) { + if (type == 'text') { + request.fields.addAll({name: value}); + } else { + request.files.add( + await http.MultipartFile.fromPath( + name, + value, + ), + ); + } + } else { + print('Error: formData has null name, value, or type.'); + } + } else { + print('Error: formData is null.'); + } } '''); var multiPartRequestSend = diff --git a/lib/codegen/go/http.dart b/lib/codegen/go/http.dart new file mode 100644 index 00000000..a93d47e0 --- /dev/null +++ b/lib/codegen/go/http.dart @@ -0,0 +1,172 @@ +import 'package:apidash/consts.dart'; +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/utils/utils.dart' show getValidRequestUri; +import 'package:apidash/models/models.dart' show RequestModel; + +class GoHttpCodeGen { + final String kTemplateStart = """package main + +import ( + "fmt" + "io" + "net/http" + "net/url"{% if hasBody %} + "bytes"{% if hasFormData %} + "mime/multipart"{% if hasFileInFormData %} + "os"{% endif %}{% endif %}{% endif %} +) + +func main() { + client := &http.Client{} + +"""; + + String kTemplateUrl = """ + url, _ := url.Parse("{{url}}") + +"""; + + String kTemplateBody = """ + {% if body %}payload := bytes.NewBuffer([]byte(`{{body}}`)){% endif %} + +"""; + + String kTemplateFormData = """ + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload){% if hasFileInFormData %} + var ( + file *os.File + part io.Writer + ){% endif %} + {% for field in fields %} + {% if field.type == "file" %}file, _ = os.Open("{{field.value}}") + defer file.Close() + part, _ = writer.CreateFormFile("{{field.name}}", "{{field.value}}") + io.Copy(part, file) + {% else %}writer.WriteField("{{field.name}}", "{{field.value}}"){% endif %}{% endfor %} + writer.Close() + + +"""; + + String kTemplateHeader = """ +{% if headers %}{% for header, value in headers %} + req.Header.Set("{{header}}", "{{value}}"){% endfor %} +{% endif %} +"""; + + String kStringFormDataHeader = """ + req.Header.Set("Content-Type", writer.FormDataContentType()) +"""; + + String kTemplateQueryParam = """ + query := url.Query() + {% for key, value in params %} + query.Set("{{key}}", "{{value}}"){% endfor %} + + url.RawQuery = query.Encode() + +"""; + + String kTemplateRequest = """ + req, _ := http.NewRequest("{{method}}", url.String(), {% if hasBody %}payload{% else %}nil{% endif %}) + +"""; + + final String kTemplateEnd = """ + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + + String? getCode( + RequestModel requestModel, + ) { + try { + String result = ""; + var hasBody = false; + var requestBody = requestModel.requestBody; + + String url = requestModel.url; + + var templateStart = jj.Template(kTemplateStart); + result += templateStart.render({ + "hasBody": requestModel.hasBody, + "hasFormData": requestModel.hasFormData, + "hasFileInFormData": requestModel.hasFileInFormData, + }); + + var templateUrl = jj.Template(kTemplateUrl); + result += templateUrl.render({"url": url}); + + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); + + Uri? uri = rec.$1; + + if (uri != null) { + if (requestModel.hasTextData || requestModel.hasJsonData) { + hasBody = true; + var templateRawBody = jj.Template(kTemplateBody); + result += templateRawBody.render({"body": requestBody}); + } else if (requestModel.hasFormData) { + hasBody = true; + var templateFormData = jj.Template(kTemplateFormData); + result += templateFormData.render({ + "hasFileInFormData": requestModel.hasFileInFormData, + "fields": requestModel.formDataMapList, + }); + } + + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + var templateQueryParam = jj.Template(kTemplateQueryParam); + result += templateQueryParam.render({"params": params}); + } + } + + var method = requestModel.method.name.toUpperCase(); + var templateRequest = jj.Template(kTemplateRequest); + result += templateRequest.render({ + "method": method, + "hasBody": hasBody, + }); + + var headersList = requestModel.enabledRequestHeaders; + if (headersList != null || requestModel.hasBody) { + var headers = requestModel.enabledHeadersMap; + if (requestModel.hasJsonData || requestModel.hasTextData) { + headers.putIfAbsent(kHeaderContentType, + () => requestModel.requestBodyContentType.header); + } + if (headers.isNotEmpty) { + var templateHeader = jj.Template(kTemplateHeader); + result += templateHeader.render({ + "headers": headers, + }); + } + } + if (requestModel.hasFormData) { + result += kStringFormDataHeader; + } + + result += kTemplateEnd; + } + + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/codegen/java/async_http_client.dart b/lib/codegen/java/async_http_client.dart new file mode 100644 index 00000000..ec804cc1 --- /dev/null +++ b/lib/codegen/java/async_http_client.dart @@ -0,0 +1,189 @@ +import 'dart:convert'; +import 'package:apidash/utils/har_utils.dart'; +import 'package:apidash/utils/http_utils.dart'; +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/models/models.dart' show RequestModel; +import 'package:apidash/consts.dart'; + +class JavaAsyncHttpClientGen { + final String kTemplateStart = ''' +import org.asynchttpclient.*; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.stream.Collectors; + +public class Main { + public static void main(String[] args) { + try (AsyncHttpClient asyncHttpClient = Dsl.asyncHttpClient()) { +'''; + + final String kTemplateUrl = ''' + String url = "{{url}}";\n +'''; + + final String kTemplateRequestCreation = ''' + Request request = asyncHttpClient + .prepare("{{method}}", url)\n +'''; + + final String kTemplateUrlQueryParam = ''' + .addQueryParam("{{name}}", "{{value}}")\n +'''; + + final String kTemplateRequestHeader = ''' + .addHeader("{{name}}", "{{value}}")\n +'''; + final String kTemplateRequestFormData = ''' + .addFormParam("{{name}}", "{{value}}")\n +'''; + + String kTemplateRequestBodyContent = ''' + String bodyContent = "{{body}}";\n +'''; + String kTemplateRequestBodySetup = ''' + .setBody(bodyContent)\n +'''; + + final String kTemplateRequestEnd = """ + .build(); + ListenableFuture listenableFuture = asyncHttpClient.executeRequest(request); + listenableFuture.addListener(() -> { + try { + Response response = listenableFuture.get(); + InputStream is = response.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + String respBody = br.lines().collect(Collectors.joining("\\n")); + System.out.println(response.getStatusCode()); + System.out.println(respBody); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + }, Executors.newCachedThreadPool()); + listenableFuture.get(); + } catch (InterruptedException | ExecutionException | IOException ignored) { + + } + } +} +\n +"""; + + String? getCode( + RequestModel requestModel, + ) { + try { + String result = ""; + bool hasBody = false; + + var rec = getValidRequestUri( + requestModel.url, + requestModel.enabledRequestParams, + ); + Uri? uri = rec.$1; + + if (uri == null) { + return ""; + } + + var url = stripUriParams(uri); + + // contains the HTTP method associated with the request + var method = requestModel.method; + + // contains the entire request body as a string if body is present + var requestBody = requestModel.requestBody; + + // generating the URL to which the request has to be submitted + var templateUrl = jj.Template(kTemplateUrl); + result += templateUrl.render({"url": url}); + + // creating request body if available + var rM = requestModel.copyWith(url: url); + var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + + // if request type is not form data, the request method can include + // a body, and the body of the request is not null, in that case + // we need to parse the body as it is, and write it to the body + if (!requestModel.hasFormData && + kMethodsWithBody.contains(method) && + requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + var templateBodyContent = jj.Template(kTemplateRequestBodyContent); + hasBody = true; + if (harJson["postData"]?["text"] != null) { + result += templateBodyContent.render({ + "body": kEncoder.convert(harJson["postData"]["text"]).substring( + 1, kEncoder.convert(harJson["postData"]["text"]).length - 1) + }); + } + } + } + + var templateRequestCreation = jj.Template(kTemplateRequestCreation); + result += + templateRequestCreation.render({"method": method.name.toUpperCase()}); + + // setting up query parameters + if (uri.hasQuery) { + var params = uri.queryParameters; + var templateUrlQueryParam = jj.Template(kTemplateUrlQueryParam); + params.forEach((name, value) { + result += + templateUrlQueryParam.render({"name": name, "value": value}); + }); + } + + result = kTemplateStart + result; + + var contentType = requestModel.requestBodyContentType.header; + var templateRequestHeader = jj.Template(kTemplateRequestHeader); + + // especially sets up Content-Type header if the request has a body + // and Content-Type is not explicitely set by the developer + if (hasBody && + !requestModel.enabledHeadersMap.containsKey('Content-Type')) { + result += templateRequestHeader + .render({"name": 'Content-Type', "value": contentType}); + } + + // setting up rest of the request headers + var headers = requestModel.enabledHeadersMap; + headers.forEach((name, value) { + result += templateRequestHeader.render({"name": name, "value": value}); + }); + + // handling form data + if (requestModel.hasFormData && + requestModel.formDataMapList.isNotEmpty && + kMethodsWithBody.contains(method)) { + // including form data into the request + var formDataList = requestModel.formDataMapList; + var templateRequestFormData = jj.Template(kTemplateRequestFormData); + for (var formDataMap in formDataList) { + result += templateRequestFormData.render( + {"name": formDataMap['name'], "value": formDataMap['value']}); + } + hasBody = true; + } + + var templateRequestBodySetup = jj.Template(kTemplateRequestBodySetup); + if (kMethodsWithBody.contains(method) && hasBody) { + result += templateRequestBodySetup.render(); + } + + var templateRequestBodyEnd = jj.Template(kTemplateRequestEnd); + result += templateRequestBodyEnd.render(); + + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/codegen/java/httpclient.dart b/lib/codegen/java/httpclient.dart new file mode 100644 index 00000000..037a9a87 --- /dev/null +++ b/lib/codegen/java/httpclient.dart @@ -0,0 +1,183 @@ +import 'dart:convert'; +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri, requestModelToHARJsonRequest, stripUriParams; +import '../../models/request_model.dart'; +import 'package:apidash/consts.dart'; + +class JavaHttpClientCodeGen { + final String kTemplateStart = """ +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.http.HttpHeaders; +import java.net.http.HttpRequest.BodyPublishers; +import java.net.http.HttpResponse.BodyHandlers; + +public class JavaHttpClientExample { + + public static void main(String[] args) throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); +"""; + final String kTemplateUrl = ''' + + String url = "{{url}}"; + +'''; + + final String kTemplateUrlQuery = ''' + + String url = "{{url}}"; + try { + URI uri = new URI(url); + url = uri.resolve("{{params}}").toString(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + +'''; + + String kTemplateRequestBody = ''' + + String body = "{{body}}"; + +'''; + + final String kStringRequestStart = """ + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) +"""; + + final String kTemplateRequestEnd = """ + .{{method}}({{body}}) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} +\n +"""; + + String? getCode( + RequestModel requestModel, + ) { + try { + String result = ""; + bool hasQuery = false; + bool hasBody = false; + bool hasJsonBody = false; + + var rec = getValidRequestUri( + requestModel.url, + requestModel.enabledRequestParams, + ); + Uri? uri = rec.$1; + + if (uri != null) { + String url = stripUriParams(uri); + + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + hasQuery = true; + var templateParams = jj.Template(kTemplateUrlQuery); + result += templateParams.render({"url": url, "params": uri.query}); + } + } + + if (!hasQuery) { + var templateUrl = jj.Template(kTemplateUrl); + result += templateUrl.render({"url": url}); + } + var rM = requestModel.copyWith(url: url); + + var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + + var method = requestModel.method; + var requestBody = requestModel.requestBody; + if (requestModel.hasFormData && + requestModel.formDataMapList.isNotEmpty && + kMethodsWithBody.contains(method)) { + var formDataList = requestModel.formDataMapList; + result += """ + StringBuilder formData = new StringBuilder(); + formData.append("""; + + for (var formDataMap in formDataList) { + result += '"""${formDataMap['name']}=${formDataMap['value']}&""",'; + } + + result = result.substring(0, result.length - 1); + result += ");\n"; + hasBody = true; + } else if (kMethodsWithBody.contains(method) && requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + var templateBody = jj.Template(kTemplateRequestBody); + hasBody = true; + hasJsonBody = + requestBody.startsWith("{") && requestBody.endsWith("}"); + if (harJson["postData"]?["text"] != null) { + result += templateBody.render({ + "body": kEncoder.convert(harJson["postData"]["text"]).substring( + 1, kEncoder.convert(harJson["postData"]["text"]).length - 1) + }); + } + } + } + + result = kTemplateStart + result; + result += kStringRequestStart; + + var headersList = requestModel.enabledRequestHeaders; + var contentType = requestModel.requestBodyContentType.header; + if (hasBody && + !requestModel.enabledHeadersMap.containsKey('Content-Type')) { + result = + """$result .header("Content-Type", "$contentType")\n"""; + } + if (headersList != null) { + var headers = requestModel.enabledHeadersMap; + if (headers.isNotEmpty) { + result += getHeaders(headers, hasJsonBody); + } + } + + var templateRequestEnd = jj.Template(kTemplateRequestEnd); + + if (kMethodsWithBody.contains(method)) { + result += templateRequestEnd.render({ + "method": method.name.toUpperCase(), + "body": hasBody + ? "BodyPublishers.ofString(body)" + : "BodyPublishers.noBody()" + }); + } else { + result += templateRequestEnd + .render({"method": method.name.toUpperCase(), "body": ""}); + } + } + return result; + } catch (e) { + return null; + } + } + + String getHeaders(Map headers, hasJsonBody) { + String result = ""; + for (final k in headers.keys) { + if (k.toLowerCase() == 'authorization') { + result = """$result .header("$k", "${headers[k]}")\n"""; + } else { + result = """$result .header("$k", "${headers[k]}")\n"""; + } + } + return result; + } +} diff --git a/lib/codegen/java/okhttp.dart b/lib/codegen/java/okhttp.dart new file mode 100644 index 00000000..ac7a6b09 --- /dev/null +++ b/lib/codegen/java/okhttp.dart @@ -0,0 +1,190 @@ +import 'dart:convert'; +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri, stripUriParams; +import '../../models/request_model.dart'; +import 'package:apidash/consts.dart'; + +class JavaOkHttpCodeGen { + final String kTemplateStart = """ +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response;{{importForQuery}}{{importForBody}}{{importForFormData}} + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + +"""; + + final String kStringImportForQuery = """ + +import okhttp3.HttpUrl;"""; + + final String kStringImportForBody = """ + +import okhttp3.RequestBody; +import okhttp3.MediaType;"""; + + final String kStringImportForFormData = """ + +import okhttp3.RequestBody; +import okhttp3.MultipartBody;"""; + + final String kTemplateUrl = ''' + + String url = "{{url}}"; + +'''; + + final String kTemplateUrlQuery = ''' + + HttpUrl url = HttpUrl.parse("{{url}}").newBuilder() + {{params}} + .build(); + +'''; + + String kTemplateRequestBody = ''' + + MediaType mediaType = MediaType.parse("{{contentType}}"); + + RequestBody body = RequestBody.create({{body}}, mediaType); + +'''; + + final String kStringRequestStart = """ + + Request request = new Request.Builder() + .url(url) +"""; + + final String kTemplateRequestEnd = """ + .{{method}}({{hasBody}}) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} + +"""; +// Converting list of form data objects to kolin multi part data + String kFormDataBody = ''' + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + {%- for item in formDataList -%} + {% if item.type == 'file' %} + .addFormDataPart("{{ item.name }}",null,RequestBody.create(MediaType.parse("application/octet-stream"),new File("{{ item.value }}"))) + {%- else %} + .addFormDataPart("{{ item.name }}","{{ item.value }}") + {%- endif %} + {%- endfor %} + .build(); + +'''; + + String? getCode( + RequestModel requestModel, + ) { + try { + String result = ""; + bool hasQuery = false; + bool hasBody = false; + bool hasFormData = false; + + var rec = getValidRequestUri( + requestModel.url, + requestModel.enabledRequestParams, + ); + Uri? uri = rec.$1; + + if (uri != null) { + String url = stripUriParams(uri); + + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + hasQuery = true; + var templateParams = jj.Template(kTemplateUrlQuery); + result += templateParams + .render({"url": url, "params": getQueryParams(params)}); + } + } + if (!hasQuery) { + var templateUrl = jj.Template(kTemplateUrl); + result += templateUrl.render({"url": url}); + } + + var method = requestModel.method; + var requestBody = requestModel.requestBody; + if (requestModel.hasFormData) { + hasFormData = true; + var formDataTemplate = jj.Template(kFormDataBody); + + result += formDataTemplate.render({ + "formDataList": requestModel.formDataMapList, + }); + } else if (kMethodsWithBody.contains(method) && requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + hasBody = true; + String contentType = requestModel.requestBodyContentType.header; + var templateBody = jj.Template(kTemplateRequestBody); + result += templateBody.render({ + "contentType": contentType, + "body": kEncoder.convert(requestBody) + }); + } + } + + var templateStart = jj.Template(kTemplateStart); + var stringStart = templateStart.render({ + "importForQuery": hasQuery ? kStringImportForQuery : "", + "importForBody": hasBody ? kStringImportForBody : "", + "importForFormData": hasFormData ? kStringImportForFormData : "" + }); + + result = stringStart + result; + result += kStringRequestStart; + + var headersList = requestModel.enabledRequestHeaders; + if (headersList != null) { + var headers = requestModel.enabledHeadersMap; + if (headers.isNotEmpty) { + result += getHeaders(headers); + } + } + + var templateRequestEnd = jj.Template(kTemplateRequestEnd); + result += templateRequestEnd.render({ + "method": method.name.toLowerCase(), + "hasBody": (hasBody || requestModel.hasFormData) ? "body" : "", + }); + } + return result; + } catch (e) { + return null; + } + } + + String getQueryParams(Map params) { + final paramStrings = params.entries.map((entry) => '.addQueryParameter("${entry.key}", "${entry.value}")').toList(); + return paramStrings.join('\n '); + } + + String getHeaders(Map headers) { + String result = ""; + for (final k in headers.keys) { + result = """$result .addHeader("$k", "${headers[k]}")\n"""; + } + return result; + } +} \ No newline at end of file diff --git a/lib/codegen/js/axios.dart b/lib/codegen/js/axios.dart index 1aeee285..301ecf46 100644 --- a/lib/codegen/js/axios.dart +++ b/lib/codegen/js/axios.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' show padMultilineString, requestModelToHARJsonRequest, stripUrlParams; @@ -10,12 +9,14 @@ class AxiosCodeGen { final bool isNodeJs; - String kStringImportNode = """{% if isNodeJs %}import axios from 'axios'; + String kStringImportNode = """import axios from 'axios'; +{%if hasFileInFormData -%} +import fs from 'fs' +{% endif %} -{% endif %}{% if isFormDataRequest and isNodeJs %}const fs = require('fs');{% endif %} """; - String kTemplateStart = """let config = { + String kTemplateStart = """const config = { url: '{{url}}', method: '{{method}}' """; @@ -37,72 +38,36 @@ class AxiosCodeGen { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - String kMultiPartBodyTemplate = r''' - - -async function buildFormData(fields) { - var formdata = new FormData(); - for (const field of fields) { - const name = field.name || ''; - const value = field.value || ''; - const type = field.type || 'text'; - - if (type === 'text') { - formdata.append(name, value); - } else if (type === 'file') { - formdata.append(name,{% if isNodeJs %} fs.createReadStream(value){% else %} fileInput.files[0],value{% endif %}); - } - } - return formdata; -} - - -'''; - var kGetFormDataTemplate = '''buildFormData({{fields_list}}); -'''; String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); String importsData = kNodejsImportTemplate.render({ - "isFormDataRequest": requestModel.isFormDataRequest, - "isNodeJs": isNodeJs, + "hasFileInFormData": requestModel.hasFileInFormData, }); - String result = importsData; - if (requestModel.isFormDataRequest && - requestModel.formDataMapList.isNotEmpty) { - var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); - var renderedMultiPartBody = templateMultiPartBody.render({ - "isNodeJs": isNodeJs, - }); - 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); + String result = isNodeJs + ? importsData + : requestModel.hasFileInFormData + ? "// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration\n\n" + : ""; + 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,31 +83,35 @@ 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) { - var getFieldDataTemplate = jj.Template(kGetFormDataTemplate); - - result += templateBody.render({ - "body": getFieldDataTemplate.render({ - "fields_list": json.encode(requestModel.formDataMapList), - }) - }); - } - if (harJson["postData"]?["text"] != null) { + if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { + // Manually Create a JS Object + Map formParams = {}; + int formFileCounter = 1; + for (var element in requestModel.formDataMapList) { + formParams["${element["name"]}"] = element["type"] == "text" + ? "${element["value"]}" + : isNodeJs + ? "fs.createReadStream(${element["value"]})" + : "fileInput$formFileCounter.files[0]"; + if (element["type"] == "file") formFileCounter++; + } + var sanitizedJSObject = sanitzeJSObject(kEncoder.convert(formParams)); + result += templateBody + .render({"body": padMultilineString(sanitizedJSObject, 2)}); + } else if (harJson["postData"]?["text"] != null) { result += templateBody .render({"body": kEncoder.convert(harJson["postData"]["text"])}); } @@ -152,4 +121,18 @@ async function buildFormData(fields) { return null; } } + + // escape function and variables in JS Object + String sanitzeJSObject(String jsObject) { + RegExp pattern = isNodeJs + ? RegExp(r'"fs\.createReadStream\((.*?)\)"') + : RegExp(r'"fileInput(\d+)\.files\[0\]"'); + + var sanitizedJSObject = jsObject.replaceAllMapped(pattern, (match) { + return isNodeJs + ? 'fs.createReadStream("${match.group(1)}")' + : 'fileInput${match.group(1)}.files[0]'; + }); + return sanitizedJSObject; + } } diff --git a/lib/codegen/js/fetch.dart b/lib/codegen/js/fetch.dart index 4ef2e551..9b5f8161 100644 --- a/lib/codegen/js/fetch.dart +++ b/lib/codegen/js/fetch.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' show padMultilineString, requestModelToHARJsonRequest; @@ -11,14 +10,16 @@ class FetchCodeGen { final bool isNodeJs; String kStringImportNode = """ -import fetch from 'node-fetch'; -{% if isFormDataRequest %}const fs = require('fs');{% endif %} +import fetch from 'node-fetch' +{% if hasFormData -%} +import { {% if hasFileInFormData %}fileFromSync, {% endif %}FormData } from 'node-fetch' +{% endif %} """; - String kTemplateStart = """let url = '{{url}}'; + String kTemplateStart = """const url = '{{url}}'; -let options = { +const options = { method: '{{method}}' """; @@ -27,75 +28,63 @@ let options = { """; String kTemplateBody = """, - body: -{{body}} + body: {{body}} """; String kMultiPartBodyTemplate = r''' -async function buildDataList(fields) { - var formdata = new FormData(); - for (const field of fields) { - const name = field.name || ''; - const value = field.value || ''; - const type = field.type || 'text'; - - if (type === 'text') { - formdata.append(name, value); - } else if (type === 'file') { - formdata.append(name,{% if isNodeJs %} fs.createReadStream(value){% else %} fileInput.files[0],value{% endif %}); - } - } - return formdata; -} - -const payload = buildDataList({{fields_list}}); +payload.append("{{name}}", {{value}}) '''; String kStringRequest = """ }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:\${err}`); + }); """; - String? getCode( - RequestModel requestModel, - String defaultUriScheme, - ) { + String? getCode(RequestModel requestModel) { try { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); String importsData = kNodejsImportTemplate.render({ - "isFormDataRequest": requestModel.isFormDataRequest, + "hasFormData": requestModel.hasFormData, + "hasFileInFormData": requestModel.hasFileInFormData, }); - String result = isNodeJs ? importsData : ""; - if (requestModel.isFormDataRequest) { + String result = isNodeJs + ? importsData + : requestModel.hasFileInFormData + ? "// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration\n\n" + : ""; + if (requestModel.hasFormData) { + result += "const payload = new FormData();\n"; var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); - result += templateMultiPartBody.render({ - "isNodeJs": isNodeJs, - "fields_list": json.encode(requestModel.formDataMapList), - }); + var formFileCounter = 1; + for (var element in requestModel.formDataMapList) { + result += templateMultiPartBody.render({ + "name": element["name"], + "value": element["type"] == "text" + ? "\"${element["value"]}\"" + : isNodeJs + ? "fileFromSync(\"${element["value"]}\")" + : "fileInput$formFileCounter.files[0]" + }); + if (element["type"] != "text") formFileCounter++; + } + result += "\n"; } - 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,15 +97,18 @@ fetch(url, options) if (headers.isNotEmpty) { var templateHeader = jj.Template(kTemplateHeader); var m = {}; - if (requestModel.isFormDataRequest) { - m["Content-Type"] = "multipart/form-data"; - } for (var i in headers) { + // fetch can automatically add the Content-Type header when FormData is passed as body + if (i["name"] == "Content-Type" && requestModel.hasFormData) { + continue; + } m[i["name"]] = i["value"]; } - result += templateHeader.render({ - "headers": padMultilineString(kEncoder.convert(m), 2), - }); + if (m.isNotEmpty) { + result += templateHeader.render({ + "headers": padMultilineString(kEncoder.convert(m), 2), + }); + } } if (harJson["postData"]?["text"] != null) { @@ -124,7 +116,7 @@ fetch(url, options) result += templateBody.render({ "body": kEncoder.convert(harJson["postData"]["text"]), }); - } else if (requestModel.isFormDataRequest) { + } else if (requestModel.hasFormData) { var templateBody = jj.Template(kTemplateBody); result += templateBody.render({ "body": 'payload', diff --git a/lib/codegen/julia/http.dart b/lib/codegen/julia/http.dart new file mode 100644 index 00000000..b1d1e96b --- /dev/null +++ b/lib/codegen/julia/http.dart @@ -0,0 +1,198 @@ +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; +import 'package:apidash/models/models.dart' show RequestModel; + +class JuliaHttpClientCodeGen { + final String kTemplateStart = """using HTTP,JSON + +url = "{{url}}" + +"""; + + String kTemplateParams = """ +{% set new_params = params | replace(":", "=>") | replace("{", "(") | replace("}", ")") %} + +params = Dict{{new_params}} +"""; + + int kParamsPadding = 9; + + String kTemplateBody = ''' +{% set new_params = body | replace(":", "=>") | replace("{", "(") | replace("}", ")") %} + +payload = Dict{{new_params}} +'''; + + String kTemplateJson = """ +{% set new_params = body | replace(":", "=>") | replace("{", "(") | replace("}", ")") %} + +payload = Dict{{new_params}} +"""; + + String kTemplateHeaders = """ +{% set new_params = headers | replace(":", "=>") | replace("{", "(") | replace("}", ")") %} + +headers = Dict{{new_params}} +"""; + + String kTemplateFormHeaderContentType = ''' +multipart/form-data; boundary={{boundary}}'''; + + int kHeadersPadding = 10; + + String kTemplateRequest = """ + + +response = HTTP.{{method}}(url +"""; + + final String kStringFormDataBody = r''' +function build_data_list(fields) + dataList = [] + for field in fields + name = field["name"] + value = field["value"] + type_ = get(field, "type", "text") + + push!(dataList, b"--{{boundary}}") + if type_ == "text" + push!(dataList, b"Content-Disposition: form-data; name=\"$name\"") + push!(dataList, b"Content-Type: text/plain") + push!(dataList, b"") + push!(dataList, codeunits(value)) + elseif type_ == "file" + push!(dataList, b"Content-Disposition: form-data; name=\"$name\"; filename=\"$value\"") + push!(dataList, b"Content-Type: $value") + push!(dataList, b"") + push!(dataList, String(read(value))) + end + end + push!(dataList, "--{{boundary}}--") + push!(dataList, b"") + return dataList +end + +dataList = build_data_list({{fields_list}}) +payload = join(dataList, b"\r\n") +'''; + + String kStringRequestParams = """, query=params"""; + + String kStringRequestBody = """, payload=payload"""; + + String kStringRequestJson = """, JSON.json(payload)"""; + + String kStringRequestHeaders = """, headers=headers"""; + + final String kStringRequestEnd = """ +) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + + String? getCode(RequestModel requestModel) { + try { + String result = ""; + bool hasQuery = false; + bool hasHeaders = false; + bool hasBody = false; + bool hasJsonBody = false; + String uuid = getNewUuid(); + + var rec = getValidRequestUri( + requestModel.url, + requestModel.enabledRequestParams, + ); + Uri? uri = rec.$1; + if (uri != null) { + var templateStartUrl = jj.Template(kTemplateStart); + result += templateStartUrl.render({ + "url": stripUriParams(uri), + }); + + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + hasQuery = true; + var templateParams = jj.Template(kTemplateParams); + var paramsString = kEncoder.convert(params); + paramsString = padMultilineString(paramsString, kParamsPadding); + result += templateParams.render({"params": paramsString}); + } + } + + if (requestModel.hasJsonData) { + hasJsonBody = true; + var templateBody = jj.Template(kTemplateJson); + result += templateBody.render({"body": requestModel.requestBody}); + } 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.hasFormData) { + var formHeaderTemplate = + jj.Template(kTemplateFormHeaderContentType); + headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ + "boundary": uuid, + }); + } + if (headers.isNotEmpty || hasBody) { + hasHeaders = true; + if (hasBody) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.requestBodyContentType.header; + } + var headersString = kEncoder.convert(headers); + headersString = padMultilineString(headersString, kHeadersPadding); + var templateHeaders = jj.Template(kTemplateHeaders); + result += templateHeaders.render({"headers": headersString}); + } + } + if (requestModel.hasFormData) { + 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": requestModel.method.name.toLowerCase(), + }); + + if (hasQuery) { + result += kStringRequestParams; + } + + if (hasBody || requestModel.hasFormData) { + result += kStringRequestBody; + } + + if (hasJsonBody || requestModel.hasFormData) { + result += kStringRequestJson; + } + + if (hasHeaders || requestModel.hasFormData) { + result += kStringRequestHeaders; + } + + result += kStringRequestEnd; + } + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/codegen/kotlin/okhttp.dart b/lib/codegen/kotlin/okhttp.dart index 07e5a92b..a3a2fb89 100644 --- a/lib/codegen/kotlin/okhttp.dart +++ b/lib/codegen/kotlin/okhttp.dart @@ -7,7 +7,7 @@ import 'package:apidash/consts.dart'; class KotlinOkHttpCodeGen { final String kTemplateStart = """import okhttp3.OkHttpClient -import okhttp3.Request{{importForQuery}}{{importForBody}} +import okhttp3.Request{{importForQuery}}{{importForBody}}{{importForFormData}}{{importForFile}} fun main() { val client = OkHttpClient() @@ -21,6 +21,16 @@ import okhttp3.HttpUrl.Companion.toHttpUrl"""; final String kStringImportForBody = """ import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.MediaType.Companion.toMediaType"""; + + final String kStringImportForFormData = """ + +import okhttp3.MultipartBody"""; + + final String kStringImportForFile = """ + +import java.io.File +import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.MediaType.Companion.toMediaType"""; final String kTemplateUrl = ''' @@ -64,27 +74,23 @@ import okhttp3.MediaType.Companion.toMediaType"""; // Converting list of form data objects to kolin multi part data String kFormDataBody = ''' val body = MultipartBody.Builder().setType(MultipartBody.FORM){% for item in formDataList %}{% if item.type == 'file' %} - .addFormDataPart("{{item.name}}",null,File("{{item.value}}").asRequestBody("application/octet-stream".toMediaType())) + .addFormDataPart("{{item.name}}",File("{{item.value}}").name,File("{{item.value}}").asRequestBody("application/octet-stream".toMediaType())) {% else %}.addFormDataPart("{{item.name}}","{{item.value}}") {% endif %}{% endfor %}.build() '''; 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; + bool hasFile = false; var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; @@ -108,11 +114,38 @@ 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); + List> modifiedFormDataList = []; + for (var item in requestModel.formDataList) { + if (item.type == FormDataType.file ) { + if (item.value[0] == "/") { + modifiedFormDataList.add({ + "name": item.name, + "value": item.value.substring(1), + "type": "file" + }); + }else{ + modifiedFormDataList.add({ + "name": item.name, + "value": item.value, + "type": "file" + }); + } + hasFile = true; + }else{ + modifiedFormDataList.add({ + "name": item.name, + "value": item.value, + "type": "text" + }); + } + } + result += formDataTemplate.render({ - "formDataList": requestModel.formDataMapList, + "formDataList": modifiedFormDataList, }); } else if (kMethodsWithBody.contains(method) && requestBody != null) { var contentLength = utf8.encode(requestBody).length; @@ -128,7 +161,9 @@ 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 : "", + "importForFile": hasFile ? kStringImportForFile : "", }); result = stringStart + result; @@ -145,7 +180,7 @@ import okhttp3.MediaType.Companion.toMediaType"""; var templateRequestEnd = jj.Template(kTemplateRequestEnd); result += templateRequestEnd.render({ "method": method.name.toLowerCase(), - "hasBody": (hasBody || requestModel.isFormDataRequest) ? "body" : "", + "hasBody": (hasBody || requestModel.hasFormData) ? "body" : "", }); } return result; diff --git a/lib/codegen/others/curl.dart b/lib/codegen/others/curl.dart index 4ae610de..2ba59765 100644 --- a/lib/codegen/others/curl.dart +++ b/lib/codegen/others/curl.dart @@ -1,6 +1,7 @@ import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' show requestModelToHARJsonRequest; import 'package:apidash/models/models.dart' show RequestModel; +import 'package:apidash/consts.dart'; // ignore: camel_case_types class cURLCodeGen { @@ -11,7 +12,7 @@ class cURLCodeGen { --header '{{name}}: {{value}}' """; String kTemplateFormData = """ \\ - --form '{{name}}: {{value}}' + --form '{{name}}={{value}}' """; String kTemplateBody = """ \\ @@ -20,25 +21,21 @@ class cURLCodeGen { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { String result = ""; - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var rM = requestModel.copyWith(url: url); - - var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + var harJson = requestModelToHARJsonRequest( + requestModel, + useEnabled: true, + ); var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ "method": switch (harJson["method"]) { "GET" => "", "HEAD" => " --head", - _ => " --request ${harJson["method"]} \\\n" + _ => " --request ${harJson["method"]} \\\n " }, "url": harJson["url"], }); @@ -46,33 +43,31 @@ class cURLCodeGen { var headers = harJson["headers"]; if (headers.isNotEmpty) { for (var item in headers) { + if (requestModel.hasFormData && item["name"] == kHeaderContentType) { + continue; + } var templateHeader = jj.Template(kTemplateHeader); result += templateHeader .render({"name": item["name"], "value": item["value"]}); } } - if (harJson['formData'] != null) { - var formDataList = harJson['formData'] as List>; - for (var formData in formDataList) { + + if (requestModel.hasJsonData || requestModel.hasTextData) { + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": requestModel.requestBody}); + } else if (requestModel.hasFormData) { + for (var formData in requestModel.formDataList) { var templateFormData = jj.Template(kTemplateFormData); - if (formData['type'] != null && - formData['name'] != null && - formData['value'] != null && - formData['name']!.isNotEmpty && - formData['value']!.isNotEmpty) { + if (formData.name.isNotEmpty && formData.value.isNotEmpty) { result += templateFormData.render({ - "name": formData["name"], + "name": formData.name, "value": - "${formData['type'] == 'file' ? '@' : ''}${formData["value"]}", + "${formData.type == FormDataType.file ? '@' : ''}${formData.value}", }); } } } - if (harJson["postData"]?["text"] != null) { - var templateBody = jj.Template(kTemplateBody); - result += templateBody.render({"body": harJson["postData"]["text"]}); - } return result; } catch (e) { return null; diff --git a/lib/codegen/others/har.dart b/lib/codegen/others/har.dart index 77d78f58..72ab8731 100644 --- a/lib/codegen/others/har.dart +++ b/lib/codegen/others/har.dart @@ -5,13 +5,15 @@ import 'package:apidash/models/models.dart' show RequestModel; class HARCodeGen { String? getCode( RequestModel requestModel, - String defaultUriScheme, - ) { + String defaultUriScheme, { + String? boundary, + }) { try { var harString = kEncoder.convert(requestModelToHARJsonRequest( requestModel, defaultUriScheme: defaultUriScheme, useEnabled: true, + boundary: boundary, )); return harString; } catch (e) { diff --git a/lib/codegen/php/guzzle.dart b/lib/codegen/php/guzzle.dart new file mode 100644 index 00000000..c0e5562e --- /dev/null +++ b/lib/codegen/php/guzzle.dart @@ -0,0 +1,161 @@ +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/utils/utils.dart' + show requestModelToHARJsonRequest, stripUrlParams; +import 'package:apidash/models/models.dart' show RequestModel; +import 'package:apidash/consts.dart'; + +class PhpGuzzleCodeGen { + String kStringImportNode = """use GuzzleHttp\\Client; +use GuzzleHttp\\Psr7\\Request; +{% if hasFormData %}use GuzzleHttp\\Psr7\\MultipartStream;{% endif %} + + +"""; + + String kMultiPartBodyTemplate = """ +\$multipart = [ +{{fields_list}} +]; + + +"""; + + String kTemplateParams = """ +\$queryParams = [ +{{params}} +]; +\$queryParamsStr = '?' . http_build_query(\$queryParams); + + +"""; + + String kTemplateHeader = """ +\$headers = [ +{{headers}} +]; + + +"""; + + String kTemplateBody = """ +\$body = {{body}}; + + +"""; + + String kStringRequest = """ +\$client = new Client(); + +\$request = new Request('{{method}}', '{{url}}'{{queryParams}} {{headers}} {{body}}); +\$res = \$client->sendAsync(\$request)->wait(); +echo \$res->getBody(); +"""; + + String? getCode(RequestModel requestModel) { + try { + jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); + String importsData = kNodejsImportTemplate.render({ + "hasFormData": requestModel.hasFormData, + }); + + String result = importsData; + + if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { + var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); + var renderedMultiPartBody = templateMultiPartBody.render({ + "fields_list": requestModel.formDataMapList.map((field) { + return ''' + [ + 'name' => '${field['name']}', + 'contents' => '${field['value']}' + ],'''; + }).join(), + }); + result += renderedMultiPartBody; + } + + var harJson = + requestModelToHARJsonRequest(requestModel, useEnabled: true); + + var params = harJson["queryString"]; + if (params.isNotEmpty) { + var templateParams = jj.Template(kTemplateParams); + var m = {}; + for (var i in params) { + m[i["name"]] = i["value"]; + } + var jsonString = ''; + m.forEach((key, value) { + jsonString += "\t\t\t\t'$key' => '$value', \n"; + }); + jsonString = jsonString.substring( + 0, jsonString.length - 2); // Removing trailing comma and space + result += templateParams.render({ + "params": jsonString, + }); + } + + var headers = harJson["headers"]; + if (headers.isNotEmpty || requestModel.hasFormData) { + var templateHeader = jj.Template(kTemplateHeader); + var m = {}; + for (var i in headers) { + m[i["name"]] = i["value"]; + } + var headersString = ''; + m.forEach((key, value) { + headersString += "\t\t\t\t'$key' => '$value', \n"; + }); + if (requestModel.hasFormData) { + m['Content-Type'] = 'multipart/form-data'; + } + headersString = headersString.substring( + 0, headersString.length - 2); // Removing trailing comma and space + result += templateHeader.render({ + "headers": headersString, + }); + } + + var templateBody = jj.Template(kTemplateBody); + if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { + result += templateBody.render({ + "body": "new MultipartStream(\$multipart)", + }); + } + + if (harJson["postData"]?["text"] != null) { + result += templateBody + .render({"body": kEncoder.convert(harJson["postData"]["text"])}); + } + + String getRequestBody(Map harJson) { + if (harJson.containsKey("postData")) { + var postData = harJson["postData"]; + if (postData.containsKey("mimeType")) { + var mimeType = postData["mimeType"]; + if (mimeType == "text/plain" || mimeType == "application/json") { + return " \$body"; + } else if (mimeType == "multipart/form-data") { + return " new MultipartStream(\$multipart)"; + } + } + } + return ""; // Return empty string if postData or formdata is not present + } + + var templateRequest = jj.Template(kStringRequest); + result += templateRequest.render({ + "url": stripUrlParams(requestModel.url), + "method": harJson["method"].toLowerCase(), + "queryParams": + harJson["queryString"].isNotEmpty ? ". \$queryParamsStr," : "", + "headers": harJson["headers"].isNotEmpty ? " \$headers," : "", + "body": getRequestBody(harJson), + }); + + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/codegen/python/http_client.dart b/lib/codegen/python/http_client.dart index 4406effb..2df5132c 100644 --- a/lib/codegen/python/http_client.dart +++ b/lib/codegen/python/http_client.dart @@ -1,14 +1,13 @@ import 'dart:io'; import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; -import 'package:apidash/utils/utils.dart' - show getNewUuid, getValidRequestUri, padMultilineString; +import 'package:apidash/utils/utils.dart' show getValidRequestUri; 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 %} """; @@ -20,7 +19,6 @@ queryParams = {{params}} queryParamsStr = '?' + urlencode(queryParams) """; - int kParamsPadding = 14; String kTemplateBody = """ @@ -36,8 +34,6 @@ headers = {{headers}} String kTemplateFormHeaderContentType = ''' multipart/form-data; boundary={{boundary}}'''; - int kHeadersPadding = 10; - String kTemplateConnection = """ conn = http.client.HTTP{{isHttps}}Connection("{{authority}}")"""; @@ -87,30 +83,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, ); @@ -123,51 +112,48 @@ body = b'\r\n'.join(dataList) 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) { - hasBody = true; + if (requestModel.hasBody) { + hasBody = true; + if (requestModel.hasJsonData || requestModel.hasTextData) { var templateBody = jj.Template(kTemplateBody); - result += templateBody.render({"body": requestBody}); + 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 && !requestModel.hasContentTypeHeader) { - headers[HttpHeaders.contentTypeHeader] = - requestModel.requestBodyContentType.header; + if (requestModel.hasJsonData || requestModel.hasTextData) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.requestBodyContentType.header; + } else if (requestModel.hasFormData) { + var formHeaderTemplate = + jj.Template(kTemplateFormHeaderContentType); + headers[HttpHeaders.contentTypeHeader] = + formHeaderTemplate.render({ + "boundary": boundary, + }); + } } var headersString = kEncoder.convert(headers); - headersString = padMultilineString(headersString, kHeadersPadding); var templateHeaders = jj.Template(kTemplateHeaders); 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, }, ); } @@ -179,16 +165,16 @@ body = b'\r\n'.join(dataList) var templateRequest = jj.Template(kTemplateRequest); result += templateRequest.render({ - "method": method.name.toUpperCase(), + "method": requestModel.method.name.toUpperCase(), "path": uri.path, "queryParamsStr": hasQuery ? " + queryParamsStr" : "", }); - if (hasBody || requestModel.isFormDataRequest) { + if (hasBody || requestModel.hasFormData) { result += kStringRequestBody; } - if (hasHeaders || requestModel.isFormDataRequest) { + if (hasHeaders || requestModel.hasFormData) { result += kStringRequestHeaders; } diff --git a/lib/codegen/python/requests.dart b/lib/codegen/python/requests.dart index 3a5beeb6..6fb07908 100644 --- a/lib/codegen/python/requests.dart +++ b/lib/codegen/python/requests.dart @@ -1,15 +1,14 @@ import 'dart:io'; -import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; import 'package:apidash/consts.dart'; import 'package:apidash/utils/utils.dart' - show getNewUuid, getValidRequestUri, padMultilineString, stripUriParams; + show getValidRequestUri, stripUriParams, getFilenameFromPath; import 'package:apidash/models/models.dart' show RequestModel; +import '../codegen_utils.dart'; class PythonRequestsCodeGen { final String kTemplateStart = """import requests -{% if isFormDataRequest %}import mimetypes -from codecs import encode +{% if hasFormData %}from requests_toolbelt.multipart.encoder import MultipartEncoder {% endif %} url = '{{url}}' @@ -20,7 +19,6 @@ url = '{{url}}' params = {{params}} """; - int kParamsPadding = 9; String kTemplateBody = """ @@ -39,44 +37,27 @@ payload = {{body}} headers = {{headers}} """; - String kTemplateFormHeaderContentType = ''' -multipart/form-data; boundary={{boundary}}'''; - - int kHeadersPadding = 10; String kTemplateRequest = """ response = requests.{{method}}(url """; - final String kStringFormDataBody = r''' + final String kTemplateFormDataBody = r''' -def build_data_list(fields): - dataList = [] - for field in fields: - name = field.get('name', '') - value = field.get('value', '') - type_ = field.get('type', 'text') +payload = MultipartEncoder({ +{{formdata_payload}} +}{% if boundary != '' %}, + boundary="{{boundary}}" +{% endif %}) - dataList.append(encode('--{{boundary}}')) - if type_ == 'text': - dataList.append(encode(f'Content-Disposition: form-data; name="{name}"')) - dataList.append(encode('Content-Type: text/plain')) - dataList.append(encode('')) - dataList.append(encode(value)) - elif type_ == 'file': - dataList.append(encode(f'Content-Disposition: form-data; name="{name}"; filename="{value}"')) - dataList.append(encode(f'Content-Type: {mimetypes.guess_type(value)[0] or "application/octet-stream"}')) - dataList.append(encode('')) - dataList.append(open(value, 'rb').read()) - dataList.append(encode('--{{boundary}}--')) - dataList.append(encode('')) - return dataList - -dataList = build_data_list({{fields_list}}) -payload = b'\r\n'.join(dataList) '''; + String kTemplateFormDataRowText = r""" "{{name}}": "{{value}}","""; + + String kTemplateFormDataRowFile = + r""" "{{name}}": ("{{filename}}", open("{{path}}", "rb")),"""; + String kStringRequestParams = """, params=params"""; String kStringRequestBody = """, data=payload"""; @@ -91,25 +72,26 @@ print('Status Code:', response.status_code) print('Response Body:', response.text) """; + String kStringFormDataContentType = "payload.content_type"; + + String refactorHeaderString(String headerString) { + return headerString.replaceAll( + '"$kStringFormDataContentType"', kStringFormDataContentType); + } + String? getCode( - RequestModel requestModel, - String defaultUriScheme, - ) { + RequestModel requestModel, { + String? boundary, + }) { try { String result = ""; bool hasQuery = false; bool hasHeaders = false; bool hasBody = false; bool hasJsonBody = false; - String uuid = getNewUuid(); - - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; @@ -117,7 +99,7 @@ print('Response Body:', response.text) var templateStartUrl = jj.Template(kTemplateStart); result += templateStartUrl.render({ "url": stripUriParams(uri), - 'isFormDataRequest': requestModel.isFormDataRequest + 'hasFormData': requestModel.hasFormData }); if (uri.hasQuery) { @@ -126,77 +108,85 @@ print('Response Body:', response.text) hasQuery = true; var templateParams = jj.Template(kTemplateParams); var paramsString = kEncoder.convert(params); - paramsString = padMultilineString(paramsString, kParamsPadding); result += templateParams.render({"params": paramsString}); } } - var method = requestModel.method; - var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(method) && requestBody != null) { - var contentLength = utf8.encode(requestBody).length; - if (contentLength > 0) { - if (requestModel.requestBodyContentType == ContentType.json) { - hasJsonBody = true; - var templateBody = jj.Template(kTemplateJson); - result += templateBody.render({"body": requestBody}); - } else { - hasBody = true; - var templateBody = jj.Template(kTemplateBody); - result += templateBody.render({"body": requestBody}); + if (requestModel.hasFormData) { + hasBody = true; + List formdataPayload = []; + for (var item in requestModel.formDataList) { + if (item.type == FormDataType.text) { + formdataPayload.add(jj.Template(kTemplateFormDataRowText).render({ + "name": item.name, + "value": item.value, + })); + } + if (item.type == FormDataType.file) { + formdataPayload.add(jj.Template(kTemplateFormDataRowFile).render({ + "name": item.name, + "filename": getFilenameFromPath(item.value), + "path": item.value, + })); } } + var formDataBodyData = jj.Template(kTemplateFormDataBody); + result += formDataBodyData.render( + { + "formdata_payload": formdataPayload.join("\n"), + "boundary": boundary ?? '', + }, + ); + } else if (requestModel.hasJsonData) { + hasJsonBody = true; + var templateBody = jj.Template(kTemplateJson); + var pyDict = jsonToPyDict(requestModel.requestBody ?? ""); + result += templateBody.render({"body": pyDict}); + } else if (requestModel.hasTextData) { + hasBody = true; + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": requestModel.requestBody}); } var headersList = requestModel.enabledRequestHeaders; if (headersList != null || hasBody) { var headers = requestModel.enabledHeadersMap; - if (requestModel.isFormDataRequest) { - var formHeaderTemplate = - jj.Template(kTemplateFormHeaderContentType); - headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ - "boundary": uuid, - }); - } - if (headers.isNotEmpty || hasBody) { - hasHeaders = true; - if (hasBody) { + if (hasBody) { + if (requestModel.hasFormData) { + headers[HttpHeaders.contentTypeHeader] = + kStringFormDataContentType; + } else { headers[HttpHeaders.contentTypeHeader] = requestModel.requestBodyContentType.header; } + } + if (headers.isNotEmpty) { + hasHeaders = true; var headersString = kEncoder.convert(headers); - headersString = padMultilineString(headersString, kHeadersPadding); + headersString = refactorHeaderString(headersString); var templateHeaders = jj.Template(kTemplateHeaders); result += templateHeaders.render({"headers": headersString}); } } - if (requestModel.isFormDataRequest) { - var formDataBodyData = jj.Template(kStringFormDataBody); - result += formDataBodyData.render( - { - "fields_list": json.encode(requestModel.formDataMapList), - "boundary": uuid, - }, - ); - } + var templateRequest = jj.Template(kTemplateRequest); result += templateRequest.render({ - "method": method.name.toLowerCase(), + "method": requestModel.method.name.toLowerCase(), }); if (hasQuery) { result += kStringRequestParams; } - if (hasBody || requestModel.isFormDataRequest) { + if (hasBody) { result += kStringRequestBody; } - if (hasJsonBody || requestModel.isFormDataRequest) { + if (hasJsonBody) { result += kStringRequestJson; } - if (hasHeaders || requestModel.isFormDataRequest) { + if (hasHeaders) { result += kStringRequestHeaders; } diff --git a/lib/codegen/rust/actix.dart b/lib/codegen/rust/actix.dart new file mode 100644 index 00000000..4e13b0f1 --- /dev/null +++ b/lib/codegen/rust/actix.dart @@ -0,0 +1,217 @@ +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, stripUriParams; +import 'package:apidash/models/models.dart' show RequestModel; + +class RustActixCodeGen { + final String kTemplateStart = """ +{%- if isFormDataRequest -%} +use std::io::Read; +{% endif -%} +#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "{{url}}"; + let client = awc::Client::default(); + +"""; + + String kTemplateParams = + """\n .query(&{{ params }})\n .unwrap()"""; + + String kTemplateBody = """ + + let payload = r#"{{body}}"#; + +"""; + + String kTemplateJson = """ + + let payload = serde_json::json!({{body}}); + +"""; + + String kTemplateHeaders = + """\n {% for key, val in headers -%}.insert_header(("{{key}}", "{{val}}")){% if not loop.last %}{{ '\n ' }}{% endif %}{%- endfor -%}"""; + + String kTemplateFormHeaderContentType = ''' +multipart/form-data; boundary={{boundary}}'''; + + String kTemplateRequest = """ + + let mut response = client\n .{{method}}(url) +"""; + + final String kStringFormDataBody = r""" + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + {%- for formitem in fields_list %} + FormDataItem { + {%- for key, val in formitem %} + {% if key == "type" %}field_type: "{{ val }}".to_string(),{% else %}{{ key }}: "{{ val }}".to_string(),{% endif %} + {%- endfor %} + }, + {%- endfor %} + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--{{boundary}}\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--{{boundary}}--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); +"""; + + String kStringRequestBody = """\n .send_body(payload)"""; + + String kStringRequestJson = """\n .send_json(&payload)"""; + + String kStringRequestNormal = """\n .send()"""; + + final String kStringRequestEnd = """\n .await\n .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + + String? getCode( + RequestModel requestModel, { + String? boundary, + }) { + try { + String uuid = getNewUuid(); + String result = ""; + bool hasBody = false; + bool hasJsonBody = false; + + String url = requestModel.url; + + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); + Uri? uri = rec.$1; + if (uri != null) { + var templateStartUrl = jj.Template(kTemplateStart); + result += templateStartUrl.render({ + "url": stripUriParams(uri), + 'isFormDataRequest': requestModel.hasFormData, + "method": requestModel.method.name.toLowerCase() + }); + + var method = requestModel.method; + var requestBody = requestModel.requestBody; + if (kMethodsWithBody.contains(method) && requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + if (requestModel.requestBodyContentType == ContentType.json) { + hasJsonBody = true; + var templateBody = jj.Template(kTemplateJson); + result += templateBody.render({"body": requestBody}); + } else if (!requestModel.hasFormData) { + hasBody = true; + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": requestBody}); + } + } + } + + if (requestModel.hasFormData) { + var formDataBodyData = jj.Template(kStringFormDataBody); + result += formDataBodyData.render( + { + "fields_list": requestModel.formDataMapList, + "boundary": boundary ?? uuid, + }, + ); + } + var templateRequest = jj.Template(kTemplateRequest); + result += templateRequest.render({ + "method": method.name.toLowerCase(), + }); + + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + var tupleStrings = params.entries + .map((entry) => '("${entry.key}", "${entry.value}")') + .toList(); + var paramsString = "[${tupleStrings.join(', ')}]"; + var templateParms = jj.Template(kTemplateParams); + result += templateParms.render({"params": paramsString}); + } + } + + var headersList = requestModel.enabledRequestHeaders; + if (headersList != null || hasBody || requestModel.hasFormData) { + var headers = requestModel.enabledHeadersMap; + if (requestModel.hasFormData) { + var formHeaderTemplate = + jj.Template(kTemplateFormHeaderContentType); + headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ + "boundary": boundary ?? uuid, + }); + } else if (hasBody) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.requestBodyContentType.header; + } + + if (headers.isNotEmpty) { + var templateHeaders = jj.Template(kTemplateHeaders); + result += templateHeaders.render({"headers": headers}); + } + } + + if (hasBody || requestModel.hasFormData) { + result += kStringRequestBody; + } else if (hasJsonBody) { + result += kStringRequestJson; + } else { + result += kStringRequestNormal; + } + + result += kStringRequestEnd; + } + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/codegen/rust/reqwest.dart b/lib/codegen/rust/reqwest.dart new file mode 100644 index 00000000..4eb0accd --- /dev/null +++ b/lib/codegen/rust/reqwest.dart @@ -0,0 +1,180 @@ +import 'dart:io'; +import 'dart:convert'; +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/consts.dart'; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri, stripUriParams; +import 'package:apidash/models/models.dart' show RequestModel; + +class RustReqwestCodeGen { + final String kTemplateStart = + """fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "{{url}}"; + +"""; + + String kTemplateParams = """\n .query(&{{params}})"""; + + String kTemplateBody = """ + + let payload = r#"{{body}}"#; + +"""; + + String kTemplateJson = """ + + let payload = serde_json::json!({{body}}); + +"""; + + String kTemplateHeaders = + """\n {% for key, val in headers -%}.header("{{key}}", "{{val}}"){% if not loop.last %}{{ '\n ' }}{% endif %}{%- endfor -%}"""; + + String kTemplateRequest = """ + + let response = client\n .{{method}}(url) +"""; + + final String kStringFormDataBody = r''' + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + {%- for formitem in fields_list %} + FormDataItem { + {%- for key, val in formitem %} + {% if key == "type" %}field_type: "{{ val }}".to_string(),{% else %}{{ key }}: "{{ val }}".to_string(),{% endif %} + {%- endfor %} + }, + {%- endfor %} + ]; + + let mut form = reqwest::blocking::multipart::Form::new(); + + for item in form_data_items { + if item.field_type == "text" { + form = form.text(item.name, item.value); + } else if item.field_type == "file" { + form = form.file(item.name, &item.value)?; + } + } +'''; + + String kStringRequestBody = """\n .body(payload)"""; + + String kStringRequestJson = """\n .json(&payload)"""; + + String kStringRequestForm = """\n .multipart(form)"""; + + final String kStringRequestEnd = """\n .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + + String? getCode( + RequestModel requestModel, + ) { + try { + String result = ""; + bool hasBody = false; + bool hasJsonBody = false; + + String url = requestModel.url; + + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); + Uri? uri = rec.$1; + if (uri != null) { + var templateStartUrl = jj.Template(kTemplateStart); + result += templateStartUrl.render({ + "url": stripUriParams(uri), + 'isFormDataRequest': requestModel.hasFormData, + 'isJson': requestModel.requestBodyContentType == ContentType.json + }); + + var method = requestModel.method; + var requestBody = requestModel.requestBody; + if (kMethodsWithBody.contains(method) && requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + if (requestModel.requestBodyContentType == ContentType.json) { + hasJsonBody = true; + var templateBody = jj.Template(kTemplateJson); + result += templateBody.render({"body": requestBody}); + } else if (!requestModel.hasFormData) { + hasBody = true; + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": requestBody}); + } + } + } + + if (requestModel.hasFormData) { + var formDataBodyData = jj.Template(kStringFormDataBody); + result += formDataBodyData.render( + { + "fields_list": requestModel.formDataMapList, + }, + ); + } + var templateRequest = jj.Template(kTemplateRequest); + result += templateRequest.render({ + "method": method.name.toLowerCase(), + }); + + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + var tupleStrings = params.entries + .map((entry) => '("${entry.key}", "${entry.value}")') + .toList(); + var paramsString = "[${tupleStrings.join(', ')}]"; + var templateParams = jj.Template(kTemplateParams); + result += templateParams.render({"params": paramsString}); + } + } + + var headersList = requestModel.enabledRequestHeaders; + if (headersList != null || hasBody) { + var headers = requestModel.enabledHeadersMap; + if (hasBody) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.requestBodyContentType.header; + } + if (headers.isNotEmpty) { + var templateHeaders = jj.Template(kTemplateHeaders); + result += templateHeaders.render({"headers": headers}); + } + } + + if (hasBody && !requestModel.hasFormData) { + result += kStringRequestBody; + } + + if (hasJsonBody) { + result += kStringRequestJson; + } + + if (requestModel.hasFormData) { + result += kStringRequestForm; + } + + result += kStringRequestEnd; + } + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/codegen/rust/ureq.dart b/lib/codegen/rust/ureq.dart new file mode 100644 index 00000000..c1c170d2 --- /dev/null +++ b/lib/codegen/rust/ureq.dart @@ -0,0 +1,211 @@ +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, stripUriParams; +import 'package:apidash/models/models.dart' show RequestModel; + +class RustUreqCodeGen { + final String kTemplateStart = """ +{%- if isFormDataRequest -%} +use std::io::Read; +{% endif -%} +fn main() -> Result<(), ureq::Error> { + let url = "{{url}}"; +"""; + + // String kTemplateParams = """\n .query_pairs({{ params }})"""; + String kTemplateParams = + """\n {% for key, val in params -%}.query("{{key}}", "{{val}}"){% if not loop.last %}{{ '\n ' }}{% endif %}{%- endfor -%}"""; + + String kTemplateBody = """ + + let payload = r#"{{body}}"#; + +"""; + + String kTemplateJson = """ + + let payload = ureq::json!({{body}}); + +"""; + + String kTemplateHeaders = + """\n {% for key, val in headers -%}.set("{{key}}", "{{val}}"){% if not loop.last %}{{ '\n ' }}{% endif %}{%- endfor -%}"""; + + String kTemplateFormHeaderContentType = ''' +multipart/form-data; boundary={{boundary}}'''; + + String kTemplateRequest = """ + + let response = ureq::{{method}}(url) +"""; + + final String kStringFormDataBody = r""" + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + {%- for formitem in fields_list %} + FormDataItem { + {%- for key, val in formitem %} + {% if key == "type" %}field_type: "{{ val }}".to_string(),{% else %}{{ key }}: "{{ val }}".to_string(),{% endif %} + {%- endfor %} + }, + {%- endfor %} + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--{{boundary}}\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--{{boundary}}--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); +"""; + + String kStringRequestBody = """\n .send_string(payload)?;"""; + + String kStringRequestForm = """\n .send_bytes(&payload)?;"""; + + String kStringRequestJson = """\n .send_json(payload)?;"""; + + String kStringRequestNormal = """\n .call()?;"""; + + final String kStringRequestEnd = """\n + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + + String? getCode( + RequestModel requestModel, { + String? boundary, + }) { + try { + String result = ""; + bool hasBody = false; + bool hasJsonBody = false; + String uuid = getNewUuid(); + + String url = requestModel.url; + + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); + Uri? uri = rec.$1; + if (uri != null) { + var templateStartUrl = jj.Template(kTemplateStart); + result += templateStartUrl.render({ + "url": stripUriParams(uri), + 'isFormDataRequest': requestModel.hasFormData, + "method": requestModel.method.name.toLowerCase() + }); + + var method = requestModel.method; + var requestBody = requestModel.requestBody; + if (kMethodsWithBody.contains(method) && requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + if (requestModel.requestBodyContentType == ContentType.json) { + hasJsonBody = true; + var templateBody = jj.Template(kTemplateJson); + result += templateBody.render({"body": requestBody}); + } else if (!requestModel.hasFormData) { + hasBody = true; + var templateBody = jj.Template(kTemplateBody); + result += templateBody.render({"body": requestBody}); + } + } + } + + if (requestModel.hasFormData) { + var formDataBodyData = jj.Template(kStringFormDataBody); + result += formDataBodyData.render( + { + "fields_list": requestModel.formDataMapList, + "boundary": boundary ?? uuid, + }, + ); + } + var templateRequest = jj.Template(kTemplateRequest); + result += templateRequest.render({ + "method": method.name.toLowerCase(), + }); + + if (uri.hasQuery) { + var params = uri.queryParameters; + if (params.isNotEmpty) { + var templateParms = jj.Template(kTemplateParams); + result += templateParms.render({"params": params}); + } + } + + var headersList = requestModel.enabledRequestHeaders; + if (headersList != null || hasBody || requestModel.hasFormData) { + var headers = requestModel.enabledHeadersMap; + if (requestModel.hasFormData) { + var formHeaderTemplate = + jj.Template(kTemplateFormHeaderContentType); + headers[HttpHeaders.contentTypeHeader] = formHeaderTemplate.render({ + "boundary": boundary ?? uuid, + }); + } else if (hasBody) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.requestBodyContentType.header; + } + + if (headers.isNotEmpty) { + var templateHeaders = jj.Template(kTemplateHeaders); + result += templateHeaders.render({"headers": headers}); + } + } + if (requestModel.hasFormData) { + result += kStringRequestForm; + } else if (hasBody) { + result += kStringRequestBody; + } else if (hasJsonBody) { + result += kStringRequestJson; + } else { + result += kStringRequestNormal; + } + + result += kStringRequestEnd; + } + return result; + } catch (e) { + return null; + } + } +} diff --git a/lib/consts.dart b/lib/consts.dart index e658632f..c35d7d33 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -8,6 +8,7 @@ import 'package:davi/davi.dart'; const kDiscordUrl = "https://bit.ly/heyfoss"; const kGitUrl = "https://github.com/foss42/apidash"; const kIssueUrl = "$kGitUrl/issues"; +const kDefaultUri = "api.apidash.dev"; final kIsMacOS = !kIsWeb && Platform.isMacOS; final kIsWindows = !kIsWeb && Platform.isWindows; @@ -265,15 +266,23 @@ enum CodegenLanguage { har("HAR", "json", "har"), dartHttp("Dart (http)", "dart", "dart"), dartDio("Dart (dio)", "dart", "dart"), + goHttp("Go (http)", "go", "go"), jsAxios("JavaScript (axios)", "javascript", "js"), jsFetch("JavaScript (fetch)", "javascript", "js"), nodejsAxios("node.js (axios)", "javascript", "js"), nodejsFetch("node.js (fetch)", "javascript", "js"), kotlinOkHttp("Kotlin (okhttp3)", "java", "kt"), - pythonHttpClient("Python (http.client)", "python", "py"), pythonRequests("Python (requests)", "python", "py"), - rustCurl("Rust (curl-rust)", "rust", "rs"); - + pythonHttpClient("Python (http.client)", "python", "py"), + rustActix("Rust (Actix Client)", "rust", "rs"), + rustReqwest("Rust (reqwest)", "rust", "rs"), + rustCurl("Rust (curl-rust)", "rust", "rs"), + rustUreq("Rust (ureq)", "rust", "rs"), + javaOkHttp("Java (okhttp3)", "java", 'java'), + javaAsyncHttpClient("Java (asynchttpclient)", "java", "java"), + javaHttpClient("Java (HttpClient)", "java", "java"), + juliaHttp("Julia (HTTP)", "julia", "jl"), + phpGuzzle("PHP (guzzle)", "php", "php"); const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); final String label; @@ -284,6 +293,8 @@ enum CodegenLanguage { const JsonEncoder kEncoder = JsonEncoder.withIndent(' '); const LineSplitter kSplitter = LineSplitter(); +const kHeaderContentType = "Content-Type"; + const kTypeApplication = 'application'; // application const kSubTypeJson = 'json'; @@ -314,12 +325,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; @@ -501,8 +515,7 @@ const kRaiseIssue = const kCsvError = "There seems to be an issue rendering this CSV. Please raise an issue in API Dash GitHub repo so that we can resolve it."; -const kHintTextUrlCard = - "Enter API endpoint like api.apidash.dev/country/codes"; +const kHintTextUrlCard = "Enter API endpoint like https://$kDefaultUri/"; const kLabelPlusNew = "+ New"; const kLabelSend = "Send"; const kLabelSending = "Sending.."; diff --git a/lib/models/request_model.dart b/lib/models/request_model.dart index a8d3569a..6bdff603 100644 --- a/lib/models/request_model.dart +++ b/lib/models/request_model.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:convert'; import 'package:flutter/foundation.dart'; import '../utils/utils.dart' show @@ -62,9 +63,31 @@ class RequestModel { Map get headersMap => rowsToMap(requestHeaders) ?? {}; Map get paramsMap => rowsToMap(requestParams) ?? {}; + bool get hasFormDataContentType => + requestBodyContentType == ContentType.formdata; + bool get hasJsonContentType => requestBodyContentType == ContentType.json; + bool get hasTextContentType => requestBodyContentType == ContentType.text; + int get contentLength => utf8.encode(requestBody ?? "").length; + bool get hasBody => hasJsonData || hasTextData || hasFormData; + bool get hasJsonData => + kMethodsWithBody.contains(method) && + hasJsonContentType && + contentLength > 0; + bool get hasTextData => + kMethodsWithBody.contains(method) && + hasTextContentType && + contentLength > 0; + bool get hasFormData => + kMethodsWithBody.contains(method) && + hasFormDataContentType && + (requestFormDataList ?? []).isNotEmpty; + List get formDataList => + requestFormDataList ?? []; List> get formDataMapList => rowsToFormDataMapList(requestFormDataList) ?? []; - bool get isFormDataRequest => requestBodyContentType == ContentType.formdata; + bool get hasFileInFormData => formDataList + .map((e) => e.type == FormDataType.file) + .any((element) => element); bool get hasContentTypeHeader => enabledHeadersMap.keys .any((k) => k.toLowerCase() == HttpHeaders.contentTypeHeader); diff --git a/lib/providers/collection_providers.dart b/lib/providers/collection_providers.dart index a1afa070..4ecc51ab 100644 --- a/lib/providers/collection_providers.dart +++ b/lib/providers/collection_providers.dart @@ -3,7 +3,7 @@ import 'settings_providers.dart'; import 'ui_providers.dart'; import '../models/models.dart'; import '../services/services.dart' show hiveHandler, HiveHandler, request; -import '../utils/utils.dart' show uuid, collectionToHAR; +import '../utils/utils.dart' show getNewUuid, collectionToHAR; import '../consts.dart'; import 'package:http/http.dart' as http; @@ -54,7 +54,7 @@ class CollectionStateNotifier } void add() { - final id = uuid.v1(); + final id = getNewUuid(); final newRequestModel = RequestModel( id: id, ); @@ -97,7 +97,7 @@ class CollectionStateNotifier } void duplicate(String id) { - final newId = uuid.v1(); + final newId = getNewUuid(); var itemIds = ref.read(requestSequenceProvider); int idx = itemIds.indexOf(id); @@ -173,8 +173,6 @@ class CollectionStateNotifier (http.Response?, Duration?, String?)? responseRec = await request( requestModel, defaultUriScheme: defaultUriScheme, - isMultiPartRequest: - requestModel.requestBodyContentType == ContentType.formdata, ); late final RequestModel newRequestModel; if (responseRec.$1 == null) { @@ -215,7 +213,7 @@ class CollectionStateNotifier bool loadData() { var ids = hiveHandler.getIds(); if (ids == null || ids.length == 0) { - String newId = uuid.v1(); + String newId = getNewUuid(); state = { newId: RequestModel( id: newId, diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart index 7658c8a0..503355f8 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_headers.dart @@ -37,7 +37,7 @@ class EditRequestHeadersState extends ConsumerState { @override Widget build(BuildContext context) { final selectedId = ref.watch(selectedIdStateProvider); - final length = ref.watch(selectedRequestModelProvider + ref.watch(selectedRequestModelProvider .select((value) => value?.requestHeaders?.length)); var rH = ref.read(selectedRequestModelProvider)?.requestHeaders; rows = (rH == null || rH.isEmpty) diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_pane.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_pane.dart index a09c4609..337f0785 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_pane.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_pane.dart @@ -17,11 +17,14 @@ class EditRequestPane extends ConsumerWidget { selectedRequestModelProvider.select((value) => value?.requestTabIndex)); final headerLength = ref.watch(selectedRequestModelProvider - .select((value) => value?.headersMap.length)); + .select((value) => value?.headersMap.length)) ?? + 0; final paramLength = ref.watch(selectedRequestModelProvider - .select((value) => value?.paramsMap.length)); - final bodyLength = ref.watch(selectedRequestModelProvider - .select((value) => value?.requestBody?.length)); + .select((value) => value?.paramsMap.length)) ?? + 0; + final hasBody = ref.watch( + selectedRequestModelProvider.select((value) => value?.hasBody)) ?? + false; return RequestPane( selectedId: selectedId, @@ -37,9 +40,9 @@ class EditRequestPane extends ConsumerWidget { .update(selectedId!, requestTabIndex: index); }, showIndicators: [ - paramLength != null && paramLength > 0, - headerLength != null && headerLength > 0, - bodyLength != null && bodyLength > 0, + paramLength > 0, + headerLength > 0, + hasBody, ], children: const [ EditRequestURLParams(), diff --git a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart index 01005df6..6e3aca4b 100644 --- a/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart +++ b/lib/screens/home_page/editor_pane/details_card/request_pane/request_params.dart @@ -38,7 +38,7 @@ class EditRequestURLParamsState extends ConsumerState { @override Widget build(BuildContext context) { final selectedId = ref.watch(selectedIdStateProvider); - final length = ref.watch(selectedRequestModelProvider + ref.watch(selectedRequestModelProvider .select((value) => value?.requestParams?.length)); var rP = ref.read(selectedRequestModelProvider)?.requestParams; rows = (rP == null || rP.isEmpty) diff --git a/lib/screens/settings_page.dart b/lib/screens/settings_page.dart index 44e67330..fde7dce7 100644 --- a/lib/screens/settings_page.dart +++ b/lib/screens/settings_page.dart @@ -65,7 +65,7 @@ class SettingsPage extends ConsumerWidget { hoverColor: kColorTransparent, title: const Text('Default URI Scheme'), subtitle: Text( - 'api.apidash.dev → ${settings.defaultUriScheme}://api.apidash.dev'), + '$kDefaultUri → ${settings.defaultUriScheme}://$kDefaultUri'), trailing: DropdownMenu( onSelected: (value) { ref diff --git a/lib/services/http_service.dart b/lib/services/http_service.dart index c5a7b4ce..dec0b516 100644 --- a/lib/services/http_service.dart +++ b/lib/services/http_service.dart @@ -9,7 +9,6 @@ import 'package:apidash/consts.dart'; Future<(http.Response?, Duration?, String?)> request( RequestModel requestModel, { String defaultUriScheme = kDefaultUriScheme, - bool isMultiPartRequest = false, }) async { (Uri?, String?) uriRec = getValidRequestUri( requestModel.url, @@ -22,44 +21,48 @@ Future<(http.Response?, Duration?, String?)> request( http.Response response; String? body; try { - var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(requestModel.method) && - requestBody != null) { - var contentLength = utf8.encode(requestBody).length; - if (contentLength > 0) { - body = requestBody; - headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); - if (!requestModel.hasContentTypeHeader) { - headers[HttpHeaders.contentTypeHeader] = - requestModel.requestBodyContentType.header; - } - } - } Stopwatch stopwatch = Stopwatch()..start(); - if (isMultiPartRequest) { - var multiPartRequest = http.MultipartRequest( - requestModel.method.name.toUpperCase(), - requestUrl, - ); - multiPartRequest.headers.addAll(headers); - for (FormDataModel formData - in (requestModel.requestFormDataList ?? [])) { - if (formData.type == FormDataType.text) { - multiPartRequest.fields.addAll({formData.name: formData.value}); - } else { - multiPartRequest.files.add( - await http.MultipartFile.fromPath( - formData.name, - formData.value, - ), - ); + var isMultiPartRequest = + requestModel.requestBodyContentType == ContentType.formdata; + if (kMethodsWithBody.contains(requestModel.method)) { + var requestBody = requestModel.requestBody; + if (requestBody != null && !isMultiPartRequest) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + body = requestBody; + headers[HttpHeaders.contentLengthHeader] = contentLength.toString(); + if (!requestModel.hasContentTypeHeader) { + headers[HttpHeaders.contentTypeHeader] = + requestModel.requestBodyContentType.header; + } } } - http.StreamedResponse multiPartResponse = await multiPartRequest.send(); - stopwatch.stop(); - http.Response convertedMultiPartResponse = - await convertStreamedResponse(multiPartResponse); - return (convertedMultiPartResponse, stopwatch.elapsed, null); + if (isMultiPartRequest) { + var multiPartRequest = http.MultipartRequest( + requestModel.method.name.toUpperCase(), + requestUrl, + ); + multiPartRequest.headers.addAll(headers); + for (var formData + in (requestModel.requestFormDataList ?? [])) { + if (formData.type == FormDataType.text) { + multiPartRequest.fields.addAll({formData.name: formData.value}); + } else { + multiPartRequest.files.add( + await http.MultipartFile.fromPath( + formData.name, + formData.value, + ), + ); + } + } + http.StreamedResponse multiPartResponse = + await multiPartRequest.send(); + stopwatch.stop(); + http.Response convertedMultiPartResponse = + await convertStreamedResponse(multiPartResponse); + return (convertedMultiPartResponse, stopwatch.elapsed, null); + } } switch (requestModel.method) { case HTTPVerb.get: diff --git a/lib/utils/file_utils.dart b/lib/utils/file_utils.dart index 41a6d4a3..68554153 100644 --- a/lib/utils/file_utils.dart +++ b/lib/utils/file_utils.dart @@ -48,8 +48,13 @@ String getShortPath(String path) { return path; } +String getFilenameFromPath(String path) { + var f = p.split(path); + return f.last; +} + String getTempFileName() { - return uuid.v1(); + return getNewUuid(); } Future pickFile() async { diff --git a/lib/utils/har_utils.dart b/lib/utils/har_utils.dart index 38913c6e..86ada7fe 100644 --- a/lib/utils/har_utils.dart +++ b/lib/utils/har_utils.dart @@ -1,6 +1,10 @@ +// http://www.softwareishard.com/blog/har-12-spec/ +// https://github.com/ahmadnassri/har-spec/blob/master/versions/1.2.md + import 'dart:convert'; import 'package:apidash/consts.dart'; -import 'package:apidash/utils/utils.dart' show getValidRequestUri; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri, getNewUuid, getFilenameFromPath; import 'package:apidash/models/models.dart' show RequestModel; import 'package:package_info_plus/package_info_plus.dart'; @@ -75,6 +79,7 @@ Map requestModelToHARJsonRequest( defaultUriScheme = kDefaultUriScheme, bool exportMode = false, bool useEnabled = false, + String? boundary, }) { Map json = {}; bool hasBody = false; @@ -110,19 +115,37 @@ Map requestModelToHARJsonRequest( } } - var method = requestModel.method; - var requestBody = requestModel.requestBody; - if (kMethodsWithBody.contains(method) && requestBody != null) { - var contentLength = utf8.encode(requestBody).length; - if (contentLength > 0) { - hasBody = true; - json["postData"] = {}; - json["postData"]["mimeType"] = - requestModel.requestBodyContentType.header; - json["postData"]["text"] = requestBody; - if (exportMode) { - json["postData"]["comment"] = ""; + if (requestModel.hasJsonData || requestModel.hasTextData) { + hasBody = true; + json["postData"] = {}; + json["postData"]["mimeType"] = requestModel.requestBodyContentType.header; + json["postData"]["text"] = requestModel.requestBody; + if (exportMode) { + json["postData"]["comment"] = ""; + } + } + + if (requestModel.hasFormData) { + boundary = boundary ?? getNewUuid(); + hasBody = true; + json["postData"] = {}; + json["postData"]["mimeType"] = + "${requestModel.requestBodyContentType.header}; boundary=$boundary"; + json["postData"]["params"] = []; + for (var item in requestModel.formDataList) { + Map d = exportMode ? {"comment": ""} : {}; + if (item.type == FormDataType.text) { + d["name"] = item.name; + d["value"] = item.value; } + if (item.type == FormDataType.file) { + d["name"] = item.name; + d["fileName"] = getFilenameFromPath(item.value); + } + json["postData"]["params"].add(d); + } + if (exportMode) { + json["postData"]["comment"] = ""; } } @@ -135,8 +158,8 @@ Map requestModelToHARJsonRequest( if (headers.isNotEmpty || hasBody) { if (hasBody && !requestModel.hasContentTypeHeader) { var m = { - "name": "Content-Type", - "value": requestModel.requestBodyContentType.header + "name": kHeaderContentType, + "value": json["postData"]["mimeType"] }; if (exportMode) { m["comment"] = ""; @@ -152,14 +175,12 @@ Map requestModelToHARJsonRequest( } } } - if (requestModel.isFormDataRequest) { - json["formData"] = requestModel.formDataMapList; - } if (exportMode) { json["comment"] = ""; json["cookies"] = []; json["headersSize"] = -1; - json["bodySize"] = hasBody ? utf8.encode(requestBody!).length : 0; + json["bodySize"] = + hasBody ? utf8.encode(json["postData"]["text"] ?? "").length : 0; } } return json; diff --git a/lib/widgets/intro_message.dart b/lib/widgets/intro_message.dart index 970596d3..7e7ff2e0 100644 --- a/lib/widgets/intro_message.dart +++ b/lib/widgets/intro_message.dart @@ -23,6 +23,9 @@ class IntroMessage extends StatelessWidget { return FutureBuilder( future: introData(), builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return const ErrorMessage(message: "An error occured"); + } if (snapshot.connectionState == ConnectionState.done) { if (Theme.of(context).brightness == Brightness.dark) { text = text.replaceAll("{{mode}}", "dark"); @@ -37,9 +40,6 @@ class IntroMessage extends StatelessWidget { padding: kPh60, ); } - if (snapshot.hasError) { - return const ErrorMessage(message: "An error occured"); - } return const Center(child: CircularProgressIndicator()); }, ); diff --git a/pubspec.lock b/pubspec.lock index 4125ed98..a4e54dfb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -117,10 +117,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "67d591d602906ef9201caf93452495ad1812bea2074f04e25dbd7c133785821b" + sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" url: "https://pub.dev" source: hosted - version: "2.4.7" + version: "2.4.8" build_runner_core: dependency: transitive description: @@ -181,10 +181,10 @@ packages: dependency: "direct main" description: name: code_builder - sha256: feee43a5c05e7b3199bb375a86430b8ada1b04104f2923d0e03cc01ca87b6d84 + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.10.0" collection: dependency: "direct main" description: @@ -221,18 +221,18 @@ packages: dependency: "direct main" description: name: csv - sha256: "63ed2871dd6471193dffc52c0e6c76fb86269c00244d244297abbb355c84a86e" + sha256: c6aa2679b2a18cb57652920f674488d89712efaf4d3fdf2e537215b35fc19d6c url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.0.0" dart_style: dependency: "direct main" description: name: dart_style - sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.3.6" davi: dependency: "direct main" description: @@ -293,10 +293,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "4e42aacde3b993c5947467ab640882c56947d9d27342a5b6f2895b23956954a6" + sha256: caa6bc229eab3e32eb2f37b53a5f9d22a6981474afd210c512a7546c1e1a04f6 url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.2.0" fixnum: dependency: transitive description: @@ -378,10 +378,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "35108526a233cc0755664d445f8a6b4b61e6f8fe993b3658b80b4a26827fc196" + sha256: cb44f7831b23a6bdd0f501718b0d2e8045cbc625a15f668af37ddb80314821db url: "https://pub.dev" source: hosted - version: "0.6.18+2" + version: "0.6.21" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -394,18 +394,18 @@ packages: dependency: "direct main" description: name: flutter_riverpod - sha256: da9591d1f8d5881628ccd5c25c40e74fc3eef50ba45e40c3905a06e1712412d5 + sha256: "0f1974eff5bbe774bf1d870e406fc6f29e3d6f1c46bd9c58e7172ff68a785d7d" url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.5.1" flutter_svg: dependency: "direct main" description: name: flutter_svg - sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.0.10+1" flutter_test: dependency: "direct dev" description: flutter @@ -428,10 +428,10 @@ packages: dependency: "direct dev" description: name: freezed - sha256: "6c5031daae12c7072b3a87eff98983076434b4889ef2a44384d0cae3f82372ba" + sha256: "57247f692f35f068cae297549a46a9a097100685c6780fe67177503eea5ed4e5" url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.4.7" freezed_annotation: dependency: "direct main" description: @@ -460,10 +460,10 @@ packages: dependency: "direct main" description: name: google_fonts - sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8 + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.2.1" graphs: dependency: transitive description: @@ -572,8 +572,8 @@ packages: dependency: "direct main" description: path: "." - ref: "9fa58d7b51e65174ab11cbcae17bba88a4194dde" - resolved-ref: "9fa58d7b51e65174ab11cbcae17bba88a4194dde" + ref: b7dde2f85dff4f482eed7eda4ef2a71344ef8b3a + resolved-ref: b7dde2f85dff4f482eed7eda4ef2a71344ef8b3a url: "https://github.com/foss42/json_data_explorer.git" source: git version: "0.1.2" @@ -677,18 +677,18 @@ packages: dependency: "direct main" description: name: lottie - sha256: a93542cc2d60a7057255405f62252533f8e8956e7e06754955669fd32fb4b216 + sha256: ce2bb2605753915080e4ee47f036a64228c88dc7f56f7bc1dbe912d75b55b1e2 url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "3.1.0" markdown: dependency: "direct main" description: name: markdown - sha256: acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 url: "https://pub.dev" source: hosted - version: "7.1.1" + version: "7.2.2" matcher: dependency: transitive description: @@ -773,10 +773,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "5.0.1" package_info_plus_platform_interface: dependency: transitive description: @@ -805,10 +805,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_android: dependency: transitive description: @@ -857,6 +857,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.10.7" + pdf_widget_wrapper: + dependency: transitive + description: + name: pdf_widget_wrapper + sha256: "9c3ca36e5000c9682d52bbdc486867ba7c5ee4403d1a5d6d03ed72157753377b" + url: "https://pub.dev" + source: hosted + version: "1.0.3" petitparser: dependency: transitive description: @@ -909,10 +917,10 @@ packages: dependency: transitive description: name: pointer_interceptor_web - sha256: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e + sha256: "9386e064097fd16419e935c23f08f35b58e6aaec155dd39bd6a003b88f9c14b4" url: "https://pub.dev" source: hosted - version: "0.10.2" + version: "0.10.1+2" pointycastle: dependency: transitive description: @@ -933,18 +941,18 @@ packages: dependency: "direct main" description: name: printing - sha256: ad39a42a5f83125952457dfd94f395c8cf0eb1f7759583dadb769be5c7f99d24 + sha256: "1c99cab90ebcc1fff65831d264627d5b529359d563e53f33ab9b8117f2d280bc" url: "https://pub.dev" source: hosted - version: "5.11.1" + version: "5.12.0" provider: dependency: "direct main" description: name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.1.2" pub_semver: dependency: transitive description: @@ -970,13 +978,13 @@ packages: source: hosted version: "3.0.1" riverpod: - dependency: transitive + dependency: "direct main" description: name: riverpod - sha256: "942999ee48b899f8a46a860f1e13cee36f2f77609eb54c5b7a669bb20d550b11" + sha256: f21b32ffd26a36555e501b04f4a5dca43ed59e16343f1a30c13632b2351dfa4d url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.5.1" rxdart: dependency: transitive description: @@ -997,10 +1005,10 @@ packages: dependency: "direct main" description: name: scrollable_positioned_list - sha256: "9566352ab9ba05794ee6c8864f154afba5d36c5637d0e3e32c615ba4ceb92772" + sha256: "1b54d5f1329a1e263269abc9e2543d90806131aa14fe7c6062a8054d57249287" url: "https://pub.dev" source: hosted - version: "0.2.3" + version: "0.3.8" shelf: dependency: transitive description: @@ -1186,10 +1194,10 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: e9aa5ea75c84cf46b3db4eea212523591211c3cf2e13099ee4ec147f54201c86 + sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.2.5" url_launcher_android: dependency: transitive description: @@ -1234,10 +1242,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" + sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.2.3" url_launcher_windows: dependency: transitive description: @@ -1250,34 +1258,34 @@ packages: dependency: "direct main" description: name: uuid - sha256: "22c94e5ad1e75f9934b766b53c742572ee2677c56bc871d850a57dad0f82127f" + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.3.3" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: "0f0c746dd2d6254a0057218ff980fc7f5670fd0fcf5e4db38a490d31eed4ad43" + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.11+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "0edf6d630d1bfd5589114138ed8fada3234deacc37966bec033d3047c29248b7" + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.11+1" vector_graphics_compiler: dependency: "direct main" description: name: vector_graphics_compiler - sha256: d24333727332d9bd20990f1483af4e09abdb9b1fc7c3db940b56ab5c42790c26 + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.11+1" vector_math: dependency: transitive description: @@ -1303,7 +1311,7 @@ packages: source: hosted version: "1.1.0" web: - dependency: "direct main" + dependency: "direct overridden" description: name: web sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" @@ -1338,10 +1346,10 @@ packages: dependency: "direct main" description: name: window_manager - sha256: dcc865277f26a7dad263a47d0e405d77e21f12cb71f30333a52710a408690bd7 + sha256: b3c895bdf936c77b83c5254bec2e6b3f066710c1f89c38b20b8acc382b525494 url: "https://pub.dev" source: hosted - version: "0.3.7" + version: "0.3.8" window_size: dependency: "direct main" description: @@ -1377,4 +1385,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.3.0 <4.0.0" - flutter: ">=3.19.0" + flutter: ">=3.19.2" diff --git a/pubspec.yaml b/pubspec.yaml index ab250f26..6f78ae1e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,25 +1,25 @@ name: apidash description: API Dash is a beautiful open-source cross-platform API Client built using Flutter which can help you easily create & customize your API requests, visually inspect responses and generate Dart code on the go. publish_to: "none" -version: 0.3.0+3 +version: 0.4.0+4 environment: sdk: ">=3.0.0 <4.0.0" - flutter: ">=3.16.0" + flutter: ">=3.19.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 - uuid: ^4.1.0 + url_launcher: ^6.2.5 + flutter_riverpod: ^2.5.1 + riverpod: ^2.5.1 + uuid: ^4.3.3 davi: ^3.4.1 - http: ^1.1.0 + http: ^1.2.1 http_parser: ^4.0.2 collection: ^1.17.2 - google_fonts: ^6.1.0 + google_fonts: ^6.2.1 highlighter: ^0.1.1 xml: ^6.3.0 jinja: ^0.5.0 @@ -28,43 +28,46 @@ dependencies: url: https://github.com/google/flutter-desktop-embedding.git path: plugins/window_size hive_flutter: ^1.1.0 - lottie: ^2.6.0 + lottie: ^3.1.0 mime_dart: ^3.0.0 - path_provider: ^2.1.0 - window_manager: ^0.3.5 + path_provider: ^2.1.2 + window_manager: ^0.3.8 path: ^1.8.3 - flutter_markdown: ^0.6.17+1 - markdown: ^7.1.1 + flutter_markdown: ^0.6.21 + markdown: ^7.2.2 just_audio: ^0.9.34 just_audio_mpv: ^0.1.7 just_audio_windows: ^0.2.0 freezed_annotation: ^2.4.1 json_annotation: ^4.8.1 - printing: ^5.11.1 - package_info_plus: ^4.1.0 + printing: ^5.12.0 + package_info_plus: ^5.0.1 flutter_typeahead: ^5.2.0 - provider: ^6.0.5 + provider: ^6.1.2 json_data_explorer: git: url: https://github.com/foss42/json_data_explorer.git - ref: 9fa58d7b51e65174ab11cbcae17bba88a4194dde - scrollable_positioned_list: ^0.2.3 - file_picker: ^6.1.1 - flutter_svg: ^2.0.9 + ref: b7dde2f85dff4f482eed7eda4ef2a71344ef8b3a + scrollable_positioned_list: ^0.3.8 + file_picker: ^6.2.0 + flutter_svg: ^2.0.10+1 vector_graphics_compiler: ^1.1.9+1 - code_builder: ^4.9.0 - dart_style: ^2.3.4 + code_builder: ^4.10.0 + dart_style: ^2.3.6 json_text_field: ^1.1.0 - csv: ^5.1.1 + csv: ^6.0.0 + +dependency_overrides: + web: ^0.5.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^3.0.0 + flutter_lints: ^3.0.1 flutter_launcher_icons: ^0.13.1 - test: ^1.24.3 - build_runner: ^2.4.6 - freezed: ^2.4.1 + test: ^1.24.9 + build_runner: ^2.4.8 + freezed: ^2.4.7 json_serializable: ^6.7.1 flutter: diff --git a/test/codegen/codegen_test.dart b/test/codegen/codegen_test.dart deleted file mode 100644 index 2e5b58a6..00000000 --- a/test/codegen/codegen_test.dart +++ /dev/null @@ -1,239 +0,0 @@ -import 'package:apidash/codegen/codegen.dart'; -import 'package:apidash/consts.dart'; -import '../request_models.dart'; -import 'package:test/test.dart'; - -void main() { - final codeGen = Codegen(); - - group('Test various Code generators', () { - test('cURL', () { - const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; - expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet1, "https"), - expectedCode); - }); - - test('Dart Dio', () { - const expectedCode = r"""import 'package:dio/dio.dart' as dio; - -void main() async { - try { - final response = await dio.Dio.get('https://api.apidash.dev'); - print(response.statusCode); - print(response.data); - } on DioException catch (e, s) { - print(e.response?.statusCode); - print(e.response?.data); - print(s); - } catch (e, s) { - print(e); - print(s); - } -} -"""; - expect( - codeGen.getCode(CodegenLanguage.dartDio, requestModelGet1, "https"), - expectedCode); - }); - - test('Dart HTTP', () { - const expectedCode = r"""import 'package:http/http.dart' as http; - -void main() async { - var uri = Uri.parse('https://api.apidash.dev'); - - final response = await http.get(uri); - - int statusCode = response.statusCode; - if (statusCode >= 200 && statusCode < 300) { - print('Status Code: $statusCode'); - print('Response Body: ${response.body}'); - } else { - print('Error Status Code: $statusCode'); - print('Error Response Body: ${response.body}'); - } -} -"""; - expect( - codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet1, "https"), - expectedCode); - }); - - test('HAR', () { - const expectedCode = r"""{ - "method": "GET", - "url": "https://api.apidash.dev", - "httpVersion": "HTTP/1.1", - "queryString": [], - "headers": [] -}"""; - expect(codeGen.getCode(CodegenLanguage.har, requestModelGet1, "https"), - expectedCode); - }); - - test('JS Axios', () { - const expectedCode = r"""let config = { - url: 'https://api.apidash.dev', - method: 'get' -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect( - codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet1, "https"), - expectedCode); - }); - - test('JS Fetch', () { - const expectedCode = r"""let url = 'https://api.apidash.dev'; - -let options = { - method: 'GET' -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect( - codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet1, "https"), - expectedCode); - }); - - test('Kotlin OkHttp', () { - const expectedCode = r"""import okhttp3.OkHttpClient -import okhttp3.Request - -fun main() { - val client = OkHttpClient() - - val url = "https://api.apidash.dev" - - val request = Request.Builder() - .url(url) - .get() - .build() - - val response = client.newCall(request).execute() - - println(response.code) - println(response.body?.string()) -} -"""; - expect( - codeGen.getCode( - CodegenLanguage.kotlinOkHttp, requestModelGet1, "https"), - expectedCode); - }); - - test('NodeJs Axios', () { - const expectedCode = r"""import axios from 'axios'; - -let config = { - url: 'https://api.apidash.dev', - method: 'get' -}; - -axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); -"""; - expect( - codeGen.getCode( - CodegenLanguage.nodejsAxios, requestModelGet1, "https"), - expectedCode); - }); - - test('Nodejs Fetch', () { - const expectedCode = r"""import fetch from 'node-fetch'; - -let url = 'https://api.apidash.dev'; - -let options = { - method: 'GET' -}; - -let status; -fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); -"""; - expect( - codeGen.getCode( - CodegenLanguage.nodejsFetch, requestModelGet1, "https"), - expectedCode); - }); - - test('Python http.client', () { - const expectedCode = r"""import http.client - -conn = http.client.HTTPSConnection("api.apidash.dev") -conn.request("GET", "") - -res = conn.getresponse() -data = res.read() - -print(data.decode("utf-8")) -"""; - expect( - codeGen.getCode( - CodegenLanguage.pythonHttpClient, requestModelGet1, "https"), - expectedCode); - }); - - test('Python requests', () { - const expectedCode = r"""import requests - -url = 'https://api.apidash.dev' - -response = requests.get(url) - -print('Status Code:', response.status_code) -print('Response Body:', response.text) -"""; - expect( - codeGen.getCode( - CodegenLanguage.pythonRequests, requestModelGet1, "https"), - expectedCode); - }); - }); -} diff --git a/test/codegen/curl_codegen_test.dart b/test/codegen/curl_codegen_test.dart index 212a82ce..ec0df5db 100644 --- a/test/codegen/curl_codegen_test.dart +++ b/test/codegen/curl_codegen_test.dart @@ -1,64 +1,74 @@ -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.apidash.dev'"""; - expect(curlCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/country/data?code=US'"""; - expect(curlCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/country/data?code=IND'"""; - expect(curlCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'"""; - expect(curlCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { const expectedCode = r"""curl --url 'https://api.github.com/repos/foss42/apidash' \ --header 'User-Agent: Test Agent'"""; - expect(curlCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { const expectedCode = r"""curl --url 'https://api.github.com/repos/foss42/apidash?raw=true' \ --header 'User-Agent: Test Agent'"""; - expect(curlCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { const expectedCode = r"""curl --url 'https://api.apidash.dev'"""; - expect(curlCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { const expectedCode = r"""curl --url 'https://api.github.com/repos/foss42/apidash?raw=true' \ --header 'User-Agent: Test Agent'"""; - expect(curlCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'"""; - expect(curlCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -66,7 +76,8 @@ void main() { r"""curl --url 'https://api.apidash.dev/humanize/social' \ --header 'User-Agent: Test Agent'"""; expect( - curlCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.curl, requestModelGet10, "https", ), @@ -77,103 +88,181 @@ void main() { const expectedCode = r"""curl --url 'https://api.apidash.dev/humanize/social?num=8700000&digits=3' \ --header 'User-Agent: Test Agent'"""; - expect(curlCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { const expectedCode = r"""curl --url 'https://api.apidash.dev/humanize/social'"""; - expect(curlCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelGet12, "https"), + expectedCode); }); }); group('HEAD Request', () { test('HEAD 1', () { const expectedCode = r"""curl --head --url 'https://api.apidash.dev'"""; - expect(curlCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { const expectedCode = r"""curl --head --url 'http://api.apidash.dev'"""; - expect(curlCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelHead2, "http"), + expectedCode); }); }); group('POST Request', () { test('POST 1', () { const expectedCode = r"""curl --request POST \ - --url 'https://api.apidash.dev/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: text/plain' \ --data '{ "text": "I LOVE Flutter" }'"""; - 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.apidash.dev/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.apidash.dev/case/lower' \ + --url 'https://api.apidash.dev/case/lower' \ --header 'Content-Type: application/json' \ --header 'User-Agent: Test Agent' \ --data '{ "text": "I LOVE Flutter" }'"""; - expect(curlCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/form' \ + --form 'text=API' \ + --form 'sep=|' \ + --form 'times=3'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost4, "https"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/form' \ + --header 'User-Agent: Test Agent' \ + --form 'text=API' \ + --form 'sep=|' \ + --form 'times=3'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost5, "https"), + expectedCode); + }); + + test('POST 6', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/img' \ + --form 'token=xyz' \ + --form 'imfile=@/Documents/up/1.png'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost6, "https"), + expectedCode); + }); + + test('POST 7', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/img' \ + --form 'token=xyz' \ + --form 'imfile=@/Documents/up/1.png'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost7, "https"), + expectedCode); + }); + + test('POST 8', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/form?size=2&len=3' \ + --form 'text=API' \ + --form 'sep=|' \ + --form 'times=3'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost8, "https"), + expectedCode); + }); + + test('POST 9', () { + const expectedCode = r"""curl --request POST \ + --url 'https://api.apidash.dev/io/img?size=2&len=3' \ + --header 'User-Agent: Test Agent' \ + --header 'Keep-Alive: true' \ + --form 'token=xyz' \ + --form 'imfile=@/Documents/up/1.png'"""; + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPost9, "https"), + expectedCode); }); }); group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""curl --request PUT \ - --url 'https://reqres.in/api/users/2' \ + --url 'https://reqres.in/api/users/2' \ --header 'Content-Type: application/json' \ --data '{ "name": "morpheus", "job": "zion resident" }'"""; - expect(curlCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPut1, "https"), + expectedCode); }); }); group('PATCH Request', () { test('PATCH 1', () { const expectedCode = r"""curl --request PATCH \ - --url 'https://reqres.in/api/users/2' \ + --url 'https://reqres.in/api/users/2' \ --header 'Content-Type: application/json' \ --data '{ "name": "marfeus", "job": "accountant" }'"""; - expect(curlCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.curl, requestModelPatch1, "https"), + expectedCode); }); }); group('DELETE Request', () { test('DELETE 1', () { const expectedCode = r"""curl --request DELETE \ - --url 'https://reqres.in/api/users/2'"""; - expect(curlCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + --url 'https://reqres.in/api/users/2'"""; + expect( + codeGen.getCode(CodegenLanguage.curl, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { const expectedCode = r"""curl --request DELETE \ - --url 'https://reqres.in/api/users/2' \ + --url 'https://reqres.in/api/users/2' \ --header 'Content-Type: application/json' \ --data '{ "name": "marfeus", "job": "accountant" }'"""; - expect(curlCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.curl, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/dart_dio_codegen_test.dart b/test/codegen/dart_dio_codegen_test.dart index 5b981fde..8f111d41 100644 --- a/test/codegen/dart_dio_codegen_test.dart +++ b/test/codegen/dart_dio_codegen_test.dart @@ -1,10 +1,10 @@ -import 'package:apidash/codegen/dart/dio.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; - import '../request_models.dart'; void main() { - final dartDioCodeGen = DartDioCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -12,10 +12,10 @@ void main() { void main() async { try { - final response = await dio.Dio.get('https://api.apidash.dev'); + final response = await dio.Dio().get('https://api.apidash.dev'); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(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', () { @@ -34,13 +36,13 @@ void main() async { void main() async { try { final queryParams = {'code': 'US'}; - final response = await dio.Dio.get( + final response = await dio.Dio().get( 'https://api.apidash.dev/country/data', queryParameters: queryParams, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -50,7 +52,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -59,13 +63,13 @@ void main() async { void main() async { try { final queryParams = {'code': 'IND'}; - final response = await dio.Dio.get( + final response = await dio.Dio().get( 'https://api.apidash.dev/country/data?code=US', queryParameters: queryParams, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -75,7 +79,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -90,13 +96,13 @@ void main() async { 'add_space': 'true', 'trailing_zeros': 'true', }; - final response = await dio.Dio.get( + final response = await dio.Dio().get( 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -106,7 +112,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -115,13 +123,13 @@ void main() async { void main() async { try { final headers = {'User-Agent': 'Test Agent'}; - final response = await dio.Dio.get( + final response = await dio.Dio().get( 'https://api.github.com/repos/foss42/apidash', - options: Options(headers: headers), + options: dio.Options(headers: headers), ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -131,7 +139,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -141,14 +151,14 @@ void main() async { try { final queryParams = {'raw': 'true'}; final headers = {'User-Agent': 'Test Agent'}; - final response = await dio.Dio.get( + final response = await dio.Dio().get( 'https://api.github.com/repos/foss42/apidash', queryParameters: queryParams, - options: Options(headers: headers), + options: dio.Options(headers: headers), ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -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,10 +178,10 @@ void main() async { void main() async { try { - final response = await dio.Dio.get('https://api.apidash.dev'); + final response = await dio.Dio().get('https://api.apidash.dev'); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(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', () { @@ -189,14 +203,14 @@ void main() async { try { final queryParams = {'raw': 'true'}; final headers = {'User-Agent': 'Test Agent'}; - final response = await dio.Dio.get( + final response = await dio.Dio().get( 'https://api.github.com/repos/foss42/apidash', queryParameters: queryParams, - options: Options(headers: headers), + options: dio.Options(headers: headers), ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -206,7 +220,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -218,38 +234,13 @@ void main() async { 'num': '8700000', 'add_space': 'true', }; - final response = await dio.Dio.get( + final response = await dio.Dio().get( 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { - print(e.response?.statusCode); - print(e.response?.data); - print(s); - } catch (e, s) { - print(e); - print(s); - } -} -"""; - expect(dartDioCodeGen.getCode(requestModelGet9, "https"), expectedCode); - }); - - test('GET 10', () { - const expectedCode = r"""import 'package:dio/dio.dart' as dio; - -void main() async { - try { - final headers = {'User-Agent': 'Test Agent'}; - final response = await dio.Dio.get( - 'https://api.apidash.dev/humanize/social', - options: Options(headers: headers), - ); - print(response.statusCode); - print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -260,7 +251,35 @@ void main() async { } """; expect( - dartDioCodeGen.getCode( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final headers = {'User-Agent': 'Test Agent'}; + final response = await dio.Dio().get( + 'https://api.apidash.dev/humanize/social', + options: dio.Options(headers: headers), + ); + print(response.statusCode); + print(response.data); + } on dio.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, requestModelGet10, "https", ), @@ -277,14 +296,14 @@ void main() async { 'digits': '3', }; final headers = {'User-Agent': 'Test Agent'}; - final response = await dio.Dio.get( + final response = await dio.Dio().get( 'https://api.apidash.dev/humanize/social', queryParameters: queryParams, - options: Options(headers: headers), + options: dio.Options(headers: headers), ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -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,10 +323,10 @@ void main() async { void main() async { try { - final response = await dio.Dio.get('https://api.apidash.dev/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) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -315,7 +336,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelGet12, "https"), + expectedCode); }); }); @@ -325,10 +348,10 @@ void main() async { void main() async { try { - final response = await dio.Dio.head('https://api.apidash.dev'); + final response = await dio.Dio().head('https://api.apidash.dev'); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(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,10 +371,10 @@ void main() async { void main() async { try { - final response = await dio.Dio.head('http://api.apidash.dev'); + final response = await dio.Dio().head('http://api.apidash.dev'); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -359,7 +384,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelHead2, "http"), + expectedCode); }); }); @@ -372,13 +399,13 @@ void main() async { final data = r'''{ "text": "I LOVE Flutter" }'''; - final response = await dio.Dio.post( + final response = await dio.Dio().post( 'https://api.apidash.dev/case/lower', data: data, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -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,15 +427,20 @@ 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( + final response = await dio.Dio().post( 'https://api.apidash.dev/case/lower', data: data, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -416,7 +450,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -429,14 +465,14 @@ void main() async { final data = convert.json.decode(r'''{ "text": "I LOVE Flutter" }'''); - final response = await dio.Dio.post( + final response = await dio.Dio().post( 'https://api.apidash.dev/case/lower', - options: Options(headers: headers), + options: dio.Options(headers: headers), data: data, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -446,10 +482,330 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPost3, "https"), + expectedCode); + }); + test('POST 4', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final data = dio.FormData(); + final List> formDataList = [ + {"name": "text", "value": "API", "type": "text"}, + {"name": "sep", "value": "|", "type": "text"}, + {"name": "times", "value": "3", "type": "text"} + ]; + for (var formField in formDataList) { + if (formField['type'] == 'file') { + if (formField['value'] != null) { + data.files.add(MapEntry( + formField['name']!, + await dio.MultipartFile.fromFile(formField['value']!, + filename: formField['value']!), + )); + } + } else { + if (formField['value'] != null) { + data.fields + .add(MapEntry(formField['name']!, formField['value']!)); + } + } + } + + final response = await dio.Dio().post( + 'https://api.apidash.dev/io/form', + data: data, + ); + print(response.statusCode); + print(response.data); + } on dio.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, requestModelPost4, "https"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final headers = {'User-Agent': 'Test Agent'}; + final data = dio.FormData(); + final List> formDataList = [ + {"name": "text", "value": "API", "type": "text"}, + {"name": "sep", "value": "|", "type": "text"}, + {"name": "times", "value": "3", "type": "text"} + ]; + for (var formField in formDataList) { + if (formField['type'] == 'file') { + if (formField['value'] != null) { + data.files.add(MapEntry( + formField['name']!, + await dio.MultipartFile.fromFile(formField['value']!, + filename: formField['value']!), + )); + } + } else { + if (formField['value'] != null) { + data.fields + .add(MapEntry(formField['name']!, formField['value']!)); + } + } + } + + final response = await dio.Dio().post( + 'https://api.apidash.dev/io/form', + options: dio.Options(headers: headers), + data: data, + ); + print(response.statusCode); + print(response.data); + } on dio.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, requestModelPost5, "https"), + expectedCode); + }); + + test('POST 6', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final data = dio.FormData(); + final List> formDataList = [ + {"name": "token", "value": "xyz", "type": "text"}, + { + "name": "imfile", + "value": "/Documents/up/1.png", + "type": "file" + } + ]; + for (var formField in formDataList) { + if (formField['type'] == 'file') { + if (formField['value'] != null) { + data.files.add(MapEntry( + formField['name']!, + await dio.MultipartFile.fromFile(formField['value']!, + filename: formField['value']!), + )); + } + } else { + if (formField['value'] != null) { + data.fields + .add(MapEntry(formField['name']!, formField['value']!)); + } + } + } + + final response = await dio.Dio().post( + 'https://api.apidash.dev/io/img', + data: data, + ); + print(response.statusCode); + print(response.data); + } on dio.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, requestModelPost6, "https"), + expectedCode); + }); + + test('POST 7', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final data = dio.FormData(); + final List> formDataList = [ + {"name": "token", "value": "xyz", "type": "text"}, + { + "name": "imfile", + "value": "/Documents/up/1.png", + "type": "file" + } + ]; + for (var formField in formDataList) { + if (formField['type'] == 'file') { + if (formField['value'] != null) { + data.files.add(MapEntry( + formField['name']!, + await dio.MultipartFile.fromFile(formField['value']!, + filename: formField['value']!), + )); + } + } else { + if (formField['value'] != null) { + data.fields + .add(MapEntry(formField['name']!, formField['value']!)); + } + } + } + + final response = await dio.Dio().post( + 'https://api.apidash.dev/io/img', + data: data, + ); + print(response.statusCode); + print(response.data); + } on dio.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, requestModelPost7, "https"), + expectedCode); + }); + + test('POST 8', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final queryParams = { + 'size': '2', + 'len': '3', + }; + final data = dio.FormData(); + final List> formDataList = [ + {"name": "text", "value": "API", "type": "text"}, + {"name": "sep", "value": "|", "type": "text"}, + {"name": "times", "value": "3", "type": "text"} + ]; + for (var formField in formDataList) { + if (formField['type'] == 'file') { + if (formField['value'] != null) { + data.files.add(MapEntry( + formField['name']!, + await dio.MultipartFile.fromFile(formField['value']!, + filename: formField['value']!), + )); + } + } else { + if (formField['value'] != null) { + data.fields + .add(MapEntry(formField['name']!, formField['value']!)); + } + } + } + + final response = await dio.Dio().post( + 'https://api.apidash.dev/io/form', + queryParameters: queryParams, + data: data, + ); + print(response.statusCode); + print(response.data); + } on dio.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, requestModelPost8, "https"), + expectedCode); + }); + + test('POST 9', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final queryParams = { + 'size': '2', + 'len': '3', + }; + final headers = { + 'User-Agent': 'Test Agent', + 'Keep-Alive': 'true', + }; + final data = dio.FormData(); + final List> formDataList = [ + {"name": "token", "value": "xyz", "type": "text"}, + { + "name": "imfile", + "value": "/Documents/up/1.png", + "type": "file" + } + ]; + for (var formField in formDataList) { + if (formField['type'] == 'file') { + if (formField['value'] != null) { + data.files.add(MapEntry( + formField['name']!, + await dio.MultipartFile.fromFile(formField['value']!, + filename: formField['value']!), + )); + } + } else { + if (formField['value'] != null) { + data.fields + .add(MapEntry(formField['name']!, formField['value']!)); + } + } + } + + final response = await dio.Dio().post( + 'https://api.apidash.dev/io/img', + queryParameters: queryParams, + options: dio.Options(headers: headers), + data: data, + ); + print(response.statusCode); + print(response.data); + } on dio.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, requestModelPost9, "https"), + expectedCode); }); }); - group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import 'package:dio/dio.dart' as dio; @@ -461,13 +817,13 @@ void main() async { "name": "morpheus", "job": "zion resident" }'''); - final response = await dio.Dio.put( + final response = await dio.Dio().put( 'https://reqres.in/api/users/2', data: data, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -477,7 +833,9 @@ void main() async { } } """; - expect(dartDioCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartDio, requestModelPut1, "https"), + expectedCode); }); }); @@ -492,36 +850,13 @@ void main() async { "name": "marfeus", "job": "accountant" }'''); - final response = await dio.Dio.patch( + final response = await dio.Dio().patch( 'https://reqres.in/api/users/2', data: data, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { - print(e.response?.statusCode); - print(e.response?.data); - print(s); - } catch (e, s) { - print(e); - print(s); - } -} -"""; - expect(dartDioCodeGen.getCode(requestModelPatch1, "https"), expectedCode); - }); - }); - - group('DELETE Request', () { - test('DELETE 1', () { - const expectedCode = r"""import 'package:dio/dio.dart' as dio; - -void main() async { - try { - final response = await dio.Dio.delete('https://reqres.in/api/users/2'); - print(response.statusCode); - print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -532,7 +867,34 @@ void main() async { } """; expect( - dartDioCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + codeGen.getCode(CodegenLanguage.dartDio, requestModelPatch1, "https"), + expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = r"""import 'package:dio/dio.dart' as dio; + +void main() async { + try { + final response = await dio.Dio().delete('https://reqres.in/api/users/2'); + print(response.statusCode); + print(response.data); + } on dio.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, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -545,13 +907,13 @@ void main() async { "name": "marfeus", "job": "accountant" }'''); - final response = await dio.Dio.delete( + final response = await dio.Dio().delete( 'https://reqres.in/api/users/2', data: data, ); print(response.statusCode); print(response.data); - } on DioException catch (e, s) { + } on dio.DioException catch (e, s) { print(e.response?.statusCode); print(e.response?.data); print(s); @@ -562,7 +924,9 @@ void main() async { } """; expect( - dartDioCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartDio, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/dart_http_codegen_test.dart b/test/codegen/dart_http_codegen_test.dart index 790658b1..6bf16114 100644 --- a/test/codegen/dart_http_codegen_test.dart +++ b/test/codegen/dart_http_codegen_test.dart @@ -1,10 +1,10 @@ -import 'package:apidash/codegen/dart/http.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; - import '../request_models.dart'; void main() { - final dartHttpCodeGen = DartHttpCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -25,7 +25,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -50,7 +52,9 @@ void main() async { } """; - expect(dartHttpCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -76,7 +80,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -106,7 +112,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -132,7 +140,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -161,7 +171,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -182,7 +194,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -211,7 +225,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -238,7 +254,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -265,7 +283,8 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelGet10, "https", ), @@ -301,7 +320,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -322,7 +343,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelGet12, "https"), + expectedCode); }); }); @@ -345,7 +368,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -366,7 +391,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelHead2, "http"), + expectedCode); }); }); @@ -399,7 +426,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -409,7 +438,12 @@ void main() async { var uri = Uri.parse('https://api.apidash.dev/case/lower'); String body = r'''{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }'''; var headers = {'content-type': 'application/json'}; @@ -430,7 +464,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -464,8 +500,377 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPost3, "https"), + expectedCode); }); + test('POST 4', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.apidash.dev/io/form'); + + final formDataList = [ + {"name": "text", "value": "API", "type": "text"}, + {"name": "sep", "value": "|", "type": "text"}, + {"name": "times", "value": "3", "type": "text"} + ]; + final request = http.MultipartRequest( + "POST", + uri, + ); + for (var formData in formDataList) { + if (formData != null) { + final name = formData['name']; + final value = formData['value']; + final type = formData['type']; + + if (name != null && value != null && type != null) { + if (type == 'text') { + request.fields.addAll({name: value}); + } else { + request.files.add( + await http.MultipartFile.fromPath( + name, + value, + ), + ); + } + } else { + print('Error: formData has null name, value, or type.'); + } + } else { + print('Error: formData is null.'); + } + } + + final response = await request.send(); + final responseBody = await response.stream.bytesToString(); + int statusCode = response.statusCode; + + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: :$responseBody'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: :$responseBody'); + } +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPost4, "https"), + expectedCode); + }); + test('POST 5', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.apidash.dev/io/form'); + + var headers = {'User-Agent': 'Test Agent'}; + + final formDataList = [ + {"name": "text", "value": "API", "type": "text"}, + {"name": "sep", "value": "|", "type": "text"}, + {"name": "times", "value": "3", "type": "text"} + ]; + final request = http.MultipartRequest( + "POST", + uri, + ); + for (var formData in formDataList) { + if (formData != null) { + final name = formData['name']; + final value = formData['value']; + final type = formData['type']; + + if (name != null && value != null && type != null) { + if (type == 'text') { + request.fields.addAll({name: value}); + } else { + request.files.add( + await http.MultipartFile.fromPath( + name, + value, + ), + ); + } + } else { + print('Error: formData has null name, value, or type.'); + } + } else { + print('Error: formData is null.'); + } + } + + request.headers.addAll(headers); + final response = await request.send(); + final responseBody = await response.stream.bytesToString(); + int statusCode = response.statusCode; + + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: :$responseBody'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: :$responseBody'); + } +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPost5, "https"), + expectedCode); + }); + test('POST 6', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.apidash.dev/io/img'); + + final formDataList = [ + {"name": "token", "value": "xyz", "type": "text"}, + {"name": "imfile", "value": "/Documents/up/1.png", "type": "file"} + ]; + final request = http.MultipartRequest( + "POST", + uri, + ); + for (var formData in formDataList) { + if (formData != null) { + final name = formData['name']; + final value = formData['value']; + final type = formData['type']; + + if (name != null && value != null && type != null) { + if (type == 'text') { + request.fields.addAll({name: value}); + } else { + request.files.add( + await http.MultipartFile.fromPath( + name, + value, + ), + ); + } + } else { + print('Error: formData has null name, value, or type.'); + } + } else { + print('Error: formData is null.'); + } + } + + final response = await request.send(); + final responseBody = await response.stream.bytesToString(); + int statusCode = response.statusCode; + + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: :$responseBody'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: :$responseBody'); + } +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPost6, "https"), + expectedCode); + }); + test('POST 7', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.apidash.dev/io/img'); + + final formDataList = [ + {"name": "token", "value": "xyz", "type": "text"}, + {"name": "imfile", "value": "/Documents/up/1.png", "type": "file"} + ]; + final request = http.MultipartRequest( + "POST", + uri, + ); + for (var formData in formDataList) { + if (formData != null) { + final name = formData['name']; + final value = formData['value']; + final type = formData['type']; + + if (name != null && value != null && type != null) { + if (type == 'text') { + request.fields.addAll({name: value}); + } else { + request.files.add( + await http.MultipartFile.fromPath( + name, + value, + ), + ); + } + } else { + print('Error: formData has null name, value, or type.'); + } + } else { + print('Error: formData is null.'); + } + } + + final response = await request.send(); + final responseBody = await response.stream.bytesToString(); + int statusCode = response.statusCode; + + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: :$responseBody'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: :$responseBody'); + } +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPost7, "https"), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.apidash.dev/io/form'); + + var queryParams = { + 'size': '2', + 'len': '3', + }; + uri = uri.replace(queryParameters: queryParams); + + final formDataList = [ + {"name": "text", "value": "API", "type": "text"}, + {"name": "sep", "value": "|", "type": "text"}, + {"name": "times", "value": "3", "type": "text"} + ]; + final request = http.MultipartRequest( + "POST", + uri, + ); + for (var formData in formDataList) { + if (formData != null) { + final name = formData['name']; + final value = formData['value']; + final type = formData['type']; + + if (name != null && value != null && type != null) { + if (type == 'text') { + request.fields.addAll({name: value}); + } else { + request.files.add( + await http.MultipartFile.fromPath( + name, + value, + ), + ); + } + } else { + print('Error: formData has null name, value, or type.'); + } + } else { + print('Error: formData is null.'); + } + } + + final response = await request.send(); + final responseBody = await response.stream.bytesToString(); + int statusCode = response.statusCode; + + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: :$responseBody'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: :$responseBody'); + } +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPost8, "https"), + expectedCode); + }); + test('POST 9', () { + const expectedCode = r"""import 'package:http/http.dart' as http; + +void main() async { + var uri = Uri.parse('https://api.apidash.dev/io/img'); + + var queryParams = { + 'size': '2', + 'len': '3', + }; + uri = uri.replace(queryParameters: queryParams); + + var headers = { + 'User-Agent': 'Test Agent', + 'Keep-Alive': 'true', + }; + + final formDataList = [ + {"name": "token", "value": "xyz", "type": "text"}, + {"name": "imfile", "value": "/Documents/up/1.png", "type": "file"} + ]; + final request = http.MultipartRequest( + "POST", + uri, + ); + for (var formData in formDataList) { + if (formData != null) { + final name = formData['name']; + final value = formData['value']; + final type = formData['type']; + + if (name != null && value != null && type != null) { + if (type == 'text') { + request.fields.addAll({name: value}); + } else { + request.files.add( + await http.MultipartFile.fromPath( + name, + value, + ), + ); + } + } else { + print('Error: formData has null name, value, or type.'); + } + } else { + print('Error: formData is null.'); + } + } + + request.headers.addAll(headers); + final response = await request.send(); + final responseBody = await response.stream.bytesToString(); + int statusCode = response.statusCode; + + if (statusCode >= 200 && statusCode < 300) { + print('Status Code: $statusCode'); + print('Response Body: :$responseBody'); + } else { + print('Error Status Code: $statusCode'); + print('Error Response Body: :$responseBody'); + } +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPost9, "https"), + expectedCode); + }); + }); group('PUT Request', () { @@ -498,7 +903,9 @@ void main() async { } } """; - expect(dartHttpCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.dartHttp, requestModelPut1, "https"), + expectedCode); }); }); @@ -533,7 +940,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelPatch1, "https"), + expectedCode); }); }); @@ -557,7 +966,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -590,7 +1001,9 @@ void main() async { } """; expect( - dartHttpCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.dartHttp, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/go_http_codegen_test.dart b/test/codegen/go_http_codegen_test.dart new file mode 100644 index 00000000..421f8018 --- /dev/null +++ b/test/codegen/go_http_codegen_test.dart @@ -0,0 +1,1047 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:apidash/screens/home_page/editor_pane/details_card/code_pane.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev") + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet1, "https"), + expectedCode); + }); + + test('GET 2', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/country/data") + query := url.Query() + + query.Set("code", "US") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet2, "https"), + expectedCode); + }); + + test('GET 3', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/country/data?code=US") + query := url.Query() + + query.Set("code", "IND") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet3, "https"), + expectedCode); + }); + + test('GET 4', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/humanize/social") + query := url.Query() + + query.Set("num", "8700000") + query.Set("digits", "3") + query.Set("system", "SS") + query.Set("add_space", "true") + query.Set("trailing_zeros", "true") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet4, "https"), + expectedCode); + }); + + test('GET 5', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.github.com/repos/foss42/apidash") + req, _ := http.NewRequest("GET", url.String(), nil) + + req.Header.Set("User-Agent", "Test Agent") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet5, "https"), + expectedCode); + }); + + test('GET 6', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.github.com/repos/foss42/apidash") + query := url.Query() + + query.Set("raw", "true") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + req.Header.Set("User-Agent", "Test Agent") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet6, "https"), + expectedCode); + }); + + test('GET 7', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev") + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet7, "https"), + expectedCode); + }); + + test('GET 8', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.github.com/repos/foss42/apidash") + query := url.Query() + + query.Set("raw", "true") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + req.Header.Set("User-Agent", "Test Agent") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet8, "https"), + expectedCode); + }); + + test('GET 9', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/humanize/social") + query := url.Query() + + query.Set("num", "8700000") + query.Set("add_space", "true") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/humanize/social") + req, _ := http.NewRequest("GET", url.String(), nil) + + req.Header.Set("User-Agent", "Test Agent") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect( + codegen.getCode( + CodegenLanguage.goHttp, + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/humanize/social") + query := url.Query() + + query.Set("num", "8700000") + query.Set("digits", "3") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("GET", url.String(), nil) + + req.Header.Set("User-Agent", "Test Agent") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/humanize/social") + req, _ := http.NewRequest("GET", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelGet12, "https"), + expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD 1', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev") + req, _ := http.NewRequest("HEAD", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelHead1, "https"), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("http://api.apidash.dev") + req, _ := http.NewRequest("HEAD", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelHead2, "http"), + expectedCode); + }); + }); + + group('POST Request', () { + test('POST 1', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/case/lower") + payload := bytes.NewBuffer([]byte(`{ +"text": "I LOVE Flutter" +}`)) + req, _ := http.NewRequest("POST", url.String(), payload) + + req.Header.Set("Content-Type", "text/plain") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost1, "https"), + expectedCode); + }); + + test('POST 2', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/case/lower") + payload := bytes.NewBuffer([]byte(`{ +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] +}`)) + req, _ := http.NewRequest("POST", url.String(), payload) + + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost2, "https"), + expectedCode); + }); + + test('POST 3', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/case/lower") + payload := bytes.NewBuffer([]byte(`{ +"text": "I LOVE Flutter" +}`)) + req, _ := http.NewRequest("POST", url.String(), payload) + + req.Header.Set("User-Agent", "Test Agent") + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + "mime/multipart" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/io/form") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + + writer.WriteField("text", "API") + writer.WriteField("sep", "|") + writer.WriteField("times", "3") + writer.Close() + + req, _ := http.NewRequest("POST", url.String(), payload) + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost4, "https"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + "mime/multipart" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/io/form") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + + writer.WriteField("text", "API") + writer.WriteField("sep", "|") + writer.WriteField("times", "3") + writer.Close() + + req, _ := http.NewRequest("POST", url.String(), payload) + + req.Header.Set("User-Agent", "Test Agent") + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPost5, "https"), + expectedCode); + }); + }); + + test("POST 6", () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + "mime/multipart" + "os" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/io/img") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + var ( + file *os.File + part io.Writer + ) + + writer.WriteField("token", "xyz") + file, _ = os.Open("/Documents/up/1.png") + defer file.Close() + part, _ = writer.CreateFormFile("imfile", "/Documents/up/1.png") + io.Copy(part, file) + + writer.Close() + + req, _ := http.NewRequest("POST", url.String(), payload) + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost6, "https"), + expectedCode); + }); + test("POST 7", () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + "mime/multipart" + "os" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/io/img") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + var ( + file *os.File + part io.Writer + ) + + writer.WriteField("token", "xyz") + file, _ = os.Open("/Documents/up/1.png") + defer file.Close() + part, _ = writer.CreateFormFile("imfile", "/Documents/up/1.png") + io.Copy(part, file) + + writer.Close() + + req, _ := http.NewRequest("POST", url.String(), payload) + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost7, "https"), + expectedCode); + }); + test("POST 8", () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + "mime/multipart" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/io/form") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + + writer.WriteField("text", "API") + writer.WriteField("sep", "|") + writer.WriteField("times", "3") + writer.Close() + + query := url.Query() + + query.Set("size", "2") + query.Set("len", "3") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("POST", url.String(), payload) + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost8, "https"), + expectedCode); + }); + test("POST 9", () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" + "mime/multipart" + "os" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://api.apidash.dev/io/img") + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + var ( + file *os.File + part io.Writer + ) + + writer.WriteField("token", "xyz") + file, _ = os.Open("/Documents/up/1.png") + defer file.Close() + part, _ = writer.CreateFormFile("imfile", "/Documents/up/1.png") + io.Copy(part, file) + + writer.Close() + + query := url.Query() + + query.Set("size", "2") + query.Set("len", "3") + + url.RawQuery = query.Encode() + req, _ := http.NewRequest("POST", url.String(), payload) + + req.Header.Set("User-Agent", "Test Agent") + req.Header.Set("Keep-Alive", "true") + req.Header.Set("Content-Type", writer.FormDataContentType()) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPost9, "https"), + expectedCode); + }); + + group('PUT Request', () { + test('PUT 1', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://reqres.in/api/users/2") + payload := bytes.NewBuffer([]byte(`{ +"name": "morpheus", +"job": "zion resident" +}`)) + req, _ := http.NewRequest("PUT", url.String(), payload) + + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect(codeGen.getCode(CodegenLanguage.goHttp, requestModelPut1, "https"), + expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://reqres.in/api/users/2") + payload := bytes.NewBuffer([]byte(`{ +"name": "marfeus", +"job": "accountant" +}`)) + req, _ := http.NewRequest("PATCH", url.String(), payload) + + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelPatch1, "https"), + expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = r"""package main + +import ( + "fmt" + "io" + "net/http" + "net/url" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://reqres.in/api/users/2") + req, _ := http.NewRequest("DELETE", url.String(), nil) + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}"""; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelDelete1, "https"), + expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = r'''package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "bytes" +) + +func main() { + client := &http.Client{} + url, _ := url.Parse("https://reqres.in/api/users/2") + payload := bytes.NewBuffer([]byte(`{ +"name": "marfeus", +"job": "accountant" +}`)) + req, _ := http.NewRequest("DELETE", url.String(), payload) + + req.Header.Set("Content-Type", "application/json") + + response, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer response.Body.Close() + + fmt.Println("Status Code:", response.StatusCode) + body, _ := io.ReadAll(response.Body) + fmt.Println("Response body:", string(body)) +}'''; + expect( + codeGen.getCode(CodegenLanguage.goHttp, requestModelDelete2, "https"), + expectedCode); + }); + }); +} diff --git a/test/codegen/har_codegen_test.dart b/test/codegen/har_codegen_test.dart index ea40bf93..767afc98 100644 --- a/test/codegen/har_codegen_test.dart +++ b/test/codegen/har_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/others/har.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final harCodeGen = HARCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -14,7 +15,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -30,7 +32,8 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -46,7 +49,8 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -78,7 +82,8 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -94,7 +99,8 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -115,7 +121,8 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -126,7 +133,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -147,7 +155,8 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -167,7 +176,8 @@ void main() { ], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -184,7 +194,8 @@ void main() { ] }"""; expect( - harCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.har, requestModelGet10, "https", ), @@ -213,7 +224,8 @@ void main() { } ] }"""; - expect(harCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { @@ -224,7 +236,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelGet12, "https"), + expectedCode); }); }); @@ -237,7 +250,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { @@ -248,7 +262,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelHead2, "http"), + expectedCode); }); }); @@ -270,7 +285,8 @@ void main() { "text": "{\n\"text\": \"I LOVE Flutter\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { @@ -287,10 +303,11 @@ void main() { ], "postData": { "mimeType": "application/json", - "text": "{\n\"text\": \"I LOVE Flutter\"\n}" + "text": "{\n\"text\": \"I LOVE Flutter\",\n\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\n}" } }"""; - expect(harCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { @@ -314,7 +331,242 @@ void main() { "text": "{\n\"text\": \"I LOVE Flutter\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=d43e2510-a25e-1f08-b0a5-591aeb704467" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=d43e2510-a25e-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "text", + "value": "API" + }, + { + "name": "sep", + "value": "|" + }, + { + "name": "times", + "value": "3" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost4, "https", + boundary: "d43e2510-a25e-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/form", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=ce268b20-a3e6-1f08-b0a5-591aeb704467" + }, + { + "name": "User-Agent", + "value": "Test Agent" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=ce268b20-a3e6-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "text", + "value": "API" + }, + { + "name": "sep", + "value": "|" + }, + { + "name": "times", + "value": "3" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost5, "https", + boundary: "ce268b20-a3e6-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 6', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=c90d21a0-a44d-1f08-b0a5-591aeb704467" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=c90d21a0-a44d-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "token", + "value": "xyz" + }, + { + "name": "imfile", + "fileName": "1.png" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost6, "https", + boundary: "c90d21a0-a44d-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 7', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/img", + "httpVersion": "HTTP/1.1", + "queryString": [], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=4ac86770-a4dc-1f08-b0a5-591aeb704467" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=4ac86770-a4dc-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "token", + "value": "xyz" + }, + { + "name": "imfile", + "fileName": "1.png" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost7, "https", + boundary: "4ac86770-a4dc-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 8', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/form?size=2&len=3", + "httpVersion": "HTTP/1.1", + "queryString": [ + { + "name": "size", + "value": "2" + }, + { + "name": "len", + "value": "3" + } + ], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=78403a20-a54a-1f08-b0a5-591aeb704467" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=78403a20-a54a-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "text", + "value": "API" + }, + { + "name": "sep", + "value": "|" + }, + { + "name": "times", + "value": "3" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost8, "https", + boundary: "78403a20-a54a-1f08-b0a5-591aeb704467"), + expectedCode); + }); + + test('POST 9', () { + const expectedCode = r"""{ + "method": "POST", + "url": "https://api.apidash.dev/io/img?size=2&len=3", + "httpVersion": "HTTP/1.1", + "queryString": [ + { + "name": "size", + "value": "2" + }, + { + "name": "len", + "value": "3" + } + ], + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=2d9cd390-a593-1f08-b0a5-591aeb704467" + }, + { + "name": "User-Agent", + "value": "Test Agent" + }, + { + "name": "Keep-Alive", + "value": "true" + } + ], + "postData": { + "mimeType": "multipart/form-data; boundary=2d9cd390-a593-1f08-b0a5-591aeb704467", + "params": [ + { + "name": "token", + "value": "xyz" + }, + { + "name": "imfile", + "fileName": "1.png" + } + ] + } +}"""; + expect( + codeGen.getCode(CodegenLanguage.har, requestModelPost9, "https", + boundary: "2d9cd390-a593-1f08-b0a5-591aeb704467"), + expectedCode); }); }); @@ -336,7 +588,8 @@ void main() { "text": "{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPut1, "https"), + expectedCode); }); }); @@ -358,7 +611,8 @@ void main() { "text": "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelPatch1, "https"), + expectedCode); }); }); @@ -371,7 +625,8 @@ void main() { "queryString": [], "headers": [] }"""; - expect(harCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { @@ -391,7 +646,8 @@ void main() { "text": "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" } }"""; - expect(harCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect(codeGen.getCode(CodegenLanguage.har, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/java_okhttp_codegen_test.dart b/test/codegen/java_okhttp_codegen_test.dart new file mode 100644 index 00000000..20a8a17a --- /dev/null +++ b/test/codegen/java_okhttp_codegen_test.dart @@ -0,0 +1,1032 @@ +import 'package:apidash/codegen/java/okhttp.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final javaOkHttpCodeGen = JavaOkHttpCodeGen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev"; + + Request request = new Request.Builder() + .url(url) + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet1), expectedCode); + }); + + test('GET 2', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.apidash.dev/country/data").newBuilder() + .addQueryParameter("code", "US") + .build(); + + Request request = new Request.Builder() + .url(url) + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet2), expectedCode); + }); + + test('GET 3', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.apidash.dev/country/data").newBuilder() + .addQueryParameter("code", "IND") + .build(); + + Request request = new Request.Builder() + .url(url) + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet3), expectedCode); + }); + + test('GET 4', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.apidash.dev/humanize/social").newBuilder() + .addQueryParameter("num", "8700000") + .addQueryParameter("digits", "3") + .addQueryParameter("system", "SS") + .addQueryParameter("add_space", "true") + .addQueryParameter("trailing_zeros", "true") + .build(); + + Request request = new Request.Builder() + .url(url) + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet4), expectedCode); + }); + + test('GET 5', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.github.com/repos/foss42/apidash"; + + Request request = new Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet5), expectedCode); + }); + + test('GET 6', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.github.com/repos/foss42/apidash").newBuilder() + .addQueryParameter("raw", "true") + .build(); + + Request request = new Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet6), expectedCode); + }); + + test('GET 7', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev"; + + Request request = new Request.Builder() + .url(url) + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet7), expectedCode); + }); + + test('GET 8', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.github.com/repos/foss42/apidash").newBuilder() + .addQueryParameter("raw", "true") + .build(); + + Request request = new Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet8), expectedCode); + }); + + test('GET 9', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.apidash.dev/humanize/social").newBuilder() + .addQueryParameter("num", "8700000") + .addQueryParameter("add_space", "true") + .build(); + + Request request = new Request.Builder() + .url(url) + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet9), expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/humanize/social"; + + Request request = new Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode( + requestModelGet10, + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.apidash.dev/humanize/social").newBuilder() + .addQueryParameter("num", "8700000") + .addQueryParameter("digits", "3") + .build(); + + Request request = new Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet11), expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/humanize/social"; + + Request request = new Request.Builder() + .url(url) + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelGet12), expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD 1', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev"; + + Request request = new Request.Builder() + .url(url) + .head() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelHead1), expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev"; + + Request request = new Request.Builder() + .url(url) + .head() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect( + javaOkHttpCodeGen.getCode(requestModelHead2), expectedCode); + }); + }); + + group('POST Request', () { + test('POST 1', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MediaType; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/case/lower"; + + MediaType mediaType = MediaType.parse("text/plain"); + + RequestBody body = RequestBody.create("{\n\"text\": \"I LOVE Flutter\"\n}", mediaType); + + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost1), expectedCode); + }); + + test('POST 2', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MediaType; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/case/lower"; + + MediaType mediaType = MediaType.parse("application/json"); + + RequestBody body = RequestBody.create("{\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}", mediaType); + + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost2), expectedCode); + }); + + test('POST 3', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MediaType; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/case/lower"; + + MediaType mediaType = MediaType.parse("application/json"); + + RequestBody body = RequestBody.create("{\n\"text\": \"I LOVE Flutter\"\n}", mediaType); + + Request request = new Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost3), expectedCode); + }); + + test('POST 4', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MultipartBody; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/io/form"; + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("text","API") + .addFormDataPart("sep","|") + .addFormDataPart("times","3") + .build(); + + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost4), expectedCode); + }); + + test('POST 5', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MultipartBody; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/io/form"; + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("text","API") + .addFormDataPart("sep","|") + .addFormDataPart("times","3") + .build(); + + Request request = new Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost5), expectedCode); + }); + + test('POST 6', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MultipartBody; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/io/img"; + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("token","xyz") + .addFormDataPart("imfile",null,RequestBody.create(MediaType.parse("application/octet-stream"),new File("/Documents/up/1.png"))) + .build(); + + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost6), expectedCode); + }); + + test('POST 7', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MultipartBody; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://api.apidash.dev/io/img"; + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("token","xyz") + .addFormDataPart("imfile",null,RequestBody.create(MediaType.parse("application/octet-stream"),new File("/Documents/up/1.png"))) + .build(); + + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost7), expectedCode); + }); + + test('POST 8', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; +import okhttp3.RequestBody; +import okhttp3.MultipartBody; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.apidash.dev/io/form").newBuilder() + .addQueryParameter("size", "2") + .addQueryParameter("len", "3") + .build(); + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("text","API") + .addFormDataPart("sep","|") + .addFormDataPart("times","3") + .build(); + + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost8), expectedCode); + }); + + test('POST 9', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.HttpUrl; +import okhttp3.RequestBody; +import okhttp3.MultipartBody; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + HttpUrl url = HttpUrl.parse("https://api.apidash.dev/io/img").newBuilder() + .addQueryParameter("size", "2") + .addQueryParameter("len", "3") + .build(); + RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("token","xyz") + .addFormDataPart("imfile",null,RequestBody.create(MediaType.parse("application/octet-stream"),new File("/Documents/up/1.png"))) + .build(); + + Request request = new Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .addHeader("Keep-Alive", "true") + .post(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPost9), expectedCode); + }); + }); + + group('PUT Request', () { + test('PUT 1', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MediaType; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://reqres.in/api/users/2"; + + MediaType mediaType = MediaType.parse("application/json"); + + RequestBody body = RequestBody.create("{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n}", mediaType); + + Request request = new Request.Builder() + .url(url) + .put(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPut1), expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MediaType; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://reqres.in/api/users/2"; + + MediaType mediaType = MediaType.parse("application/json"); + + RequestBody body = RequestBody.create("{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}", mediaType); + + Request request = new Request.Builder() + .url(url) + .patch(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect( + javaOkHttpCodeGen.getCode(requestModelPatch1), expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = r"""import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://reqres.in/api/users/2"; + + Request request = new Request.Builder() + .url(url) + .delete() + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +"""; + expect(javaOkHttpCodeGen.getCode(requestModelDelete1), + expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = r'''import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.RequestBody; +import okhttp3.MediaType; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + OkHttpClient client = new OkHttpClient().newBuilder().build(); + + String url = "https://reqres.in/api/users/2"; + + MediaType mediaType = MediaType.parse("application/json"); + + RequestBody body = RequestBody.create("{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}", mediaType); + + Request request = new Request.Builder() + .url(url) + .delete(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + System.out.println(response.code()); + if (response.body() != null) { + System.out.println(response.body().string()); + } + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} +'''; + expect(javaOkHttpCodeGen.getCode(requestModelDelete2), + expectedCode); + }); + }); +} \ No newline at end of file diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index c364dbdb..15bbeff1 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -1,34 +1,34 @@ -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 = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev', method: 'get' }; axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/country/data', method: 'get', params: { @@ -37,22 +37,21 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/country/data', method: 'get', params: { @@ -61,22 +60,21 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -89,22 +87,21 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', headers: { @@ -113,22 +110,21 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', params: { @@ -140,43 +136,41 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet6, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev', method: 'get' }; axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', params: { @@ -188,22 +182,21 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet8, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -213,22 +206,21 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet9, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', headers: { @@ -237,19 +229,17 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; expect( - axiosCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.jsAxios, requestModelGet10, "https", ), @@ -257,7 +247,7 @@ axios(config) }); test('GET 11', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -270,89 +260,85 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet11, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet11, "https"), + expectedCode); }); test('GET 12', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get' }; axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev', method: 'head' }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelHead1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelHead1, "https"), + expectedCode); }); test('HEAD 2', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'http://api.apidash.dev', method: 'head' }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { @@ -362,47 +348,45 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelPost1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost1, "https"), + expectedCode); }); test('POST 2', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { 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) - .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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelPost2, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost2, "https"), + expectedCode); }); test('POST 3', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { @@ -413,24 +397,227 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost3, "https"), + expectedCode); + }); + test('POST 4', () { + const expectedCode = r"""const config = { + url: 'https://api.apidash.dev/io/form', + method: 'post', + headers: { + "Content-Type": "multipart/form-data" + }, + data: { + "text": "API", + "sep": "|", + "times": "3" + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, + requestModelPost4, + "https", + ), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""const config = { + url: 'https://api.apidash.dev/io/form', + method: 'post', + headers: { + "Content-Type": "multipart/form-data", + "User-Agent": "Test Agent" + }, + data: { + "text": "API", + "sep": "|", + "times": "3" + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, + requestModelPost5, + "https", + ), + expectedCode); + }); + test('POST 6', () { + const expectedCode = + r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration + +const config = { + url: 'https://api.apidash.dev/io/img', + method: 'post', + headers: { + "Content-Type": "multipart/form-data" + }, + data: { + "token": "xyz", + "imfile": fileInput1.files[0] + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, + requestModelPost6, + "https", + ), + expectedCode); + }); + test('POST 7', () { + const expectedCode = + r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration + +const config = { + url: 'https://api.apidash.dev/io/img', + method: 'post', + headers: { + "Content-Type": "multipart/form-data" + }, + data: { + "token": "xyz", + "imfile": fileInput1.files[0] + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, + requestModelPost7, + "https", + ), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r"""const config = { + url: 'https://api.apidash.dev/io/form', + method: 'post', + params: { + "size": "2", + "len": "3" + }, + headers: { + "Content-Type": "multipart/form-data" + }, + data: { + "text": "API", + "sep": "|", + "times": "3" + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, + requestModelPost8, + "https", + ), + expectedCode); + }); + test('POST 9', () { + const expectedCode = + r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration + +const config = { + url: 'https://api.apidash.dev/io/img', + method: 'post', + params: { + "size": "2", + "len": "3" + }, + headers: { + "Content-Type": "multipart/form-data", + "User-Agent": "Test Agent", + "Keep-Alive": "true" + }, + data: { + "token": "xyz", + "imfile": fileInput1.files[0] + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, + requestModelPost9, + "https", + ), + expectedCode); }); }); group('PUT Request', () { test('PUT 1', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://reqres.in/api/users/2', method: 'put', headers: { @@ -440,24 +627,23 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPut1, "https"), + expectedCode); }); }); group('PATCH Request', () { test('PATCH 1', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://reqres.in/api/users/2', method: 'patch', headers: { @@ -467,45 +653,44 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsAxios, requestModelPatch1, "https"), + expectedCode); }); }); group('DELETE Request', () { test('DELETE 1', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://reqres.in/api/users/2', method: 'delete' }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://reqres.in/api/users/2', method: 'delete', headers: { @@ -515,18 +700,18 @@ axios(config) }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.jsAxios, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index c29f93b9..83ee687c 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -1,280 +1,270 @@ -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.apidash.dev'; + const expectedCode = r"""const url = 'https://api.apidash.dev'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/country/data?code=US'; + r"""const url = 'https://api.apidash.dev/country/data?code=US'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/country/data?code=IND'; + r"""const url = 'https://api.apidash.dev/country/data?code=IND'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; + r"""const url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { const expectedCode = - r"""let url = 'https://api.github.com/repos/foss42/apidash'; + r"""const url = 'https://api.github.com/repos/foss42/apidash'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { const expectedCode = - r"""let url = 'https://api.github.com/repos/foss42/apidash?raw=true'; + r"""const url = 'https://api.github.com/repos/foss42/apidash?raw=true'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev'; + const expectedCode = r"""const url = 'https://api.apidash.dev'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { const expectedCode = - r"""let url = 'https://api.github.com/repos/foss42/apidash?raw=true'; + r"""const url = 'https://api.github.com/repos/foss42/apidash?raw=true'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/humanize/social?num=8700000&add_space=true'; + r"""const url = 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/humanize/social'; + r"""const url = 'https://api.apidash.dev/humanize/social'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; expect( - fetchCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.jsFetch, requestModelGet10, "https", ), @@ -283,323 +273,520 @@ fetch(url, options) test('GET 11', () { const expectedCode = - r"""let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3'; + r"""const url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/humanize/social'; + r"""const url = 'https://api.apidash.dev/humanize/social'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev'; + const expectedCode = r"""const url = 'https://api.apidash.dev'; -let options = { +const options = { method: 'HEAD' }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev'; + const expectedCode = r"""const url = 'http://api.apidash.dev'; -let options = { +const options = { method: 'HEAD' }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/case/lower'; + const expectedCode = r"""const url = 'https://api.apidash.dev/case/lower'; -let options = { +const options = { method: 'POST', headers: { "Content-Type": "text/plain" }, - body: -"{\n\"text\": \"I LOVE Flutter\"\n}" + body: "{\n\"text\": \"I LOVE Flutter\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/case/lower'; + const expectedCode = r"""const url = 'https://api.apidash.dev/case/lower'; -let options = { +const options = { method: 'POST', headers: { "Content-Type": "application/json" }, - body: -"{\n\"text\": \"I LOVE Flutter\"\n}" + body: "{\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; 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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.apidash.dev/case/lower'; + const expectedCode = r"""const url = 'https://api.apidash.dev/case/lower'; -let options = { +const options = { method: 'POST', headers: { "Content-Type": "application/json", "User-Agent": "Test Agent" }, - body: -"{\n\"text\": \"I LOVE Flutter\"\n}" + body: "{\n\"text\": \"I LOVE Flutter\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost3, "https"), + expectedCode); + }); + test('POST 4', () { + const expectedCode = r"""const payload = new FormData(); +payload.append("text", "API") +payload.append("sep", "|") +payload.append("times", "3") + +const url = 'https://api.apidash.dev/io/form'; + +const options = { + method: 'POST', + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, + requestModelPost4, + "https", + ), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""const payload = new FormData(); +payload.append("text", "API") +payload.append("sep", "|") +payload.append("times", "3") + +const url = 'https://api.apidash.dev/io/form'; + +const options = { + method: 'POST', + headers: { + "User-Agent": "Test Agent" + }, + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, + requestModelPost5, + "https", + ), + expectedCode); + }); + test('POST 6', () { + const expectedCode = + r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration + +const payload = new FormData(); +payload.append("token", "xyz") +payload.append("imfile", fileInput1.files[0]) + +const url = 'https://api.apidash.dev/io/img'; + +const options = { + method: 'POST', + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, + requestModelPost6, + "https", + ), + expectedCode); + }); + test('POST 7', () { + const expectedCode = + r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration + +const payload = new FormData(); +payload.append("token", "xyz") +payload.append("imfile", fileInput1.files[0]) + +const url = 'https://api.apidash.dev/io/img'; + +const options = { + method: 'POST', + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, + requestModelPost7, + "https", + ), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r"""const payload = new FormData(); +payload.append("text", "API") +payload.append("sep", "|") +payload.append("times", "3") + +const url = 'https://api.apidash.dev/io/form?size=2&len=3'; + +const options = { + method: 'POST', + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, + requestModelPost8, + "https", + ), + expectedCode); + }); + test('POST 9', () { + const expectedCode = + r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration + +const payload = new FormData(); +payload.append("token", "xyz") +payload.append("imfile", fileInput1.files[0]) + +const url = 'https://api.apidash.dev/io/img?size=2&len=3'; + +const options = { + method: 'POST', + headers: { + "User-Agent": "Test Agent", + "Keep-Alive": "true" + }, + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, + requestModelPost9, + "https", + ), + expectedCode); }); }); group('PUT Request', () { test('PUT 1', () { - const expectedCode = r"""let url = 'https://reqres.in/api/users/2'; + const expectedCode = r"""const url = 'https://reqres.in/api/users/2'; -let options = { +const options = { method: 'PUT', headers: { "Content-Type": "application/json" }, - body: -"{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n}" + body: "{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPut1, "https"), + expectedCode); }); }); group('PATCH Request', () { test('PATCH 1', () { - const expectedCode = r"""let url = 'https://reqres.in/api/users/2'; + const expectedCode = r"""const url = 'https://reqres.in/api/users/2'; -let options = { +const options = { method: 'PATCH', headers: { "Content-Type": "application/json" }, - body: -"{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" + body: "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode(CodegenLanguage.jsFetch, requestModelPatch1, "https"), + expectedCode); }); }); group('DELETE Request', () { test('DELETE 1', () { - const expectedCode = r"""let url = 'https://reqres.in/api/users/2'; + const expectedCode = r"""const url = 'https://reqres.in/api/users/2'; -let options = { +const options = { method: 'DELETE' }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { - const expectedCode = r"""let url = 'https://reqres.in/api/users/2'; + const expectedCode = r"""const url = 'https://reqres.in/api/users/2'; -let options = { +const options = { method: 'DELETE', headers: { "Content-Type": "application/json" }, - body: -"{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" + body: "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.jsFetch, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/julia_http_codegen_test.dart b/test/codegen/julia_http_codegen_test.dart new file mode 100644 index 00000000..2b5161eb --- /dev/null +++ b/test/codegen/julia_http_codegen_test.dart @@ -0,0 +1,453 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev" + + +response = HTTP.get(url) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet1, "https"), + expectedCode); + }); + test('GET 2', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/country/data" + + +params = Dict( + "code"=> "US" + ) + +response = HTTP.get(url, query=params) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet2, "https"), + expectedCode); + }); + test('GET 3', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/country/data" + + +params = Dict( + "code"=> "IND" + ) + +response = HTTP.get(url, query=params) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet3, "https"), + expectedCode); + }); + test('GET 4', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/humanize/social" + + +params = Dict( + "num"=> "8700000", + "digits"=> "3", + "system"=> "SS", + "add_space"=> "true", + "trailing_zeros"=> "true" + ) + +response = HTTP.get(url, query=params) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet4, "https"), + expectedCode); + }); + + test('GET 5', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.github.com/repos/foss42/apidash" + + +headers = Dict( + "User-Agent"=> "Test Agent" + ) + +response = HTTP.get(url, headers=headers) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet5, "https"), + expectedCode); + }); + + test('GET 6', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.github.com/repos/foss42/apidash" + + +params = Dict( + "raw"=> "true" + ) + +headers = Dict( + "User-Agent"=> "Test Agent" + ) + +response = HTTP.get(url, query=params, headers=headers) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet6, "https"), + expectedCode); + }); + + test('GET 7', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev" + + +response = HTTP.get(url) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet7, "https"), + expectedCode); + }); + + test('GET 8', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.github.com/repos/foss42/apidash" + + +params = Dict( + "raw"=> "true" + ) + +headers = Dict( + "User-Agent"=> "Test Agent" + ) + +response = HTTP.get(url, query=params, headers=headers) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet8, "https"), + expectedCode); + }); + + test('GET 9', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/humanize/social" + + +params = Dict( + "num"=> "8700000", + "add_space"=> "true" + ) + +response = HTTP.get(url, query=params) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/humanize/social" + + +headers = Dict( + "User-Agent"=> "Test Agent" + ) + +response = HTTP.get(url, headers=headers) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelGet10, "https"), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/humanize/social" + + +params = Dict( + "num"=> "8700000", + "digits"=> "3" + ) + +headers = Dict( + "User-Agent"=> "Test Agent" + ) + +response = HTTP.get(url, query=params, headers=headers) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/humanize/social" + + +response = HTTP.get(url) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelGet12, "https"), + expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD 1', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev" + + +response = HTTP.head(url) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelHead1, "https"), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev" + + +response = HTTP.head(url) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelHead2, "https"), + expectedCode); + }); + }); + + group('POST Request', () { + test('POST 1', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/case/lower" + + +payload = Dict( +"text"=> "I LOVE Flutter" +) + +headers = Dict( + "content-type"=> "text/plain" + ) + +response = HTTP.post(url, payload=payload, headers=headers) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelPost1, "https"), + expectedCode); + }); + + test('POST 2', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/case/lower" + + +payload = Dict( +"text"=> "I LOVE Flutter", +"flag"=> null, +"male"=> true, +"female"=> false, +"no"=> 1.2, +"arr"=> ["null", "true", "false", null] +) + +response = HTTP.post(url, JSON.json(payload)) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelPost2, "https"), + expectedCode); + }); + test('POST 3', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://api.apidash.dev/case/lower" + + +payload = Dict( +"text"=> "I LOVE Flutter" +) + +headers = Dict( + "User-Agent"=> "Test Agent" + ) + +response = HTTP.post(url, JSON.json(payload), headers=headers) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelPost3, "https"), + expectedCode); + }); + }); + group('PUT Request', () { + test('PUT 1', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://reqres.in/api/users/2" + + +payload = Dict( +"name"=> "morpheus", +"job"=> "zion resident" +) + +response = HTTP.put(url, JSON.json(payload)) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode(CodegenLanguage.juliaHttp, requestModelPut1, "https"), + expectedCode); + }); + }); + group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://reqres.in/api/users/2" + + +payload = Dict( +"name"=> "marfeus", +"job"=> "accountant" +) + +response = HTTP.patch(url, JSON.json(payload)) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelPatch1, "https"), + expectedCode); + }); + }); + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://reqres.in/api/users/2" + + +response = HTTP.delete(url) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelDelete1, "https"), + expectedCode); + }); + test('DELETE 2', () { + const expectedCode = r"""using HTTP,JSON + +url = "https://reqres.in/api/users/2" + + +payload = Dict( +"name"=> "marfeus", +"job"=> "accountant" +) + +response = HTTP.delete(url, JSON.json(payload)) + +println("Status Code:", response.status) +println("Response Body:", String(response.body)) +"""; + expect( + codeGen.getCode( + CodegenLanguage.juliaHttp, requestModelDelete2, "https"), + expectedCode); + }); + }); +} diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index bedb94c6..7b6850f3 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/kotlin/okhttp.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; import '../request_models.dart'; void main() { - final kotlinOkHttpCodeGen = KotlinOkHttpCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -27,7 +28,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet1, "https"), + expectedCode); }); test('GET 2', () { @@ -54,7 +57,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet2, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet2, "https"), + expectedCode); }); test('GET 3', () { @@ -81,7 +86,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet3, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet3, "https"), + expectedCode); }); test('GET 4', () { @@ -112,7 +119,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet4, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { @@ -137,7 +146,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet5, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { @@ -165,7 +176,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet6, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet6, "https"), + expectedCode); }); test('GET 7', () { @@ -189,7 +202,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet7, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { @@ -217,7 +232,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet8, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet8, "https"), + expectedCode); }); test('GET 9', () { @@ -245,7 +262,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelGet9, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet9, "https"), + expectedCode); }); test('GET 10', () { @@ -270,7 +289,8 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet10, "https", ), @@ -302,7 +322,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet11, "https"), expectedCode); }); @@ -326,7 +348,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelGet12, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelGet12, "https"), expectedCode); }); }); @@ -352,7 +376,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelHead1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelHead1, "https"), expectedCode); }); @@ -377,7 +403,9 @@ fun main() { } """; expect( - kotlinOkHttpCodeGen.getCode(requestModelHead2, "http"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelHead2, "http"), + expectedCode); }); }); @@ -410,7 +438,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost1, "https"), expectedCode); }); @@ -428,7 +458,12 @@ fun main() { val mediaType = "application/json".toMediaType() val body = """{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }""".toRequestBody(mediaType) val request = Request.Builder() @@ -442,7 +477,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost2, "https"), expectedCode); }); @@ -475,7 +512,204 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPost3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost3, "https"), + expectedCode); + }); + test('POST 4', () { + const expectedCode = r'''import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.MultipartBody + +fun main() { + val client = OkHttpClient() + + val url = "https://api.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) + .post(body) + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +'''; + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost4, "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); + }); + test('POST 6', () { + const expectedCode = r'''import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.MultipartBody +import java.io.File +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.MediaType.Companion.toMediaType + +fun main() { + val client = OkHttpClient() + + val url = "https://api.apidash.dev/io/img" + val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("token","xyz") + + .addFormDataPart("imfile",File("Documents/up/1.png").name,File("Documents/up/1.png").asRequestBody("application/octet-stream".toMediaType())) + .build() + val request = Request.Builder() + .url(url) + .post(body) + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +'''; + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost6, "https"), + expectedCode); + }); + test('POST 7', () { + const expectedCode = r'''import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.MultipartBody +import java.io.File +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.MediaType.Companion.toMediaType + +fun main() { + val client = OkHttpClient() + + val url = "https://api.apidash.dev/io/img" + val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("token","xyz") + + .addFormDataPart("imfile",File("Documents/up/1.png").name,File("Documents/up/1.png").asRequestBody("application/octet-stream".toMediaType())) + .build() + val request = Request.Builder() + .url(url) + .post(body) + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +'''; + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost7, "https"), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r'''import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MultipartBody + +fun main() { + val client = OkHttpClient() + + val url = "https://api.apidash.dev/io/form".toHttpUrl().newBuilder() + .addQueryParameter("size", "2") + .addQueryParameter("len", "3") + .build() + val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("text","API") + .addFormDataPart("sep","|") + .addFormDataPart("times","3") + .build() + val request = Request.Builder() + .url(url) + .post(body) + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +'''; + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost8, "https"), + expectedCode); + }); + test('POST 9', () { + const expectedCode = r'''import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MultipartBody +import java.io.File +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.MediaType.Companion.toMediaType + +fun main() { + val client = OkHttpClient() + + val url = "https://api.apidash.dev/io/img".toHttpUrl().newBuilder() + .addQueryParameter("size", "2") + .addQueryParameter("len", "3") + .build() + val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("token","xyz") + + .addFormDataPart("imfile",File("Documents/up/1.png").name,File("Documents/up/1.png").asRequestBody("application/octet-stream".toMediaType())) + .build() + val request = Request.Builder() + .url(url) + .addHeader("User-Agent", "Test Agent") + .addHeader("Keep-Alive", "true") + .post(body) + .build() + + val response = client.newCall(request).execute() + + println(response.code) + println(response.body?.string()) +} +'''; + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPost9, "https"), expectedCode); }); }); @@ -511,7 +745,9 @@ fun main() { } '''; expect( - kotlinOkHttpCodeGen.getCode(requestModelPut1, "https"), expectedCode); + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPut1, "https"), + expectedCode); }); }); @@ -545,7 +781,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelPatch1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelPatch1, "https"), expectedCode); }); }); @@ -571,7 +809,9 @@ fun main() { println(response.body?.string()) } """; - expect(kotlinOkHttpCodeGen.getCode(requestModelDelete1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelDelete1, "https"), expectedCode); }); @@ -604,7 +844,9 @@ fun main() { println(response.body?.string()) } '''; - expect(kotlinOkHttpCodeGen.getCode(requestModelDelete2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.kotlinOkHttp, requestModelDelete2, "https"), expectedCode); }); }); diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index d4a12902..31f359ea 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -1,38 +1,39 @@ -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 = { +const config = { url: 'https://api.apidash.dev', method: 'get' }; axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'https://api.apidash.dev/country/data', method: 'get', params: { @@ -41,24 +42,24 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'https://api.apidash.dev/country/data', method: 'get', params: { @@ -67,24 +68,24 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -97,24 +98,24 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', headers: { @@ -123,24 +124,24 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', params: { @@ -152,47 +153,47 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'https://api.apidash.dev', method: 'get' }; axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', params: { @@ -204,24 +205,24 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -231,24 +232,24 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', headers: { @@ -257,19 +258,17 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; expect( - axiosCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet10, "https", ), @@ -279,7 +278,7 @@ axios(config) test('GET 11', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -292,41 +291,41 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get' }; axios(config) - .then(function (response) { - // handle success - console.log(response.status); - console.log(response.data); - }) - .catch(function (error) { - // handle error - console.log(error.response.status); - console.log(error); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelGet12, "https"), + expectedCode); }); }); @@ -334,47 +333,47 @@ axios(config) test('HEAD 1', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev', method: 'head' }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'http://api.apidash.dev', method: 'head' }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelHead2, "http"), + expectedCode); }); }); @@ -382,7 +381,7 @@ axios(config) test('POST 1', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { @@ -392,51 +391,51 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { 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) - .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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - 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 = { +const config = { url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { @@ -447,18 +446,228 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPost3, "https"), + expectedCode); + }); + test('POST 4', () { + const expectedCode = r"""import axios from 'axios'; + +const config = { + url: 'https://api.apidash.dev/io/form', + method: 'post', + headers: { + "Content-Type": "multipart/form-data" + }, + data: { + "text": "API", + "sep": "|", + "times": "3" + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, + requestModelPost4, + "https", + ), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""import axios from 'axios'; + +const config = { + url: 'https://api.apidash.dev/io/form', + method: 'post', + headers: { + "Content-Type": "multipart/form-data", + "User-Agent": "Test Agent" + }, + data: { + "text": "API", + "sep": "|", + "times": "3" + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, + requestModelPost5, + "https", + ), + expectedCode); + }); + test('POST 6', () { + const expectedCode = r"""import axios from 'axios'; +import fs from 'fs' + +const config = { + url: 'https://api.apidash.dev/io/img', + method: 'post', + headers: { + "Content-Type": "multipart/form-data" + }, + data: { + "token": "xyz", + "imfile": fs.createReadStream("/Documents/up/1.png") + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, + requestModelPost6, + "https", + ), + expectedCode); + }); + test('POST 7', () { + const expectedCode = r"""import axios from 'axios'; +import fs from 'fs' + +const config = { + url: 'https://api.apidash.dev/io/img', + method: 'post', + headers: { + "Content-Type": "multipart/form-data" + }, + data: { + "token": "xyz", + "imfile": fs.createReadStream("/Documents/up/1.png") + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, + requestModelPost7, + "https", + ), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r"""import axios from 'axios'; + +const config = { + url: 'https://api.apidash.dev/io/form', + method: 'post', + params: { + "size": "2", + "len": "3" + }, + headers: { + "Content-Type": "multipart/form-data" + }, + data: { + "text": "API", + "sep": "|", + "times": "3" + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, + requestModelPost8, + "https", + ), + expectedCode); + }); + test('POST 9', () { + const expectedCode = r"""import axios from 'axios'; +import fs from 'fs' + +const config = { + url: 'https://api.apidash.dev/io/img', + method: 'post', + params: { + "size": "2", + "len": "3" + }, + headers: { + "Content-Type": "multipart/form-data", + "User-Agent": "Test Agent", + "Keep-Alive": "true" + }, + data: { + "token": "xyz", + "imfile": fs.createReadStream("/Documents/up/1.png") + } +}; + +axios(config) + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, + requestModelPost9, + "https", + ), + expectedCode); }); }); @@ -466,7 +675,7 @@ axios(config) test('PUT 1', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://reqres.in/api/users/2', method: 'put', headers: { @@ -476,18 +685,18 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPut1, "https"), + expectedCode); }); }); @@ -495,7 +704,7 @@ axios(config) test('PATCH 1', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://reqres.in/api/users/2', method: 'patch', headers: { @@ -505,18 +714,18 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelPatch1, "https"), + expectedCode); }); }); @@ -524,30 +733,30 @@ axios(config) test('DELETE 1', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://reqres.in/api/users/2', method: 'delete' }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://reqres.in/api/users/2', method: 'delete', headers: { @@ -557,18 +766,18 @@ let config = { }; 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); - }); + .then(res => { + console.log(res.status); + console.log(res.data); + }) + .catch(err => { + console.log(err); + }); """; - expect(axiosCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsAxios, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index 592610ee..88ca7072 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -1,292 +1,291 @@ -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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev'; +const url = 'https://api.apidash.dev'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/country/data?code=US'; +const url = 'https://api.apidash.dev/country/data?code=US'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/country/data?code=IND'; +const url = 'https://api.apidash.dev/country/data?code=IND'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; +const url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelGet4, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet4, "https"), + expectedCode); }); test('GET 5', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.github.com/repos/foss42/apidash'; +const url = 'https://api.github.com/repos/foss42/apidash'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelGet5, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet5, "https"), + expectedCode); }); test('GET 6', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.github.com/repos/foss42/apidash?raw=true'; +const url = 'https://api.github.com/repos/foss42/apidash?raw=true'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev'; +const url = 'https://api.apidash.dev'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelGet7, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet7, "https"), + expectedCode); }); test('GET 8', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.github.com/repos/foss42/apidash?raw=true'; +const url = 'https://api.github.com/repos/foss42/apidash?raw=true'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'; +const url = 'https://api.apidash.dev/humanize/social?num=8700000&add_space=true'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/humanize/social'; +const url = 'https://api.apidash.dev/humanize/social'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; expect( - fetchCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet10, "https", ), @@ -294,344 +293,547 @@ fetch(url, options) }); test('GET 11', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3'; +const url = 'https://api.apidash.dev/humanize/social?num=8700000&digits=3'; -let options = { +const options = { method: 'GET', headers: { "User-Agent": "Test Agent" } }; -let status; fetch(url, options) - .then(res => { - status = res.status; - return res.json() - }) - .then(body => { - console.log(status); - console.log(body); - }) - .catch(err => { - console.log(status); - console.error('error:' + err); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/humanize/social'; +const url = 'https://api.apidash.dev/humanize/social'; -let options = { +const 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelGet12, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelGet12, "https"), + expectedCode); }); }); group('HEAD Request', () { test('HEAD 1', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev'; +const url = 'https://api.apidash.dev'; -let options = { +const options = { method: 'HEAD' }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'http://api.apidash.dev'; +const url = 'http://api.apidash.dev'; -let options = { +const options = { method: 'HEAD' }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelHead2, "http"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelHead2, "http"), + expectedCode); }); }); group('POST Request', () { test('POST 1', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/case/lower'; +const url = 'https://api.apidash.dev/case/lower'; -let options = { +const options = { method: 'POST', headers: { "Content-Type": "text/plain" }, - body: -"{\n\"text\": \"I LOVE Flutter\"\n}" + body: "{\n\"text\": \"I LOVE Flutter\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/case/lower'; +const url = 'https://api.apidash.dev/case/lower'; -let options = { +const options = { method: 'POST', headers: { "Content-Type": "application/json" }, - body: -"{\n\"text\": \"I LOVE Flutter\"\n}" + body: "{\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; 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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + 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'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://api.apidash.dev/case/lower'; +const url = 'https://api.apidash.dev/case/lower'; -let options = { +const options = { method: 'POST', headers: { "Content-Type": "application/json", "User-Agent": "Test Agent" }, - body: -"{\n\"text\": \"I LOVE Flutter\"\n}" + body: "{\n\"text\": \"I LOVE Flutter\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelPost3, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost3, "https"), + expectedCode); + }); + test('POST 4', () { + const expectedCode = r"""import fetch from 'node-fetch' +import { FormData } from 'node-fetch' + +const payload = new FormData(); +payload.append("text", "API") +payload.append("sep", "|") +payload.append("times", "3") + +const url = 'https://api.apidash.dev/io/form'; + +const options = { + method: 'POST', + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost4, "https", + boundary: "test"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""import fetch from 'node-fetch' +import { FormData } from 'node-fetch' + +const payload = new FormData(); +payload.append("text", "API") +payload.append("sep", "|") +payload.append("times", "3") + +const url = 'https://api.apidash.dev/io/form'; + +const options = { + method: 'POST', + headers: { + "User-Agent": "Test Agent" + }, + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost5, "https", + boundary: "test"), + expectedCode); + }); + test('POST 6', () { + const expectedCode = r"""import fetch from 'node-fetch' +import { fileFromSync, FormData } from 'node-fetch' + +const payload = new FormData(); +payload.append("token", "xyz") +payload.append("imfile", fileFromSync("/Documents/up/1.png")) + +const url = 'https://api.apidash.dev/io/img'; + +const options = { + method: 'POST', + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost6, "https", + boundary: "test"), + expectedCode); + }); + test('POST 7', () { + const expectedCode = r"""import fetch from 'node-fetch' +import { fileFromSync, FormData } from 'node-fetch' + +const payload = new FormData(); +payload.append("token", "xyz") +payload.append("imfile", fileFromSync("/Documents/up/1.png")) + +const url = 'https://api.apidash.dev/io/img'; + +const options = { + method: 'POST', + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost7, "https", + boundary: "test"), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r"""import fetch from 'node-fetch' +import { FormData } from 'node-fetch' + +const payload = new FormData(); +payload.append("text", "API") +payload.append("sep", "|") +payload.append("times", "3") + +const url = 'https://api.apidash.dev/io/form?size=2&len=3'; + +const options = { + method: 'POST', + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost8, "https", + boundary: "test"), + expectedCode); + }); + test('POST 9', () { + const expectedCode = r"""import fetch from 'node-fetch' +import { fileFromSync, FormData } from 'node-fetch' + +const payload = new FormData(); +payload.append("token", "xyz") +payload.append("imfile", fileFromSync("/Documents/up/1.png")) + +const url = 'https://api.apidash.dev/io/img?size=2&len=3'; + +const options = { + method: 'POST', + headers: { + "User-Agent": "Test Agent", + "Keep-Alive": "true" + }, + body: payload +}; + +fetch(url, options) + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); +"""; + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPost9, "https", + boundary: "test"), + expectedCode); }); }); group('PUT Request', () { test('PUT 1', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://reqres.in/api/users/2'; +const url = 'https://reqres.in/api/users/2'; -let options = { +const options = { method: 'PUT', headers: { "Content-Type": "application/json" }, - body: -"{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n}" + body: "{\n\"name\": \"morpheus\",\n\"job\": \"zion resident\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelPut1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPut1, "https"), + expectedCode); }); }); group('PATCH Request', () { test('PATCH 1', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://reqres.in/api/users/2'; +const url = 'https://reqres.in/api/users/2'; -let options = { +const options = { method: 'PATCH', headers: { "Content-Type": "application/json" }, - body: -"{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" + body: "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelPatch1, "https"), + expectedCode); }); }); group('DELETE Request', () { test('DELETE 1', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://reqres.in/api/users/2'; +const url = 'https://reqres.in/api/users/2'; -let options = { +const options = { method: 'DELETE' }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelDelete1, "https"), + expectedCode); }); test('DELETE 2', () { - const expectedCode = r"""import fetch from 'node-fetch'; + const expectedCode = r"""import fetch from 'node-fetch' -let url = 'https://reqres.in/api/users/2'; +const url = 'https://reqres.in/api/users/2'; -let options = { +const options = { method: 'DELETE', headers: { "Content-Type": "application/json" }, - body: -"{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" + body: "{\n\"name\": \"marfeus\",\n\"job\": \"accountant\"\n}" }; -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); - }); + .then(res => { + console.log(res.status); + return res.text() + }) + .then(body => { + console.log(body); + }) + .catch(err => { + console.error(`error:${err}`); + }); """; - expect(fetchCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + expect( + codeGen.getCode( + CodegenLanguage.nodejsFetch, requestModelDelete2, "https"), + expectedCode); }); }); } diff --git a/test/codegen/python_http_client_codegen_test.dart b/test/codegen/python_http_client_codegen_test.dart index 0ca712c2..c1d68702 100644 --- a/test/codegen/python_http_client_codegen_test.dart +++ b/test/codegen/python_http_client_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/python/http_client.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final pythonHttpClientCodeGen = PythonHttpClientCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -17,7 +18,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet1, "https"), expectedCode); }); @@ -26,8 +29,8 @@ print(data.decode("utf-8")) from urllib.parse import urlencode queryParams = { - "code": "US" - } + "code": "US" +} queryParamsStr = '?' + urlencode(queryParams) conn = http.client.HTTPSConnection("api.apidash.dev") @@ -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); }); @@ -47,8 +52,8 @@ print(data.decode("utf-8")) from urllib.parse import urlencode queryParams = { - "code": "IND" - } + "code": "IND" +} queryParamsStr = '?' + urlencode(queryParams) conn = http.client.HTTPSConnection("api.apidash.dev") @@ -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); }); @@ -68,12 +75,12 @@ print(data.decode("utf-8")) from urllib.parse import urlencode queryParams = { - "num": "8700000", - "digits": "3", - "system": "SS", - "add_space": "true", - "trailing_zeros": "true" - } + "num": "8700000", + "digits": "3", + "system": "SS", + "add_space": "true", + "trailing_zeros": "true" +} queryParamsStr = '?' + urlencode(queryParams) conn = http.client.HTTPSConnection("api.apidash.dev") @@ -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); }); @@ -92,8 +101,8 @@ print(data.decode("utf-8")) const expectedCode = r"""import http.client headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} conn = http.client.HTTPSConnection("api.github.com") conn.request("GET", "/repos/foss42/apidash", @@ -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); }); @@ -113,13 +124,13 @@ print(data.decode("utf-8")) from urllib.parse import urlencode queryParams = { - "raw": "true" - } + "raw": "true" +} queryParamsStr = '?' + urlencode(queryParams) headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} conn = http.client.HTTPSConnection("api.github.com") conn.request("GET", "/repos/foss42/apidash" + queryParamsStr, @@ -130,7 +141,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet6, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet6, "https"), expectedCode); }); @@ -145,7 +158,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet7, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet7, "https"), expectedCode); }); @@ -154,13 +169,13 @@ print(data.decode("utf-8")) from urllib.parse import urlencode queryParams = { - "raw": "true" - } + "raw": "true" +} queryParamsStr = '?' + urlencode(queryParams) headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} conn = http.client.HTTPSConnection("api.github.com") conn.request("GET", "/repos/foss42/apidash" + queryParamsStr, @@ -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); }); @@ -180,9 +197,9 @@ print(data.decode("utf-8")) from urllib.parse import urlencode queryParams = { - "num": "8700000", - "add_space": "true" - } + "num": "8700000", + "add_space": "true" +} queryParamsStr = '?' + urlencode(queryParams) conn = http.client.HTTPSConnection("api.apidash.dev") @@ -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); }); @@ -201,8 +220,8 @@ print(data.decode("utf-8")) const expectedCode = r"""import http.client headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social", @@ -214,7 +233,8 @@ data = res.read() print(data.decode("utf-8")) """; expect( - pythonHttpClientCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet10, "https", ), @@ -226,14 +246,14 @@ print(data.decode("utf-8")) from urllib.parse import urlencode queryParams = { - "num": "8700000", - "digits": "3" - } + "num": "8700000", + "digits": "3" +} queryParamsStr = '?' + urlencode(queryParams) headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("GET", "/humanize/social" + queryParamsStr, @@ -244,7 +264,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet11, "https"), expectedCode); }); @@ -259,7 +281,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelGet12, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelGet12, "https"), expectedCode); }); }); @@ -276,7 +300,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelHead1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelHead1, "https"), expectedCode); }); @@ -291,7 +317,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelHead2, "http"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelHead2, "http"), expectedCode); }); }); @@ -305,8 +333,8 @@ body = r'''{ }''' headers = { - "content-type": "text/plain" - } + "content-type": "text/plain" +} conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", @@ -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,12 +356,17 @@ 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" - } + "content-type": "application/json" +} conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", @@ -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); }); @@ -355,9 +392,9 @@ body = r'''{ }''' headers = { - "User-Agent": "Test Agent", - "content-type": "application/json" - } + "User-Agent": "Test Agent", + "content-type": "application/json" +} conn = http.client.HTTPSConnection("api.apidash.dev") conn.request("POST", "/case/lower", @@ -369,7 +406,320 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPost3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r"""import http.client +import mimetypes +from codecs import encode + +headers = { + "content-type": "multipart/form-data; boundary=b9826c20-773c-1f0c-814d-a1b3d90cd6b3" +} + +def build_data_list(fields): + dataList = [] + for field in fields: + name = field.get('name', '') + value = field.get('value', '') + type_ = field.get('type', 'text') + dataList.append(encode('--b9826c20-773c-1f0c-814d-a1b3d90cd6b3')) + 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(f'--b9826c20-773c-1f0c-814d-a1b3d90cd6b3--')) + dataList.append(encode('')) + return dataList + +dataList = build_data_list([{"name":"text","value":"API","type":"text"},{"name":"sep","value":"|","type":"text"},{"name":"times","value":"3","type":"text"}]) +body = b'\r\n'.join(dataList) +conn = http.client.HTTPSConnection("api.apidash.dev") +conn.request("POST", "/io/form", + body= body, + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost4, "https", + boundary: "b9826c20-773c-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""import http.client +import mimetypes +from codecs import encode + +headers = { + "User-Agent": "Test Agent", + "content-type": "multipart/form-data; boundary=929dc910-7714-1f0c-814d-a1b3d90cd6b3" +} + +def build_data_list(fields): + dataList = [] + for field in fields: + name = field.get('name', '') + value = field.get('value', '') + type_ = field.get('type', 'text') + dataList.append(encode('--929dc910-7714-1f0c-814d-a1b3d90cd6b3')) + 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(f'--929dc910-7714-1f0c-814d-a1b3d90cd6b3--')) + dataList.append(encode('')) + return dataList + +dataList = build_data_list([{"name":"text","value":"API","type":"text"},{"name":"sep","value":"|","type":"text"},{"name":"times","value":"3","type":"text"}]) +body = b'\r\n'.join(dataList) +conn = http.client.HTTPSConnection("api.apidash.dev") +conn.request("POST", "/io/form", + body= body, + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost5, "https", + boundary: "929dc910-7714-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + + test('POST 6', () { + const expectedCode = r"""import http.client +import mimetypes +from codecs import encode + +headers = { + "content-type": "multipart/form-data; boundary=9b1374c0-76e0-1f0c-814d-a1b3d90cd6b3" +} + +def build_data_list(fields): + dataList = [] + for field in fields: + name = field.get('name', '') + value = field.get('value', '') + type_ = field.get('type', 'text') + dataList.append(encode('--9b1374c0-76e0-1f0c-814d-a1b3d90cd6b3')) + 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(f'--9b1374c0-76e0-1f0c-814d-a1b3d90cd6b3--')) + dataList.append(encode('')) + return dataList + +dataList = build_data_list([{"name":"token","value":"xyz","type":"text"},{"name":"imfile","value":"/Documents/up/1.png","type":"file"}]) +body = b'\r\n'.join(dataList) +conn = http.client.HTTPSConnection("api.apidash.dev") +conn.request("POST", "/io/img", + body= body, + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost6, "https", + boundary: "9b1374c0-76e0-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + + test('POST 7', () { + const expectedCode = r"""import http.client +import mimetypes +from codecs import encode + +headers = { + "content-type": "multipart/form-data; boundary=defdf240-76b4-1f0c-814d-a1b3d90cd6b3" +} + +def build_data_list(fields): + dataList = [] + for field in fields: + name = field.get('name', '') + value = field.get('value', '') + type_ = field.get('type', 'text') + dataList.append(encode('--defdf240-76b4-1f0c-814d-a1b3d90cd6b3')) + 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(f'--defdf240-76b4-1f0c-814d-a1b3d90cd6b3--')) + dataList.append(encode('')) + return dataList + +dataList = build_data_list([{"name":"token","value":"xyz","type":"text"},{"name":"imfile","value":"/Documents/up/1.png","type":"file"}]) +body = b'\r\n'.join(dataList) +conn = http.client.HTTPSConnection("api.apidash.dev") +conn.request("POST", "/io/img", + body= body, + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost7, "https", + boundary: "defdf240-76b4-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + + test('POST 8', () { + const expectedCode = r"""import http.client +import mimetypes +from codecs import encode +from urllib.parse import urlencode + +queryParams = { + "size": "2", + "len": "3" +} +queryParamsStr = '?' + urlencode(queryParams) + +headers = { + "content-type": "multipart/form-data; boundary=a990b150-7683-1f0c-814d-a1b3d90cd6b3" +} + +def build_data_list(fields): + dataList = [] + for field in fields: + name = field.get('name', '') + value = field.get('value', '') + type_ = field.get('type', 'text') + dataList.append(encode('--a990b150-7683-1f0c-814d-a1b3d90cd6b3')) + 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(f'--a990b150-7683-1f0c-814d-a1b3d90cd6b3--')) + dataList.append(encode('')) + return dataList + +dataList = build_data_list([{"name":"text","value":"API","type":"text"},{"name":"sep","value":"|","type":"text"},{"name":"times","value":"3","type":"text"}]) +body = b'\r\n'.join(dataList) +conn = http.client.HTTPSConnection("api.apidash.dev") +conn.request("POST", "/io/form" + queryParamsStr, + body= body, + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost8, "https", + boundary: "a990b150-7683-1f0c-814d-a1b3d90cd6b3"), + expectedCode); + }); + + test('POST 9', () { + const expectedCode = r"""import http.client +import mimetypes +from codecs import encode +from urllib.parse import urlencode + +queryParams = { + "size": "2", + "len": "3" +} +queryParamsStr = '?' + urlencode(queryParams) + +headers = { + "User-Agent": "Test Agent", + "Keep-Alive": "true", + "content-type": "multipart/form-data; boundary=79088e00-75ec-1f0c-814d-a1b3d90cd6b3" +} + +def build_data_list(fields): + dataList = [] + for field in fields: + name = field.get('name', '') + value = field.get('value', '') + type_ = field.get('type', 'text') + dataList.append(encode('--79088e00-75ec-1f0c-814d-a1b3d90cd6b3')) + 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(f'--79088e00-75ec-1f0c-814d-a1b3d90cd6b3--')) + dataList.append(encode('')) + return dataList + +dataList = build_data_list([{"name":"token","value":"xyz","type":"text"},{"name":"imfile","value":"/Documents/up/1.png","type":"file"}]) +body = b'\r\n'.join(dataList) +conn = http.client.HTTPSConnection("api.apidash.dev") +conn.request("POST", "/io/img" + queryParamsStr, + body= body, + headers= headers) + +res = conn.getresponse() +data = res.read() + +print(data.decode("utf-8")) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPost9, "https", + boundary: "79088e00-75ec-1f0c-814d-a1b3d90cd6b3"), expectedCode); }); }); @@ -384,8 +734,8 @@ body = r'''{ }''' headers = { - "content-type": "application/json" - } + "content-type": "application/json" +} conn = http.client.HTTPSConnection("reqres.in") conn.request("PUT", "/api/users/2", @@ -397,7 +747,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPut1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPut1, "https"), expectedCode); }); }); @@ -412,8 +764,8 @@ body = r'''{ }''' headers = { - "content-type": "application/json" - } + "content-type": "application/json" +} conn = http.client.HTTPSConnection("reqres.in") conn.request("PATCH", "/api/users/2", @@ -425,7 +777,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelPatch1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelPatch1, "https"), expectedCode); }); }); @@ -442,7 +796,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelDelete1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelDelete1, "https"), expectedCode); }); @@ -455,8 +811,8 @@ body = r'''{ }''' headers = { - "content-type": "application/json" - } + "content-type": "application/json" +} conn = http.client.HTTPSConnection("reqres.in") conn.request("DELETE", "/api/users/2", @@ -468,7 +824,9 @@ data = res.read() print(data.decode("utf-8")) """; - expect(pythonHttpClientCodeGen.getCode(requestModelDelete2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonHttpClient, requestModelDelete2, "https"), expectedCode); }); }); diff --git a/test/codegen/python_requests_codegen_test.dart b/test/codegen/python_requests_codegen_test.dart index 3ed0a38a..057c09c6 100644 --- a/test/codegen/python_requests_codegen_test.dart +++ b/test/codegen/python_requests_codegen_test.dart @@ -1,9 +1,10 @@ -import 'package:apidash/codegen/python/requests.dart'; -import '../request_models.dart'; +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; import 'package:test/test.dart'; +import '../request_models.dart'; void main() { - final pythonRequestsCodeGen = PythonRequestsCodeGen(); + final codeGen = Codegen(); group('GET Request', () { test('GET 1', () { @@ -16,7 +17,9 @@ response = requests.get(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet1, "https"), expectedCode); }); @@ -26,15 +29,17 @@ print('Response Body:', response.text) 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); }); @@ -44,15 +49,17 @@ print('Response Body:', response.text) 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); }); @@ -62,19 +69,21 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/humanize/social' params = { - "num": "8700000", - "digits": "3", - "system": "SS", - "add_space": "true", - "trailing_zeros": "true" - } + "num": "8700000", + "digits": "3", + "system": "SS", + "add_space": "true", + "trailing_zeros": "true" +} response = requests.get(url, params=params) 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,19 +113,21 @@ 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); }); @@ -128,7 +141,9 @@ response = requests.get(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet7, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet7, "https"), expectedCode); }); @@ -138,19 +153,21 @@ 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); }); @@ -160,16 +177,18 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/humanize/social' params = { - "num": "8700000", - "add_space": "true" - } + "num": "8700000", + "add_space": "true" +} response = requests.get(url, params=params) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet9, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet9, "https"), expectedCode); }); @@ -179,8 +198,8 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/humanize/social' headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.get(url, headers=headers) @@ -188,7 +207,8 @@ print('Status Code:', response.status_code) print('Response Body:', response.text) """; expect( - pythonRequestsCodeGen.getCode( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet10, "https", ), @@ -201,20 +221,22 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/humanize/social' params = { - "num": "8700000", - "digits": "3" - } + "num": "8700000", + "digits": "3" +} headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.get(url, params=params, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet11, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet11, "https"), expectedCode); }); @@ -228,7 +250,9 @@ response = requests.get(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelGet12, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelGet12, "https"), expectedCode); }); }); @@ -244,7 +268,9 @@ response = requests.head(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelHead1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelHead1, "https"), expectedCode); }); @@ -258,7 +284,9 @@ response = requests.head(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelHead2, "http"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelHead2, "http"), expectedCode); }); }); @@ -274,15 +302,17 @@ payload = r'''{ }''' 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); }); @@ -292,7 +322,12 @@ print('Response Body:', response.text) url = 'https://api.apidash.dev/case/lower' payload = { -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": None, +"male": True, +"female": False, +"no": 1.2, +"arr": ["null", "true", "false", None] } response = requests.post(url, json=payload) @@ -300,7 +335,9 @@ response = requests.post(url, json=payload) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost2, "https"), expectedCode); }); @@ -314,15 +351,189 @@ payload = { } headers = { - "User-Agent": "Test Agent" - } + "User-Agent": "Test Agent" +} response = requests.post(url, json=payload, headers=headers) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPost3, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/form' + +payload = MultipartEncoder({ + "text": "API", + "sep": "|", + "times": "3", +}) + +headers = { + "content-type": payload.content_type +} + +response = requests.post(url, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost4, "https"), + expectedCode); + }); + + test('POST 5', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/form' + +payload = MultipartEncoder({ + "text": "API", + "sep": "|", + "times": "3", +}) + +headers = { + "User-Agent": "Test Agent", + "content-type": payload.content_type +} + +response = requests.post(url, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost5, "https"), + expectedCode); + }); + + test('POST 6', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/img' + +payload = MultipartEncoder({ + "token": "xyz", + "imfile": ("1.png", open("/Documents/up/1.png", "rb")), +}) + +headers = { + "content-type": payload.content_type +} + +response = requests.post(url, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost6, "https"), + expectedCode); + }); + + test('POST 7', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/img' + +payload = MultipartEncoder({ + "token": "xyz", + "imfile": ("1.png", open("/Documents/up/1.png", "rb")), +}) + +headers = { + "content-type": payload.content_type +} + +response = requests.post(url, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost7, "https"), + expectedCode); + }); + + test('POST 8', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/form' + +params = { + "size": "2", + "len": "3" +} + +payload = MultipartEncoder({ + "text": "API", + "sep": "|", + "times": "3", +}) + +headers = { + "content-type": payload.content_type +} + +response = requests.post(url, params=params, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost8, "https"), + expectedCode); + }); + + test('POST 9', () { + const expectedCode = r"""import requests +from requests_toolbelt.multipart.encoder import MultipartEncoder + +url = 'https://api.apidash.dev/io/img' + +params = { + "size": "2", + "len": "3" +} + +payload = MultipartEncoder({ + "token": "xyz", + "imfile": ("1.png", open("/Documents/up/1.png", "rb")), +}) + +headers = { + "User-Agent": "Test Agent", + "Keep-Alive": "true", + "content-type": payload.content_type +} + +response = requests.post(url, params=params, data=payload, headers=headers) + +print('Status Code:', response.status_code) +print('Response Body:', response.text) +"""; + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPost9, "https"), expectedCode); }); }); @@ -343,7 +554,9 @@ response = requests.put(url, json=payload) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPut1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPut1, "https"), expectedCode); }); }); @@ -364,7 +577,9 @@ response = requests.patch(url, json=payload) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelPatch1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelPatch1, "https"), expectedCode); }); }); @@ -380,7 +595,9 @@ response = requests.delete(url) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelDelete1, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelDelete1, "https"), expectedCode); }); @@ -399,7 +616,9 @@ response = requests.delete(url, json=payload) print('Status Code:', response.status_code) print('Response Body:', response.text) """; - expect(pythonRequestsCodeGen.getCode(requestModelDelete2, "https"), + expect( + codeGen.getCode( + CodegenLanguage.pythonRequests, requestModelDelete2, "https"), expectedCode); }); }); diff --git a/test/codegen/rust_actix_codegen_test.dart b/test/codegen/rust_actix_codegen_test.dart new file mode 100644 index 00000000..8e215295 --- /dev/null +++ b/test/codegen/rust_actix_codegen_test.dart @@ -0,0 +1,1094 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet1, "https"), + expectedCode); + }); + + test('GET 2', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/country/data"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .query(&[("code", "US")]) + .unwrap() + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet2, "https"), + expectedCode); + }); + + test('GET 3', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/country/data"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .query(&[("code", "IND")]) + .unwrap() + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet3, "https"), + expectedCode); + }); + + test('GET 4', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/humanize/social"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .query(&[("num", "8700000"), ("digits", "3"), ("system", "SS"), ("add_space", "true"), ("trailing_zeros", "true")]) + .unwrap() + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet4, "https"), + expectedCode); + }); + + test('GET 5', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.github.com/repos/foss42/apidash"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .insert_header(("User-Agent", "Test Agent")) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet5, "https"), + expectedCode); + }); + + test('GET 6', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.github.com/repos/foss42/apidash"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .query(&[("raw", "true")]) + .unwrap() + .insert_header(("User-Agent", "Test Agent")) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet6, "https"), + expectedCode); + }); + + test('GET 7', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet7, "https"), + expectedCode); + }); + + test('GET 8', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.github.com/repos/foss42/apidash"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .query(&[("raw", "true")]) + .unwrap() + .insert_header(("User-Agent", "Test Agent")) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet8, "https"), + expectedCode); + }); + + test('GET 9', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/humanize/social"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .query(&[("num", "8700000"), ("add_space", "true")]) + .unwrap() + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/humanize/social"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .insert_header(("User-Agent", "Test Agent")) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/humanize/social"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .query(&[("num", "8700000"), ("digits", "3")]) + .unwrap() + .insert_header(("User-Agent", "Test Agent")) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/humanize/social"; + let client = awc::Client::default(); + + let mut response = client + .get(url) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelGet12, "https"), + expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD 1', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev"; + let client = awc::Client::default(); + + let mut response = client + .head(url) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelHead1, "https"), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "http://api.apidash.dev"; + let client = awc::Client::default(); + + let mut response = client + .head(url) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelHead2, "http"), + expectedCode); + }); + }); + + group('POST Request', () { + test('POST 1', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/case/lower"; + let client = awc::Client::default(); + + let payload = r#"{ +"text": "I LOVE Flutter" +}"#; + + let mut response = client + .post(url) + .insert_header(("content-type", "text/plain")) + .send_body(payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelPost1, "https"), + expectedCode); + }); + + test('POST 2', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/case/lower"; + let client = awc::Client::default(); + + let payload = serde_json::json!({ +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] +}); + + let mut response = client + .post(url) + .send_json(&payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelPost2, "https"), + expectedCode); + }); + + test('POST 3', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/case/lower"; + let client = awc::Client::default(); + + let payload = serde_json::json!({ +"text": "I LOVE Flutter" +}); + + let mut response = client + .post(url) + .insert_header(("User-Agent", "Test Agent")) + .send_json(&payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r"""use std::io::Read; +#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/io/form"; + let client = awc::Client::default(); + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let mut response = client + .post(url) + .insert_header(("content-type", "multipart/form-data; boundary=test")) + .send_body(payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, + requestModelPost4, + "https", + boundary: "test", + ), + expectedCode); + }); + test('POST 5', () { + const expectedCode = r"""use std::io::Read; +#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/io/form"; + let client = awc::Client::default(); + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let mut response = client + .post(url) + .insert_header(("User-Agent", "Test Agent")) + .insert_header(("content-type", "multipart/form-data; boundary=test")) + .send_body(payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelPost5, "https", + boundary: "test"), + expectedCode); + }); + test('POST 6', () { + const expectedCode = r"""use std::io::Read; +#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/io/img"; + let client = awc::Client::default(); + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let mut response = client + .post(url) + .insert_header(("content-type", "multipart/form-data; boundary=test")) + .send_body(payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelPost6, "https", + boundary: "test"), + expectedCode); + }); + test('POST 7', () { + const expectedCode = r"""use std::io::Read; +#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/io/img"; + let client = awc::Client::default(); + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let mut response = client + .post(url) + .insert_header(("content-type", "multipart/form-data; boundary=test")) + .send_body(payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelPost7, "https", + boundary: "test"), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r"""use std::io::Read; +#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/io/form"; + let client = awc::Client::default(); + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let mut response = client + .post(url) + .query(&[("size", "2"), ("len", "3")]) + .unwrap() + .insert_header(("content-type", "multipart/form-data; boundary=test")) + .send_body(payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelPost8, "https", + boundary: "test"), + expectedCode); + }); + test('POST 9', () { + const expectedCode = r"""use std::io::Read; +#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://api.apidash.dev/io/img"; + let client = awc::Client::default(); + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let mut response = client + .post(url) + .query(&[("size", "2"), ("len", "3")]) + .unwrap() + .insert_header(("User-Agent", "Test Agent")) + .insert_header(("Keep-Alive", "true")) + .insert_header(("content-type", "multipart/form-data; boundary=test")) + .send_body(payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelPost9, "https", + boundary: "test"), + expectedCode); + }); + }); + + group('PUT Request', () { + test('PUT 1', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://reqres.in/api/users/2"; + let client = awc::Client::default(); + + let payload = serde_json::json!({ +"name": "morpheus", +"job": "zion resident" +}); + + let mut response = client + .put(url) + .send_json(&payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustActix, requestModelPut1, "https"), + expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://reqres.in/api/users/2"; + let client = awc::Client::default(); + + let payload = serde_json::json!({ +"name": "marfeus", +"job": "accountant" +}); + + let mut response = client + .patch(url) + .send_json(&payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelPatch1, "https"), + expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://reqres.in/api/users/2"; + let client = awc::Client::default(); + + let mut response = client + .delete(url) + .send() + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelDelete1, "https"), + expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = r"""#[actix_rt::main] +async fn main() -> Result<(), Box> { + let url = "https://reqres.in/api/users/2"; + let client = awc::Client::default(); + + let payload = serde_json::json!({ +"name": "marfeus", +"job": "accountant" +}); + + let mut response = client + .delete(url) + .send_json(&payload) + .await + .unwrap(); + + let body_bytes = response.body().await.unwrap(); + let body = std::str::from_utf8(&body_bytes).unwrap(); + println!("Response Status: {}", response.status()); + println!("Response: {:?}", body); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustActix, requestModelDelete2, "https"), + expectedCode); + }); + }); +} diff --git a/test/codegen/rust_reqwest_codegen_test.dart b/test/codegen/rust_reqwest_codegen_test.dart new file mode 100644 index 00000000..c262a64e --- /dev/null +++ b/test/codegen/rust_reqwest_codegen_test.dart @@ -0,0 +1,866 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev"; + + let response = client + .get(url) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet1, "https"), + expectedCode); + }); + + test('GET 2', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/country/data"; + + let response = client + .get(url) + .query(&[("code", "US")]) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet2, "https"), + expectedCode); + }); + + test('GET 3', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/country/data"; + + let response = client + .get(url) + .query(&[("code", "IND")]) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet3, "https"), + expectedCode); + }); + + test('GET 4', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/humanize/social"; + + let response = client + .get(url) + .query(&[("num", "8700000"), ("digits", "3"), ("system", "SS"), ("add_space", "true"), ("trailing_zeros", "true")]) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet4, "https"), + expectedCode); + }); + + test('GET 5', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.github.com/repos/foss42/apidash"; + + let response = client + .get(url) + .header("User-Agent", "Test Agent") + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet5, "https"), + expectedCode); + }); + + test('GET 6', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.github.com/repos/foss42/apidash"; + + let response = client + .get(url) + .query(&[("raw", "true")]) + .header("User-Agent", "Test Agent") + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet6, "https"), + expectedCode); + }); + + test('GET 7', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev"; + + let response = client + .get(url) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet7, "https"), + expectedCode); + }); + + test('GET 8', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.github.com/repos/foss42/apidash"; + + let response = client + .get(url) + .query(&[("raw", "true")]) + .header("User-Agent", "Test Agent") + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet8, "https"), + expectedCode); + }); + + test('GET 9', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/humanize/social"; + + let response = client + .get(url) + .query(&[("num", "8700000"), ("add_space", "true")]) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/humanize/social"; + + let response = client + .get(url) + .header("User-Agent", "Test Agent") + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/humanize/social"; + + let response = client + .get(url) + .query(&[("num", "8700000"), ("digits", "3")]) + .header("User-Agent", "Test Agent") + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/humanize/social"; + + let response = client + .get(url) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelGet12, "https"), + expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD 1', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev"; + + let response = client + .head(url) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelHead1, "https"), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "http://api.apidash.dev"; + + let response = client + .head(url) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelHead2, "http"), + expectedCode); + }); + }); + + group('POST Request', () { + test('POST 1', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/case/lower"; + + let payload = r#"{ +"text": "I LOVE Flutter" +}"#; + + let response = client + .post(url) + .header("content-type", "text/plain") + .body(payload) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPost1, "https"), + expectedCode); + }); + + test('POST 2', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/case/lower"; + + let payload = serde_json::json!({ +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] +}); + + let response = client + .post(url) + .json(&payload) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPost2, "https"), + expectedCode); + }); + + test('POST 3', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/case/lower"; + + let payload = serde_json::json!({ +"text": "I LOVE Flutter" +}); + + let response = client + .post(url) + .header("User-Agent", "Test Agent") + .json(&payload) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPost3, "https"), + expectedCode); + }); + test('POST 4', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/io/form"; + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + let mut form = reqwest::blocking::multipart::Form::new(); + + for item in form_data_items { + if item.field_type == "text" { + form = form.text(item.name, item.value); + } else if item.field_type == "file" { + form = form.file(item.name, &item.value)?; + } + } + let response = client + .post(url) + .multipart(form) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, + requestModelPost4, + "https", + boundary: "test", + ), + expectedCode); + }); + test('POST 5', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/io/form"; + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + let mut form = reqwest::blocking::multipart::Form::new(); + + for item in form_data_items { + if item.field_type == "text" { + form = form.text(item.name, item.value); + } else if item.field_type == "file" { + form = form.file(item.name, &item.value)?; + } + } + let response = client + .post(url) + .header("User-Agent", "Test Agent") + .multipart(form) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPost5, "https", + boundary: "test"), + expectedCode); + }); + test('POST 6', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/io/img"; + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + let mut form = reqwest::blocking::multipart::Form::new(); + + for item in form_data_items { + if item.field_type == "text" { + form = form.text(item.name, item.value); + } else if item.field_type == "file" { + form = form.file(item.name, &item.value)?; + } + } + let response = client + .post(url) + .multipart(form) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPost6, "https", + boundary: "test"), + expectedCode); + }); + test('POST 7', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/io/img"; + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + let mut form = reqwest::blocking::multipart::Form::new(); + + for item in form_data_items { + if item.field_type == "text" { + form = form.text(item.name, item.value); + } else if item.field_type == "file" { + form = form.file(item.name, &item.value)?; + } + } + let response = client + .post(url) + .multipart(form) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPost7, "https", + boundary: "test"), + expectedCode); + }); + test('POST 8', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/io/form"; + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + let mut form = reqwest::blocking::multipart::Form::new(); + + for item in form_data_items { + if item.field_type == "text" { + form = form.text(item.name, item.value); + } else if item.field_type == "file" { + form = form.file(item.name, &item.value)?; + } + } + let response = client + .post(url) + .query(&[("size", "2"), ("len", "3")]) + .multipart(form) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPost8, "https", + boundary: "test"), + expectedCode); + }); + test('POST 9', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://api.apidash.dev/io/img"; + + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + let mut form = reqwest::blocking::multipart::Form::new(); + + for item in form_data_items { + if item.field_type == "text" { + form = form.text(item.name, item.value); + } else if item.field_type == "file" { + form = form.file(item.name, &item.value)?; + } + } + let response = client + .post(url) + .query(&[("size", "2"), ("len", "3")]) + .header("User-Agent", "Test Agent") + .header("Keep-Alive", "true") + .multipart(form) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPost9, "https", + boundary: "test"), + expectedCode); + }); + }); + + group('PUT Request', () { + test('PUT 1', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://reqres.in/api/users/2"; + + let payload = serde_json::json!({ +"name": "morpheus", +"job": "zion resident" +}); + + let response = client + .put(url) + .json(&payload) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPut1, "https"), + expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://reqres.in/api/users/2"; + + let payload = serde_json::json!({ +"name": "marfeus", +"job": "accountant" +}); + + let response = client + .patch(url) + .json(&payload) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelPatch1, "https"), + expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://reqres.in/api/users/2"; + + let response = client + .delete(url) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelDelete1, "https"), + expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = + r"""fn main() -> Result<(), Box> { + let client = reqwest::blocking::Client::new(); + let url = "https://reqres.in/api/users/2"; + + let payload = serde_json::json!({ +"name": "marfeus", +"job": "accountant" +}); + + let response = client + .delete(url) + .json(&payload) + .send()?; + + println!("Status Code: {}", response.status()); + println!("Response Body: {}", response.text()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustReqwest, requestModelDelete2, "https"), + expectedCode); + }); + }); +} diff --git a/test/codegen/rust_ureq_codegen_test.dart b/test/codegen/rust_ureq_codegen_test.dart new file mode 100644 index 00000000..b6985f3f --- /dev/null +++ b/test/codegen/rust_ureq_codegen_test.dart @@ -0,0 +1,871 @@ +import 'package:apidash/codegen/codegen.dart'; +import 'package:apidash/consts.dart'; +import 'package:test/test.dart'; +import '../request_models.dart'; + +void main() { + final codeGen = Codegen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev"; + let response = ureq::get(url) + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet1, "https"), + expectedCode); + }); + + test('GET 2', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/country/data"; + let response = ureq::get(url) + .query("code", "US") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet2, "https"), + expectedCode); + }); + + test('GET 3', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/country/data"; + let response = ureq::get(url) + .query("code", "IND") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet3, "https"), + expectedCode); + }); + + test('GET 4', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/humanize/social"; + let response = ureq::get(url) + .query("num", "8700000") + .query("digits", "3") + .query("system", "SS") + .query("add_space", "true") + .query("trailing_zeros", "true") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet4, "https"), + expectedCode); + }); + + test('GET 5', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.github.com/repos/foss42/apidash"; + let response = ureq::get(url) + .set("User-Agent", "Test Agent") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet5, "https"), + expectedCode); + }); + + test('GET 6', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.github.com/repos/foss42/apidash"; + let response = ureq::get(url) + .query("raw", "true") + .set("User-Agent", "Test Agent") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet6, "https"), + expectedCode); + }); + + test('GET 7', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev"; + let response = ureq::get(url) + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet7, "https"), + expectedCode); + }); + + test('GET 8', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.github.com/repos/foss42/apidash"; + let response = ureq::get(url) + .query("raw", "true") + .set("User-Agent", "Test Agent") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet8, "https"), + expectedCode); + }); + + test('GET 9', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/humanize/social"; + let response = ureq::get(url) + .query("num", "8700000") + .query("add_space", "true") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet9, "https"), + expectedCode); + }); + + test('GET 10', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/humanize/social"; + let response = ureq::get(url) + .set("User-Agent", "Test Agent") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustUreq, + requestModelGet10, + "https", + ), + expectedCode); + }); + + test('GET 11', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/humanize/social"; + let response = ureq::get(url) + .query("num", "8700000") + .query("digits", "3") + .set("User-Agent", "Test Agent") + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet11, "https"), + expectedCode); + }); + + test('GET 12', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/humanize/social"; + let response = ureq::get(url) + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelGet12, "https"), + expectedCode); + }); + }); + + group('HEAD Request', () { + test('HEAD 1', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev"; + let response = ureq::head(url) + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelHead1, "https"), + expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "http://api.apidash.dev"; + let response = ureq::head(url) + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelHead2, "http"), + expectedCode); + }); + }); + + group('POST Request', () { + test('POST 1', () { + const expectedCode = r'''fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/case/lower"; + let payload = r#"{ +"text": "I LOVE Flutter" +}"#; + + let response = ureq::post(url) + .set("content-type", "text/plain") + .send_string(payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +'''; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost1, "https"), + expectedCode); + }); + + test('POST 2', () { + const expectedCode = r'''fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/case/lower"; + let payload = ureq::json!({ +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] +}); + + let response = ureq::post(url) + .send_json(payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +'''; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost2, "https"), + expectedCode); + }); + + test('POST 3', () { + const expectedCode = r'''fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/case/lower"; + let payload = ureq::json!({ +"text": "I LOVE Flutter" +}); + + let response = ureq::post(url) + .set("User-Agent", "Test Agent") + .send_json(payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +'''; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost3, "https"), + expectedCode); + }); + + test('POST 4', () { + const expectedCode = r"""use std::io::Read; +fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/io/form"; + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let response = ureq::post(url) + .set("content-type", "multipart/form-data; boundary=test") + .send_bytes(&payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustUreq, + requestModelPost4, + "https", + boundary: "test", + ), + expectedCode); + }); + test('POST 5', () { + const expectedCode = r"""use std::io::Read; +fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/io/form"; + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let response = ureq::post(url) + .set("User-Agent", "Test Agent") + .set("content-type", "multipart/form-data; boundary=test") + .send_bytes(&payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost5, "https", + boundary: "test"), + expectedCode); + }); + test('POST 6', () { + const expectedCode = r"""use std::io::Read; +fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/io/img"; + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let response = ureq::post(url) + .set("content-type", "multipart/form-data; boundary=test") + .send_bytes(&payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost6, "https", + boundary: "test"), + expectedCode); + }); + test('POST 7', () { + const expectedCode = r"""use std::io::Read; +fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/io/img"; + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let response = ureq::post(url) + .set("content-type", "multipart/form-data; boundary=test") + .send_bytes(&payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost7, "https", + boundary: "test"), + expectedCode); + }); + test('POST 8', () { + const expectedCode = r"""use std::io::Read; +fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/io/form"; + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "text".to_string(), + value: "API".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "sep".to_string(), + value: "|".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "times".to_string(), + value: "3".to_string(), + field_type: "text".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let response = ureq::post(url) + .query("size", "2") + .query("len", "3") + .set("content-type", "multipart/form-data; boundary=test") + .send_bytes(&payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost8, "https", + boundary: "test"), + expectedCode); + }); + test('POST 9', () { + const expectedCode = r"""use std::io::Read; +fn main() -> Result<(), ureq::Error> { + let url = "https://api.apidash.dev/io/img"; + struct FormDataItem { + name: String, + value: String, + field_type: String, + } + + let form_data_items: Vec = vec![ + FormDataItem { + name: "token".to_string(), + value: "xyz".to_string(), + field_type: "text".to_string(), + }, + FormDataItem { + name: "imfile".to_string(), + value: "/Documents/up/1.png".to_string(), + field_type: "file".to_string(), + }, + ]; + + fn build_data_list(fields: Vec) -> Vec { + let mut data_list = Vec::new(); + + for field in fields { + data_list.extend_from_slice(b"--test\r\n"); + + if field.field_type == "text" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"\r\n", field.name).as_bytes()); + data_list.extend_from_slice(b"Content-Type: text/plain\r\n\r\n"); + data_list.extend_from_slice(field.value.as_bytes()); + data_list.extend_from_slice(b"\r\n"); + } else if field.field_type == "file" { + data_list.extend_from_slice(format!("Content-Disposition: form-data; name=\"{}\"; filename=\"{}\"\r\n", field.name, field.value).as_bytes()); + + let mime_type = mime_guess::from_path(&field.value).first_or(mime_guess::mime::APPLICATION_OCTET_STREAM); + data_list.extend_from_slice(format!("Content-Type: {}\r\n\r\n", mime_type).as_bytes()); + + let mut file = std::fs::File::open(&field.value).unwrap(); + let mut file_contents = Vec::new(); + file.read_to_end(&mut file_contents).unwrap(); + data_list.extend_from_slice(&file_contents); + data_list.extend_from_slice(b"\r\n"); + } + } + + data_list.extend_from_slice(b"--test--\r\n"); + data_list + } + + let payload = build_data_list(form_data_items); + let response = ureq::post(url) + .query("size", "2") + .query("len", "3") + .set("User-Agent", "Test Agent") + .set("Keep-Alive", "true") + .set("content-type", "multipart/form-data; boundary=test") + .send_bytes(&payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPost9, "https", + boundary: "test"), + expectedCode); + }); + }); + + group('PUT Request', () { + test('PUT 1', () { + const expectedCode = r'''fn main() -> Result<(), ureq::Error> { + let url = "https://reqres.in/api/users/2"; + let payload = ureq::json!({ +"name": "morpheus", +"job": "zion resident" +}); + + let response = ureq::put(url) + .send_json(payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +'''; + expect( + codeGen.getCode(CodegenLanguage.rustUreq, requestModelPut1, "https"), + expectedCode); + }); + }); + + group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = r'''fn main() -> Result<(), ureq::Error> { + let url = "https://reqres.in/api/users/2"; + let payload = ureq::json!({ +"name": "marfeus", +"job": "accountant" +}); + + let response = ureq::patch(url) + .send_json(payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +'''; + expect( + codeGen.getCode( + CodegenLanguage.rustUreq, requestModelPatch1, "https"), + expectedCode); + }); + }); + + group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = r"""fn main() -> Result<(), ureq::Error> { + let url = "https://reqres.in/api/users/2"; + let response = ureq::delete(url) + .call()?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +"""; + expect( + codeGen.getCode( + CodegenLanguage.rustUreq, requestModelDelete1, "https"), + expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = r'''fn main() -> Result<(), ureq::Error> { + let url = "https://reqres.in/api/users/2"; + let payload = ureq::json!({ +"name": "marfeus", +"job": "accountant" +}); + + let response = ureq::delete(url) + .send_json(payload)?; + + println!("Response Status: {}", response.status()); + println!("Response: {}", response.into_string()?); + + Ok(()) +} +'''; + expect( + codeGen.getCode( + CodegenLanguage.rustUreq, requestModelDelete2, "https"), + expectedCode); + }); + }); +} diff --git a/test/models/request_model_test.dart b/test/models/request_model_test.dart index 1bb40ec7..b7dbb413 100644 --- a/test/models/request_model_test.dart +++ b/test/models/request_model_test.dart @@ -175,7 +175,7 @@ void main() { }); expect(requestModel.paramsMap, {}); expect(requestModel.formDataMapList, []); - expect(requestModel.isFormDataRequest, false); + expect(requestModel.hasFormData, false); expect(requestModel.hasContentTypeHeader, true); }); diff --git a/test/request_models.dart b/test/request_models.dart index 0c3d85e2..67ff2835 100644 --- a/test/request_models.dart +++ b/test/request_models.dart @@ -209,7 +209,12 @@ const requestModelPost2 = RequestModel( url: 'https://api.apidash.dev/case/lower', method: HTTPVerb.post, requestBody: r"""{ -"text": "I LOVE Flutter" +"text": "I LOVE Flutter", +"flag": null, +"male": true, +"female": false, +"no": 1.2, +"arr": ["null", "true", "false", null] }""", ); diff --git a/test/utils/har_utils_test.dart b/test/utils/har_utils_test.dart index 174ab180..9655e7c1 100644 --- a/test/utils/har_utils_test.dart +++ b/test/utils/har_utils_test.dart @@ -261,14 +261,19 @@ void main() { 'postData': { 'mimeType': 'application/json', 'text': '{\n' - '"text": "I LOVE Flutter"\n' + '"text": "I LOVE Flutter",\n' + '"flag": null,\n' + '"male": true,\n' + '"female": false,\n' + '"no": 1.2,\n' + '"arr": ["null", "true", "false", null]\n' '}', 'comment': '' }, 'comment': '', 'cookies': [], 'headersSize': -1, - 'bodySize': 28 + 'bodySize': 124 }; expect( requestModelToHARJsonRequest(