From ac7950efe7f301e848e424ac11aaa8e10545ea26 Mon Sep 17 00:00:00 2001 From: PCoder23 Date: Sat, 24 Feb 2024 11:02:05 +0530 Subject: [PATCH 01/26] Added codegen for java htttpclient with test cases --- lib/codegen/codegen.dart | 3 + lib/codegen/java/httpclient.dart | 181 ++++ lib/consts.dart | 4 +- .../java_http_client_codegen_test.dart | 800 ++++++++++++++++++ 4 files changed, 987 insertions(+), 1 deletion(-) create mode 100644 lib/codegen/java/httpclient.dart create mode 100644 test/codegen/java_http_client_codegen_test.dart diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 1aec7144..7276ed29 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -9,6 +9,7 @@ import 'js/axios.dart'; import 'js/fetch.dart'; import 'others/har.dart'; import 'others/curl.dart'; +import 'java/httpclient.dart'; class Codegen { String? getCode( @@ -42,6 +43,8 @@ class Codegen { .getCode(requestModel, defaultUriScheme); case CodegenLanguage.pythonRequests: return PythonRequestsCodeGen().getCode(requestModel, defaultUriScheme); + case CodegenLanguage.javaHttpClient: + return JavaHttpClientCodeGen().getCode(requestModel, defaultUriScheme); } } } diff --git a/lib/codegen/java/httpclient.dart b/lib/codegen/java/httpclient.dart new file mode 100644 index 00000000..d57c73f3 --- /dev/null +++ b/lib/codegen/java/httpclient.dart @@ -0,0 +1,181 @@ + +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, + String defaultUriScheme, + ) { + try { + String result = ""; + bool hasQuery = false; + bool hasBody = false; + bool hasJsonBody = false; + + String url = requestModel.url; + if (!url.contains("://") && url.isNotEmpty) { + url = "$defaultUriScheme://$url"; + } + + var rec = getValidRequestUri( + 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.isFormDataRequest && 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/consts.dart b/lib/consts.dart index f8f9f97c..5c460043 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -268,7 +268,9 @@ enum CodegenLanguage { nodejsFetch("node.js (fetch)", "javascript", "js"), kotlinOkHttp("Kotlin (okhttp3)", "java", "kt"), pythonHttpClient("Python (http.client)", "python", "py"), - pythonRequests("Python (requests)", "python", "py"); + pythonRequests("Python (requests)", "python", "py"), + javaHttpClient("Java (HttpClient)", "java", "java") + ; const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); final String label; diff --git a/test/codegen/java_http_client_codegen_test.dart b/test/codegen/java_http_client_codegen_test.dart new file mode 100644 index 00000000..83b71d2f --- /dev/null +++ b/test/codegen/java_http_client_codegen_test.dart @@ -0,0 +1,800 @@ +import 'package:test/test.dart'; +import 'package:apidash/codegen/java/httpclient.dart'; +import '../request_models.dart'; + +void main() { + final javaHttpClientCodeGen = JavaHttpClientCodeGen(); + + group('GET Request', () { + test('GET 1', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet1, "https"), expectedCode); + }); + + test('GET 2', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/country/data"; + try { + URI uri = new URI(url); + url = uri.resolve("code=US").toString(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet2, "https"), expectedCode); + }); + + test('GET 3', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/country/data"; + try { + URI uri = new URI(url); + url = uri.resolve("code=IND").toString(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet3, "https"), expectedCode); + }); + + test('GET 4', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/humanize/social"; + try { + URI uri = new URI(url); + url = uri.resolve("num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true").toString(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet4, "https"), expectedCode); + }); + + test('GET 5', () { + const expectedCode = """ +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(); + + String url = "https://api.github.com/repos/foss42/apidash"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("User-Agent", "Test Agent") + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet5, "https"), expectedCode); + }); + + test('GET 6', () { + const expectedCode = """ +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(); + + String url = "https://api.github.com/repos/foss42/apidash"; + try { + URI uri = new URI(url); + url = uri.resolve("raw=true").toString(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("User-Agent", "Test Agent") + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet6, "https"), expectedCode); + }); + + test('GET 7', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet7, "https"), expectedCode); + }); + + test('GET 8', () { + const expectedCode = """ +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(); + + String url = "https://api.github.com/repos/foss42/apidash"; + try { + URI uri = new URI(url); + url = uri.resolve("raw=true").toString(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("User-Agent", "Test Agent") + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet8, "https"), expectedCode); + }); + + test('GET 9', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/humanize/social"; + try { + URI uri = new URI(url); + url = uri.resolve("num=8700000&add_space=true").toString(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet9, "https"), expectedCode); + }); + + test('GET 10', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/humanize/social"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("User-Agent", "Test Agent") + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet10, "https"), expectedCode); + }); + + test('GET 11', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/humanize/social"; + try { + URI uri = new URI(url); + url = uri.resolve("num=8700000&digits=3").toString(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("User-Agent", "Test Agent") + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet11, "https"), expectedCode); + }); + + test('GET 12', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/humanize/social"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .GET() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelGet12, "https"), expectedCode); + }); + + test('HEAD 1', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .HEAD() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelHead1, "https"), expectedCode); + }); + + test('HEAD 2', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .HEAD() + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelHead2, "https"), expectedCode); + }); +}); + +group('POST Request', () { + test('POST 1', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/case/lower"; + + String body = "{\\n\\"text\\": \\"I LOVE Flutter\\"\\n}"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Content-Type", "text/plain") + .POST(BodyPublishers.ofString(body)) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelPost1, "https"), expectedCode); + }); + + test('POST 2', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/case/lower"; + + String body = "{\\n\\"text\\": \\"I LOVE Flutter\\"\\n}"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Content-Type", "application/json") + .POST(BodyPublishers.ofString(body)) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelPost2, "https"), expectedCode); + }); + + test('POST 3', () { + const expectedCode = """ +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(); + + String url = "https://api.foss42.com/case/lower"; + + String body = "{\\n\\"text\\": \\"I LOVE Flutter\\"\\n}"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Content-Type", "application/json") + .header("User-Agent", "Test Agent") + .POST(BodyPublishers.ofString(body)) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelPost3, "https"), expectedCode); + }); +}); + +group('PUT Request', () { + test('PUT 1', () { + const expectedCode = """ +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(); + + String url = "https://reqres.in/api/users/2"; + + String body = "{\\n\\"name\\": \\"morpheus\\",\\n\\"job\\": \\"zion resident\\"\\n}"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Content-Type", "application/json") + .PUT(BodyPublishers.ofString(body)) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelPut1, "https"), expectedCode); + }); +}); + +group('PATCH Request', () { + test('PATCH 1', () { + const expectedCode = """ +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(); + + String url = "https://reqres.in/api/users/2"; + + String body = "{\\n\\"name\\": \\"marfeus\\",\\n\\"job\\": \\"accountant\\"\\n}"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Content-Type", "application/json") + .PATCH(BodyPublishers.ofString(body)) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelPatch1, "https"), expectedCode); + }); +}); + +group('DELETE Request', () { + test('DELETE 1', () { + const expectedCode = """ +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(); + + String url = "https://reqres.in/api/users/2"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .DELETE(BodyPublishers.noBody()) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelDelete1, "https"), expectedCode); + }); + + test('DELETE 2', () { + const expectedCode = """ +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(); + + String url = "https://reqres.in/api/users/2"; + + String body = "{\\n\\"name\\": \\"marfeus\\",\\n\\"job\\": \\"accountant\\"\\n}"; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Content-Type", "application/json") + .DELETE(BodyPublishers.ofString(body)) + .build(); + + HttpResponse response = client.send(request, BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + } +} + +"""; + expect(javaHttpClientCodeGen.getCode(requestModelDelete2, "https"), expectedCode); + }); +}); + + + +} \ No newline at end of file From 8f66d25de4f7a5cabc19b25bdfd52efab49b1cef Mon Sep 17 00:00:00 2001 From: Aditya Mayukh Som Date: Sun, 3 Mar 2024 02:42:58 +0530 Subject: [PATCH 02/26] ADD: javaAsyncHttpClient as Codegen Language enum --- lib/consts.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/consts.dart b/lib/consts.dart index d157b7fa..7f090a65 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -271,7 +271,8 @@ enum CodegenLanguage { nodejsFetch("node.js (fetch)", "javascript", "js"), kotlinOkHttp("Kotlin (okhttp3)", "java", "kt"), pythonHttpClient("Python (http.client)", "python", "py"), - pythonRequests("Python (requests)", "python", "py"); + pythonRequests("Python (requests)", "python", "py"), + javaAsyncHttpClient("Java (async-http-client)", "java", "java"); const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); final String label; From 220d58e6389e6af84b0b593123c4e23a671123a3 Mon Sep 17 00:00:00 2001 From: Aditya Mayukh Som Date: Sun, 3 Mar 2024 02:43:23 +0530 Subject: [PATCH 03/26] ADD: switch case for generating javaAsyncHttpClient code generation --- lib/codegen/codegen.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 1aec7144..76aed61b 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -5,6 +5,7 @@ import 'dart/dio.dart'; import 'kotlin/okhttp.dart'; import 'python/http_client.dart'; import 'python/requests.dart'; +import 'java/async_http_client.dart'; import 'js/axios.dart'; import 'js/fetch.dart'; import 'others/har.dart'; @@ -42,6 +43,8 @@ class Codegen { .getCode(requestModel, defaultUriScheme); case CodegenLanguage.pythonRequests: return PythonRequestsCodeGen().getCode(requestModel, defaultUriScheme); + case CodegenLanguage.javaAsyncHttpClient: + return JavaAsyncHttpClientGen().getCode(requestModel, defaultUriScheme); } } } From c9f90a5d56e98fa2b0728ec53e1dd8e71c168789 Mon Sep 17 00:00:00 2001 From: Aditya Mayukh Som Date: Sun, 3 Mar 2024 02:46:10 +0530 Subject: [PATCH 04/26] ADD: JavaAsyncHttpClientGen class --- lib/codegen/java/async_http_client.dart | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 lib/codegen/java/async_http_client.dart diff --git a/lib/codegen/java/async_http_client.dart b/lib/codegen/java/async_http_client.dart new file mode 100644 index 00000000..daaa2103 --- /dev/null +++ b/lib/codegen/java/async_http_client.dart @@ -0,0 +1,9 @@ +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 { +} From c13c788ea9876acb889709b347bab8c9d6b13b5f Mon Sep 17 00:00:00 2001 From: Aditya Mayukh Som Date: Sun, 3 Mar 2024 02:54:07 +0530 Subject: [PATCH 05/26] ADD: templates for code generation --- lib/codegen/java/async_http_client.dart | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/lib/codegen/java/async_http_client.dart b/lib/codegen/java/async_http_client.dart index daaa2103..c6aa368d 100644 --- a/lib/codegen/java/async_http_client.dart +++ b/lib/codegen/java/async_http_client.dart @@ -6,4 +6,72 @@ 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 +"""; + } From b9750ef8b16f061fe0d1357adb72c4c1ae508885 Mon Sep 17 00:00:00 2001 From: Aditya Mayukh Som Date: Sun, 3 Mar 2024 02:58:14 +0530 Subject: [PATCH 06/26] ADD: getCode function to return the generted code string --- lib/codegen/java/async_http_client.dart | 126 ++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/lib/codegen/java/async_http_client.dart b/lib/codegen/java/async_http_client.dart index c6aa368d..f0f688c6 100644 --- a/lib/codegen/java/async_http_client.dart +++ b/lib/codegen/java/async_http_client.dart @@ -74,4 +74,130 @@ public class Main { \n """; + String? getCode( + RequestModel requestModel, + String defaultUriScheme, + ) { + try { + String result = ""; + bool hasBody = false; + bool hasJsonBody = false; + + String url = requestModel.url; + if (!url.contains("://") && url.isNotEmpty) { + url = "$defaultUriScheme://$url"; + } + + var rec = getValidRequestUri( + url, + requestModel.enabledRequestParams, + ); + Uri? uri = rec.$1; + + if (uri == null) { + return ""; + } + + 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.isFormDataRequest && + kMethodsWithBody.contains(method) && + requestBody != null) { + var contentLength = utf8.encode(requestBody).length; + if (contentLength > 0) { + var templateBodyContent = jj.Template(kTemplateRequestBodyContent); + hasBody = true; + + // every JSON should be enclosed within a pair of curly braces + // very simple check for JSON, for stronger check, we may validate + // the JSON in the JSON editor itself + hasJsonBody = + requestBody.startsWith("{") && requestBody.endsWith("}"); + + 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.isFormDataRequest && + 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; + } + } } From 827e0d6b3a3f3d4b599d757b5bb303f6911c3d64 Mon Sep 17 00:00:00 2001 From: Aashutosh soni Date: Mon, 4 Mar 2024 15:07:56 +0530 Subject: [PATCH 07/26] added php Guzzle support --- lib/codegen/codegen.dart | 3 + lib/codegen/php/guzzle.dart | 514 ++++++++++++++++++++++++++++++++++++ lib/consts.dart | 1 + 3 files changed, 518 insertions(+) create mode 100644 lib/codegen/php/guzzle.dart diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 1aec7144..aed1074d 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -3,6 +3,7 @@ import 'package:apidash/consts.dart'; import 'dart/http.dart'; import 'dart/dio.dart'; import 'kotlin/okhttp.dart'; +import 'php/guzzle.dart'; import 'python/http_client.dart'; import 'python/requests.dart'; import 'js/axios.dart'; @@ -37,6 +38,8 @@ class Codegen { .getCode(requestModel, defaultUriScheme); case CodegenLanguage.kotlinOkHttp: return KotlinOkHttpCodeGen().getCode(requestModel, defaultUriScheme); + case CodegenLanguage.phpGuzzle: + return PhpGuzzleCodeGen().getCode(requestModel, defaultUriScheme); case CodegenLanguage.pythonHttpClient: return PythonHttpClientCodeGen() .getCode(requestModel, defaultUriScheme); diff --git a/lib/codegen/php/guzzle.dart b/lib/codegen/php/guzzle.dart new file mode 100644 index 00000000..34ca744a --- /dev/null +++ b/lib/codegen/php/guzzle.dart @@ -0,0 +1,514 @@ +// import 'dart:convert'; +// import 'package:jinja/jinja.dart' as jj; +// import 'package:apidash/utils/utils.dart' +// show padMultilineString, 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 isFormDataRequest %}use GuzzleHttp\\Psr7\\MultipartStream;;{% endif %} +// \ + +// """; + +// String kTemplateParams = """ +// \$queryParams = [ +// {{params}} +// ]; + +// \$queryParamsStr = '?' . http_build_query(\$queryParams); +// \ + +// """; + +// String kTemplateHeader = """ +// \$headers = [ +// {{headers}} +// ]; +// \ + +// """; + +// String kTemplateBody = """ +// \$body = {{body}}; +// \ + +// """; + +// String kMultiPartBodyTemplate = r''' +// //body tempalte + +// '''; +// var kGetFormDataTemplate = """ +// \$multipart = [ +// [ +// 'name' => 'formfield1', +// 'contents' => 'formdata1' +// ], +// [ +// 'name' => 'formfield2', +// 'contents' => 'formdata2' +// ], +// [ +// 'name' => 'formfile1', +// 'contents' => fopen('C:\\Users\\Ashut\\Downloads\\8h45la.png', 'r') +// ] +// ]; + +// {{fields_list}}; +// """; + +// String kTemplateStart = """ +// \$client = new Client(); +// \ + +// """; + +// String kStringRequest = """ +// \$request = new Request('{{method}}', '{{url}}' . \$queryParamsStr, \$headers, \$body); + +// \$res = \$client->sendAsync(\$request)->wait(); + +// echo \$res->getBody(); + +// """; + +// String? getCode( +// RequestModel requestModel, +// String defaultUriScheme, +// ) { +// try { +// jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); +// String importsData = kNodejsImportTemplate.render({ +// "isFormDataRequest": requestModel.isFormDataRequest, +// }); + +// String result = importsData; + +// if (requestModel.isFormDataRequest && +// requestModel.formDataMapList.isNotEmpty) { +// var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); +// var renderedMultiPartBody = templateMultiPartBody.render({}); +// result += renderedMultiPartBody; +// } + +// String url = requestModel.url; +// if (!url.contains("://") && url.isNotEmpty) { +// url = "$defaultUriScheme://$url"; +// } +// var rM = requestModel.copyWith(url: url); + +// var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + +// var 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.isFormDataRequest) { +// 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"; +// }); +// headersString = headersString.substring( +// 0, headersString.length - 2); // Removing trailing comma and space +// result += templateHeader.render({ +// "headers": headersString, +// }); +// } + +// 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) { +// result += templateBody +// .render({"body": kEncoder.convert(harJson["postData"]["text"])}); +// } +// result += kStringRequest; + +// var templateStart = jj.Template(kTemplateStart); +// result += templateStart.render({ +// // "url": stripUrlParams(url), +// // "method": harJson["method"].toLowerCase(), +// }); + +// var templateRequest = jj.Template(kStringRequest); +// result += templateRequest.render({ +// "url": stripUrlParams(url), +// "method": harJson["method"].toLowerCase(), +// }); + +// return result; +// } catch (e) { +// return null; +// } +// } +// } + +// import 'dart:convert'; +// import 'package:jinja/jinja.dart' as jj; +// import 'package:apidash/utils/utils.dart' +// show padMultilineString, 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 isFormDataRequest %}use GuzzleHttp\\Psr7\\MultipartStream; +// use GuzzleHttp\\Psr7\\Utils;{% endif %} +// \ + +// """; + +// String kTemplateParams = """ +// \$queryParams = [ +// {{params}} +// ]; + +// \$queryParamsStr = '?' . http_build_query(\$queryParams); +// \ + +// """; + +// String kTemplateHeader = """ +// \$headers = [ +// {{headers}} +// ]; +// \ + +// """; + +// String kTemplateBody = """ +// \$body = {{body}}; +// \ + +// """; + +// String kMultiPartBodyTemplate = """ +// \$multipart = [ +// {{fields_list}} +// ]; +// """; + +// String kTemplateStart = """ +// \$client = new Client(); +// \ + +// """; + +// String kStringRequest = """ +// \$request = new Request('{{method}}', '{{url}}' . \$queryParamsStr, \$headers, {{body}}); +// \$res = \$client->sendAsync(\$request)->wait(); +// echo \$res->getBody(); +// """; + +// String? getCode( +// RequestModel requestModel, +// String defaultUriScheme, +// ) { +// try { +// jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); +// String importsData = kNodejsImportTemplate.render({ +// "isFormDataRequest": requestModel.isFormDataRequest, +// }); + +// String result = importsData; + +// if (requestModel.isFormDataRequest && +// requestModel.formDataMapList.isNotEmpty) { +// var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); +// var renderedMultiPartBody = templateMultiPartBody.render({ +// "fields_list": requestModel.formDataMapList.map(( +// field, +// ) { +// return ''' +// [ +// 'name' => '${field['name']}', +// 'contents' => '${field['contents']}' +// ], +// '''; +// }).join(), +// }); +// result += renderedMultiPartBody; +// } + +// String url = requestModel.url; +// if (!url.contains("://") && url.isNotEmpty) { +// url = "$defaultUriScheme://$url"; +// } +// var rM = requestModel.copyWith(url: url); + +// var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + +// var 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.isFormDataRequest) { +// 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"; +// }); +// headersString = headersString.substring( +// 0, headersString.length - 2); // Removing trailing comma and space +// result += templateHeader.render({ +// "headers": headersString, +// }); +// } + +// var templateBody = jj.Template(kTemplateBody); + +// if (requestModel.isFormDataRequest && +// requestModel.formDataMapList.isNotEmpty) { +// result += templateBody.render({ +// "body": "new MultipartStream(\$multipart)", +// }); +// } +// if (harJson["postData"]?["text"] != null) { +// result += templateBody +// .render({"body": kEncoder.convert(harJson["postData"]["text"])}); +// } + +// var templateStart = jj.Template(kTemplateStart); +// result += templateStart.render({ +// // "url": stripUrlParams(url), +// // "method": harJson["method"].toLowerCase(), +// }); + +// var templateRequest = jj.Template(kStringRequest); +// result += templateRequest.render({ +// "url": stripUrlParams(url), +// "method": harJson["method"].toLowerCase(), +// }); + +// return result; +// } catch (e) { +// return null; +// } +// } +// } + +import 'package:jinja/jinja.dart' as jj; +import 'package:apidash/utils/utils.dart' + show padMultilineString, 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 isFormDataRequest %}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, + String defaultUriScheme, + ) { + try { + jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); + String importsData = kNodejsImportTemplate.render({ + "isFormDataRequest": requestModel.isFormDataRequest, + }); + + String result = importsData; + + if (requestModel.isFormDataRequest && + 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; + } + + 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 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.isFormDataRequest) { + 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.isFormDataRequest) { + 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.isFormDataRequest && + requestModel.formDataMapList.isNotEmpty) { + result += templateBody.render({ + "body": "new MultipartStream(\$multipart)", + }); + } + + if (harJson["postData"]?["text"] != null) { + result += templateBody + .render({"body": kEncoder.convert(harJson["postData"]["text"])}); + } + + //result += kStringRequest; + + 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 is not present or if mimeType is not supported + } + + var templateRequest = jj.Template(kStringRequest); + result += templateRequest.render({ + "url": stripUrlParams(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/consts.dart b/lib/consts.dart index 90096f83..b430794e 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -270,6 +270,7 @@ enum CodegenLanguage { nodejsAxios("node.js (axios)", "javascript", "js"), nodejsFetch("node.js (fetch)", "javascript", "js"), kotlinOkHttp("Kotlin (okhttp3)", "java", "kt"), + phpGuzzle("PHP (guzzle)", "php", "php"), pythonHttpClient("Python (http.client)", "python", "py"), pythonRequests("Python (requests)", "python", "py"); From 5b81f179451df395280b53b45db2f107a169a5ed Mon Sep 17 00:00:00 2001 From: Aashutosh soni Date: Mon, 4 Mar 2024 22:27:03 +0530 Subject: [PATCH 08/26] update: bugfixes --- lib/codegen/php/guzzle.dart | 347 +----------------------------------- 1 file changed, 2 insertions(+), 345 deletions(-) diff --git a/lib/codegen/php/guzzle.dart b/lib/codegen/php/guzzle.dart index 34ca744a..2857c526 100644 --- a/lib/codegen/php/guzzle.dart +++ b/lib/codegen/php/guzzle.dart @@ -1,344 +1,3 @@ -// import 'dart:convert'; -// import 'package:jinja/jinja.dart' as jj; -// import 'package:apidash/utils/utils.dart' -// show padMultilineString, 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 isFormDataRequest %}use GuzzleHttp\\Psr7\\MultipartStream;;{% endif %} -// \ - -// """; - -// String kTemplateParams = """ -// \$queryParams = [ -// {{params}} -// ]; - -// \$queryParamsStr = '?' . http_build_query(\$queryParams); -// \ - -// """; - -// String kTemplateHeader = """ -// \$headers = [ -// {{headers}} -// ]; -// \ - -// """; - -// String kTemplateBody = """ -// \$body = {{body}}; -// \ - -// """; - -// String kMultiPartBodyTemplate = r''' -// //body tempalte - -// '''; -// var kGetFormDataTemplate = """ -// \$multipart = [ -// [ -// 'name' => 'formfield1', -// 'contents' => 'formdata1' -// ], -// [ -// 'name' => 'formfield2', -// 'contents' => 'formdata2' -// ], -// [ -// 'name' => 'formfile1', -// 'contents' => fopen('C:\\Users\\Ashut\\Downloads\\8h45la.png', 'r') -// ] -// ]; - -// {{fields_list}}; -// """; - -// String kTemplateStart = """ -// \$client = new Client(); -// \ - -// """; - -// String kStringRequest = """ -// \$request = new Request('{{method}}', '{{url}}' . \$queryParamsStr, \$headers, \$body); - -// \$res = \$client->sendAsync(\$request)->wait(); - -// echo \$res->getBody(); - -// """; - -// String? getCode( -// RequestModel requestModel, -// String defaultUriScheme, -// ) { -// try { -// jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); -// String importsData = kNodejsImportTemplate.render({ -// "isFormDataRequest": requestModel.isFormDataRequest, -// }); - -// String result = importsData; - -// if (requestModel.isFormDataRequest && -// requestModel.formDataMapList.isNotEmpty) { -// var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); -// var renderedMultiPartBody = templateMultiPartBody.render({}); -// result += renderedMultiPartBody; -// } - -// String url = requestModel.url; -// if (!url.contains("://") && url.isNotEmpty) { -// url = "$defaultUriScheme://$url"; -// } -// var rM = requestModel.copyWith(url: url); - -// var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); - -// var 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.isFormDataRequest) { -// 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"; -// }); -// headersString = headersString.substring( -// 0, headersString.length - 2); // Removing trailing comma and space -// result += templateHeader.render({ -// "headers": headersString, -// }); -// } - -// 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) { -// result += templateBody -// .render({"body": kEncoder.convert(harJson["postData"]["text"])}); -// } -// result += kStringRequest; - -// var templateStart = jj.Template(kTemplateStart); -// result += templateStart.render({ -// // "url": stripUrlParams(url), -// // "method": harJson["method"].toLowerCase(), -// }); - -// var templateRequest = jj.Template(kStringRequest); -// result += templateRequest.render({ -// "url": stripUrlParams(url), -// "method": harJson["method"].toLowerCase(), -// }); - -// return result; -// } catch (e) { -// return null; -// } -// } -// } - -// import 'dart:convert'; -// import 'package:jinja/jinja.dart' as jj; -// import 'package:apidash/utils/utils.dart' -// show padMultilineString, 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 isFormDataRequest %}use GuzzleHttp\\Psr7\\MultipartStream; -// use GuzzleHttp\\Psr7\\Utils;{% endif %} -// \ - -// """; - -// String kTemplateParams = """ -// \$queryParams = [ -// {{params}} -// ]; - -// \$queryParamsStr = '?' . http_build_query(\$queryParams); -// \ - -// """; - -// String kTemplateHeader = """ -// \$headers = [ -// {{headers}} -// ]; -// \ - -// """; - -// String kTemplateBody = """ -// \$body = {{body}}; -// \ - -// """; - -// String kMultiPartBodyTemplate = """ -// \$multipart = [ -// {{fields_list}} -// ]; -// """; - -// String kTemplateStart = """ -// \$client = new Client(); -// \ - -// """; - -// String kStringRequest = """ -// \$request = new Request('{{method}}', '{{url}}' . \$queryParamsStr, \$headers, {{body}}); -// \$res = \$client->sendAsync(\$request)->wait(); -// echo \$res->getBody(); -// """; - -// String? getCode( -// RequestModel requestModel, -// String defaultUriScheme, -// ) { -// try { -// jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); -// String importsData = kNodejsImportTemplate.render({ -// "isFormDataRequest": requestModel.isFormDataRequest, -// }); - -// String result = importsData; - -// if (requestModel.isFormDataRequest && -// requestModel.formDataMapList.isNotEmpty) { -// var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); -// var renderedMultiPartBody = templateMultiPartBody.render({ -// "fields_list": requestModel.formDataMapList.map(( -// field, -// ) { -// return ''' -// [ -// 'name' => '${field['name']}', -// 'contents' => '${field['contents']}' -// ], -// '''; -// }).join(), -// }); -// result += renderedMultiPartBody; -// } - -// String url = requestModel.url; -// if (!url.contains("://") && url.isNotEmpty) { -// url = "$defaultUriScheme://$url"; -// } -// var rM = requestModel.copyWith(url: url); - -// var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); - -// var 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.isFormDataRequest) { -// 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"; -// }); -// headersString = headersString.substring( -// 0, headersString.length - 2); // Removing trailing comma and space -// result += templateHeader.render({ -// "headers": headersString, -// }); -// } - -// var templateBody = jj.Template(kTemplateBody); - -// if (requestModel.isFormDataRequest && -// requestModel.formDataMapList.isNotEmpty) { -// result += templateBody.render({ -// "body": "new MultipartStream(\$multipart)", -// }); -// } -// if (harJson["postData"]?["text"] != null) { -// result += templateBody -// .render({"body": kEncoder.convert(harJson["postData"]["text"])}); -// } - -// var templateStart = jj.Template(kTemplateStart); -// result += templateStart.render({ -// // "url": stripUrlParams(url), -// // "method": harJson["method"].toLowerCase(), -// }); - -// var templateRequest = jj.Template(kStringRequest); -// result += templateRequest.render({ -// "url": stripUrlParams(url), -// "method": harJson["method"].toLowerCase(), -// }); - -// return result; -// } catch (e) { -// return null; -// } -// } -// } - import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' show padMultilineString, requestModelToHARJsonRequest, stripUrlParams; @@ -479,8 +138,6 @@ echo \$res->getBody(); .render({"body": kEncoder.convert(harJson["postData"]["text"])}); } - //result += kStringRequest; - String getRequestBody(Map harJson) { if (harJson.containsKey("postData")) { var postData = harJson["postData"]; @@ -493,7 +150,7 @@ echo \$res->getBody(); } } } - return ""; // Return empty string if postData is not present or if mimeType is not supported + return ""; // Return empty string if postData or formdata is not present } var templateRequest = jj.Template(kStringRequest); @@ -501,7 +158,7 @@ echo \$res->getBody(); "url": stripUrlParams(url), "method": harJson["method"].toLowerCase(), "queryParams": - harJson["queryString"].isNotEmpty ? " \$queryParamsStr," : "", + harJson["queryString"].isNotEmpty ? ". \$queryParamsStr," : "", "headers": harJson["headers"].isNotEmpty ? " \$headers," : "", "body": getRequestBody(harJson), }); From f14c024dd0a8ddf84ee701c9dae559d2a76082e7 Mon Sep 17 00:00:00 2001 From: Aashutosh soni Date: Tue, 5 Mar 2024 11:52:12 +0530 Subject: [PATCH 09/26] update: removed unneccessary "\" characters from templates. --- lib/codegen/php/guzzle.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/codegen/php/guzzle.dart b/lib/codegen/php/guzzle.dart index 2857c526..04acd213 100644 --- a/lib/codegen/php/guzzle.dart +++ b/lib/codegen/php/guzzle.dart @@ -8,7 +8,7 @@ class PhpGuzzleCodeGen { String kStringImportNode = """use GuzzleHttp\\Client; use GuzzleHttp\\Psr7\\Request; {% if isFormDataRequest %}use GuzzleHttp\\Psr7\\MultipartStream;{% endif %} -\ + """; @@ -16,7 +16,7 @@ use GuzzleHttp\\Psr7\\Request; \$multipart = [ {{fields_list}} ]; -\ + """; @@ -25,7 +25,7 @@ use GuzzleHttp\\Psr7\\Request; {{params}} ]; \$queryParamsStr = '?' . http_build_query(\$queryParams); -\ + """; @@ -33,19 +33,19 @@ use GuzzleHttp\\Psr7\\Request; \$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(); From 12177fcff3a14e4ca91e5a4a33142dc4e9dc244d Mon Sep 17 00:00:00 2001 From: Elise Date: Thu, 14 Mar 2024 00:05:55 -0700 Subject: [PATCH 10/26] Add codegen for java okhttp and test cases --- README.md | 1 + lib/codegen/codegen.dart | 3 + lib/codegen/java/okhttp.dart | 190 ++++ lib/consts.dart | 1 + test/codegen/java_okhttp_codegen_test.dart | 1032 ++++++++++++++++++++ 5 files changed, 1227 insertions(+) create mode 100644 lib/codegen/java/okhttp.dart create mode 100644 test/codegen/java_okhttp_codegen_test.dart diff --git a/README.md b/README.md index 1beea998..c2760f5d 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,7 @@ API Dash currently supports API integration code generation for the following la | Python | `http.client` | | Python | `requests` | | Kotlin | `okhttp3` | +| Java | `okhttp3` | 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 854ca241..2409bb63 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -15,6 +15,7 @@ import 'js/fetch.dart'; import 'others/har.dart'; import 'others/curl.dart'; import 'julia/http.dart'; +import 'java/okhttp.dart'; class Codegen { String? getCode( @@ -52,6 +53,8 @@ class Codegen { return FetchCodeGen(isNodeJs: true).getCode(rM); case CodegenLanguage.kotlinOkHttp: return KotlinOkHttpCodeGen().getCode(rM); + case CodegenLanguage.javaOkHttp: + return JavaOkHttpCodeGen().getCode(rM); case CodegenLanguage.pythonHttpClient: return PythonHttpClientCodeGen() .getCode(rM, boundary: boundary ?? getNewUuid()); 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/consts.dart b/lib/consts.dart index a557023d..b912db9b 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -272,6 +272,7 @@ enum CodegenLanguage { nodejsAxios("node.js (axios)", "javascript", "js"), nodejsFetch("node.js (fetch)", "javascript", "js"), kotlinOkHttp("Kotlin (okhttp3)", "java", "kt"), + javaOkHttp("Java (okhttp3)", "java", 'java'), pythonHttpClient("Python (http.client)", "python", "py"), pythonRequests("Python (requests)", "python", "py"), rustActix("Rust (Actix Client)", "rust", "rs"), 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 From c37fed89975176a1498afaa4cf205c9d3cc1b269 Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Thu, 14 Mar 2024 02:36:06 +0530 Subject: [PATCH 11/26] fix(codgen-fetch): fix the broken codegen for multipart requests as well as refactor it --- lib/codegen/js/fetch.dart | 104 ++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 55 deletions(-) diff --git a/lib/codegen/js/fetch.dart b/lib/codegen/js/fetch.dart index 2ff88a9b..e1da4d4c 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 hasFormData %}const fs = require('fs');{% endif %} +import fetch from 'node-fetch' +{% if hasFormData -%} +import { fileFromSync, FormData } from 'node-fetch' +{% endif %} """; - String kTemplateStart = """let url = '{{url}}'; + String kTemplateStart = """const url = '{{url}}'; -let options = { +const options = { method: '{{method}}' """; @@ -27,72 +28,62 @@ 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? getCode(RequestModel requestModel) { try { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); String importsData = kNodejsImportTemplate.render({ "hasFormData": requestModel.hasFormData, }); - String result = isNodeJs ? importsData : ""; + String result = isNodeJs + ? importsData + : requestModel.hasFormData + ? "// 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"; } - var harJson = requestModelToHARJsonRequest( - requestModel, - useEnabled: true, - ); + var harJson = + requestModelToHARJsonRequest(requestModel, useEnabled: true); var templateStart = jj.Template(kTemplateStart); result += templateStart.render({ @@ -105,15 +96,18 @@ fetch(url, options) if (headers.isNotEmpty) { var templateHeader = jj.Template(kTemplateHeader); var m = {}; - if (requestModel.hasFormData) { - m[kHeaderContentType] = "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) { From 2be85a11157bb8034ad18f881f7fe0f61931af9f Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Thu, 14 Mar 2024 02:45:12 +0530 Subject: [PATCH 12/26] test(fetch): update tests with respect to new changes --- test/codegen/js_fetch_codegen_test.dart | 806 +++++++++++-------- test/codegen/nodejs_fetch_codegen_test.dart | 836 ++++++++++++-------- 2 files changed, 967 insertions(+), 675 deletions(-) diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index 4f070142..c6863709 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -8,26 +8,23 @@ void main() { 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet1, "https"), @@ -36,26 +33,23 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet2, "https"), @@ -64,26 +58,23 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet3, "https"), @@ -92,26 +83,23 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet4, "https"), @@ -120,29 +108,26 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet5, "https"), @@ -151,29 +136,26 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet6, "https"), @@ -181,26 +163,23 @@ fetch(url, options) }); 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet7, "https"), @@ -209,29 +188,26 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet8, "https"), @@ -240,26 +216,23 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet9, "https"), @@ -268,29 +241,26 @@ fetch(url, options) 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( codeGen.getCode( @@ -303,29 +273,26 @@ 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet11, "https"), @@ -334,26 +301,23 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelGet12, "https"), @@ -363,26 +327,23 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelHead1, "https"), @@ -390,26 +351,23 @@ fetch(url, options) }); 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelHead2, "http"), @@ -419,31 +377,27 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost1, "https"), @@ -451,31 +405,27 @@ fetch(url, options) }); 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\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost2, "https"), @@ -483,66 +433,279 @@ fetch(url, options) }); 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelPost3, "https"), expectedCode); }); + test('POST 4', () { + const expectedCode = + r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration + +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"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration + +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"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration + +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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelPut1, "https"), @@ -552,31 +715,27 @@ fetch(url, options) 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( codeGen.getCode(CodegenLanguage.jsFetch, requestModelPatch1, "https"), @@ -586,26 +745,23 @@ fetch(url, options) 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( codeGen.getCode( @@ -614,31 +770,27 @@ fetch(url, options) }); 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( codeGen.getCode( diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index 831fd2e0..4b81bae0 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -8,28 +8,25 @@ void main() { 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( codeGen.getCode( @@ -38,28 +35,25 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -68,28 +62,25 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -98,28 +89,25 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -128,31 +116,28 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -161,31 +146,28 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -194,28 +176,25 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -224,31 +203,28 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -257,28 +233,25 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -287,31 +260,28 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -323,31 +293,28 @@ 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( codeGen.getCode( @@ -356,28 +323,25 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -388,28 +352,25 @@ fetch(url, options) 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( codeGen.getCode( @@ -418,28 +379,25 @@ fetch(url, options) }); 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( codeGen.getCode( @@ -450,33 +408,29 @@ fetch(url, options) 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( codeGen.getCode( @@ -485,33 +439,29 @@ fetch(url, options) }); 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\"flag\": null,\n\"male\": true,\n\"female\": false,\n\"no\": 1.2,\n\"arr\": [\"null\", \"true\", \"false\", null]\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( codeGen.getCode( @@ -520,71 +470,272 @@ fetch(url, options) }); 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( codeGen.getCode( CodegenLanguage.nodejsFetch, requestModelPost3, "https"), expectedCode); }); + test('POST 4', () { + const expectedCode = r"""import fetch from 'node-fetch' +import { fileFromSync, 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 { fileFromSync, 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 { fileFromSync, 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( codeGen.getCode( @@ -595,33 +746,29 @@ fetch(url, options) 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( codeGen.getCode( @@ -632,28 +779,25 @@ fetch(url, options) 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( codeGen.getCode( @@ -662,33 +806,29 @@ fetch(url, options) }); 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( codeGen.getCode( From 3e2cc9026308548183548d50161409361634d64d Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 04:50:32 +0530 Subject: [PATCH 13/26] fixes --- lib/codegen/js/fetch.dart | 3 ++- test/codegen/nodejs_fetch_codegen_test.dart | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/codegen/js/fetch.dart b/lib/codegen/js/fetch.dart index e1da4d4c..caf27a47 100644 --- a/lib/codegen/js/fetch.dart +++ b/lib/codegen/js/fetch.dart @@ -12,7 +12,7 @@ class FetchCodeGen { String kStringImportNode = """ import fetch from 'node-fetch' {% if hasFormData -%} -import { fileFromSync, FormData } from 'node-fetch' +import { {% if hasFileInFormData %}fileFromSync, {% endif %}FormData } from 'node-fetch' {% endif %} """; @@ -57,6 +57,7 @@ fetch(url, options) jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); String importsData = kNodejsImportTemplate.render({ "hasFormData": requestModel.hasFormData, + "hasFileInFormData": requestModel.hasFileInFormData, }); String result = isNodeJs diff --git a/test/codegen/nodejs_fetch_codegen_test.dart b/test/codegen/nodejs_fetch_codegen_test.dart index 4b81bae0..88ca7072 100644 --- a/test/codegen/nodejs_fetch_codegen_test.dart +++ b/test/codegen/nodejs_fetch_codegen_test.dart @@ -502,7 +502,7 @@ fetch(url, options) }); test('POST 4', () { const expectedCode = r"""import fetch from 'node-fetch' -import { fileFromSync, FormData } from 'node-fetch' +import { FormData } from 'node-fetch' const payload = new FormData(); payload.append("text", "API") @@ -537,7 +537,7 @@ fetch(url, options) test('POST 5', () { const expectedCode = r"""import fetch from 'node-fetch' -import { fileFromSync, FormData } from 'node-fetch' +import { FormData } from 'node-fetch' const payload = new FormData(); payload.append("text", "API") @@ -640,7 +640,7 @@ fetch(url, options) }); test('POST 8', () { const expectedCode = r"""import fetch from 'node-fetch' -import { fileFromSync, FormData } from 'node-fetch' +import { FormData } from 'node-fetch' const payload = new FormData(); payload.append("text", "API") From 6aaa29cb9841d6960cf14666be195064d6aca0da Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 05:24:50 +0530 Subject: [PATCH 14/26] js minor fix --- lib/codegen/js/fetch.dart | 2 +- test/codegen/js_fetch_codegen_test.dart | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/lib/codegen/js/fetch.dart b/lib/codegen/js/fetch.dart index caf27a47..9b5f8161 100644 --- a/lib/codegen/js/fetch.dart +++ b/lib/codegen/js/fetch.dart @@ -62,7 +62,7 @@ fetch(url, options) String result = isNodeJs ? importsData - : requestModel.hasFormData + : requestModel.hasFileInFormData ? "// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration\n\n" : ""; if (requestModel.hasFormData) { diff --git a/test/codegen/js_fetch_codegen_test.dart b/test/codegen/js_fetch_codegen_test.dart index c6863709..83ee687c 100644 --- a/test/codegen/js_fetch_codegen_test.dart +++ b/test/codegen/js_fetch_codegen_test.dart @@ -461,10 +461,7 @@ fetch(url, options) expectedCode); }); test('POST 4', () { - const expectedCode = - r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration - -const payload = new FormData(); + const expectedCode = r"""const payload = new FormData(); payload.append("text", "API") payload.append("sep", "|") payload.append("times", "3") @@ -498,10 +495,7 @@ fetch(url, options) }); test('POST 5', () { - const expectedCode = - r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration - -const payload = new FormData(); + const expectedCode = r"""const payload = new FormData(); payload.append("text", "API") payload.append("sep", "|") payload.append("times", "3") @@ -607,10 +601,7 @@ fetch(url, options) expectedCode); }); test('POST 8', () { - const expectedCode = - r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1995208098 for details regarding integration - -const payload = new FormData(); + const expectedCode = r"""const payload = new FormData(); payload.append("text", "API") payload.append("sep", "|") payload.append("times", "3") From 15c38c61275bb8a47cf13d59dba556be665fd54c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 08:12:56 +0530 Subject: [PATCH 15/26] removed errors --- lib/codegen/java/async_http_client.dart | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/lib/codegen/java/async_http_client.dart b/lib/codegen/java/async_http_client.dart index f0f688c6..ec804cc1 100644 --- a/lib/codegen/java/async_http_client.dart +++ b/lib/codegen/java/async_http_client.dart @@ -76,20 +76,13 @@ public class Main { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { String result = ""; bool hasBody = false; - bool hasJsonBody = false; - - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; @@ -98,7 +91,7 @@ public class Main { return ""; } - url = stripUriParams(uri); + var url = stripUriParams(uri); // contains the HTTP method associated with the request var method = requestModel.method; @@ -117,20 +110,13 @@ public class Main { // 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.isFormDataRequest && + if (!requestModel.hasFormData && kMethodsWithBody.contains(method) && requestBody != null) { var contentLength = utf8.encode(requestBody).length; if (contentLength > 0) { var templateBodyContent = jj.Template(kTemplateRequestBodyContent); hasBody = true; - - // every JSON should be enclosed within a pair of curly braces - // very simple check for JSON, for stronger check, we may validate - // the JSON in the JSON editor itself - hasJsonBody = - requestBody.startsWith("{") && requestBody.endsWith("}"); - if (harJson["postData"]?["text"] != null) { result += templateBodyContent.render({ "body": kEncoder.convert(harJson["postData"]["text"]).substring( @@ -174,7 +160,7 @@ public class Main { }); // handling form data - if (requestModel.isFormDataRequest && + if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty && kMethodsWithBody.contains(method)) { // including form data into the request From 9e2cf7fac1f91c2384b88266391fe3caa6195829 Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Thu, 14 Mar 2024 18:19:04 +0530 Subject: [PATCH 16/26] fix(codgen-axios): fix the broken codegen for multipart requests as well as refactor it --- lib/codegen/js/axios.dart | 103 +++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 57 deletions(-) diff --git a/lib/codegen/js/axios.dart b/lib/codegen/js/axios.dart index 71456d6e..51859fc6 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 hasFormData -%} +import fs from 'fs' +{% endif %} -{% endif %}{% if hasFormData and isNodeJs %}const fs = require('fs');{% endif %} """; - String kTemplateStart = """let config = { + String kTemplateStart = """const config = { url: '{{url}}', method: '{{method}}' """; @@ -37,40 +38,14 @@ 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, ) { @@ -78,18 +53,13 @@ async function buildFormData(fields) { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); String importsData = kNodejsImportTemplate.render({ "hasFormData": requestModel.hasFormData, - "isNodeJs": isNodeJs, }); - String result = importsData; - if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { - var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); - var renderedMultiPartBody = templateMultiPartBody.render({ - "isNodeJs": isNodeJs, - }); - result += renderedMultiPartBody; - } - + String result = isNodeJs + ? importsData + : requestModel.hasFormData + ? "// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration\n\n" + : ""; var harJson = requestModelToHARJsonRequest( requestModel, useEnabled: true, @@ -126,17 +96,22 @@ async function buildFormData(fields) { .render({"headers": padMultilineString(kEncoder.convert(m), 2)}); } var templateBody = jj.Template(kTemplateBody); - if (requestModel.hasFormData && 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) { + // 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"])}); } @@ -146,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; + } } From f80b6b343d00f7396d4f74c78b3ccef8973cb29b Mon Sep 17 00:00:00 2001 From: Tanish2002 Date: Thu, 14 Mar 2024 20:05:06 +0530 Subject: [PATCH 17/26] test(axios): update tests with respect to new changes --- test/codegen/js_axios_codegen_test.dart | 612 ++++++++++++-------- test/codegen/nodejs_axios_codegen_test.dart | 612 ++++++++++++-------- 2 files changed, 762 insertions(+), 462 deletions(-) diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index 40b420e4..1c417b63 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -8,22 +8,19 @@ void main() { 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet1, "https"), @@ -31,7 +28,7 @@ axios(config) }); test('GET 2', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/country/data', method: 'get', params: { @@ -40,16 +37,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet2, "https"), @@ -57,7 +51,7 @@ axios(config) }); test('GET 3', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/country/data', method: 'get', params: { @@ -66,16 +60,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet3, "https"), @@ -83,7 +74,7 @@ axios(config) }); test('GET 4', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -96,16 +87,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet4, "https"), @@ -113,7 +101,7 @@ axios(config) }); test('GET 5', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', headers: { @@ -122,16 +110,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet5, "https"), @@ -139,7 +124,7 @@ axios(config) }); test('GET 6', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', params: { @@ -151,16 +136,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet6, "https"), @@ -168,22 +150,19 @@ axios(config) }); 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet7, "https"), @@ -191,7 +170,7 @@ axios(config) }); test('GET 8', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.github.com/repos/foss42/apidash', method: 'get', params: { @@ -203,16 +182,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet8, "https"), @@ -220,7 +196,7 @@ axios(config) }); test('GET 9', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -230,16 +206,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet9, "https"), @@ -247,7 +220,7 @@ axios(config) }); test('GET 10', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', headers: { @@ -256,16 +229,13 @@ 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( codeGen.getCode( @@ -277,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: { @@ -290,16 +260,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet11, "https"), @@ -307,22 +274,19 @@ axios(config) }); 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelGet12, "https"), @@ -332,22 +296,19 @@ axios(config) 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelHead1, "https"), @@ -355,22 +316,19 @@ axios(config) }); 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelHead2, "http"), @@ -380,7 +338,7 @@ axios(config) 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: { @@ -390,16 +348,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost1, "https"), @@ -407,7 +362,7 @@ axios(config) }); test('POST 2', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { @@ -417,16 +372,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost2, "https"), @@ -434,7 +386,7 @@ axios(config) }); test('POST 3', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { @@ -445,26 +397,236 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelPost3, "https"), expectedCode); }); + test('POST 4', () { + 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/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"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration + +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"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration + +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: { @@ -474,16 +636,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelPut1, "https"), @@ -493,7 +652,7 @@ axios(config) 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: { @@ -503,16 +662,13 @@ 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( codeGen.getCode(CodegenLanguage.jsAxios, requestModelPatch1, "https"), @@ -522,22 +678,19 @@ axios(config) 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( codeGen.getCode( @@ -546,7 +699,7 @@ axios(config) }); test('DELETE 2', () { - const expectedCode = r"""let config = { + const expectedCode = r"""const config = { url: 'https://reqres.in/api/users/2', method: 'delete', headers: { @@ -556,16 +709,13 @@ 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( codeGen.getCode( diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index ab4c2bf5..84a7ae1d 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -10,22 +10,19 @@ void main() { 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( codeGen.getCode( @@ -36,7 +33,7 @@ axios(config) test('GET 2', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/country/data', method: 'get', params: { @@ -45,16 +42,13 @@ 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( codeGen.getCode( @@ -65,7 +59,7 @@ axios(config) test('GET 3', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/country/data', method: 'get', params: { @@ -74,16 +68,13 @@ 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( codeGen.getCode( @@ -94,7 +85,7 @@ axios(config) test('GET 4', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -107,16 +98,13 @@ 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( codeGen.getCode( @@ -127,7 +115,7 @@ axios(config) 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: { @@ -136,16 +124,13 @@ 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( codeGen.getCode( @@ -156,7 +141,7 @@ axios(config) 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: { @@ -168,16 +153,13 @@ 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( codeGen.getCode( @@ -188,22 +170,19 @@ axios(config) 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( codeGen.getCode( @@ -214,7 +193,7 @@ axios(config) 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: { @@ -226,16 +205,13 @@ 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( codeGen.getCode( @@ -246,7 +222,7 @@ axios(config) test('GET 9', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', params: { @@ -256,16 +232,13 @@ 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( codeGen.getCode( @@ -276,7 +249,7 @@ axios(config) test('GET 10', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/humanize/social', method: 'get', headers: { @@ -285,16 +258,13 @@ 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( codeGen.getCode( @@ -308,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: { @@ -321,16 +291,13 @@ 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( codeGen.getCode( @@ -341,22 +308,19 @@ axios(config) 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( codeGen.getCode( @@ -369,22 +333,19 @@ 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( codeGen.getCode( @@ -395,22 +356,19 @@ axios(config) 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( codeGen.getCode( @@ -423,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: { @@ -433,16 +391,13 @@ 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( codeGen.getCode( @@ -453,7 +408,7 @@ axios(config) test('POST 2', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { @@ -463,16 +418,13 @@ 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( codeGen.getCode( @@ -483,7 +435,7 @@ axios(config) test('POST 3', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://api.apidash.dev/case/lower', method: 'post', headers: { @@ -494,29 +446,239 @@ 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( codeGen.getCode( CodegenLanguage.nodejsAxios, requestModelPost3, "https"), expectedCode); }); + test('POST 4', () { + const expectedCode = r"""import axios from 'axios'; +import fs from 'fs' + +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'; +import fs from 'fs' + +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'; +import fs from 'fs' + +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); + }); }); group('PUT Request', () { test('PUT 1', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://reqres.in/api/users/2', method: 'put', headers: { @@ -526,16 +688,13 @@ 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( codeGen.getCode( @@ -548,7 +707,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: { @@ -558,16 +717,13 @@ 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( codeGen.getCode( @@ -580,22 +736,19 @@ 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( codeGen.getCode( @@ -606,7 +759,7 @@ axios(config) test('DELETE 2', () { const expectedCode = r"""import axios from 'axios'; -let config = { +const config = { url: 'https://reqres.in/api/users/2', method: 'delete', headers: { @@ -616,16 +769,13 @@ 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( codeGen.getCode( From 81e6511f6e1237822531b210b137bcef818674d5 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 15:56:57 +0530 Subject: [PATCH 18/26] fixes --- lib/codegen/java/httpclient.dart | 84 +- lib/consts.dart | 2 +- .../java_http_client_codegen_test.dart | 800 ------------------ 3 files changed, 44 insertions(+), 842 deletions(-) delete mode 100644 test/codegen/java_http_client_codegen_test.dart diff --git a/lib/codegen/java/httpclient.dart b/lib/codegen/java/httpclient.dart index d57c73f3..037a9a87 100644 --- a/lib/codegen/java/httpclient.dart +++ b/lib/codegen/java/httpclient.dart @@ -1,7 +1,7 @@ - import 'dart:convert'; import 'package:jinja/jinja.dart' as jj; -import 'package:apidash/utils/utils.dart' show getValidRequestUri, requestModelToHARJsonRequest, stripUriParams; +import 'package:apidash/utils/utils.dart' + show getValidRequestUri, requestModelToHARJsonRequest, stripUriParams; import '../../models/request_model.dart'; import 'package:apidash/consts.dart'; @@ -66,7 +66,6 @@ public class JavaHttpClientExample { String? getCode( RequestModel requestModel, - String defaultUriScheme, ) { try { String result = ""; @@ -74,13 +73,8 @@ public class JavaHttpClientExample { bool hasBody = false; bool hasJsonBody = false; - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var rec = getValidRequestUri( - url, + requestModel.url, requestModel.enabledRequestParams, ); Uri? uri = rec.$1; @@ -95,40 +89,46 @@ public class JavaHttpClientExample { var templateParams = jj.Template(kTemplateUrlQuery); result += templateParams.render({"url": url, "params": uri.query}); } - } - - if(!hasQuery) { + } + + 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 harJson = requestModelToHARJsonRequest(rM, useEnabled: true); var method = requestModel.method; var requestBody = requestModel.requestBody; - if (requestModel.isFormDataRequest && requestModel.formDataMapList.isNotEmpty && kMethodsWithBody.contains(method)) { - var formDataList = requestModel.formDataMapList; - result += """ + 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']}&""",'; - } + for (var formDataMap in formDataList) { + result += '"""${formDataMap['name']}=${formDataMap['value']}&""",'; + } - result = result.substring(0, result.length - 1); - result += ");\n"; - hasBody = true; + 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("}"); + 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 += templateBody.render({ + "body": kEncoder.convert(harJson["postData"]["text"]).substring( + 1, kEncoder.convert(harJson["postData"]["text"]).length - 1) + }); + } } } @@ -137,28 +137,30 @@ public class JavaHttpClientExample { var headersList = requestModel.enabledRequestHeaders; var contentType = requestModel.requestBodyContentType.header; - if(hasBody && !requestModel.enabledHeadersMap.containsKey('Content-Type')){ - result = """$result .header("Content-Type", "$contentType")\n"""; + 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); + result += getHeaders(headers, hasJsonBody); } } var templateRequestEnd = jj.Template(kTemplateRequestEnd); - - if(kMethodsWithBody.contains(method)){ + + if (kMethodsWithBody.contains(method)) { result += templateRequestEnd.render({ - "method": method.name.toUpperCase(), - "body": hasBody ? "BodyPublishers.ofString(body)" : "BodyPublishers.noBody()" - }); + "method": method.name.toUpperCase(), + "body": hasBody + ? "BodyPublishers.ofString(body)" + : "BodyPublishers.noBody()" + }); } else { - result += templateRequestEnd.render({ - "method": method.name.toUpperCase(), - "body": "" - }); + result += templateRequestEnd + .render({"method": method.name.toUpperCase(), "body": ""}); } } return result; @@ -167,10 +169,10 @@ public class JavaHttpClientExample { } } - String getHeaders(Map headers,hasJsonBody) { + String getHeaders(Map headers, hasJsonBody) { String result = ""; for (final k in headers.keys) { - if(k.toLowerCase() == 'authorization') { + if (k.toLowerCase() == 'authorization') { result = """$result .header("$k", "${headers[k]}")\n"""; } else { result = """$result .header("$k", "${headers[k]}")\n"""; diff --git a/lib/consts.dart b/lib/consts.dart index c290d79c..33c0190b 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -279,7 +279,7 @@ enum CodegenLanguage { rustUreq("Rust (ureq)", "rust", "rs"), javaOkHttp("Java (okhttp3)", "java", 'java'), javaAsyncHttpClient("Java (async-http-client)", "java", "java"), - javaHttpClient("Java (HttpClient)", "java", "java") + javaHttpClient("Java (HttpClient)", "java", "java"), juliaHttp("Julia (HTTP)", "julia", "jl"); const CodegenLanguage(this.label, this.codeHighlightLang, this.ext); diff --git a/test/codegen/java_http_client_codegen_test.dart b/test/codegen/java_http_client_codegen_test.dart deleted file mode 100644 index 83b71d2f..00000000 --- a/test/codegen/java_http_client_codegen_test.dart +++ /dev/null @@ -1,800 +0,0 @@ -import 'package:test/test.dart'; -import 'package:apidash/codegen/java/httpclient.dart'; -import '../request_models.dart'; - -void main() { - final javaHttpClientCodeGen = JavaHttpClientCodeGen(); - - group('GET Request', () { - test('GET 1', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet1, "https"), expectedCode); - }); - - test('GET 2', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/country/data"; - try { - URI uri = new URI(url); - url = uri.resolve("code=US").toString(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet2, "https"), expectedCode); - }); - - test('GET 3', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/country/data"; - try { - URI uri = new URI(url); - url = uri.resolve("code=IND").toString(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet3, "https"), expectedCode); - }); - - test('GET 4', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/humanize/social"; - try { - URI uri = new URI(url); - url = uri.resolve("num=8700000&digits=3&system=SS&add_space=true&trailing_zeros=true").toString(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet4, "https"), expectedCode); - }); - - test('GET 5', () { - const expectedCode = """ -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(); - - String url = "https://api.github.com/repos/foss42/apidash"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("User-Agent", "Test Agent") - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet5, "https"), expectedCode); - }); - - test('GET 6', () { - const expectedCode = """ -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(); - - String url = "https://api.github.com/repos/foss42/apidash"; - try { - URI uri = new URI(url); - url = uri.resolve("raw=true").toString(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("User-Agent", "Test Agent") - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet6, "https"), expectedCode); - }); - - test('GET 7', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet7, "https"), expectedCode); - }); - - test('GET 8', () { - const expectedCode = """ -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(); - - String url = "https://api.github.com/repos/foss42/apidash"; - try { - URI uri = new URI(url); - url = uri.resolve("raw=true").toString(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("User-Agent", "Test Agent") - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet8, "https"), expectedCode); - }); - - test('GET 9', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/humanize/social"; - try { - URI uri = new URI(url); - url = uri.resolve("num=8700000&add_space=true").toString(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet9, "https"), expectedCode); - }); - - test('GET 10', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/humanize/social"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("User-Agent", "Test Agent") - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet10, "https"), expectedCode); - }); - - test('GET 11', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/humanize/social"; - try { - URI uri = new URI(url); - url = uri.resolve("num=8700000&digits=3").toString(); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("User-Agent", "Test Agent") - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet11, "https"), expectedCode); - }); - - test('GET 12', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/humanize/social"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .GET() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelGet12, "https"), expectedCode); - }); - - test('HEAD 1', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .HEAD() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelHead1, "https"), expectedCode); - }); - - test('HEAD 2', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .HEAD() - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelHead2, "https"), expectedCode); - }); -}); - -group('POST Request', () { - test('POST 1', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/case/lower"; - - String body = "{\\n\\"text\\": \\"I LOVE Flutter\\"\\n}"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Content-Type", "text/plain") - .POST(BodyPublishers.ofString(body)) - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelPost1, "https"), expectedCode); - }); - - test('POST 2', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/case/lower"; - - String body = "{\\n\\"text\\": \\"I LOVE Flutter\\"\\n}"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Content-Type", "application/json") - .POST(BodyPublishers.ofString(body)) - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelPost2, "https"), expectedCode); - }); - - test('POST 3', () { - const expectedCode = """ -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(); - - String url = "https://api.foss42.com/case/lower"; - - String body = "{\\n\\"text\\": \\"I LOVE Flutter\\"\\n}"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Content-Type", "application/json") - .header("User-Agent", "Test Agent") - .POST(BodyPublishers.ofString(body)) - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelPost3, "https"), expectedCode); - }); -}); - -group('PUT Request', () { - test('PUT 1', () { - const expectedCode = """ -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(); - - String url = "https://reqres.in/api/users/2"; - - String body = "{\\n\\"name\\": \\"morpheus\\",\\n\\"job\\": \\"zion resident\\"\\n}"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Content-Type", "application/json") - .PUT(BodyPublishers.ofString(body)) - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelPut1, "https"), expectedCode); - }); -}); - -group('PATCH Request', () { - test('PATCH 1', () { - const expectedCode = """ -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(); - - String url = "https://reqres.in/api/users/2"; - - String body = "{\\n\\"name\\": \\"marfeus\\",\\n\\"job\\": \\"accountant\\"\\n}"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Content-Type", "application/json") - .PATCH(BodyPublishers.ofString(body)) - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelPatch1, "https"), expectedCode); - }); -}); - -group('DELETE Request', () { - test('DELETE 1', () { - const expectedCode = """ -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(); - - String url = "https://reqres.in/api/users/2"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .DELETE(BodyPublishers.noBody()) - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelDelete1, "https"), expectedCode); - }); - - test('DELETE 2', () { - const expectedCode = """ -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(); - - String url = "https://reqres.in/api/users/2"; - - String body = "{\\n\\"name\\": \\"marfeus\\",\\n\\"job\\": \\"accountant\\"\\n}"; - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .header("Content-Type", "application/json") - .DELETE(BodyPublishers.ofString(body)) - .build(); - - HttpResponse response = client.send(request, BodyHandlers.ofString()); - System.out.println(response.statusCode()); - System.out.println(response.body()); - } -} - -"""; - expect(javaHttpClientCodeGen.getCode(requestModelDelete2, "https"), expectedCode); - }); -}); - - - -} \ No newline at end of file From 1228ac4e465bc4558fcea1cd82d85f90ba746721 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 17:35:25 +0530 Subject: [PATCH 19/26] Update seq --- lib/codegen/codegen.dart | 20 ++++++++++---------- lib/consts.dart | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/codegen/codegen.dart b/lib/codegen/codegen.dart index 5100f7aa..df07492f 100644 --- a/lib/codegen/codegen.dart +++ b/lib/codegen/codegen.dart @@ -45,6 +45,8 @@ class Codegen { return DartHttpCodeGen().getCode(rM); case CodegenLanguage.dartDio: return DartDioCodeGen().getCode(rM); + case CodegenLanguage.goHttp: + return GoHttpCodeGen().getCode(rM); case CodegenLanguage.jsAxios: return AxiosCodeGen().getCode(rM); case CodegenLanguage.jsFetch: @@ -53,10 +55,16 @@ class Codegen { return AxiosCodeGen(isNodeJs: true).getCode(rM); case CodegenLanguage.nodejsFetch: 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(rM); - case CodegenLanguage.javaOkHttp: - return JavaOkHttpCodeGen().getCode(rM); case CodegenLanguage.pythonHttpClient: return PythonHttpClientCodeGen() .getCode(rM, boundary: boundary ?? getNewUuid()); @@ -68,14 +76,6 @@ class Codegen { return RustReqwestCodeGen().getCode(rM); case CodegenLanguage.rustUreq: return RustUreqCodeGen().getCode(rM, boundary: boundary); - case CodegenLanguage.goHttp: - return GoHttpCodeGen().getCode(rM); - case CodegenLanguage.juliaHttp: - return JuliaHttpClientCodeGen().getCode(rM); - case CodegenLanguage.javaAsyncHttpClient: - return JavaAsyncHttpClientGen().getCode(rM); - case CodegenLanguage.javaHttpClient: - return JavaHttpClientCodeGen().getCode(rM); } } } diff --git a/lib/consts.dart b/lib/consts.dart index 33c0190b..af4b6524 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -272,8 +272,8 @@ enum CodegenLanguage { 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"), + pythonHttpClient("Python (http.client)", "python", "py"), rustActix("Rust (Actix Client)", "rust", "rs"), rustReqwest("Rust (reqwest)", "rust", "rs"), rustUreq("Rust (ureq)", "rust", "rs"), From d4723abe60c72816eb1d7b2f8b51781566eea746 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 17:44:51 +0530 Subject: [PATCH 20/26] fixes --- lib/codegen/php/guzzle.dart | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/lib/codegen/php/guzzle.dart b/lib/codegen/php/guzzle.dart index 04acd213..c0e5562e 100644 --- a/lib/codegen/php/guzzle.dart +++ b/lib/codegen/php/guzzle.dart @@ -1,13 +1,13 @@ import 'package:jinja/jinja.dart' as jj; import 'package:apidash/utils/utils.dart' - show padMultilineString, requestModelToHARJsonRequest, stripUrlParams; + 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 isFormDataRequest %}use GuzzleHttp\\Psr7\\MultipartStream;{% endif %} +{% if hasFormData %}use GuzzleHttp\\Psr7\\MultipartStream;{% endif %} """; @@ -51,20 +51,16 @@ use GuzzleHttp\\Psr7\\Request; echo \$res->getBody(); """; - 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, }); String result = importsData; - if (requestModel.isFormDataRequest && - requestModel.formDataMapList.isNotEmpty) { + if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { var templateMultiPartBody = jj.Template(kMultiPartBodyTemplate); var renderedMultiPartBody = templateMultiPartBody.render({ "fields_list": requestModel.formDataMapList.map((field) { @@ -78,13 +74,8 @@ echo \$res->getBody(); result += renderedMultiPartBody; } - String url = requestModel.url; - if (!url.contains("://") && url.isNotEmpty) { - url = "$defaultUriScheme://$url"; - } - var rM = requestModel.copyWith(url: url); - - var harJson = requestModelToHARJsonRequest(rM, useEnabled: true); + var harJson = + requestModelToHARJsonRequest(requestModel, useEnabled: true); var params = harJson["queryString"]; if (params.isNotEmpty) { @@ -105,7 +96,7 @@ echo \$res->getBody(); } 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) { @@ -115,7 +106,7 @@ echo \$res->getBody(); m.forEach((key, value) { headersString += "\t\t\t\t'$key' => '$value', \n"; }); - if (requestModel.isFormDataRequest) { + if (requestModel.hasFormData) { m['Content-Type'] = 'multipart/form-data'; } headersString = headersString.substring( @@ -126,8 +117,7 @@ echo \$res->getBody(); } var templateBody = jj.Template(kTemplateBody); - if (requestModel.isFormDataRequest && - requestModel.formDataMapList.isNotEmpty) { + if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) { result += templateBody.render({ "body": "new MultipartStream(\$multipart)", }); @@ -155,7 +145,7 @@ echo \$res->getBody(); var templateRequest = jj.Template(kStringRequest); result += templateRequest.render({ - "url": stripUrlParams(url), + "url": stripUrlParams(requestModel.url), "method": harJson["method"].toLowerCase(), "queryParams": harJson["queryString"].isNotEmpty ? ". \$queryParamsStr," : "", From 9e007faf101a542d8e3fcc602957980009566661 Mon Sep 17 00:00:00 2001 From: PCoder23 Date: Fri, 15 Mar 2024 17:51:41 +0530 Subject: [PATCH 21/26] added post test 4, and 6 to 9 --- test/codegen/kotlin_okhttp_codegen_test.dart | 155 +++++++++++++++++++ 1 file changed, 155 insertions(+) diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index f91f183c..076339c9 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -517,6 +517,35 @@ fun main() { 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 @@ -548,6 +577,132 @@ fun main() { CodegenLanguage.kotlinOkHttp, requestModelPost5, "https"), expectedCode); }); + test('POST 6', () { + const expectedCode = r'''import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.MultipartBody + +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",null,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 + +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",null,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 + +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",null,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); + }); }); group('PUT Request', () { From 8d624dddaae23024ff6fd438d5b107be7194b34a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 18:09:00 +0530 Subject: [PATCH 22/26] Update README.md --- README.md | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c2760f5d..3202681c 100644 --- a/README.md +++ b/README.md @@ -123,19 +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` | -| Java | `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` | https://github.com/foss42/apidash/issues/280 | +| 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). From 67aadaabec92897d4b6c43911ab12a857261c208 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 18:12:07 +0530 Subject: [PATCH 23/26] Update consts.dart --- lib/consts.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/consts.dart b/lib/consts.dart index 3222a75b..e3d2dc6b 100644 --- a/lib/consts.dart +++ b/lib/consts.dart @@ -278,11 +278,11 @@ enum CodegenLanguage { rustReqwest("Rust (reqwest)", "rust", "rs"), rustUreq("Rust (ureq)", "rust", "rs"), javaOkHttp("Java (okhttp3)", "java", 'java'), - javaAsyncHttpClient("Java (async-http-client)", "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; final String codeHighlightLang; From a3fd05f9057af0dc3e8efebf941bdcf647b85f26 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 15 Mar 2024 18:56:06 +0530 Subject: [PATCH 24/26] fixes --- lib/codegen/js/axios.dart | 6 +++--- test/codegen/js_axios_codegen_test.dart | 15 +++------------ test/codegen/nodejs_axios_codegen_test.dart | 3 --- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/lib/codegen/js/axios.dart b/lib/codegen/js/axios.dart index 51859fc6..301ecf46 100644 --- a/lib/codegen/js/axios.dart +++ b/lib/codegen/js/axios.dart @@ -10,7 +10,7 @@ class AxiosCodeGen { final bool isNodeJs; String kStringImportNode = """import axios from 'axios'; -{%if hasFormData -%} +{%if hasFileInFormData -%} import fs from 'fs' {% endif %} @@ -52,12 +52,12 @@ axios(config) try { jj.Template kNodejsImportTemplate = jj.Template(kStringImportNode); String importsData = kNodejsImportTemplate.render({ - "hasFormData": requestModel.hasFormData, + "hasFileInFormData": requestModel.hasFileInFormData, }); String result = isNodeJs ? importsData - : requestModel.hasFormData + : requestModel.hasFileInFormData ? "// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration\n\n" : ""; var harJson = requestModelToHARJsonRequest( diff --git a/test/codegen/js_axios_codegen_test.dart b/test/codegen/js_axios_codegen_test.dart index 1c417b63..15bbeff1 100644 --- a/test/codegen/js_axios_codegen_test.dart +++ b/test/codegen/js_axios_codegen_test.dart @@ -410,10 +410,7 @@ axios(config) expectedCode); }); test('POST 4', () { - const expectedCode = - r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration - -const config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/io/form', method: 'post', headers: { @@ -445,10 +442,7 @@ axios(config) }); test('POST 5', () { - const expectedCode = - r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration - -const config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/io/form', method: 'post', headers: { @@ -546,10 +540,7 @@ axios(config) expectedCode); }); test('POST 8', () { - const expectedCode = - r"""// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration - -const config = { + const expectedCode = r"""const config = { url: 'https://api.apidash.dev/io/form', method: 'post', params: { diff --git a/test/codegen/nodejs_axios_codegen_test.dart b/test/codegen/nodejs_axios_codegen_test.dart index 84a7ae1d..31f359ea 100644 --- a/test/codegen/nodejs_axios_codegen_test.dart +++ b/test/codegen/nodejs_axios_codegen_test.dart @@ -461,7 +461,6 @@ axios(config) }); test('POST 4', () { const expectedCode = r"""import axios from 'axios'; -import fs from 'fs' const config = { url: 'https://api.apidash.dev/io/form', @@ -496,7 +495,6 @@ axios(config) test('POST 5', () { const expectedCode = r"""import axios from 'axios'; -import fs from 'fs' const config = { url: 'https://api.apidash.dev/io/form', @@ -597,7 +595,6 @@ axios(config) }); test('POST 8', () { const expectedCode = r"""import axios from 'axios'; -import fs from 'fs' const config = { url: 'https://api.apidash.dev/io/form', From 8b3a3568d89660554ba1f08783a942371afacb43 Mon Sep 17 00:00:00 2001 From: PCoder23 Date: Fri, 15 Mar 2024 22:43:57 +0530 Subject: [PATCH 25/26] fixed issues --- lib/codegen/kotlin/okhttp.dart | 42 ++++++++++++++++++-- test/codegen/kotlin_okhttp_codegen_test.dart | 15 +++++-- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/lib/codegen/kotlin/okhttp.dart b/lib/codegen/kotlin/okhttp.dart index c717dc97..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}}{{importForFormData}} +import okhttp3.Request{{importForQuery}}{{importForBody}}{{importForFormData}}{{importForFile}} fun main() { val client = OkHttpClient() @@ -27,6 +27,12 @@ import okhttp3.MediaType.Companion.toMediaType"""; import okhttp3.MultipartBody"""; + final String kStringImportForFile = """ + +import java.io.File +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.MediaType.Companion.toMediaType"""; + final String kTemplateUrl = ''' val url = "{{url}}" @@ -68,7 +74,7 @@ import okhttp3.MultipartBody"""; // 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() '''; @@ -81,6 +87,7 @@ import okhttp3.MultipartBody"""; bool hasQuery = false; bool hasBody = false; bool hasFormData = false; + bool hasFile = false; var rec = getValidRequestUri( requestModel.url, @@ -111,8 +118,34 @@ import okhttp3.MultipartBody"""; 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; @@ -129,7 +162,8 @@ import okhttp3.MultipartBody"""; var stringStart = templateStart.render({ "importForQuery": hasQuery ? kStringImportForQuery : "", "importForBody": hasBody ? kStringImportForBody : "", - "importForFormData": hasFormData ? kStringImportForFormData : "" + "importForFormData": hasFormData ? kStringImportForFormData : "", + "importForFile": hasFile ? kStringImportForFile : "", }); result = stringStart + result; diff --git a/test/codegen/kotlin_okhttp_codegen_test.dart b/test/codegen/kotlin_okhttp_codegen_test.dart index 076339c9..7b6850f3 100644 --- a/test/codegen/kotlin_okhttp_codegen_test.dart +++ b/test/codegen/kotlin_okhttp_codegen_test.dart @@ -581,6 +581,9 @@ fun main() { 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() @@ -588,7 +591,7 @@ fun main() { val url = "https://api.apidash.dev/io/img" val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("token","xyz") - .addFormDataPart("imfile",null,File("/Documents/up/1.png").asRequestBody("application/octet-stream".toMediaType())) + .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) @@ -610,6 +613,9 @@ fun main() { 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() @@ -617,7 +623,7 @@ fun main() { val url = "https://api.apidash.dev/io/img" val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("token","xyz") - .addFormDataPart("imfile",null,File("/Documents/up/1.png").asRequestBody("application/octet-stream".toMediaType())) + .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) @@ -673,6 +679,9 @@ fun main() { 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() @@ -683,7 +692,7 @@ fun main() { .build() val body = MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("token","xyz") - .addFormDataPart("imfile",null,File("/Documents/up/1.png").asRequestBody("application/octet-stream".toMediaType())) + .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) From 21dfa85e8ec214b711e962d96be0566c777d8a95 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 16 Mar 2024 01:17:31 +0530 Subject: [PATCH 26/26] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3202681c..f6f73d62 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,7 @@ API Dash currently supports API integration code generation for the following la | JavaScript (`node.js`) | `fetch` | | | Python | `requests` | | | Python | `http.client` | | -| Kotlin | `okhttp3` | https://github.com/foss42/apidash/issues/280 | +| Kotlin | `okhttp3` | | | Rust | `reqwest` | | | Rust | `ureq` | | | Rust | `Actix Client` | |