@Operation(summary = "일기 삭제")
@DeleteMapping("/{diaryId}")
public ResponseEntity<ResultResponse> deleteDiary(@AuthenticationPrincipal UserDetail user,
@PathVariable Long diaryId){
diaryService.deleteDiary(user, diaryId);
return ResponseEntity.ok(ResultResponse.of(ResultCode.DIARY_DELETE_SUCCESS));
}
@AuthenticationPrincipal UserDetail user
이 부분이 들어가 있다. @Test
@WithCustomMockUser
@DisplayName("사용자가 작성한 일기가 PK로 삭제될 수 있다.")
void deleteDiary() throws Exception {
//given
doNothing().when(diaryService).deleteDiary(any(), any());
//when
ResultActions perform =
mockMvc.perform(
delete("/diaries/{diaryId}", 1L));
//then
perform.andExpect(status().isOk());
//docs
perform.andDo(print())
.andDo(document("delete diary",
getDocumentRequest(),
getDocumentResponse()));
}
@AuthenticationPrincipal UserDetail
을 테스트하기 위한 인증된 사용자를 미리 만든 커스텀어노테이션이다.@WithCustomMockUser을 빼도 성공이 된다.
그러나 @DeleteMapping
요청의 경우, 일반적으로 HTTP DELETE
요청은 본문(body) 데이터를 전송하지 않습니다. 따라서 @AuthenticationPrincipal
을 사용하여 UserDetail
객체를 직접 매개변수로 받는 것은 일반적으로 사용되지 않습니다. 대신에 @AuthenticationPrincipal
은 주로 HTTP POST
또는 PUT
요청과 같이 본문 데이터가 있는 요청에서 사용됩니다.
@Operation(summary = "일기 등록")
@PostMapping
public ResponseEntity<ResultResponse> createDiary(@AuthenticationPrincipal UserDetail user,
@RequestPart("file") MultipartFile multipartFile,
@Valid @RequestPart(value="createRequest") DiaryCreateReq createRequest) throws IOException {
String drawingUrl = s3UploadService.saveFile(multipartFile, user.getUsername());
diaryService.createDiary(user, createRequest, drawingUrl);
return ResponseEntity.ok(ResultResponse.of(ResultCode.DIARY_CREATE_SUCCESS));
}
@Test
@DisplayName("일기가 등록될 수 있다.")
void createDiary() throws Exception {
//given
MockMultipartFile file = new MockMultipartFile(
"file", // 파라미터 이름
"file_name", // 파일 이름
"image/jpeg",// 파일 타입
"test file".getBytes(StandardCharsets.UTF_8) // 파일 내용
);
given(s3UploadService.saveFile(any(), any())).willReturn(String.valueOf(file));
DiaryCreateReq createReq = DiaryControllerFixture.CREATE_REQ;
String jsonByCreateReq = objectMapper.writeValueAsString(createReq);
MockMultipartFile request = new MockMultipartFile(
"createRequest",
"createRequest",
"application/json",
jsonByCreateReq.getBytes(StandardCharsets.UTF_8)
);
String token = "accessToken";
diaryService.createDiary(any(), any(), any());
//when
ResultActions perform =
mockMvc.perform(
multipart("/diaries")
.file(file)
.file(request)
.header(HttpHeaders.AUTHORIZATION, "Bearer " + token)
);
// then
perform.andExpect(status().isOk());
// docs
perform.andDo(print())
.andDo(document("register diary",
getDocumentRequest(),
getDocumentResponse()));
}
@WithCustomMockUser
이 없으면 null이 들어가 에러가 발생하게 된다. @Test
@DisplayName("사용자가 작성한 일기가 PK로 삭제될 수 있다.")
void deleteDiary() throws Exception {
//given
doNothing().when(diaryService).deleteDiary(any(), any());
//when
ResultActions perform =
mockMvc.perform(
delete("/diaries/{diaryId}", 1L));
//then
perform.andExpect(status().isOk());
//docs
perform.andDo(print())
.andDo(document("delete diary",
getDocumentRequest(),
getDocumentResponse()));
}