프로젝트마다 테스트 코드 적용해야지 해야지 하다가 드디어 본격적으로 해보게 되었다.
public abstract class AbstractValidatorTest {
private ValidatorFactory factory;
protected Validator validator;
@BeforeEach
void setUpValidator() {
factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
@AfterEach
void tearDownValidator() {
if (factory != null) {
factory.close();
}
}
}
@Test
void givenInvalidPhoneNumber_whenValid_thenFailValidation() {
// given
RequestStoreBasicInfo request = new RequestStoreBasicInfo(
"맛있는김밥",
"한식",
"010-1234-578asd",
"신선한 재료로 매일 준비합니다."
);
// when
Set<ConstraintViolation<RequestStoreBasicInfo>> violations = validator.validate(request);
// then
assertThat(violations).hasSize(1);
assertThat(violations)
.extracting("message")
.contains("전화번호 형식이 올바르지 않습니다. 예: 010-1234-5678 또는 02-123-4567");
}
public class StoreFixture {
public static Store createStore(User user) {
StoreRegisterRequestDto dto = new StoreRegisterRequestDto(
createBasicInfo(),
createOperationInfo(),
createOrderSettings()
);
return dto.toEntity(user);
}
public static StoreRegisterRequestDto createStoreRegisterRequestDto() {
return new StoreRegisterRequestDto(
StoreFixture.createBasicInfo(),
StoreFixture.createOperationInfo(),
StoreFixture.createOrderSettings()
);
}
public static User createUser() {
return User.of(
"test@email.com",
"pw",
"사장님",
"010-1234-5678",
UserRole.OWNER
);
}
...
}
@DisplayName("성공 - 가게 상세 조회 (소유주 일치)")
@Test
void givenStoreIdAndUserId_whenGetOwnerStoreDetail_thenReturnStoreDetail() {
// given
Long userId = 1L;
Long storeId = 2L;
User user = mock(User.class);
Store store = StoreFixture.createStore(user);
ReflectionTestUtils.setField(store, "user", user);
ReflectionTestUtils.setField(user, "id", userId);
given(userRepository.findByIdOrElseThrow(userId)).willReturn(user);
given(storeRepository.findByIdOrElseThrow(storeId)).willReturn(store);
given(user.getId()).willReturn(1L);
// when
OwnerStoreDetailResponseDto response = storeService.getOwnerStoreDetail(2L, 1L);
// then
assertThat(response).isNotNull();
assertThat(response.basicInfo().category()).isEqualTo("한식");
assertThat(response.status()).isEqualTo(StoreStatus.CLOSED);
}
@DataJpaTest
@Import(TestAuditorConfig.class)
@ActiveProfiles("test")
class StoreRepositoryTest {
@Autowired
private StoreRepository storeRepository;
@Autowired
private UserRepository userRepository;
private User userEntity;
private StoreRegisterRequestDto dto;
@BeforeEach
void setup() {
userEntity = StoreFixture.createUser();
dto = StoreFixture.createStoreRegisterRequestDto();
}
@DisplayName("가게 검색 목록 조회 테스트")
@Nested
class FindAllOpenedStoreByNameTest {
@DisplayName("성공 - 가게 이름 검색 +_폐업 가게 제외 + OPEN 가게 우선 정렬")
@Test
void givenStoreName_whenFindAllStoreByName_thenReturnPagedStores() {
// given
Pageable pageable = PageRequest.of(0, 10);
User savedUser = userRepository.save(userEntity);
Store store1 = dto.toEntity(savedUser);
Store store2 = dto.toEntity(savedUser);
Store store3 = dto.toEntity(savedUser);
store1.updateStatus(StoreStatus.PERMANENTLY_CLOSED);
store2.updateStatus(StoreStatus.TEMPORARILY_CLOSED);
store3.updateStatus(StoreStatus.OPEN);
storeRepository.save(store1);
storeRepository.save(store2);
storeRepository.save(store3);
// when
Page<Store> result = storeRepository.findAllStoreByName("%김밥%", pageable);
// then
List<Store> stores = result.getContent();
assertThat(stores.get(0).getStatus()).isEqualTo(StoreStatus.OPEN);
assertThat(stores.get(1).getStatus()).isEqualTo(StoreStatus.TEMPORARILY_CLOSED);
assertThat(stores).noneMatch(s -> s.getStatus() == StoreStatus.PERMANENTLY_CLOSED);
}
}
@DisplayName("가게 추가 등록 가능 여부 조회 테스트")
@Nested
class IsStoreRegistrationAvailableTest {
@Test
@DisplayName("성공 - 운영중 가게 수가 3개 미만이면 등록 가능")
void givenLessThanThreeStores_whenCheckAvailability_thenReturnTrue() {
// given
User savedUser = userRepository.save(userEntity);
Store store1 = dto.toEntity(savedUser);
Store store2 = dto.toEntity(savedUser);
Store store3 = dto.toEntity(savedUser);
// 등록된 가게는 3개지만 활성화된 가게는 2개 (폐업 상태인 가게는 제외)
store1.updatePermanentlyClosed(true);
storeRepository.save(store1);
storeRepository.save(store2);
storeRepository.save(store3);
// when
boolean available = storeRepository.isStoreRegistrationAvailable(savedUser.getId());
// then
assertThat(available).isTrue();
}
@Test
@DisplayName("성공 - 운영중 가게 수가 3개 이상이면 등록 불가")
void givenThreeOrMoreStores_whenCheckAvailability_thenReturnFalse() {
// given
User savedUser = userRepository.save(userEntity);
Store store1 = dto.toEntity(savedUser);
Store store2 = dto.toEntity(savedUser);
Store store3 = dto.toEntity(savedUser);
storeRepository.save(store1);
storeRepository.save(store2);
storeRepository.save(store3);
// when
boolean available = storeRepository.isStoreRegistrationAvailable(savedUser.getId());
// then
assertThat(available).isFalse();
}
}
}