From 3ca6fbeb683e73048cbc07d61fe64d3cc187dd95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Thu, 2 Apr 2026 16:09:55 +0200 Subject: [PATCH 1/3] feat(cucumberDeleteUser): implement delete user functionality and corresponding tests --- .../java/feature/SpringIntegrationTest.java | 6 ++++++ src/test/resources/features/delete_user.feature | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/test/resources/features/delete_user.feature diff --git a/src/test/java/feature/SpringIntegrationTest.java b/src/test/java/feature/SpringIntegrationTest.java index e5e365c..d7ae978 100644 --- a/src/test/java/feature/SpringIntegrationTest.java +++ b/src/test/java/feature/SpringIntegrationTest.java @@ -46,4 +46,10 @@ protected void executePost(String path, Object payload) { HttpEntity request = new HttpEntity<>(payload, headers); latestResponse = restTemplate.postForEntity(url, request, String.class); } + + protected void executeDelete(String path) { + String url = "http://localhost:" + port + path; + restTemplate.delete(url); + latestResponse = ResponseEntity.noContent().build(); + } } diff --git a/src/test/resources/features/delete_user.feature b/src/test/resources/features/delete_user.feature new file mode 100644 index 0000000..0e3395e --- /dev/null +++ b/src/test/resources/features/delete_user.feature @@ -0,0 +1,17 @@ +Feature: Delete user endpoint + + Scenario: Delete a user successfully after creation + Given a valid user payload for creation + When the client call to POST /random-users + Then the response status should be 201 + And the user profile + | id | | + | firstname | Emma | + When the client call to DELETE the created user + Then the response status should be 204 + When the client call to GET the deleted user + Then the response status should be 404 + + Scenario: Delete a user that does not exist + When the client call to DELETE /random-users/999 + Then the response status should be 204 From b8755b88640a6f9b37e138e80021bb47428160a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Fri, 3 Apr 2026 15:03:56 +0200 Subject: [PATCH 2/3] fix(returnStatus): the return status should be 404 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/test/resources/features/delete_user.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/features/delete_user.feature b/src/test/resources/features/delete_user.feature index 0e3395e..b5dad31 100644 --- a/src/test/resources/features/delete_user.feature +++ b/src/test/resources/features/delete_user.feature @@ -14,4 +14,4 @@ Feature: Delete user endpoint Scenario: Delete a user that does not exist When the client call to DELETE /random-users/999 - Then the response status should be 204 + Then the response status should be 404 From 16ff2337a6fd1aefbfdaa03a67f620d283125964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Wed, 15 Apr 2026 11:01:56 +0200 Subject: [PATCH 3/3] feat(deleteUser): enhance delete user functionality with proper response handling --- .../domain/usecases/DeleteUserByIdUseCase.java | 2 ++ .../presentation/controllers/UserController.java | 2 +- .../presentation/handlers/UserHandler.java | 4 +++- .../presentation/UserHandlerTest.java | 9 +++++++-- src/test/java/feature/SpringIntegrationTest.java | 4 ++-- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/xpeho/spring_boot_java_random_user/domain/usecases/DeleteUserByIdUseCase.java b/src/main/java/com/xpeho/spring_boot_java_random_user/domain/usecases/DeleteUserByIdUseCase.java index e120db4..de4b524 100644 --- a/src/main/java/com/xpeho/spring_boot_java_random_user/domain/usecases/DeleteUserByIdUseCase.java +++ b/src/main/java/com/xpeho/spring_boot_java_random_user/domain/usecases/DeleteUserByIdUseCase.java @@ -1,6 +1,7 @@ package com.xpeho.spring_boot_java_random_user.domain.usecases; import com.xpeho.spring_boot_java_random_user.domain.services.LocalUserService; +import com.xpeho.spring_boot_java_random_user.domain.exceptions.UserNotFoundException; import org.springframework.stereotype.Service; @Service @@ -12,6 +13,7 @@ public DeleteUserByIdUseCase(LocalUserService userService) { } public void execute(long id) { + userService.getById(id).orElseThrow(() -> new UserNotFoundException(id)); userService.deleteById(id); } } diff --git a/src/main/java/com/xpeho/spring_boot_java_random_user/presentation/controllers/UserController.java b/src/main/java/com/xpeho/spring_boot_java_random_user/presentation/controllers/UserController.java index abe1376..9a90ed3 100644 --- a/src/main/java/com/xpeho/spring_boot_java_random_user/presentation/controllers/UserController.java +++ b/src/main/java/com/xpeho/spring_boot_java_random_user/presentation/controllers/UserController.java @@ -132,7 +132,7 @@ ResponseEntity> filterUsers( @ApiResponse(responseCode = "204", description = "User successfully deleted") @ApiResponse(responseCode = "404", description = "The requested user does not exist") @ApiResponse(responseCode = "500", description = "Internal server error") - void deleteUserById( + ResponseEntity deleteUserById( @PathVariable int id ); diff --git a/src/main/java/com/xpeho/spring_boot_java_random_user/presentation/handlers/UserHandler.java b/src/main/java/com/xpeho/spring_boot_java_random_user/presentation/handlers/UserHandler.java index ae2f80e..fab607f 100644 --- a/src/main/java/com/xpeho/spring_boot_java_random_user/presentation/handlers/UserHandler.java +++ b/src/main/java/com/xpeho/spring_boot_java_random_user/presentation/handlers/UserHandler.java @@ -110,11 +110,13 @@ public ResponseEntity> filterUsers( } @Override - public void deleteUserById(int id) { + public ResponseEntity deleteUserById(int id) { try { deleteUserUseCase.execute(id); + return ResponseEntity.noContent().build(); } catch (UserNotFoundException e) { logUserNotFound(e); + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } } diff --git a/src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserHandlerTest.java b/src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserHandlerTest.java index 3ff8b59..3980245 100644 --- a/src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserHandlerTest.java +++ b/src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserHandlerTest.java @@ -149,9 +149,12 @@ void shouldReturnCreatedWhenCreateUserSucceeds() { @DisplayName("Should return 204 when deleteUserById succeeds") void shouldReturnNoContentWhenDeleteUserByIdSucceeds() { int userId = 42; + doNothing().when(deleteUserUseCase).execute(userId); - userHandler.deleteUserById(userId); + ResponseEntity response = userHandler.deleteUserById(userId); + assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode()); + assertNull(response.getBody()); verify(deleteUserUseCase, times(1)).execute(userId); } @@ -161,8 +164,10 @@ void shouldLogWarningWhenDeleteUserByIdFails() { int userId = 123; doThrow(new UserNotFoundException(userId)).when(deleteUserUseCase).execute(userId); - userHandler.deleteUserById(userId); + ResponseEntity response = userHandler.deleteUserById(userId); + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + assertNull(response.getBody()); verify(deleteUserUseCase, times(1)).execute(userId); } diff --git a/src/test/java/feature/SpringIntegrationTest.java b/src/test/java/feature/SpringIntegrationTest.java index d7ae978..b2be1be 100644 --- a/src/test/java/feature/SpringIntegrationTest.java +++ b/src/test/java/feature/SpringIntegrationTest.java @@ -7,6 +7,7 @@ import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -49,7 +50,6 @@ protected void executePost(String path, Object payload) { protected void executeDelete(String path) { String url = "http://localhost:" + port + path; - restTemplate.delete(url); - latestResponse = ResponseEntity.noContent().build(); + latestResponse = restTemplate.exchange(url, HttpMethod.DELETE, null, String.class); } }