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 e5e365c..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; @@ -46,4 +47,9 @@ 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; + latestResponse = restTemplate.exchange(url, HttpMethod.DELETE, null, String.class); + } } diff --git a/src/test/resources/features/delete_user.feature b/src/test/resources/features/delete_user.feature new file mode 100644 index 0000000..b5dad31 --- /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 404