Skip to content
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 @@ -8,6 +8,7 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
Expand All @@ -18,9 +19,9 @@ public class DateCloseScheduler {
private final PostRepository postRepository;

@Transactional
@Scheduled(fixedDelay = 1000 * 60)
@Scheduled(fixedDelay = 1000)
public void closePostsByDate() {
log.info("마감 스케줄링 시작");
log.info("마감 스케줄링 시작 | 서버 시간: {}", LocalDateTime.now());
List<Post> postsNeedToClose = postRepository.findPostsNeedToClose();
postsNeedToClose.forEach(Post::close);
log.info("총 {}개 게시글 마감", postsNeedToClose.size());
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/chooz/post/domain/CloseOption.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ private static void validateVoterCloseType(Integer maxVoterCount) {
}

private static void validateDateCloseType(LocalDateTime closedAt) {
if (Objects.isNull(closedAt) || closedAt.isBefore(LocalDateTime.now().plusHours(1))) {
if (Objects.isNull(closedAt) || closedAt.isBefore(LocalDateTime.now().plusMinutes(59))) {
throw new BadRequestException(ErrorCode.INVALID_DATE_CLOSE_OPTION);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ public Slice<PostWithVoteCount> findPostsWithVoteCountByUserId(Long userId, Long
.select(new QPostWithVoteCount(
post,
JPAExpressions
.select(vote.userId.countDistinct())
.select(vote.userId.count())
.from(vote)
.where(
vote.postId.eq(post.id),
Expand Down
149 changes: 116 additions & 33 deletions src/test/java/com/chooz/post/application/PostQueryServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,89 @@ void findUserPosts2() throws Exception {
);
}

@Test
@DisplayName("유저가 작성한 게시글 조회 - 중복 투표")
void findUserPosts_multiple() {
//given
User user = userRepository.save(UserFixture.createDefaultUser());
Post post1 = postRepository.save(PostFixture.createPostBuilder()
.userId(user.getId())
.pollOption(PostFixture.multiplePollOption())
.build());
Post post2 = postRepository.save(PostFixture.createPostBuilder()
.userId(user.getId())
.pollOption(PostFixture.multiplePollOption())
.build());
//유저1 게시글1 선택지 1, 2 복수 투표
voteRepository.save(VoteFixture.createDefaultVote(user.getId(), post1.getId(), post1.getPollChoices().get(0).getId()));
voteRepository.save(VoteFixture.createDefaultVote(user.getId(), post1.getId(), post1.getPollChoices().get(1).getId()));

//유저1 게시글2 선택지 1 단일 투표
voteRepository.save(VoteFixture.createDefaultVote(user.getId(), post2.getId(), post2.getPollChoices().get(0).getId()));

//when
var response = postService.findUserPosts(user.getId(), null, 10);

//then
List<MyPagePostResponse> data = response.data();
assertAll(
() -> assertThat(response.data()).hasSize(2),
() -> assertThat(response.hasNext()).isFalse(),

() -> assertThat(data.getFirst().id()).isEqualTo(post2.getId()),
() -> assertThat(data.getFirst().title()).isEqualTo(post2.getTitle()),

() -> assertThat(data.getFirst().postVoteInfo().mostVotedPollChoice().title()).isEqualTo(post2.getPollChoices().get(0).getTitle()),
() -> assertThat(data.getFirst().postVoteInfo().totalVoterCount()).isEqualTo(1),
() -> assertThat(data.getFirst().postVoteInfo().mostVotedPollChoice().voteCount()).isEqualTo(1),
() -> assertThat(data.getFirst().postVoteInfo().mostVotedPollChoice().voteRatio()).isEqualTo("100"),

() -> assertThat(data.get(1).id()).isEqualTo(post1.getId()),
() -> assertThat(data.get(1).title()).isEqualTo(post1.getTitle()),

() -> assertThat(data.get(1).postVoteInfo().mostVotedPollChoice().title()).isEqualTo(post1.getPollChoices().get(0).getTitle()),
() -> assertThat(data.get(1).postVoteInfo().totalVoterCount()).isEqualTo(2),
() -> assertThat(data.get(1).postVoteInfo().mostVotedPollChoice().voteCount()).isEqualTo(1),
() -> assertThat(data.get(1).postVoteInfo().mostVotedPollChoice().voteRatio()).isEqualTo("50")
);
}

@Test
@DisplayName("유저가 작성한 게시글 조회 - 중복 투표2")
void findUserPosts_multiple2() {
//given
User user = userRepository.save(UserFixture.createDefaultUser());
User user2 = userRepository.save(UserFixture.createDefaultUser());
Post post = postRepository.save(PostFixture.createPostBuilder()
.userId(user.getId())
.pollOption(PostFixture.multiplePollOption())
.build());
//유저1 선택지 1, 2 복수 투표
voteRepository.save(VoteFixture.createDefaultVote(user.getId(), post.getId(), post.getPollChoices().get(0).getId()));
voteRepository.save(VoteFixture.createDefaultVote(user.getId(), post.getId(), post.getPollChoices().get(1).getId()));

//유저2 선택지 1 단일 투표
voteRepository.save(VoteFixture.createDefaultVote(user.getId(), post.getId(), post.getPollChoices().get(0).getId()));

//when
var response = postService.findUserPosts(user.getId(), null, 10);

//then
List<MyPagePostResponse> data = response.data();
assertAll(
() -> assertThat(response.data()).hasSize(1),
() -> assertThat(response.hasNext()).isFalse(),

() -> assertThat(data.getFirst().id()).isEqualTo(post.getId()),
() -> assertThat(data.getFirst().title()).isEqualTo(post.getTitle()),

() -> assertThat(data.getFirst().postVoteInfo().mostVotedPollChoice().title()).isEqualTo(post.getPollChoices().get(0).getTitle()),
() -> assertThat(data.getFirst().postVoteInfo().totalVoterCount()).isEqualTo(3),
() -> assertThat(data.getFirst().postVoteInfo().mostVotedPollChoice().voteCount()).isEqualTo(2),
() -> assertThat(data.getFirst().postVoteInfo().mostVotedPollChoice().voteRatio()).isEqualTo("67")
);
}

@Test
@DisplayName("유저가 투표한 게시글 조회 - 커서 null인 경우")
void findVotedPosts() throws Exception {
Expand All @@ -151,38 +234,7 @@ void findVotedPosts() throws Exception {
}

@Test
@DisplayName("피드 조회 - 내 게시글 1개, 공개 게시글 15개, 투표 10개, 댓글 20개")
void findFeed() throws Exception {
//given
int size = 20;
User user1 = userRepository.save(createUserBuilder().build());
User user2 = userRepository.save(createUserBuilder().build());

List<Post> publicPosts = createPostsWithScope(user2, Scope.PUBLIC, 15);
createPostsWithScope(user2, Scope.PRIVATE, 3);
Post myPost = postRepository.save(createPostBuilder().userId(user1.getId()).build());

createVotes(user1, publicPosts.getFirst(), 10);
createComments(user1, publicPosts.getFirst(), 20);

List<Vote> publicPostVotes = voteRepository.findByPostIdAndDeletedFalse(publicPosts.getFirst().getId());
List<Comment> publicPostComments = commentRepository.findByPostIdAndDeletedFalse(publicPosts.getFirst().getId());

//when
CursorBasePaginatedResponse<FeedResponse> response = postService.findFeed(user1.getId(), null, size);

//then
assertAll(
() -> assertThat(response.data().size()).isEqualTo(16),
() -> assertThat(response.data().getLast().voterCount()).isEqualTo(1),
() -> assertThat(response.data().getLast().commentCount()).isEqualTo(publicPostComments.size()),
() -> assertThat(response.data().getLast().isAuthor()).isFalse(),
() -> assertThat(response.data().getFirst().isAuthor()).isTrue()
);
}

@Test
@DisplayName("투표 현황 조회 - 중복 투표")
@DisplayName("유저가 투표한 게시글 조회 - 중복 투표")
void findVotedPosts_multiple() {
//given
User user = userRepository.save(UserFixture.createDefaultUser());
Expand Down Expand Up @@ -214,7 +266,7 @@ void findVotedPosts_multiple() {
}

@Test
@DisplayName("투표 현황 조회 - 중복 투표2")
@DisplayName("유저가 투표한 게시글 조회 - 중복 투표2")
void findVotedPosts_multiple2() {
//given
User user = userRepository.save(UserFixture.createDefaultUser());
Expand Down Expand Up @@ -249,6 +301,37 @@ void findVotedPosts_multiple2() {
);
}

@Test
@DisplayName("피드 조회 - 내 게시글 1개, 공개 게시글 15개, 투표 10개, 댓글 20개")
void findFeed() throws Exception {
//given
int size = 20;
User user1 = userRepository.save(createUserBuilder().build());
User user2 = userRepository.save(createUserBuilder().build());

List<Post> publicPosts = createPostsWithScope(user2, Scope.PUBLIC, 15);
createPostsWithScope(user2, Scope.PRIVATE, 3);
Post myPost = postRepository.save(createPostBuilder().userId(user1.getId()).build());

createVotes(user1, publicPosts.getFirst(), 10);
createComments(user1, publicPosts.getFirst(), 20);

List<Vote> publicPostVotes = voteRepository.findByPostIdAndDeletedFalse(publicPosts.getFirst().getId());
List<Comment> publicPostComments = commentRepository.findByPostIdAndDeletedFalse(publicPosts.getFirst().getId());

//when
CursorBasePaginatedResponse<FeedResponse> response = postService.findFeed(user1.getId(), null, size);

//then
assertAll(
() -> assertThat(response.data().size()).isEqualTo(16),
() -> assertThat(response.data().getLast().voterCount()).isEqualTo(1),
() -> assertThat(response.data().getLast().commentCount()).isEqualTo(publicPostComments.size()),
() -> assertThat(response.data().getLast().isAuthor()).isFalse(),
() -> assertThat(response.data().getFirst().isAuthor()).isTrue()
);
}

private List<Post> createPosts(User user, int size) {
List<Post> posts = new ArrayList<>();
for (int i = 0; i < size; i ++) {
Expand Down