From ac7950efe7f301e848e424ac11aaa8e10545ea26 Mon Sep 17 00:00:00 2001
From: PCoder23 <pranavkjha111@gmail.com>
Date: Sat, 24 Feb 2024 11:02:05 +0530
Subject: [PATCH] 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<String> 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<String, String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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