From deccb96fb263f6abd62c2e338d667fb3cb2ac416 Mon Sep 17 00:00:00 2001 From: jhan0121 Date: Wed, 24 Dec 2025 15:38:07 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EB=94=94=EB=B0=94=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/DeviceController.java | 14 ++++ .../request/DeviceDeleteRequest.java | 4 ++ .../member/service/MemberService.java | 10 +++ .../service/input/DeviceDeleteInput.java | 13 ++++ ...est.java => DevicePageControllerTest.java} | 64 ++++++++++++++++++- .../member/service/MemberServiceTest.java | 57 +++++++++++++++++ 6 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/recyclestudy/member/controller/request/DeviceDeleteRequest.java create mode 100644 src/main/java/com/recyclestudy/member/service/input/DeviceDeleteInput.java rename src/test/java/com/recyclestudy/member/controller/{DeviceControllerTest.java => DevicePageControllerTest.java} (59%) diff --git a/src/main/java/com/recyclestudy/member/controller/DeviceController.java b/src/main/java/com/recyclestudy/member/controller/DeviceController.java index 0323821..c8fd4ab 100644 --- a/src/main/java/com/recyclestudy/member/controller/DeviceController.java +++ b/src/main/java/com/recyclestudy/member/controller/DeviceController.java @@ -1,13 +1,19 @@ package com.recyclestudy.member.controller; +import com.recyclestudy.member.controller.request.DeviceDeleteRequest; import com.recyclestudy.member.domain.DeviceIdentifier; import com.recyclestudy.member.domain.Email; import com.recyclestudy.member.service.MemberService; +import com.recyclestudy.member.service.input.DeviceDeleteInput; import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/api/v1/device") @@ -24,4 +30,12 @@ public String authenticateDevice( memberService.authenticateDevice(Email.from(email), DeviceIdentifier.from(deviceIdentifier)); return "auth_success"; } + + @DeleteMapping + @ResponseBody + public ResponseEntity deleteDevice(@RequestBody final DeviceDeleteRequest request) { + DeviceDeleteInput input = DeviceDeleteInput.from(request.email(), request.deviceIdentifier()); + memberService.deleteDevice(input); + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/com/recyclestudy/member/controller/request/DeviceDeleteRequest.java b/src/main/java/com/recyclestudy/member/controller/request/DeviceDeleteRequest.java new file mode 100644 index 0000000..dda22d7 --- /dev/null +++ b/src/main/java/com/recyclestudy/member/controller/request/DeviceDeleteRequest.java @@ -0,0 +1,4 @@ +package com.recyclestudy.member.controller.request; + +public record DeviceDeleteRequest(String email, String deviceIdentifier) { +} diff --git a/src/main/java/com/recyclestudy/member/service/MemberService.java b/src/main/java/com/recyclestudy/member/service/MemberService.java index 61eef86..7359d73 100644 --- a/src/main/java/com/recyclestudy/member/service/MemberService.java +++ b/src/main/java/com/recyclestudy/member/service/MemberService.java @@ -10,6 +10,7 @@ import com.recyclestudy.member.domain.Member; import com.recyclestudy.member.repository.DeviceRepository; import com.recyclestudy.member.repository.MemberRepository; +import com.recyclestudy.member.service.input.DeviceDeleteInput; import com.recyclestudy.member.service.input.MemberFindInput; import com.recyclestudy.member.service.input.MemberSaveInput; import com.recyclestudy.member.service.output.MemberFindOutput; @@ -69,6 +70,15 @@ public void authenticateDevice(final Email email, final DeviceIdentifier deviceI device.activate(LocalDateTime.now(clock)); } + @Transactional + public void deleteDevice(final DeviceDeleteInput input) { + final Device device = deviceRepository.findByIdentifier(input.deviceIdentifier()) + .orElseThrow(() -> new NotFoundException("존재하지 않는 디바이스 아이디입니다: %s" + .formatted(input.deviceIdentifier().getValue()))); + device.verifyOwner(input.email()); + deviceRepository.delete(device); + } + private Member saveNewMember(final Email email) { final Optional memberOptional = memberRepository.findByEmail(email); diff --git a/src/main/java/com/recyclestudy/member/service/input/DeviceDeleteInput.java b/src/main/java/com/recyclestudy/member/service/input/DeviceDeleteInput.java new file mode 100644 index 0000000..c1f3276 --- /dev/null +++ b/src/main/java/com/recyclestudy/member/service/input/DeviceDeleteInput.java @@ -0,0 +1,13 @@ +package com.recyclestudy.member.service.input; + +import com.recyclestudy.member.domain.DeviceIdentifier; +import com.recyclestudy.member.domain.Email; + +public record DeviceDeleteInput(Email email, DeviceIdentifier deviceIdentifier) { + + public static DeviceDeleteInput from(final String emailValue, final String identifier) { + final Email email = Email.from(emailValue); + final DeviceIdentifier deviceIdentifier = DeviceIdentifier.from(identifier); + return new DeviceDeleteInput(email, deviceIdentifier); + } +} diff --git a/src/test/java/com/recyclestudy/member/controller/DeviceControllerTest.java b/src/test/java/com/recyclestudy/member/controller/DevicePageControllerTest.java similarity index 59% rename from src/test/java/com/recyclestudy/member/controller/DeviceControllerTest.java rename to src/test/java/com/recyclestudy/member/controller/DevicePageControllerTest.java index 3d682cc..b8c8829 100644 --- a/src/test/java/com/recyclestudy/member/controller/DeviceControllerTest.java +++ b/src/test/java/com/recyclestudy/member/controller/DevicePageControllerTest.java @@ -2,6 +2,8 @@ import com.recyclestudy.exception.BadRequestException; import com.recyclestudy.exception.DeviceActivationExpiredException; +import com.recyclestudy.exception.NotFoundException; +import com.recyclestudy.member.controller.request.DeviceDeleteRequest; import com.recyclestudy.member.domain.DeviceIdentifier; import com.recyclestudy.member.domain.Email; import com.recyclestudy.member.service.MemberService; @@ -12,15 +14,17 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoBean; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -class DeviceControllerTest { +class DevicePageControllerTest { @LocalServerPort private int port; @@ -92,4 +96,62 @@ void authenticateDevice_Expired() { .statusCode(HttpStatus.BAD_REQUEST.value()) .body("message", equalTo("인증 유효 시간이 만료되었습니다.")); } + + @Test + @DisplayName("디바이스 삭제 시 204 응답을 반환한다") + void deleteDevice() { + // given + final DeviceDeleteRequest request = new DeviceDeleteRequest("test@test.com", "device-id"); + + doNothing().when(memberService).deleteDevice(any()); + + // when & then + given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(request) + .when() + .delete("/api/v1/device") + .then() + .statusCode(HttpStatus.NO_CONTENT.value()); + } + + @Test + @DisplayName("존재하지 않는 디바이스 삭제 시 404 응답을 반환한다") + void deleteDevice_NotFound() { + // given + final DeviceDeleteRequest request = new DeviceDeleteRequest("test@test.com", "not-existed"); + + doThrow(new NotFoundException("존재하지 않는 디바이스 아이디입니다")) + .when(memberService).deleteDevice(any()); + + // when & then + given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(request) + .when() + .delete("/api/v1/device") + .then() + .statusCode(HttpStatus.NOT_FOUND.value()) + .body("message", equalTo("존재하지 않는 디바이스 아이디입니다")); + } + + @Test + @DisplayName("소유자가 아닌 디바이스 삭제 시 400 응답을 반환한다") + void deleteDevice_NotOwner() { + // given + final DeviceDeleteRequest request = new DeviceDeleteRequest("other@test.com", "device-id"); + + doThrow(new BadRequestException("디바이스 소유자가 아닙니다.")) + .when(memberService).deleteDevice(any()); + + // when & then + given() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(request) + .when() + .delete("/api/v1/device") + .then() + .statusCode(HttpStatus.BAD_REQUEST.value()) + .body("message", equalTo("디바이스 소유자가 아닙니다.")); + } } diff --git a/src/test/java/com/recyclestudy/member/service/MemberServiceTest.java b/src/test/java/com/recyclestudy/member/service/MemberServiceTest.java index dd4a367..8519a23 100644 --- a/src/test/java/com/recyclestudy/member/service/MemberServiceTest.java +++ b/src/test/java/com/recyclestudy/member/service/MemberServiceTest.java @@ -10,6 +10,7 @@ import com.recyclestudy.member.domain.Member; import com.recyclestudy.member.repository.DeviceRepository; import com.recyclestudy.member.repository.MemberRepository; +import com.recyclestudy.member.service.input.DeviceDeleteInput; import com.recyclestudy.member.service.input.MemberFindInput; import com.recyclestudy.member.service.input.MemberSaveInput; import com.recyclestudy.member.service.output.MemberFindOutput; @@ -241,4 +242,60 @@ void authenticateDevice_fail_owner() { .isInstanceOf(BadRequestException.class) .hasMessage("디바이스 소유자가 아닙니다."); } + + @Test + @DisplayName("디바이스를 삭제할 수 있다") + void deleteDevice() { + // given + final Email email = Email.from("test@test.com"); + final DeviceIdentifier deviceIdentifier = DeviceIdentifier.from("test"); + final DeviceDeleteInput input = DeviceDeleteInput.from( + email.getValue(), deviceIdentifier.getValue()); + final Member member = Member.withoutId(email); + final Device device = Device.withoutId(member, deviceIdentifier, true, ActivationExpiredDateTime.create(now)); + + given(deviceRepository.findByIdentifier(deviceIdentifier)).willReturn(Optional.of(device)); + + // when + memberService.deleteDevice(input); + + // then + verify(deviceRepository).delete(device); + } + + @Test + @DisplayName("존재하지 않는 디바이스 삭제 시도 시 예외를 던진다") + void deleteDevice_fail_notFound() { + // given + final Email email = Email.from("test@test.com"); + final DeviceIdentifier deviceIdentifier = DeviceIdentifier.from("not-existed"); + final DeviceDeleteInput input = DeviceDeleteInput.from( + email.getValue(), deviceIdentifier.getValue()); + + given(deviceRepository.findByIdentifier(deviceIdentifier)).willReturn(Optional.empty()); + + // when & then + assertThatThrownBy(() -> memberService.deleteDevice(input)) + .isInstanceOf(NotFoundException.class); + } + + @Test + @DisplayName("소유자가 아닌 디바이스 삭제 시도 시 예외를 던진다") + void deleteDevice_fail_owner() { + // given + final Email email = Email.from("test@test.com"); + final Email otherEmail = Email.from("other@test.com"); + final DeviceIdentifier deviceIdentifier = DeviceIdentifier.from("test"); + final DeviceDeleteInput input = DeviceDeleteInput.from( + otherEmail.getValue(), deviceIdentifier.getValue()); + final Member member = Member.withoutId(email); + final Device device = Device.withoutId(member, deviceIdentifier, true, ActivationExpiredDateTime.create(now)); + + given(deviceRepository.findByIdentifier(deviceIdentifier)).willReturn(Optional.of(device)); + + // when & then + assertThatThrownBy(() -> memberService.deleteDevice(input)) + .isInstanceOf(BadRequestException.class) + .hasMessage("디바이스 소유자가 아닙니다."); + } } From c4941c3cc329c6e7df1892e81db78f0fb3ab1ed5 Mon Sep 17 00:00:00 2001 From: jhan0121 Date: Wed, 24 Dec 2025 15:44:30 +0900 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EB=88=84=EB=9D=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/recyclestudy/member/controller/DeviceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/recyclestudy/member/controller/DeviceController.java b/src/main/java/com/recyclestudy/member/controller/DeviceController.java index c8fd4ab..fbac2d8 100644 --- a/src/main/java/com/recyclestudy/member/controller/DeviceController.java +++ b/src/main/java/com/recyclestudy/member/controller/DeviceController.java @@ -34,7 +34,7 @@ public String authenticateDevice( @DeleteMapping @ResponseBody public ResponseEntity deleteDevice(@RequestBody final DeviceDeleteRequest request) { - DeviceDeleteInput input = DeviceDeleteInput.from(request.email(), request.deviceIdentifier()); + final DeviceDeleteInput input = DeviceDeleteInput.from(request.email(), request.deviceIdentifier()); memberService.deleteDevice(input); return ResponseEntity.noContent().build(); } From 6c7d36c785b87fa857d8edeb1d3e33e1785ec5c3 Mon Sep 17 00:00:00 2001 From: jhan0121 Date: Wed, 24 Dec 2025 15:50:15 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EB=8C=80=EC=83=81=20=EB=94=94?= =?UTF-8?q?=EB=B0=94=EC=9D=B4=EC=8A=A4=EB=A5=BC=20=EC=A0=9C=EA=B1=B0?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/DeviceController.java | 3 ++- .../request/DeviceDeleteRequest.java | 2 +- .../member/repository/DeviceRepository.java | 2 ++ .../member/service/MemberService.java | 4 ++-- .../service/input/DeviceDeleteInput.java | 9 ++++++--- ...lerTest.java => DeviceControllerTest.java} | 20 +++++++++---------- .../member/service/MemberServiceTest.java | 17 ++++++++-------- 7 files changed, 32 insertions(+), 25 deletions(-) rename src/test/java/com/recyclestudy/member/controller/{DevicePageControllerTest.java => DeviceControllerTest.java} (89%) diff --git a/src/main/java/com/recyclestudy/member/controller/DeviceController.java b/src/main/java/com/recyclestudy/member/controller/DeviceController.java index fbac2d8..400b329 100644 --- a/src/main/java/com/recyclestudy/member/controller/DeviceController.java +++ b/src/main/java/com/recyclestudy/member/controller/DeviceController.java @@ -34,7 +34,8 @@ public String authenticateDevice( @DeleteMapping @ResponseBody public ResponseEntity deleteDevice(@RequestBody final DeviceDeleteRequest request) { - final DeviceDeleteInput input = DeviceDeleteInput.from(request.email(), request.deviceIdentifier()); + final DeviceDeleteInput input = DeviceDeleteInput.from(request.email(), request.deviceIdentifier(), + request.targetDeviceIdentifier()); memberService.deleteDevice(input); return ResponseEntity.noContent().build(); } diff --git a/src/main/java/com/recyclestudy/member/controller/request/DeviceDeleteRequest.java b/src/main/java/com/recyclestudy/member/controller/request/DeviceDeleteRequest.java index dda22d7..86bfa82 100644 --- a/src/main/java/com/recyclestudy/member/controller/request/DeviceDeleteRequest.java +++ b/src/main/java/com/recyclestudy/member/controller/request/DeviceDeleteRequest.java @@ -1,4 +1,4 @@ package com.recyclestudy.member.controller.request; -public record DeviceDeleteRequest(String email, String deviceIdentifier) { +public record DeviceDeleteRequest(String email, String deviceIdentifier, String targetDeviceIdentifier) { } diff --git a/src/main/java/com/recyclestudy/member/repository/DeviceRepository.java b/src/main/java/com/recyclestudy/member/repository/DeviceRepository.java index 2fc7223..74f49fd 100644 --- a/src/main/java/com/recyclestudy/member/repository/DeviceRepository.java +++ b/src/main/java/com/recyclestudy/member/repository/DeviceRepository.java @@ -20,4 +20,6 @@ public interface DeviceRepository extends JpaRepository { List findAllByMemberEmail(@Param("email") Email email); Optional findByIdentifier(DeviceIdentifier deviceIdentifier); + + void deleteByIdentifier(DeviceIdentifier identifier); } diff --git a/src/main/java/com/recyclestudy/member/service/MemberService.java b/src/main/java/com/recyclestudy/member/service/MemberService.java index 7359d73..5ce4254 100644 --- a/src/main/java/com/recyclestudy/member/service/MemberService.java +++ b/src/main/java/com/recyclestudy/member/service/MemberService.java @@ -73,10 +73,10 @@ public void authenticateDevice(final Email email, final DeviceIdentifier deviceI @Transactional public void deleteDevice(final DeviceDeleteInput input) { final Device device = deviceRepository.findByIdentifier(input.deviceIdentifier()) - .orElseThrow(() -> new NotFoundException("존재하지 않는 디바이스 아이디입니다: %s" + .orElseThrow(() -> new UnauthorizedException("유효하지 않은 디바이스 아이디입니다: %s" .formatted(input.deviceIdentifier().getValue()))); device.verifyOwner(input.email()); - deviceRepository.delete(device); + deviceRepository.deleteByIdentifier(input.targetDeviceIdentifier()); } private Member saveNewMember(final Email email) { diff --git a/src/main/java/com/recyclestudy/member/service/input/DeviceDeleteInput.java b/src/main/java/com/recyclestudy/member/service/input/DeviceDeleteInput.java index c1f3276..0c27aa7 100644 --- a/src/main/java/com/recyclestudy/member/service/input/DeviceDeleteInput.java +++ b/src/main/java/com/recyclestudy/member/service/input/DeviceDeleteInput.java @@ -3,11 +3,14 @@ import com.recyclestudy.member.domain.DeviceIdentifier; import com.recyclestudy.member.domain.Email; -public record DeviceDeleteInput(Email email, DeviceIdentifier deviceIdentifier) { +public record DeviceDeleteInput(Email email, DeviceIdentifier deviceIdentifier, + DeviceIdentifier targetDeviceIdentifier) { - public static DeviceDeleteInput from(final String emailValue, final String identifier) { + public static DeviceDeleteInput from(final String emailValue, final String identifier, + final String targetIdentifier) { final Email email = Email.from(emailValue); final DeviceIdentifier deviceIdentifier = DeviceIdentifier.from(identifier); - return new DeviceDeleteInput(email, deviceIdentifier); + final DeviceIdentifier targetDeviceIdentifier = DeviceIdentifier.from(targetIdentifier); + return new DeviceDeleteInput(email, deviceIdentifier, targetDeviceIdentifier); } } diff --git a/src/test/java/com/recyclestudy/member/controller/DevicePageControllerTest.java b/src/test/java/com/recyclestudy/member/controller/DeviceControllerTest.java similarity index 89% rename from src/test/java/com/recyclestudy/member/controller/DevicePageControllerTest.java rename to src/test/java/com/recyclestudy/member/controller/DeviceControllerTest.java index b8c8829..dd03363 100644 --- a/src/test/java/com/recyclestudy/member/controller/DevicePageControllerTest.java +++ b/src/test/java/com/recyclestudy/member/controller/DeviceControllerTest.java @@ -2,7 +2,7 @@ import com.recyclestudy.exception.BadRequestException; import com.recyclestudy.exception.DeviceActivationExpiredException; -import com.recyclestudy.exception.NotFoundException; +import com.recyclestudy.exception.UnauthorizedException; import com.recyclestudy.member.controller.request.DeviceDeleteRequest; import com.recyclestudy.member.domain.DeviceIdentifier; import com.recyclestudy.member.domain.Email; @@ -24,7 +24,7 @@ import static org.mockito.Mockito.doThrow; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -class DevicePageControllerTest { +class DeviceControllerTest { @LocalServerPort private int port; @@ -101,7 +101,7 @@ void authenticateDevice_Expired() { @DisplayName("디바이스 삭제 시 204 응답을 반환한다") void deleteDevice() { // given - final DeviceDeleteRequest request = new DeviceDeleteRequest("test@test.com", "device-id"); + final DeviceDeleteRequest request = new DeviceDeleteRequest("test@test.com", "device-id", "target-id"); doNothing().when(memberService).deleteDevice(any()); @@ -116,12 +116,12 @@ void deleteDevice() { } @Test - @DisplayName("존재하지 않는 디바이스 삭제 시 404 응답을 반환한다") - void deleteDevice_NotFound() { + @DisplayName("유효하지 않은 디바이스 아이디로 삭제 시 401 응답을 반환한다") + void deleteDevice_InvalidIdentifier() { // given - final DeviceDeleteRequest request = new DeviceDeleteRequest("test@test.com", "not-existed"); + final DeviceDeleteRequest request = new DeviceDeleteRequest("test@test.com", "not-existed", "target-id"); - doThrow(new NotFoundException("존재하지 않는 디바이스 아이디입니다")) + doThrow(new UnauthorizedException("유효하지 않은 디바이스 아이디입니다")) .when(memberService).deleteDevice(any()); // when & then @@ -131,15 +131,15 @@ void deleteDevice_NotFound() { .when() .delete("/api/v1/device") .then() - .statusCode(HttpStatus.NOT_FOUND.value()) - .body("message", equalTo("존재하지 않는 디바이스 아이디입니다")); + .statusCode(HttpStatus.UNAUTHORIZED.value()) + .body("message", equalTo("유효하지 않은 디바이스 아이디입니다")); } @Test @DisplayName("소유자가 아닌 디바이스 삭제 시 400 응답을 반환한다") void deleteDevice_NotOwner() { // given - final DeviceDeleteRequest request = new DeviceDeleteRequest("other@test.com", "device-id"); + final DeviceDeleteRequest request = new DeviceDeleteRequest("other@test.com", "device-id", "target-id"); doThrow(new BadRequestException("디바이스 소유자가 아닙니다.")) .when(memberService).deleteDevice(any()); diff --git a/src/test/java/com/recyclestudy/member/service/MemberServiceTest.java b/src/test/java/com/recyclestudy/member/service/MemberServiceTest.java index 8519a23..a87c39e 100644 --- a/src/test/java/com/recyclestudy/member/service/MemberServiceTest.java +++ b/src/test/java/com/recyclestudy/member/service/MemberServiceTest.java @@ -249,8 +249,9 @@ void deleteDevice() { // given final Email email = Email.from("test@test.com"); final DeviceIdentifier deviceIdentifier = DeviceIdentifier.from("test"); + final DeviceIdentifier targetDeviceIdentifier = DeviceIdentifier.from("target"); final DeviceDeleteInput input = DeviceDeleteInput.from( - email.getValue(), deviceIdentifier.getValue()); + email.getValue(), deviceIdentifier.getValue(), targetDeviceIdentifier.getValue()); final Member member = Member.withoutId(email); final Device device = Device.withoutId(member, deviceIdentifier, true, ActivationExpiredDateTime.create(now)); @@ -260,34 +261,34 @@ void deleteDevice() { memberService.deleteDevice(input); // then - verify(deviceRepository).delete(device); + verify(deviceRepository).deleteByIdentifier(targetDeviceIdentifier); } @Test - @DisplayName("존재하지 않는 디바이스 삭제 시도 시 예외를 던진다") - void deleteDevice_fail_notFound() { + @DisplayName("유효하지 않은 디바이스 아이디로 삭제 시도 시 예외를 던진다") + void deleteDevice_fail_invalidIdentifier() { // given final Email email = Email.from("test@test.com"); final DeviceIdentifier deviceIdentifier = DeviceIdentifier.from("not-existed"); final DeviceDeleteInput input = DeviceDeleteInput.from( - email.getValue(), deviceIdentifier.getValue()); + email.getValue(), deviceIdentifier.getValue(), "target"); given(deviceRepository.findByIdentifier(deviceIdentifier)).willReturn(Optional.empty()); // when & then assertThatThrownBy(() -> memberService.deleteDevice(input)) - .isInstanceOf(NotFoundException.class); + .isInstanceOf(UnauthorizedException.class); } @Test - @DisplayName("소유자가 아닌 디바이스 삭제 시도 시 예외를 던진다") + @DisplayName("소유자가 아닌 디바이스로 삭제 시도 시 예외를 던진다") void deleteDevice_fail_owner() { // given final Email email = Email.from("test@test.com"); final Email otherEmail = Email.from("other@test.com"); final DeviceIdentifier deviceIdentifier = DeviceIdentifier.from("test"); final DeviceDeleteInput input = DeviceDeleteInput.from( - otherEmail.getValue(), deviceIdentifier.getValue()); + otherEmail.getValue(), deviceIdentifier.getValue(), "target"); final Member member = Member.withoutId(email); final Device device = Device.withoutId(member, deviceIdentifier, true, ActivationExpiredDateTime.create(now));