Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
Expand Down Expand Up @@ -80,4 +81,18 @@ public ResponseEntity<DiagnosisSummaryRes> createDiagnosis(
URI location = UriUtil.createLocationUri(resBody.diagnosisId());
return ResponseEntity.created(location).body(resBody);
}

@Operation(summary = "진단 삭제")
@ApiResponses({ @ApiResponse(responseCode = "204", description = "삭제 성공") })
@ApiErrorCodes({ ErrorCode.INVALID_REQUEST, ErrorCode.DIAGNOSIS_NOT_FOUND, ErrorCode.INTERNAL_ERROR })
@DeleteMapping("/{diagnosisId}")
public ResponseEntity<Void> deleteDiagnosis(
@PathVariable
@Positive(message = "Id는 1 이상의 정수여야 합니다.")
Integer diagnosisId,
@RequestAttribute(USER_ID) Long userId
) {
diagnosisService.deleteDiagnosis(diagnosisId, userId);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,6 @@ Optional<DiagnosisResult> findDetailByIdAndUserId(
@Param("diagnosisId") Integer diagnosisId,
@Param("userId") Long userId
);

Optional<DiagnosisResult> findByIdAndUser_KakaoId(Integer id, Long kakaoId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,14 @@ public DiagnosisDetailRes getDiagnosisDetailById(Integer diagnosisId, Long userI
weaknesses);
}

@Transactional
public void deleteDiagnosis(Integer diagnosisId, Long userId) {
DiagnosisResult diagnosis = diagnosisRepository.findByIdAndUser_KakaoId(diagnosisId, userId)
.orElseThrow(() -> new CustomException(ErrorCode.DIAGNOSIS_NOT_FOUND));

diagnosisRepository.delete(diagnosis);
}

private void validateUserJob(User user) {
if (user.getJob() == null) {
throw new CustomException(ErrorCode.JOB_NOT_SELECTED);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,4 +361,40 @@ void getDiagnosisDetail_noWeaknesses() {
assertThat(result.weaknesses()).isEmpty();
}
}

@Nested
@DisplayName("deleteDiagnosis")
class DeleteDiagnosisTest {

@Test
@DisplayName("진단을 성공적으로 삭제한다")
void deleteDiagnosis_success() {
Integer diagnosisId = 1;
Long userId = 1L;

DiagnosisResult diagnosis = mock(DiagnosisResult.class);
when(diagnosisRepository.findByIdAndUser_KakaoId(diagnosisId, userId)).thenReturn(Optional.of(diagnosis));

diagnosisService.deleteDiagnosis(diagnosisId, userId);

verify(diagnosisRepository).findByIdAndUser_KakaoId(diagnosisId, userId);
verify(diagnosisRepository).delete(diagnosis);
}

@Test
@DisplayName("진단이 없거나 내 진단이 아니면 DIAGNOSIS_NOT_FOUND 예외가 발생하고 삭제하지 않는다")
void deleteDiagnosis_notFound_throwsException() {
Integer diagnosisId = 999;
Long userId = 1L;

when(diagnosisRepository.findByIdAndUser_KakaoId(diagnosisId, userId)).thenReturn(Optional.empty());

assertThatThrownBy(() -> diagnosisService.deleteDiagnosis(diagnosisId, userId)).isInstanceOf(
CustomException.class).extracting(e -> ((CustomException) e).getErrorCode())
.isEqualTo(ErrorCode.DIAGNOSIS_NOT_FOUND);

verify(diagnosisRepository).findByIdAndUser_KakaoId(diagnosisId, userId);
verify(diagnosisRepository, never()).delete(any(DiagnosisResult.class));
}
}
}