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