Skip to content

Commit

Permalink
✨ Feature: 일기 조회 테스트 케이스 작성 및 유효성 검사 추가 (#58)
Browse files Browse the repository at this point in the history
* ✅ Test: DiaryQueryRepositoryTest 작성

* 🧪 Test: DiaryQueryServiceTest 작성

* ✨ Feature: DiaryQueryService 유효성 검사 추가

* ✅ Test: DiaryControllerTest 작성

* ✅ Test: 존재하지 않는 일기 조회 테스트 케이스 추가
  • Loading branch information
ahnsugyeong authored Apr 24, 2024
1 parent c14cf89 commit f2e798d
Show file tree
Hide file tree
Showing 15 changed files with 377 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,13 @@ public ResponseDto<Boolean> checkEmailAvailability(@RequestParam String email) {
})
@Operation(summary = "토큰 재발급", description = "Refresh Token, Access Token을 재발급합니다.")
@PostMapping("/reissue")
public ResponseDto<JwtResponse> reissue(@RequestParam RefreshTokenRequest request) {
public ResponseDto<JwtResponse> reissue(@RequestBody RefreshTokenRequest request) {
return ResponseDto.onSuccess(authFacade.reissueToken(request));
}

@Operation(summary = "로그아웃", description = "사용자의 Refresh Token을 받아 해당 토큰을 무효화합니다.")
@DeleteMapping("/sign-out")
public ResponseDto<Boolean> signOut(@RequestParam RefreshTokenRequest request) {
public ResponseDto<Boolean> signOut(@RequestBody RefreshTokenRequest request) {
return ResponseDto.onSuccess(authFacade.signOut(request));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public void deleteDiary(User user, Long diaryId) {
diaryCommandService.deleteDiary(user, diaryId);
}

public DiaryResponse getDiaryById(User user, Long diaryId) {
return DiaryMapper.toDiaryResponse(diaryQueryService.getDiaryById(user, diaryId));
public DiaryResponse getDiaryByUser(User user, Long diaryId) {
return DiaryMapper.toDiaryResponse(diaryQueryService.getDiaryByUser(user, diaryId));
}

public DiaryListResponse getMonthlyDiariesByUser(User user, int year, int month) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public interface DiaryQueryService {

Diary getDiaryById(User user, Long diaryId);
Diary getDiaryByUser(User user, Long diaryId);

List<Diary> getMonthlyDiariesByUser(User user, int year, int month);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,22 @@ public class DiaryQueryServiceImpl implements DiaryQueryService {
private final DiaryQueryRepository diaryQueryRepository;

@Override
public Diary getDiaryById(User user, Long diaryId) {
public Diary getDiaryByUser(User user, Long diaryId) {
Diary diary = diaryRepository.findById(diaryId)
.orElseThrow(() -> DiaryNotFoundException.EXCEPTION);
if (!diary.getUser().equals(user)) {
throw DiaryAccessDeniedException.EXCEPTION;
}
checkDiaryOwnership(user, diary);
return diary;
}

@Override
public List<Diary> getMonthlyDiariesByUser(User user, int year, int month) {
return diaryQueryRepository.findDiariesByUserAndMonth(user.getId(), year, month);
return diaryQueryRepository.findDiariesByUserAndYearAndMonth(user.getId(), year, month);
}

private void checkDiaryOwnership(User user, Diary diary) {
if (!diary.getUser().getId().equals(user.getId())) {
throw DiaryAccessDeniedException.EXCEPTION;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public String analyzeAverageColorAsHex(String imageUrl) {
int[] averageColor = getAverageColor(imageUrl);
return rgbToHex(averageColor[0], averageColor[1], averageColor[2]);
} catch (Exception e) {
return "#ffffff";
return "#FFFFFF";
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ public ResponseDto<Boolean> deleteDiary(@AuthUser User user,
description = "지정된 ID의 일기를 조회합니다. 상세 정보를 반환합니다."
)
@GetMapping("/{diaryId}")
public ResponseDto<DiaryResponse> getDiaryById(@AuthUser User user,
public ResponseDto<DiaryResponse> getDiaryByUser(@AuthUser User user,
@PathVariable("diaryId") Long diaryId) {
return ResponseDto.onSuccess(diaryFacade.getDiaryById(user, diaryId));
return ResponseDto.onSuccess(diaryFacade.getDiaryByUser(user, diaryId));
}

@ApiErrorCodeExample({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,13 @@ void createDiary() {
DiaryCreateRequest request = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));

// when
Diary createdDiary = diaryCommandService.createDiary(user, request, "FFFFFF", emotions);
Diary createdDiary = diaryCommandService.createDiary(user, request, "#FFFFFF", emotions);

// then
assertThat(createdDiary).isNotNull();
assertThat(createdDiary.getId()).isNotNull();
assertThat(createdDiary.getContent()).isEqualTo("content");
assertThat(createdDiary.getPainting().getColor()).isEqualTo("FFFFFF");
assertThat(createdDiary.getPainting().getColor()).isEqualTo("#FFFFFF");
assertThat(createdDiary.getDate()).isEqualTo(LocalDateTime.of(2024, 1, 1, 0, 0));

assertThat(createdDiary.getDiaryEmotions())
Expand All @@ -107,7 +107,7 @@ void shouldNotCreateDiaryWithFutureDate() {
.build();

// when & then
assertThatThrownBy(() -> diaryCommandService.createDiary(user, request, "FFFFFF", emotions))
assertThatThrownBy(() -> diaryCommandService.createDiary(user, request, "#FFFFFF", emotions))
.isInstanceOf(DiaryDateOutOfBoundsException.class)
.hasMessageContaining("일기는 오늘 날짜 이후로 생성할 수 없습니다.");
}
Expand All @@ -117,10 +117,10 @@ void shouldNotCreateDiaryWithFutureDate() {
void shouldNotCreateDiaryWithDuplicatedDate() {
// given
DiaryCreateRequest request = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
diaryCommandService.createDiary(user, request, "FFFFFF", emotions);
diaryCommandService.createDiary(user, request, "#FFFFFF", emotions);

// when & then
assertThatThrownBy(() -> diaryCommandService.createDiary(user, request, "FFFFFF", emotions))
assertThatThrownBy(() -> diaryCommandService.createDiary(user, request, "#FFFFFF", emotions))
.isInstanceOf(DiaryDuplicateDateException.class)
.hasMessageContaining("해당 날짜에 이미 일기가 존재합니다.");
}
Expand All @@ -130,7 +130,7 @@ void shouldNotCreateDiaryWithDuplicatedDate() {
void updateDiary() {
// given
DiaryCreateRequest createRequest = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "FFFFFF", emotions);
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "#FFFFFF", emotions);

DiaryUpdateRequest updateRequest = buildValidDiaryUpdateRequest(
"updated content",
Expand All @@ -144,7 +144,7 @@ void updateDiary() {
assertThat(updatedDiary).isNotNull();
assertThat(updatedDiary.getId()).isNotNull();
assertThat(updatedDiary.getContent()).isEqualTo("updated content");
assertThat(updatedDiary.getPainting().getColor()).isEqualTo("FFFFFF");
assertThat(updatedDiary.getPainting().getColor()).isEqualTo("#FFFFFF");
assertThat(updatedDiary.getDate()).isEqualTo(LocalDateTime.of(2023, 1, 1, 0, 0));

assertThat(createdDiary.getDiaryEmotions())
Expand All @@ -158,7 +158,7 @@ void updateDiary() {
void updateDiaryContentOnly() {
// given
DiaryCreateRequest createRequest = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "FFFFFF", emotions);
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "#FFFFFF", emotions);

DiaryUpdateRequest updateRequest = buildValidDiaryUpdateRequest("updated content", null);

Expand All @@ -169,7 +169,7 @@ void updateDiaryContentOnly() {
assertThat(updatedDiary).isNotNull();
assertThat(updatedDiary.getId()).isNotNull();
assertThat(updatedDiary.getContent()).isEqualTo("updated content");
assertThat(updatedDiary.getPainting().getColor()).isEqualTo("FFFFFF");
assertThat(updatedDiary.getPainting().getColor()).isEqualTo("#FFFFFF");
assertThat(updatedDiary.getDate()).isEqualTo(LocalDateTime.of(2024, 1, 1, 0, 0));

assertThat(createdDiary.getDiaryEmotions())
Expand All @@ -183,7 +183,7 @@ void updateDiaryContentOnly() {
void updateDiaryDateOnly() {
// given
DiaryCreateRequest createRequest = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "FFFFFF", emotions);
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "#FFFFFF", emotions);

DiaryUpdateRequest updateRequest = buildValidDiaryUpdateRequest(null, LocalDateTime.of(2023, 1, 1, 0, 0));

Expand All @@ -194,7 +194,7 @@ void updateDiaryDateOnly() {
assertThat(updatedDiary).isNotNull();
assertThat(updatedDiary.getId()).isNotNull();
assertThat(updatedDiary.getContent()).isEqualTo("content");
assertThat(updatedDiary.getPainting().getColor()).isEqualTo("FFFFFF");
assertThat(updatedDiary.getPainting().getColor()).isEqualTo("#FFFFFF");
assertThat(updatedDiary.getDate()).isEqualTo(LocalDateTime.of(2023, 1, 1, 0, 0));

assertThat(createdDiary.getDiaryEmotions())
Expand All @@ -221,7 +221,7 @@ void throwExceptionWhenUPDATENonExistentDiary() {
void shouldNotUpdateDiaryWithFutureDate() {
// given
DiaryCreateRequest createRequest = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "FFFFFF", emotions);
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "#FFFFFF", emotions);

DiaryUpdateRequest updateRequest = buildValidDiaryUpdateRequest(null, LocalDateTime.now().plusDays(1));

Expand All @@ -236,10 +236,10 @@ void shouldNotUpdateDiaryWithFutureDate() {
void shouldNotUpdateDiaryWithDuplicatedDate() {
// given
DiaryCreateRequest createRequest1 = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
diaryCommandService.createDiary(user, createRequest1, "FFFFFF", emotions);
diaryCommandService.createDiary(user, createRequest1, "#FFFFFF", emotions);

DiaryCreateRequest createRequest2 = buildValidDiaryCreateRequest(LocalDateTime.of(2023, 1, 1, 0, 0));
Diary createdDiary = diaryCommandService.createDiary(user, createRequest2, "FFFFFF", emotions);
Diary createdDiary = diaryCommandService.createDiary(user, createRequest2, "#FFFFFF", emotions);

DiaryUpdateRequest updateRequest = buildValidDiaryUpdateRequest(null, LocalDateTime.of(2024, 1, 1, 0, 0));

Expand All @@ -257,7 +257,7 @@ void shouldThrowAccessDeniedWhenUpdatingOtherUsersDiary() {
userRepository.save(otherUser);

DiaryCreateRequest createRequest = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
Diary diary = diaryCommandService.createDiary(user, createRequest, "FFFFFF", emotions);
Diary diary = diaryCommandService.createDiary(user, createRequest, "#FFFFFF", emotions);

DiaryUpdateRequest updateRequest = buildValidDiaryUpdateRequest("updated content", LocalDateTime.now());

Expand All @@ -273,7 +273,7 @@ void shouldThrowAccessDeniedWhenUpdatingOtherUsersDiary() {
void deleteDiarySuccessfully() {
// given
DiaryCreateRequest createRequest = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "FFFFFF", emotions);
Diary createdDiary = diaryCommandService.createDiary(user, createRequest, "#FFFFFF", emotions);

// when
diaryCommandService.deleteDiary(user, createdDiary.getId());
Expand Down Expand Up @@ -304,7 +304,7 @@ void shouldThrowAccessDeniedWhenDeletingOtherUsersDiary() {
userRepository.save(otherUser);

DiaryCreateRequest createRequest = buildValidDiaryCreateRequest(LocalDateTime.of(2024, 1, 1, 0, 0));
Diary diary = diaryCommandService.createDiary(user, createRequest, "FFFFFF", emotions);
Diary diary = diaryCommandService.createDiary(user, createRequest, "#FFFFFF", emotions);

// when & then
assertThrows(DiaryAccessDeniedException.class, () -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package zzangdol.diary.implement;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.time.LocalDateTime;
import java.util.List;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import zzangdol.diary.dao.DiaryRepository;
import zzangdol.diary.domain.Diary;
import zzangdol.exception.custom.DiaryAccessDeniedException;
import zzangdol.exception.custom.DiaryNotFoundException;
import zzangdol.user.dao.UserRepository;
import zzangdol.user.domain.User;

@SpringBootTest
class DiaryQueryServiceTest {

@Autowired
private DiaryQueryService diaryQueryService;

@Autowired
private UserRepository userRepository;

@Autowired
private DiaryRepository diaryRepository;

private User user;

@BeforeEach
void setUp() {
diaryRepository.deleteAll();
userRepository.deleteAll();
user = User.builder().build();
userRepository.save(user);
}

@AfterEach
void tearDown() {
diaryRepository.deleteAllInBatch();
userRepository.deleteAllInBatch();
}

@DisplayName("특정 일기를 조회한다.")
@Test
void getDiaryByUser() {
// given
Diary diary = buildDiary(LocalDateTime.of(2024, 4, 1, 0, 0));
diary = diaryRepository.save(diary);

// when
Diary result = diaryQueryService.getDiaryByUser(user, diary.getId());

// then
assertThat(result).isNotNull();
assertThat(result.getId()).isEqualTo(diary.getId());
assertThat(result.getContent()).isEqualTo("content");
assertThat(result.getDate()).isEqualTo(LocalDateTime.of(2024, 4, 1, 0, 0));
}

@DisplayName("특정 사용자의 특정 연도와 월에 대한 일기 목록을 조회한다.")
@Test
void getMonthlyDiariesByUser() {
// given
Diary diary1 = buildDiary(LocalDateTime.of(2024, 4, 1, 0, 0));
Diary diary2 = buildDiary(LocalDateTime.of(2024, 4, 30, 23, 59));
Diary diary3 = buildDiary(LocalDateTime.of(2024, 5, 1, 0, 0));
Diary diary4 = buildDiary(LocalDateTime.of(2024, 3, 31, 23, 59));
diaryRepository.saveAll(List.of(diary1, diary2, diary3, diary4));

int year = 2024;
int month = 4;

// when
List<Diary> result = diaryQueryService.getMonthlyDiariesByUser(user, year, month);

// then
assertThat(result).isNotNull();
assertThat(result).hasSize(2);
assertThat(result).extracting("date")
.containsExactlyInAnyOrder(
LocalDateTime.of(2024, 4, 1, 0, 0),
LocalDateTime.of(2024, 4, 30, 23, 59));
}

@DisplayName("다른 사용자의 일기를 조회하려 할 때 접근 거부 예외를 발생시킨다.")
@Test
void accessDeniedWhenUserIsNotOwner() {
// given
Diary diary = buildDiary(LocalDateTime.of(2024, 4, 1, 0, 0));
diaryRepository.save(diary);
User otherUser = User.builder().build();

// when & then
assertThrows(DiaryAccessDeniedException.class, () -> {
diaryQueryService.getDiaryByUser(otherUser, diary.getId());
});
}

@Test
@DisplayName("존재하지 않는 일기를 조회하려 할 때 예외를 발생시킨다.")
void throwExceptionWhenGetNonExistentDiary() {
// given
Long nonExistentDiaryId = 999L; // 존재하지 않는 ID

// when & then
assertThrows(DiaryNotFoundException.class, () -> {
diaryQueryService.getDiaryByUser(user, nonExistentDiaryId);
});
}

private Diary buildDiary(LocalDateTime date) {
return Diary.builder()
.user(user)
.content("content")
.date(date)
.build();
}
}
Loading

0 comments on commit f2e798d

Please sign in to comment.