Skip to content

Commit a840c90

Browse files
committed
test: 퀘스트 참여 도메인 서비스 테스트를 작성한다
1 parent 7a59f4a commit a840c90

File tree

7 files changed

+304
-0
lines changed

7 files changed

+304
-0
lines changed

src/main/java/daybyquest/participant/domain/Participants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import daybyquest.user.domain.User;
1414
import daybyquest.user.domain.Users;
1515
import org.springframework.stereotype.Component;
16+
import org.springframework.transaction.annotation.Transactional;
1617

1718
@Component
1819
public class Participants {
@@ -85,6 +86,7 @@ public void validateCountByUserId(final Long userId) {
8586
}
8687
}
8788

89+
@Transactional
8890
public void increaseLinkedCount(final Long userId, final Long questId) {
8991
final Participant participant = getByUserIdAndQuestId(userId, questId);
9092
participant.increaseLinkedCount();
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package daybyquest.participant.application;
2+
3+
import static daybyquest.global.error.ExceptionCode.NOT_CONTINUABLE_QUEST;
4+
import static daybyquest.participant.domain.ParticipantState.CONTINUE;
5+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_1;
6+
import static daybyquest.support.fixture.QuestFixtures.QUEST_1;
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
9+
10+
import daybyquest.global.error.exception.InvalidDomainException;
11+
import daybyquest.participant.domain.Participant;
12+
import daybyquest.support.test.ServiceTest;
13+
import org.junit.jupiter.api.Test;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
16+
public class ContinueQuestServiceTest extends ServiceTest {
17+
18+
@Autowired
19+
private TakeRewardService takeRewardService;
20+
21+
@Autowired
22+
private ContinueQuestService continueQuestService;
23+
24+
@Test
25+
void 퀘스트를_계속한다() {
26+
// given
27+
final Long aliceId = ALICE를_저장한다();
28+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
29+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
30+
participants.saveWithUserIdAndQuestId(aliceId, questId);
31+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount);
32+
takeRewardService.invoke(aliceId, questId);
33+
34+
// when
35+
continueQuestService.invoke(aliceId, questId);
36+
final Participant actual = participants.getByUserIdAndQuestId(aliceId, questId);
37+
38+
// then
39+
assertThat(actual.getState()).isEqualTo(CONTINUE);
40+
}
41+
42+
@Test
43+
void 이미_계속_수행_중인_퀘스트를_계속할_수_없다() {
44+
// given
45+
final Long aliceId = ALICE를_저장한다();
46+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
47+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
48+
participants.saveWithUserIdAndQuestId(aliceId, questId);
49+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount);
50+
takeRewardService.invoke(aliceId, questId);
51+
continueQuestService.invoke(aliceId, questId);
52+
53+
// when & then
54+
assertThatThrownBy(() -> continueQuestService.invoke(aliceId, questId))
55+
.isInstanceOf(InvalidDomainException.class)
56+
.hasMessageContaining(NOT_CONTINUABLE_QUEST.getMessage());
57+
}
58+
59+
@Test
60+
void 보상을_받지_않은_퀘스트를_계속_할_수_없다() {
61+
// given
62+
final Long aliceId = ALICE를_저장한다();
63+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
64+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
65+
participants.saveWithUserIdAndQuestId(aliceId, questId);
66+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount);
67+
68+
// when & then
69+
assertThatThrownBy(() -> continueQuestService.invoke(aliceId, questId))
70+
.isInstanceOf(InvalidDomainException.class)
71+
.hasMessageContaining(NOT_CONTINUABLE_QUEST.getMessage());
72+
}
73+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package daybyquest.participant.application;
2+
3+
import static daybyquest.global.error.ExceptionCode.NOT_ACCEPTED_QUEST;
4+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_1;
5+
import static daybyquest.support.fixture.QuestFixtures.QUEST_1;
6+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
7+
8+
import daybyquest.global.error.exception.InvalidDomainException;
9+
import daybyquest.support.test.ServiceTest;
10+
import org.junit.jupiter.api.Test;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
13+
public class DeleteParticipantServiceTest extends ServiceTest {
14+
15+
@Autowired
16+
private DeleteParticipantService deleteParticipantService;
17+
18+
@Test
19+
void 퀘스트를_삭제한다() {
20+
// given
21+
final Long aliceId = ALICE를_저장한다();
22+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
23+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
24+
participants.saveWithUserIdAndQuestId(aliceId, questId);
25+
26+
// when
27+
deleteParticipantService.invoke(aliceId, questId);
28+
29+
// then
30+
assertThatThrownBy(() -> participants.getByUserIdAndQuestId(aliceId, questId))
31+
.isInstanceOf(InvalidDomainException.class)
32+
.hasMessageContaining(NOT_ACCEPTED_QUEST.getMessage());
33+
}
34+
35+
@Test
36+
void 수락한_적이_없는_퀘스트는_삭제할_수_없다() {
37+
// given
38+
final Long aliceId = ALICE를_저장한다();
39+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
40+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
41+
42+
// when & then
43+
assertThatThrownBy(() -> deleteParticipantService.invoke(aliceId, questId))
44+
.isInstanceOf(InvalidDomainException.class)
45+
.hasMessageContaining(NOT_ACCEPTED_QUEST.getMessage());
46+
}
47+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package daybyquest.participant.application;
2+
3+
import static daybyquest.global.error.ExceptionCode.NOT_FINISHABLE_QUEST;
4+
import static daybyquest.participant.domain.ParticipantState.FINISHED;
5+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_1;
6+
import static daybyquest.support.fixture.QuestFixtures.QUEST_1;
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
9+
10+
import daybyquest.global.error.exception.InvalidDomainException;
11+
import daybyquest.participant.domain.Participant;
12+
import daybyquest.support.test.ServiceTest;
13+
import org.junit.jupiter.api.Test;
14+
import org.springframework.beans.factory.annotation.Autowired;
15+
16+
public class FinishQuestServiceTest extends ServiceTest {
17+
18+
@Autowired
19+
private FinishQuestService finishQuestService;
20+
21+
@Autowired
22+
private TakeRewardService takeRewardService;
23+
24+
@Autowired
25+
private ContinueQuestService continueQuestService;
26+
27+
@Test
28+
void 퀘스트를_끝낸다() {
29+
// given
30+
final Long aliceId = ALICE를_저장한다();
31+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
32+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
33+
participants.saveWithUserIdAndQuestId(aliceId, questId);
34+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount);
35+
takeRewardService.invoke(aliceId, questId);
36+
continueQuestService.invoke(aliceId, questId);
37+
38+
// when
39+
finishQuestService.invoke(aliceId, questId);
40+
final Participant actual = participants.getByUserIdAndQuestId(aliceId, questId);
41+
42+
// then
43+
assertThat(actual.getState()).isEqualTo(FINISHED);
44+
}
45+
46+
@Test
47+
void 이미_끝낸_퀘스트를_끝낼_수_없다() {
48+
// given
49+
final Long aliceId = ALICE를_저장한다();
50+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
51+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
52+
participants.saveWithUserIdAndQuestId(aliceId, questId);
53+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount);
54+
takeRewardService.invoke(aliceId, questId);
55+
56+
// when & then
57+
assertThatThrownBy(() -> finishQuestService.invoke(aliceId, questId))
58+
.isInstanceOf(InvalidDomainException.class)
59+
.hasMessageContaining(NOT_FINISHABLE_QUEST.getMessage());
60+
}
61+
62+
@Test
63+
void 보상을_받지_않은_퀘스트를_끝낼_수_없다() {
64+
// given
65+
final Long aliceId = ALICE를_저장한다();
66+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
67+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
68+
participants.saveWithUserIdAndQuestId(aliceId, questId);
69+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount);
70+
71+
// when & then
72+
assertThatThrownBy(() -> finishQuestService.invoke(aliceId, questId))
73+
.isInstanceOf(InvalidDomainException.class)
74+
.hasMessageContaining(NOT_FINISHABLE_QUEST.getMessage());
75+
}
76+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package daybyquest.participant.application;
2+
3+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_1;
4+
import static daybyquest.support.fixture.QuestFixtures.QUEST_1;
5+
import static org.assertj.core.api.Assertions.assertThatCode;
6+
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 SaveParticipantServiceTest extends ServiceTest {
12+
13+
@Autowired
14+
private SaveParticipantService saveParticipantService;
15+
16+
@Test
17+
void 퀘스트를_수락한다() {
18+
// given
19+
final Long aliceId = ALICE를_저장한다();
20+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
21+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
22+
23+
// when & then
24+
assertThatCode(() -> saveParticipantService.invoke(aliceId, questId))
25+
.doesNotThrowAnyException();
26+
}
27+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package daybyquest.participant.application;
2+
3+
import static daybyquest.global.error.ExceptionCode.ALREADY_REWARDED_QUEST;
4+
import static daybyquest.global.error.ExceptionCode.NOT_FINISHABLE_QUEST;
5+
import static daybyquest.participant.domain.ParticipantState.FINISHED;
6+
import static daybyquest.support.fixture.BadgeFixtures.BADGE_1;
7+
import static daybyquest.support.fixture.QuestFixtures.QUEST_1;
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
10+
11+
import daybyquest.global.error.exception.InvalidDomainException;
12+
import daybyquest.participant.domain.Participant;
13+
import daybyquest.support.test.ServiceTest;
14+
import org.junit.jupiter.api.Test;
15+
import org.springframework.beans.factory.annotation.Autowired;
16+
17+
public class TakeRewardServiceTest extends ServiceTest {
18+
19+
@Autowired
20+
private TakeRewardService takeRewardService;
21+
22+
@Test
23+
void 퀘스트_보상을_받는다() {
24+
// given
25+
final Long aliceId = ALICE를_저장한다();
26+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
27+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
28+
participants.saveWithUserIdAndQuestId(aliceId, questId);
29+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount);
30+
31+
// when
32+
takeRewardService.invoke(aliceId, questId);
33+
final Participant actual = participants.getByUserIdAndQuestId(aliceId, questId);
34+
35+
// then
36+
assertThat(actual.getState()).isEqualTo(FINISHED);
37+
}
38+
39+
@Test
40+
void 수행_횟수가_충분하지_않으면_보상을_받을_수_없다() {
41+
// given
42+
final Long aliceId = ALICE를_저장한다();
43+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
44+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
45+
participants.saveWithUserIdAndQuestId(aliceId, questId);
46+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount - 1);
47+
48+
// when & then
49+
assertThatThrownBy(() -> takeRewardService.invoke(aliceId, questId))
50+
.isInstanceOf(InvalidDomainException.class)
51+
.hasMessageContaining(NOT_FINISHABLE_QUEST.getMessage());
52+
}
53+
54+
@Test
55+
void 이미_보상을_받았다면_받을_수_없다() {
56+
// given
57+
final Long aliceId = ALICE를_저장한다();
58+
final Long badgeId = badges.save(BADGE_1.생성()).getId();
59+
final Long questId = quests.save(QUEST_1.세부사항이_설정된_일반_퀘스트_생성(badgeId)).getId();
60+
participants.saveWithUserIdAndQuestId(aliceId, questId);
61+
퀘스트를_수행한다(aliceId, questId, QUEST_1.rewardCount);
62+
takeRewardService.invoke(aliceId, questId);
63+
64+
// when & then
65+
assertThatThrownBy(() -> takeRewardService.invoke(aliceId, questId))
66+
.isInstanceOf(InvalidDomainException.class)
67+
.hasMessageContaining(ALREADY_REWARDED_QUEST.getMessage());
68+
}
69+
}

src/test/java/daybyquest/support/test/ServiceTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static daybyquest.support.fixture.UserFixtures.DAVID;
88

99
import daybyquest.badge.domain.Badges;
10+
import daybyquest.badge.domain.Ownings;
1011
import daybyquest.global.query.NoOffsetIdPage;
1112
import daybyquest.group.domain.GroupUsers;
1213
import daybyquest.group.domain.Groups;
@@ -67,6 +68,9 @@ public class ServiceTest {
6768
@Autowired
6869
protected Follows follows;
6970

71+
@Autowired
72+
protected Ownings ownings;
73+
7074
@MockBean
7175
protected DateTimeProvider dataTimeProvider;
7276

@@ -121,6 +125,12 @@ void cleanDatabase() {
121125
return users.save(DARTH.생성()).getId();
122126
}
123127

128+
protected void 퀘스트를_수행한다(final Long userId, final Long qusetId, final Long count) {
129+
for (int index = 1; index <= count; index++) {
130+
participants.increaseLinkedCount(userId, qusetId);
131+
}
132+
}
133+
124134
protected NoOffsetIdPage 페이지() {
125135
return new NoOffsetIdPage(null, 5);
126136
}

0 commit comments

Comments
 (0)