diff --git a/bucketback-api/src/main/java/com/programmers/bucketback/global/config/security/SecurityManager.java b/bucketback-api/src/main/java/com/programmers/bucketback/global/config/security/SecurityManager.java index 76edc0d03..d180da8d1 100644 --- a/bucketback-api/src/main/java/com/programmers/bucketback/global/config/security/SecurityManager.java +++ b/bucketback-api/src/main/java/com/programmers/bucketback/global/config/security/SecurityManager.java @@ -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) { diff --git a/bucketback-api/src/test/java/com/programmers/bucketback/global/config/security/jwt/JwtServiceTest.java b/bucketback-api/src/test/java/com/programmers/bucketback/global/config/security/jwt/JwtServiceTest.java new file mode 100644 index 000000000..67fc5f50c --- /dev/null +++ b/bucketback-api/src/test/java/com/programmers/bucketback/global/config/security/jwt/JwtServiceTest.java @@ -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); + } + } + +} \ No newline at end of file diff --git a/bucketback-domain/src/main/java/com/programmers/bucketback/domains/comment/domain/vo/Content.java b/bucketback-domain/src/main/java/com/programmers/bucketback/domains/comment/domain/vo/Content.java index 3ba37652f..9cfb8d3a9 100644 --- a/bucketback-domain/src/main/java/com/programmers/bucketback/domains/comment/domain/vo/Content.java +++ b/bucketback-domain/src/main/java/com/programmers/bucketback/domains/comment/domain/vo/Content.java @@ -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; @@ -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); } } diff --git a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/comment/domain/vo/ContentTest.java b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/comment/domain/vo/ContentTest.java new file mode 100644 index 000000000..1fa8375f1 --- /dev/null +++ b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/comment/domain/vo/ContentTest.java @@ -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(); + } + + @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); + } +} \ No newline at end of file diff --git a/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedReaderTest.java b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedReaderTest.java new file mode 100644 index 000000000..72ee40ca5 --- /dev/null +++ b/bucketback-domain/src/test/java/com/programmers/bucketback/domains/feed/implementation/FeedReaderTest.java @@ -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 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 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); + } +} \ No newline at end of file