From 0648a4b11c8ff92be05450883b1e353dfc55443d Mon Sep 17 00:00:00 2001
From: Saikat Chakraborty <40471715+saikatcse03@users.noreply.github.com>
Date: Sun, 9 Jul 2023 18:37:52 +0530
Subject: [PATCH] Setup PATCH method in the OpenFeign (#14304)
* Fix the integration tests which failed due to defined port
* Add open feign patch example
* refactor the feign code
* refactor the feign code
* refactor the feign code
* refactor the code
* remove space
* refactor code
* refactor code and set the user id for testing
* refactor code
---
spring-cloud-modules/pom.xml | 1 +
.../spring-cloud-openfeign-2/pom.xml | 61 +++++++++++++++
.../cloud/openfeign/ExampleApplication.java | 16 ++++
.../patcherror/client/UserClient.java | 16 ++++
.../openfeign/patcherror/model/User.java | 34 +++++++++
.../src/main/resources/application.properties | 3 +
.../cloud/openfeign/SpringContextTest.java | 16 ++++
.../patcherror/client/UserClientUnitTest.java | 75 +++++++++++++++++++
8 files changed, 222 insertions(+)
create mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/pom.xml
create mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java
create mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/patcherror/client/UserClient.java
create mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/patcherror/model/User.java
create mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties
create mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java
create mode 100644 spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/patcherror/client/UserClientUnitTest.java
diff --git a/spring-cloud-modules/pom.xml b/spring-cloud-modules/pom.xml
index c4b89d6db0..564eff536c 100644
--- a/spring-cloud-modules/pom.xml
+++ b/spring-cloud-modules/pom.xml
@@ -56,6 +56,7 @@
spring-cloud-sleuth
spring-cloud-open-telemetry
spring-cloud-azure
+ spring-cloud-openfeign-2
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml b/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml
new file mode 100644
index 0000000000..ebfbc02755
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+ com.baeldung.cloud
+ spring-cloud-openfeign-2
+ spring-cloud-openfeign-2
+ OpenFeign project for Spring Boot
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+ io.github.openfeign
+ feign-okhttp
+
+
+ com.github.tomakehurst
+ wiremock-jre8
+ ${wire.mock.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit-jupiter.version}
+ test
+
+
+
+
+ 2021.0.7
+ 2.35.0
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java
new file mode 100644
index 0000000000..c7f07f6667
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/ExampleApplication.java
@@ -0,0 +1,16 @@
+package com.baeldung.cloud.openfeign;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+@SpringBootApplication
+@EnableFeignClients
+public class ExampleApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ExampleApplication.class, args);
+ }
+
+}
+
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/patcherror/client/UserClient.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/patcherror/client/UserClient.java
new file mode 100644
index 0000000000..02e3fbec26
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/patcherror/client/UserClient.java
@@ -0,0 +1,16 @@
+package com.baeldung.cloud.openfeign.patcherror.client;
+
+import com.baeldung.cloud.openfeign.patcherror.model.User;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@FeignClient(name = "user-client", url = "${user.api.url}")
+public interface UserClient {
+
+ @RequestMapping(value = "{userId}", method = RequestMethod.PATCH)
+ User updateUser(@PathVariable(value = "userId") String userId, @RequestBody User user);
+
+}
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/patcherror/model/User.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/patcherror/model/User.java
new file mode 100644
index 0000000000..dbbf9b7a58
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/java/com/baeldung/cloud/openfeign/patcherror/model/User.java
@@ -0,0 +1,34 @@
+package com.baeldung.cloud.openfeign.patcherror.model;
+
+public class User {
+
+ private String userId;
+
+ private String userName;
+
+ private String email;
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..50d9740975
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/main/resources/application.properties
@@ -0,0 +1,3 @@
+spring.application.name=openfeign
+user.api.url=http://localhost:8082/api/user
+feign.okhttp.enabled=true
\ No newline at end of file
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java
new file mode 100644
index 0000000000..4bf35f74f4
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/SpringContextTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.cloud.openfeign;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ExampleApplication.class)
+public class SpringContextTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/patcherror/client/UserClientUnitTest.java b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/patcherror/client/UserClientUnitTest.java
new file mode 100644
index 0000000000..fefaef01cc
--- /dev/null
+++ b/spring-cloud-modules/spring-cloud-openfeign-2/src/test/java/com/baeldung/cloud/openfeign/patcherror/client/UserClientUnitTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.cloud.openfeign.patcherror.client;
+
+import com.baeldung.cloud.openfeign.ExampleApplication;
+import com.baeldung.cloud.openfeign.patcherror.model.User;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import feign.FeignException;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpStatus;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static org.junit.jupiter.api.Assertions.*;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = ExampleApplication.class)
+public class UserClientUnitTest {
+
+ @Autowired
+ private UserClient userClient;
+
+ private WireMockServer wireMockServer;
+
+ @BeforeEach
+ public void startWireMockServer() {
+ wireMockServer = new WireMockServer(8082);
+ configureFor("localhost", 8082);
+ wireMockServer.start();
+ }
+
+ @AfterEach
+ public void stopWireMockServer() {
+ wireMockServer.stop();
+ }
+
+ @Test
+ void givenUserExistsAndIsValid_whenUpdateUserCalled_thenReturnSuccess() {
+ String updatedUserResponse = "{\n" +
+ " \"userId\": 100001,\n" +
+ " \"userName\": \"name\",\n" +
+ " \"email\": \"updated-email@mail.in\"\n" +
+ "}";
+
+ stubFor(patch(urlEqualTo("/api/user/".concat("100001")))
+ .willReturn(aResponse().withStatus(HttpStatus.OK.value())
+ .withHeader("Content-Type", "application/json")
+ .withBody(updatedUserResponse)));
+
+ User user = new User();
+ user.setUserId("100001");
+ user.setEmail("updated-email@mail.in");
+ User updatedUser = userClient.updateUser("100001", user);
+
+ assertEquals(user.getUserId(), updatedUser.getUserId());
+ assertEquals(user.getEmail(), updatedUser.getEmail());
+ }
+
+ @Test
+ void givenUserNotFound_whenUpdateUserCalled_thenReturnNotFoundErrorAndFeignException() {
+ User user = new User();
+ user.setUserId("100002");
+ user.setEmail("updated-email@mail.in");
+
+ stubFor(patch(urlEqualTo("/api/user/".concat("100002")))
+ .willReturn(aResponse().withStatus(404)));
+
+ assertThrows(FeignException.class, () -> userClient.updateUser("100002", user));
+ }
+}