Skip to content

Commit

Permalink
[Feature] - 레디스 관련 테스트 코드 작성 (#637)
Browse files Browse the repository at this point in the history
* test: 여행기 페이징 조회 기능 캐시 등록 테스트 작성

* test: 여행기 페이징 조회 기능 캐시 조건 테스트 작성

* test: 여행기 페이징 캐시 TTL 테스트 작성

* test: 테스트간 캐시 격리를 위한 캐시 tearDown 로직 작성

* test: ttl이 30분인지 테스트할 때 Expiration이 29-30분 사이인지 테스트 하도록 수정
  • Loading branch information
Libienz authored Jan 6, 2025
1 parent 8b63f77 commit 5602bca
Showing 1 changed file with 104 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import java.util.List;
import java.util.concurrent.TimeUnit;
import kr.touroot.global.AbstractServiceIntegrationTest;
import kr.touroot.global.auth.dto.MemberAuth;
import kr.touroot.global.exception.BadRequestException;
Expand All @@ -22,21 +23,34 @@
import kr.touroot.travelogue.fixture.TravelogueRequestFixture;
import kr.touroot.travelogue.fixture.TravelogueResponseFixture;
import kr.touroot.travelogue.helper.TravelogueTestHelper;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.redis.core.RedisTemplate;

@DisplayName("여행기 Facade 서비스")
class TravelogueFacadeServiceTest extends AbstractServiceIntegrationTest {

@Autowired
private TravelogueFacadeService service;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private TravelogueTestHelper testHelper;

@BeforeEach
void setUp() {
redisTemplate.getConnectionFactory().getConnection().flushAll();
}

@DisplayName("여행기를 생성할 수 있다.")
@Test
void createTravelogue() {
Expand Down Expand Up @@ -112,6 +126,96 @@ void findTravelogues() {
assertThat(result).containsAll(expect);
}

@DisplayName("여행기 컨텐츠 페이징 응답 시 페이지 번호가 4이하이고 필터 조건과 검색 조건이 없으면 응답을 캐싱한다.")
@ParameterizedTest
@ValueSource(ints = {0, 1, 2, 3, 4})
void cacheTraveloguePage(int pageNumber) {
// given
TravelogueSearchRequest searchRequest = new TravelogueSearchRequest(null, null);
TravelogueFilterRequest filterRequest = new TravelogueFilterRequest(null, null);
Pageable pageRequest = PageRequest.of(pageNumber, 5, Sort.by("id"));

// when
service.findSimpleTravelogues(filterRequest, searchRequest, pageRequest);

// then
String key = "traveloguePage::" + pageRequest.toString();
String cachedValue = redisTemplate.opsForValue().get(key);
assertThat(cachedValue).isNotEmpty();
}

@DisplayName("여행기 컨텐츠 페이징 응답 시 페이지 번호가 5이상이면 응답을 캐싱하지 않는다.")
@ParameterizedTest
@ValueSource(ints = {5, 6, 7, 8, 9})
void noCacheTraveloguePage(int pageNumber) {
// given
TravelogueSearchRequest searchRequest = new TravelogueSearchRequest(null, null);
TravelogueFilterRequest filterRequest = new TravelogueFilterRequest(null, null);
Pageable pageRequest = PageRequest.of(pageNumber, 5, Sort.by("id"));

// when
service.findSimpleTravelogues(filterRequest, searchRequest, pageRequest);

// then
String key = "traveloguePage::" + pageRequest.toString();
String cachedValue = redisTemplate.opsForValue().get(key);
assertThat(cachedValue).isNull();
}

@DisplayName("여행기 컨텐츠 페이징 응답 시 검색 조건이 있다면 응답을 캐싱하지 않는다.")
@Test
void noCacheTraveloguePageWhenSearchConditionExist() {
// given
TravelogueSearchRequest searchRequest = new TravelogueSearchRequest("멋쟁이 리비의 여행", null);
TravelogueFilterRequest filterRequest = new TravelogueFilterRequest(null, null);
Pageable pageRequest = PageRequest.of(1, 5, Sort.by("id"));

// when
service.findSimpleTravelogues(filterRequest, searchRequest, pageRequest);

// then
String key = "traveloguePage::" + pageRequest.toString();
String cachedValue = redisTemplate.opsForValue().get(key);
assertThat(cachedValue).isNull();
}

@DisplayName("여행기 컨텐츠 페이징 응답 시 필터링 조건이 있다면 응답을 캐싱하지 않는다.")
@Test
void noCacheTraveloguePageWhenFilterConditionExist() {
// given
TravelogueSearchRequest searchRequest = new TravelogueSearchRequest(null, null);
TravelogueFilterRequest filterRequest = new TravelogueFilterRequest(null, 3);
Pageable pageRequest = PageRequest.of(1, 5, Sort.by("id"));

// when
service.findSimpleTravelogues(filterRequest, searchRequest, pageRequest);

// then
String key = "traveloguePage::" + pageRequest.toString();
String cachedValue = redisTemplate.opsForValue().get(key);
assertThat(cachedValue).isNull();
}

@DisplayName("여행기 컨텐츠 페이징 응답 캐시는 30분 동안 유지된다.")
@Test
void pageCacheExpiration() {
// given
TravelogueSearchRequest searchRequest = new TravelogueSearchRequest(null, null);
TravelogueFilterRequest filterRequest = new TravelogueFilterRequest(null, null);
Pageable pageRequest = PageRequest.of(1, 5, Sort.by("id"));

// when
service.findSimpleTravelogues(filterRequest, searchRequest, pageRequest);

// then
String key = "traveloguePage::" + pageRequest.toString();
Long ttl = redisTemplate.getExpire(key, TimeUnit.MINUTES);
Assertions.assertAll(
() -> assertThat(ttl).isGreaterThanOrEqualTo(29),
() -> assertThat(ttl).isLessThanOrEqualTo(30)
);
}

@DisplayName("필터링된 여행기 목록을 조회한다.")
@Test
void filterTravelogues() {
Expand Down

0 comments on commit 5602bca

Please sign in to comment.