Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[OMCT-410] jwt,content 단위 테스트, feedReader 상세 조회 테스트 #218

Merged
merged 15 commits into from
Jan 8, 2024
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 @@ -31,7 +31,7 @@ public void authenticate(
}

public String generateAccessToken(final Long memberId) {
return jwtService.generateAccessToken(memberId.toString());
return jwtService.generateAccessToken(String.valueOf(memberId));
}

public String generateRefreshToken(final Long memberId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.programmers.bucketback.global.config.security.jwt;

import static org.assertj.core.api.Assertions.*;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import com.programmers.bucketback.domains.member.domain.Member;
import com.programmers.bucketback.domains.member.domain.MemberBuilder;

import io.jsonwebtoken.JwtException;

class JwtServiceTest {

private String accessSecretKey = "testsecretkeydaslkjslsdnmflsdkgjsldgkjlweptojkgn";
private String refreshSecretKey = "testsecretkeydaslkjslsdnmflsdkgjsldgkjlweptojkgn";
private JwtConfig jwtConfig = new JwtConfig(accessSecretKey, 100, refreshSecretKey, 100);
private JwtService jwtService = new JwtService(jwtConfig);

@Test
@DisplayName("access token 생성에 성공한다.")
void successAccessTokenCreate() {
//given
Long memberId = 1L;
Member member = MemberBuilder.build(memberId);

//when
String token = jwtService.generateAccessToken(String.valueOf(member.getId()));
String username = jwtService.extractUsername(token);

//then
assertThat(jwtService.isAccessTokenValid(token)).isEqualTo(true);
assertThat(username).isEqualTo(String.valueOf(member.getId()));
}

@Nested
@DisplayName("유효한 토큰 유효성 검사")
class ValidAccessToken {

@ParameterizedTest
@ValueSource(ints = {1, 10, 1000})
@DisplayName("유효한 토큰 검사에 성공한다.")
void successValidTokenEvaluation(int expirationSecond) {
//given
JwtConfig jwtConfig = new JwtConfig(accessSecretKey, expirationSecond, refreshSecretKey, 100);
JwtService jwtService = new JwtService(jwtConfig);

Long memberId = 1L;
Member member = MemberBuilder.build(memberId);
String token = jwtService.generateAccessToken(String.valueOf(member.getId()));

//given
boolean result = jwtService.isAccessTokenValid(token);
assertThat(result).isEqualTo(true);
}

@ParameterizedTest
@ValueSource(ints = {0})
@DisplayName("만료된 토큰 검증에 성공한다.")
void successExpiredTokenEvaluation(int expirationSecond) {
//given
JwtConfig jwtConfig = new JwtConfig(accessSecretKey, expirationSecond, refreshSecretKey, 100);
JwtService jwtService = new JwtService(jwtConfig);

Long memberId = 1L;
Member member = MemberBuilder.build(memberId);
String token = jwtService.generateAccessToken(String.valueOf(member.getId()));

//given
assertThatThrownBy(() -> jwtService.isAccessTokenValid(token)).isInstanceOf(JwtException.class);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
public class Content {

public static final int MAX_CONTENT_LENGTH = 300;
public static final int MIN_CONTENT_LENGTH = 1;

@Column(name = "content", length = MAX_CONTENT_LENGTH, nullable = false)
private String content;
Expand All @@ -25,7 +26,10 @@ public Content(final String content) {
}

private void validate(final String content) {
if (content == null || content.length() > MAX_CONTENT_LENGTH) {
if (content == null ||
content.length() > MAX_CONTENT_LENGTH ||
content.length() < MIN_CONTENT_LENGTH
) {
throw new BusinessException(ErrorCode.COMMENT_CONTENT_BAD_LENGTH);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.programmers.bucketback.domains.comment.domain.vo;

import static org.assertj.core.api.Assertions.*;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.NullAndEmptySource;
import org.junit.jupiter.params.provider.ValueSource;

import com.programmers.bucketback.error.BusinessException;

class ContentTest {

@ParameterizedTest
@DisplayName("댓글 내용 유효한 값의 길이 검증 성공")
@ValueSource(ints = {1, 10, 300})
void successValidateContentLength(int count) {
String fill = "a";
Content content = new Content(fill.repeat(count));
assertThat(content).isNotNull();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

p1;
isNotNull 보다는 예외가 터지지 않는 것을 확인하는 메서드니까 doesNotThrowAnyException를 사용하는 것은 어떤가요??

Copy link
Member Author

@HandmadeCloud HandmadeCloud Jan 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

예외가 터지지 않는다 = 값이 정상적으로 잘 생성되었다. 이렇게 볼 수 있을 것 같아요
테스트를 예외 중심으로 바라봐는 시각과 생성 중심으로 바라보냐의 차이로 생각했을 때 저는 후자를 선택했습니다.

}

@ParameterizedTest
@DisplayName("댓글 내용 유효하지 않은 값 예외 검증 성공")
@ValueSource(ints = {301, 0})
void successValidateInvalidContentLength(int count) {
String fill = "a";
assertThatThrownBy(() -> new Content(fill.repeat(count)))
.isInstanceOf(BusinessException.class);
}

@ParameterizedTest
@DisplayName("빈 내용과 null 값에 대한 예외 성공")
@NullAndEmptySource
void successValidateEmptyAndNullContent(String fill) {
assertThatThrownBy(() -> new Content(fill))
.isInstanceOf(BusinessException.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package com.programmers.bucketback.domains.feed.implementation;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;

import java.util.List;
import java.util.Optional;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

import com.programmers.bucketback.domains.bucket.domain.Bucket;
import com.programmers.bucketback.domains.bucket.domain.BucketBuilder;
import com.programmers.bucketback.domains.feed.FeedBuilder;
import com.programmers.bucketback.domains.feed.domain.Feed;
import com.programmers.bucketback.domains.feed.domain.FeedItem;
import com.programmers.bucketback.domains.feed.model.FeedDetail;
import com.programmers.bucketback.domains.feed.model.FeedInfo;
import com.programmers.bucketback.domains.feed.model.FeedItemInfo;
import com.programmers.bucketback.domains.feed.repository.FeedLikeRepository;
import com.programmers.bucketback.domains.feed.repository.FeedRepository;
import com.programmers.bucketback.domains.member.domain.Member;
import com.programmers.bucketback.domains.member.domain.MemberBuilder;
import com.programmers.bucketback.domains.member.implementation.MemberReader;
import com.programmers.bucketback.domains.member.model.MemberInfo;

@ExtendWith(MockitoExtension.class)
class FeedReaderTest {

@Mock
private FeedRepository feedRepository;

@Mock
private FeedLikeRepository feedLikeRepository;

@Mock
private MemberReader memberReader;

@InjectMocks
private FeedReader feedReader;

@Test
@DisplayName("피드 상세 조회에 성공한다.")
void successReadFeedDetail() {
//given
Long memberId = 1L;
Member member = MemberBuilder.build(1L);
Feed feed = FeedBuilder.build();
Long feedId = 1L;

MemberInfo memberInfo = new MemberInfo(member.getId(),
member.getNickname(),
member.getProfileImage(),
member.getLevel()
);

Bucket bucket = BucketBuilder.build();
List<FeedItem> feedItems = bucket.getBucketItems().stream()
.map(bucketItem -> new FeedItem(bucketItem.getItem()))
.toList();
feedItems.forEach(feed::addFeedItem);

FeedInfo feedInfo = FeedInfo.builder()
.id(feed.getId())
.hobby(feed.getHobby().getHobbyValue())
.content(feed.getFeedContent())
.bucketName(feed.getName())
.bucketBudget(feed.getBudget())
.totalPrice(feed.getTotalPrice())
.createdAt(feed.getCreatedAt())
.hasAdoptedComment(false)
.isLiked(true)
.likeCount(feed.getLikes().size())
.build();

List<FeedItemInfo> feedItemInfos = feedItems.stream()
.map(FeedItemInfo::from)
.toList();

given(memberReader.read(anyLong())).willReturn(member);
given(feedLikeRepository.existsByMemberIdAndFeed(anyLong(), any())).willReturn(true);
given(feedRepository.findById(anyLong())).willReturn(Optional.ofNullable(feed));

//when
FeedDetail feedDetail = feedReader.readDetail(feedId, memberId);

//then
assertThat(feedDetail.feedInfo()).usingRecursiveComparison().isEqualTo(feedInfo);
assertThat(feedDetail.memberInfo()).usingRecursiveComparison().isEqualTo(memberInfo);
assertThat(feedDetail.feedItems()).usingRecursiveComparison().isEqualTo(feedItemInfos);
}
}