Skip to content

Commit 2947847

Browse files
authored
Merge pull request #173 from DayByQuest/test/service
[Test] 서비스에 대한 테스트를 작성한다
2 parents 8828e01 + 9c78f67 commit 2947847

File tree

21 files changed

+507
-16
lines changed

21 files changed

+507
-16
lines changed

src/main/java/daybyquest/badge/application/SaveBadgeService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import daybyquest.badge.domain.Badge;
44
import daybyquest.badge.domain.Badges;
5+
import daybyquest.badge.dto.request.SaveBadgeRequest;
56
import daybyquest.image.application.ImageService;
67
import daybyquest.image.domain.Image;
78
import org.springframework.stereotype.Service;
@@ -23,9 +24,9 @@ public SaveBadgeService(final Badges badges, final ImageService imageService) {
2324
}
2425

2526
@Transactional
26-
public void invoke(final String name, final MultipartFile file) {
27+
public Long invoke(final SaveBadgeRequest request, final MultipartFile file) {
2728
final Image image = imageService.convertToImage(CATEGORY, file);
28-
final Badge badge = new Badge(name, image);
29-
badges.save(badge);
29+
final Badge badge = new Badge(request.getName(), image);
30+
return badges.save(badge).getId();
3031
}
3132
}

src/main/java/daybyquest/badge/presentation/BadgeCommandApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public BadgeCommandApi(final SaveBadgeService saveBadgeService) {
2525
public ResponseEntity<Void> saveBadge(final AccessUser user,
2626
@RequestPart("image") final MultipartFile image,
2727
@RequestPart("request") @Valid final SaveBadgeRequest request) {
28-
saveBadgeService.invoke(request.getName(), image);
28+
saveBadgeService.invoke(request, image);
2929
return ResponseEntity.ok().build();
3030
}
3131
}

src/main/java/daybyquest/comment/application/SaveCommentService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ public SaveCommentService(final Comments comments) {
1616
}
1717

1818
@Transactional
19-
public void invoke(final Long loginId, final Long postId, final SaveCommentRequest request) {
19+
public Long invoke(final Long loginId, final Long postId, final SaveCommentRequest request) {
2020
final Comment comment = new Comment(loginId, postId, request.getContent());
21-
comments.save(comment);
21+
return comments.save(comment).getId();
2222
}
2323
}

src/main/java/daybyquest/comment/domain/Comments.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package daybyquest.comment.domain;
22

3+
import daybyquest.global.error.exception.NotExistCommentException;
34
import daybyquest.post.domain.Posts;
45
import daybyquest.user.domain.Users;
56
import org.springframework.stereotype.Component;
@@ -19,9 +20,13 @@ public class Comments {
1920
this.posts = posts;
2021
}
2122

22-
public void save(final Comment comment) {
23+
public Comment save(final Comment comment) {
2324
users.validateExistentById(comment.getUserId());
2425
posts.validateExistentById(comment.getPostId());
25-
commentRepository.save(comment);
26+
return commentRepository.save(comment);
27+
}
28+
29+
public Comment getById(final Long id) {
30+
return commentRepository.findById(id).orElseThrow(NotExistCommentException::new);
2631
}
2732
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package daybyquest.global.error.exception;
2+
3+
import daybyquest.global.error.ExceptionCode;
4+
5+
public class NotExistCommentException extends CustomException {
6+
7+
public NotExistCommentException() {
8+
super(ExceptionCode.NOT_EXIST_COMMENT);
9+
}
10+
}

src/main/java/daybyquest/profile/application/GetPresetBadgeService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ public GetPresetBadgeService(final Users users, final ProfileSettings profileSet
2828
@Transactional(readOnly = true)
2929
public MultipleBadgesResponse invoke(final String username) {
3030
final Long userId = users.getUserIdByUsername(username);
31-
final List<Long> badgeIds = profileSettings.getById(userId).getBadgeIds();
32-
final List<BadgeResponse> responses = badgeDao.findAllByIdIn(badgeIds)
31+
final List<BadgeResponse> responses = badgeDao.findAllByIdIn(profileSettings.getBadgeIdsById(userId))
3332
.stream().map(BadgeResponse::of).toList();
3433
return new MultipleBadgesResponse(responses);
3534
}

src/main/java/daybyquest/profile/domain/ProfileSettings.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package daybyquest.profile.domain;
22

33
import daybyquest.global.error.exception.NotExistUserException;
4+
import java.util.List;
45
import org.springframework.stereotype.Component;
6+
import org.springframework.transaction.annotation.Transactional;
57

68
@Component
79
public class ProfileSettings {
@@ -19,4 +21,9 @@ public void save(final ProfileSetting profileSetting) {
1921
public ProfileSetting getById(final Long userId) {
2022
return profileSettingRepository.findByUserId(userId).orElseThrow(NotExistUserException::new);
2123
}
24+
25+
@Transactional(readOnly = true)
26+
public List<Long> getBadgeIdsById(final Long userId) {
27+
return getById(userId).getBadgeIds();
28+
}
2229
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package daybyquest.badge.application;
2+
3+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_1;
4+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_2;
5+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_3;
6+
import static org.assertj.core.api.Assertions.assertThat;
7+
8+
import daybyquest.badge.dto.response.BadgeResponse;
9+
import daybyquest.badge.dto.response.PageBadgesResponse;
10+
import daybyquest.support.test.ServiceTest;
11+
import java.util.List;
12+
import org.junit.jupiter.api.Test;
13+
import org.springframework.beans.factory.annotation.Autowired;
14+
15+
public class GetMyBadgesServiceTest extends ServiceTest {
16+
17+
@Autowired
18+
private GetMyBadgesService getMyBadgesService;
19+
20+
@Test
21+
void 내_뱃지_목록을_조회한다() {
22+
// given
23+
final Long aliceId = ALICE를_저장한다();
24+
final Long badge1Id = badges.save(BADGE_1.생성()).getId();
25+
final Long badge2Id = badges.save(BADGE_2.생성()).getId();
26+
badges.save(BADGE_3.생성());
27+
ownings.saveByUserIdAndBadgeId(aliceId, badge1Id);
28+
ownings.saveByUserIdAndBadgeId(aliceId, badge2Id);
29+
30+
final List<Long> expected = List.of(badge1Id, badge2Id);
31+
32+
// when
33+
final PageBadgesResponse response = getMyBadgesService.invoke(aliceId, 시간_페이지());
34+
final List<Long> actual = response.badges().stream().map(BadgeResponse::id).toList();
35+
36+
// then
37+
assertThat(actual).containsExactlyInAnyOrderElementsOf(expected);
38+
}
39+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package daybyquest.badge.application;
2+
3+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_1;
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
import static org.junit.jupiter.api.Assertions.assertAll;
6+
7+
import daybyquest.badge.domain.Badge;
8+
import daybyquest.badge.dto.request.SaveBadgeRequest;
9+
import daybyquest.support.test.ServiceTest;
10+
import org.junit.jupiter.api.Test;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.test.util.ReflectionTestUtils;
13+
import org.springframework.web.multipart.MultipartFile;
14+
15+
public class SaveBadgeServiceTest extends ServiceTest {
16+
17+
@Autowired
18+
private SaveBadgeService saveBadgeService;
19+
20+
@Test
21+
void 뱃지를_생성한다() {
22+
// given
23+
final SaveBadgeRequest request = 뱃지_생성_요청(BADGE_1.생성());
24+
final MultipartFile file = 사진_파일(BADGE_1.imageIdentifier);
25+
26+
// when
27+
final Long badgeId = saveBadgeService.invoke(request, file);
28+
final Badge actual = badges.getById(badgeId);
29+
30+
// then
31+
assertAll(() -> {
32+
assertThat(actual.getName()).isEqualTo(BADGE_1.name);
33+
assertThat(actual.getImage().getIdentifier()).isEqualTo(BADGE_1.imageIdentifier);
34+
});
35+
}
36+
37+
private SaveBadgeRequest 뱃지_생성_요청(final Badge badge) {
38+
final SaveBadgeRequest request = new SaveBadgeRequest();
39+
ReflectionTestUtils.setField(request, "name", badge.getName());
40+
return request;
41+
}
42+
}

src/test/java/daybyquest/badge/presentation/BadgeCommandApiTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import static daybyquest.support.fixture.BadgeFixtures.BADGE_1;
44
import static org.mockito.ArgumentMatchers.any;
5-
import static org.mockito.ArgumentMatchers.eq;
65
import static org.mockito.BDDMockito.then;
76
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.multipart;
87
import static org.springframework.restdocs.request.RequestDocumentation.partWithName;
@@ -50,7 +49,7 @@ public class BadgeCommandApiTest extends ApiTest {
5049
requestParts(partWithName("image").description("사진"),
5150
partWithName("request").description("요청")))
5251
);
53-
then(saveBadgeService).should().invoke(eq(BADGE_1.name), any());
52+
then(saveBadgeService).should().invoke(any(), any());
5453
}
5554

5655
private SaveBadgeRequest 뱃지_생성_요청(final Badge badge) {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package daybyquest.comment.application;
2+
3+
import static daybyquest.support.fixture.CommentFixtures.댓글_1;
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
6+
import daybyquest.comment.dto.response.CommentResponse;
7+
import daybyquest.comment.dto.response.PageCommentsResponse;
8+
import daybyquest.support.fixture.PostFixtures;
9+
import daybyquest.support.test.ServiceTest;
10+
import java.util.List;
11+
import org.junit.jupiter.api.Test;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
14+
public class GetCommentsByPostIdServiceTest extends ServiceTest {
15+
16+
@Autowired
17+
private GetCommentsByPostIdService getCommentsByPostIdService;
18+
19+
@Test
20+
void 게시물_ID를_통해_댓글_목록을_조회한다() {
21+
// given
22+
final Long aliceId = ALICE를_저장한다();
23+
final Long bobId = BOB을_저장한다();
24+
25+
final Long post1Id = posts.save(PostFixtures.POST_1.생성(aliceId)).getId();
26+
final Long post2Id = posts.save(PostFixtures.POST_2.생성(aliceId)).getId();
27+
28+
final List<Long> expected = List.of(comments.save(댓글_1.생성(post1Id, aliceId)).getId(),
29+
comments.save(댓글_1.생성(post1Id, bobId)).getId());
30+
comments.save(댓글_1.생성(post2Id, aliceId));
31+
32+
// when
33+
final PageCommentsResponse response = getCommentsByPostIdService.invoke(aliceId, post1Id, 페이지());
34+
final List<Long> actual = response.comments().stream().map(CommentResponse::id).toList();
35+
36+
// then
37+
assertThat(actual).containsExactlyInAnyOrderElementsOf(expected);
38+
}
39+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package daybyquest.comment.application;
2+
3+
import static daybyquest.support.fixture.CommentFixtures.댓글_1;
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
import static org.junit.jupiter.api.Assertions.assertAll;
6+
7+
import daybyquest.comment.domain.Comment;
8+
import daybyquest.comment.dto.request.SaveCommentRequest;
9+
import daybyquest.support.fixture.PostFixtures;
10+
import daybyquest.support.test.ServiceTest;
11+
import org.junit.jupiter.api.Test;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.test.util.ReflectionTestUtils;
14+
15+
public class SaveCommentServiceTest extends ServiceTest {
16+
17+
@Autowired
18+
private SaveCommentService saveCommentService;
19+
20+
@Test
21+
void 댓글을_저장한다() {
22+
// given
23+
final Long aliceId = ALICE를_저장한다();
24+
final Long postId = posts.save(PostFixtures.POST_1.생성(aliceId)).getId();
25+
final SaveCommentRequest request = 댓글_생성_요청(댓글_1.생성(postId, aliceId));
26+
27+
// when
28+
final Long commentId = saveCommentService.invoke(aliceId, postId, request);
29+
final Comment comment = comments.getById(commentId);
30+
31+
// then
32+
assertAll(() -> {
33+
assertThat(comment.getUserId()).isEqualTo(aliceId);
34+
assertThat(comment.getPostId()).isEqualTo(postId);
35+
assertThat(comment.getContent()).isEqualTo(댓글_1.content);
36+
});
37+
}
38+
39+
private SaveCommentRequest 댓글_생성_요청(final Comment comment) {
40+
final SaveCommentRequest request = new SaveCommentRequest();
41+
ReflectionTestUtils.setField(request, "content", comment.getContent());
42+
return request;
43+
}
44+
}

src/test/java/daybyquest/comment/domain/CommentsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class CommentsTest {
3535
final Long postId = 2L;
3636

3737
// when
38-
comments.save(댓글_1.생성(userId, postId));
38+
comments.save(댓글_1.생성(postId, userId));
3939

4040
// then
4141
assertAll(() -> {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package daybyquest.dislike.application;
2+
3+
import static daybyquest.support.fixture.PostFixtures.POST_1;
4+
import static org.assertj.core.api.Assertions.assertThatCode;
5+
6+
import daybyquest.dislike.domain.PostDislike;
7+
import daybyquest.support.test.ServiceTest;
8+
import org.junit.jupiter.api.Test;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
11+
public class DeletePostDislikeServiceTest extends ServiceTest {
12+
13+
@Autowired
14+
private DeletePostDislikeService deletePostDislikeService;
15+
16+
@Test
17+
void 관심_없음을_취소한다() {
18+
// given
19+
final Long aliceId = ALICE를_저장한다();
20+
final Long postId = posts.save(POST_1.생성(aliceId)).getId();
21+
postDislikes.save(new PostDislike(aliceId, postId));
22+
23+
// when & then
24+
assertThatCode(() -> deletePostDislikeService.invoke(aliceId, postId))
25+
.doesNotThrowAnyException();
26+
}
27+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package daybyquest.dislike.application;
2+
3+
import static daybyquest.global.error.ExceptionCode.ALREADY_DISLIKED_POST;
4+
import static daybyquest.support.fixture.PostFixtures.POST_1;
5+
import static org.assertj.core.api.Assertions.assertThatCode;
6+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
7+
8+
import daybyquest.dislike.domain.PostDislike;
9+
import daybyquest.global.error.exception.InvalidDomainException;
10+
import daybyquest.like.domain.PostLike;
11+
import daybyquest.support.test.ServiceTest;
12+
import org.junit.jupiter.api.Test;
13+
import org.springframework.beans.factory.annotation.Autowired;
14+
15+
public class SavePostDislikeServiceTest extends ServiceTest {
16+
17+
@Autowired
18+
private SavePostDislikeService savePostDislikeService;
19+
20+
@Test
21+
void 관심_없음을_저장한다() {
22+
// given
23+
final Long aliceId = ALICE를_저장한다();
24+
final Long postId = posts.save(POST_1.생성(aliceId)).getId();
25+
26+
// when
27+
savePostDislikeService.invoke(aliceId, postId);
28+
29+
// then
30+
assertThatThrownBy(() -> postDislikes.save(new PostDislike(aliceId, postId)))
31+
.isInstanceOf(InvalidDomainException.class)
32+
.hasMessageContaining(ALREADY_DISLIKED_POST.getMessage());
33+
}
34+
35+
@Test
36+
void 이미_관심_없음을_눌렀으면_저장할_수_없다() {
37+
// given
38+
final Long aliceId = ALICE를_저장한다();
39+
final Long postId = posts.save(POST_1.생성(aliceId)).getId();
40+
postDislikes.save(new PostDislike(aliceId, postId));
41+
42+
// when & then
43+
assertThatThrownBy(() -> savePostDislikeService.invoke(aliceId, postId))
44+
.isInstanceOf(InvalidDomainException.class)
45+
.hasMessageContaining(ALREADY_DISLIKED_POST.getMessage());
46+
}
47+
48+
@Test
49+
void 관심_없음을_누르면_좋아요가_취소된다() {
50+
// given
51+
final Long aliceId = ALICE를_저장한다();
52+
final Long postId = posts.save(POST_1.생성(aliceId)).getId();
53+
postLikes.save(new PostLike(aliceId, postId));
54+
55+
// when & then
56+
assertThatCode(() -> savePostDislikeService.invoke(aliceId, postId))
57+
.doesNotThrowAnyException();
58+
}
59+
}

0 commit comments

Comments
 (0)