Skip to content

Commit

Permalink
feature: 피드 미션완료 필드 추가 (#235)
Browse files Browse the repository at this point in the history
* feature: 피드 미션완료 필드 추가

* fix: 테스트 수정

* fix: 테스트 수정

* fix: column nullable false
  • Loading branch information
kwanok authored Aug 27, 2024
1 parent a8f8680 commit 33a6455
Show file tree
Hide file tree
Showing 12 changed files with 120 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
public record FeedContentGetResponse(
@Schema(description = "미션 ID", example = "1") Long missionId,
@Schema(description = "미션 제목", example = "산책하기") String missionTitle,
@Schema(description = "미션 완료 메시지", example = "산책하기 미션을 수행했어요!")
String missionCompleteMessage,
@Schema(description = "미션 기록 ID", example = "1") Long missionRecordId,
@Schema(description = "작성자 ID", example = "1") Long authorId,
@Schema(description = "작성자 프로필 닉네임") String authorProfileNickname,
Expand All @@ -20,6 +22,7 @@ public static FeedContentGetResponse from(FindFeedDto missionRecord) {
return new FeedContentGetResponse(
missionRecord.mission().getId(),
missionRecord.mission().getTitle(),
missionRecord.mission().getCompleteMessage(),
missionRecord.missionRecord().getId(),
missionRecord.author().getId(),
missionRecord.author().getProfile().getNickname(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ public MissionUpdateResponse updateMission(

missionToUpdate.updateTitle(missionUpdateRequest.title());
missionToUpdate.updateRaisePet(missionUpdateRequest.raisePet());
missionToUpdate.updateCompleteMessage(missionUpdateRequest.completeMessage());
missionRepository.save(missionToUpdate);

return MissionUpdateResponse.from(missionToUpdate);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,16 @@ public class Mission extends BaseTimeEntity {
@Column(name = "raise_pet", nullable = false)
private RaisePet raisePet;

@NotBlank
@Size(max = 100)
@Column(name = "complete_message", nullable = false)
private String completeMessage;

@Builder
public Mission(String title, RaisePet raisePet) {
public Mission(String title, RaisePet raisePet, String completeMessage) {
this.title = title;
this.raisePet = raisePet;
this.completeMessage = completeMessage;
}

public void updateTitle(String title) {
Expand All @@ -51,4 +57,8 @@ public void updateIllustrationUrl(String illustrationUrl) {
public void updateRaisePet(RaisePet raisePet) {
this.raisePet = raisePet;
}

public void updateCompleteMessage(String completeMessage) {
this.completeMessage = completeMessage;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,7 @@ public record MissionCreateRequest(
String title,
@Schema(description = "반려동물 유형", example = "DOG")
@NotNull(message = "RaisePet cannot be null")
RaisePet raisePet) {}
RaisePet raisePet,
@Schema(description = "미션 완료 메시지", example = "산책 미션을 수행했어요!")
@NotBlank(message = "CompleteMessage cannot be blank")
String completeMessage) {}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,7 @@ public record MissionUpdateRequest(
String title,
@Schema(description = "반려동물 유형", example = "DOG")
@NotNull(message = "RaisePet cannot be null")
RaisePet raisePet) {}
RaisePet raisePet,
@Schema(description = "미션 완료 메시지", example = "산책 미션을 수행했어요!")
@NotBlank(message = "CompleteMessage cannot be blank")
String completeMessage) {}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ public record MissionCreateResponse(
@Schema(description = "미션 ID", example = "1") @NotBlank Long id,
@Schema(description = "미션 제목", example = "산책하기")
@NotBlank(message = "Title cannot be blank")
String title) {
String title,
@Schema(description = "미션 완료 메시지", example = "산책 미션을 수행했어요!")
@NotBlank(message = "CompleteMessage cannot be blank")
String completeMessage) {
public static MissionCreateResponse from(Mission mission) {
return new MissionCreateResponse(mission.getId(), mission.getTitle());
return new MissionCreateResponse(
mission.getId(), mission.getTitle(), mission.getCompleteMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ public record MissionGetOneResponse(
@Schema(description = "미션 ID", example = "1") @NotBlank Long id,
@Schema(description = "미션 제목", example = "산책하기")
@NotBlank(message = "Title cannot be blank")
String title) {
String title,
@Schema(description = "미션 완료 메시지", example = "산책 미션을 수행했어요!")
@NotBlank(message = "CompleteMessage cannot be blank")
String completeMessage) {
public static MissionGetOneResponse from(Mission mission) {
return new MissionGetOneResponse(mission.getId(), mission.getTitle());
return new MissionGetOneResponse(
mission.getId(), mission.getTitle(), mission.getCompleteMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ public record MissionUpdateResponse(
@Schema(description = "미션 ID", example = "1") @NotBlank Long id,
@Schema(description = "미션 제목", example = "산책하기")
@NotBlank(message = "Title cannot be blank")
String title) {
String title,
@Schema(description = "미션 완료 메시지", example = "산책 미션을 수행했어요!")
@NotBlank(message = "CompleteMessage cannot be blank")
String completeMessage) {
public static MissionUpdateResponse from(Mission mission) {
return new MissionUpdateResponse(mission.getId(), mission.getTitle());
return new MissionUpdateResponse(
mission.getId(), mission.getTitle(), mission.getCompleteMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,17 @@ public void setUp() {
@Test
void 미션_생성_성공() throws Exception {
// Given
MissionCreateResponse missionCreateResponse = new MissionCreateResponse(1L, "Test Mission");
MissionCreateResponse missionCreateResponse =
new MissionCreateResponse(1L, "Test Mission", "");
when(missionService.createMission(any(MissionCreateRequest.class)))
.thenReturn(missionCreateResponse);

// When & Then
mockMvc.perform(
post("/missions")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"title\":\"Test Mission\", \"raisePet\":\"DOG\"}"))
.content(
"{\"title\":\"Test Mission\", \"raisePet\":\"DOG\", \"completeMessage\":\"Complete\"}"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data.title").value("Test Mission"));
}
Expand All @@ -74,7 +76,8 @@ public void setUp() {
@Test
void 미션_조회_성공() throws Exception {
// Given
MissionGetOneResponse missionGetOneResponse = new MissionGetOneResponse(1L, "Test Mission");
MissionGetOneResponse missionGetOneResponse =
new MissionGetOneResponse(1L, "Test Mission", "");
when(missionService.getMission(1L)).thenReturn(missionGetOneResponse);

// When & Then
Expand All @@ -87,13 +90,14 @@ public void setUp() {
void 미션_수정_성공() throws Exception {
// Given
when(missionService.updateMission(anyLong(), any(MissionUpdateRequest.class)))
.thenReturn(new MissionUpdateResponse(1L, "Updated Mission"));
.thenReturn(new MissionUpdateResponse(1L, "Updated Mission", ""));

// When & Then
mockMvc.perform(
patch("/missions/1")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"title\":\"Test Mission\", \"raisePet\":\"DOG\"}"))
.content(
"{\"title\":\"Test Mission\", \"raisePet\":\"DOG\", \"completeMessage\":\"Complete\"}"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data.title").value("Updated Mission"));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

import com.depromeet.stonebed.FixtureMonkeySetUp;
import com.depromeet.stonebed.domain.member.domain.Member;
import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.dao.MissionRepository;
Expand All @@ -23,13 +24,15 @@
import java.util.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.context.ActiveProfiles;

@ActiveProfiles("test")
class MissionServiceTest {
@ExtendWith(MockitoExtension.class)
class MissionServiceTest extends FixtureMonkeySetUp {

@Mock private MissionRepository missionRepository;
@Mock private MissionHistoryRepository missionHistoryRepository;
Expand All @@ -47,25 +50,30 @@ class MissionServiceTest {
public void setUp() {
today = LocalDate.now();
beforeDayByStandard = LocalDate.now().minusDays(3);
mission = Mission.builder().title("Test Mission").raisePet(RaisePet.DOG).build();
mission =
fixtureMonkey
.giveMeBuilder(Mission.class)
.set("raisePet", RaisePet.DOG)
.build()
.sample();
missionHistory = MissionHistory.createMissionHistory(mission, today, RaisePet.DOG);
member = mock(Member.class);
MockitoAnnotations.openMocks(this);
}

@Test
void 미션_생성_성공() {
// Given
when(missionRepository.save(any(Mission.class))).thenReturn(mission);
MissionCreateRequest missionCreateRequest =
new MissionCreateRequest("Test Mission", RaisePet.DOG);
new MissionCreateRequest(
mission.getTitle(), mission.getRaisePet(), mission.getCompleteMessage());

// When
MissionCreateResponse missionCreateResponse =
missionService.createMission(missionCreateRequest);

// Then
assertThat(missionCreateResponse.title()).isEqualTo("Test Mission");
assertThat(missionCreateResponse.title()).isEqualTo(mission.getTitle());
verify(missionRepository, times(1)).save(any(Mission.class));
}

Expand All @@ -78,34 +86,40 @@ public void setUp() {
MissionGetOneResponse missionGetOneResponse = missionService.getMission(1L);

// Then
assertThat(missionGetOneResponse.title()).isEqualTo("Test Mission");
assertThat(missionGetOneResponse.title()).isEqualTo(mission.getTitle());
verify(missionRepository, times(1)).findById(anyLong());
assertEquals(RaisePet.DOG, mission.getRaisePet());
}

@Test
void 오늘의_미션_조회_성공_히스토리가_이미_존재하는_경우() {
// Given
LocalDate currentDate = LocalDate.now();
Mission localMission = new Mission("Test Mission", RaisePet.DOG);
Mission localMission =
fixtureMonkey
.giveMeBuilder(Mission.class)
.set("raisePet", mission.getRaisePet())
.build()
.sample();
MissionHistory localMissionHistory =
MissionHistory.createMissionHistory(localMission, currentDate, RaisePet.DOG);
MissionHistory.createMissionHistory(
localMission, currentDate, localMission.getRaisePet());

when(missionHistoryRepository.findByAssignedDateAndRaisePet(currentDate, RaisePet.DOG))
when(missionHistoryRepository.findByAssignedDateAndRaisePet(
currentDate, localMission.getRaisePet()))
.thenReturn(Optional.of(localMissionHistory));
when(memberUtil.getCurrentMember()).thenReturn(member);
when(member.getRaisePet()).thenReturn(RaisePet.DOG);
when(member.getRaisePet()).thenReturn(localMission.getRaisePet());

// When
MissionGetTodayResponse result = missionService.getOrCreateTodayMission();

// Then
assertThat(result).isNotNull();
assertThat(result.title()).isEqualTo("Test Mission");
assertThat(result.title()).isEqualTo(localMission.getTitle());
verify(missionHistoryRepository, times(1))
.findByAssignedDateAndRaisePet(today, RaisePet.DOG);
.findByAssignedDateAndRaisePet(today, localMission.getRaisePet());
verify(missionHistoryRepository, times(0)).save(any(MissionHistory.class));
assertEquals(RaisePet.DOG, mission.getRaisePet());
assertEquals(localMission.getRaisePet(), mission.getRaisePet());
}

@Test
Expand Down Expand Up @@ -147,17 +161,15 @@ public void setUp() {
// Given: 초기 설정
List<Mission> emptyMissionList = new ArrayList<>();
when(memberUtil.getCurrentMember()).thenReturn(member);
when(member.getRaisePet()).thenReturn(RaisePet.DOG);
when(member.getRaisePet()).thenReturn(mission.getRaisePet());

when(missionRepository.findMissionsAssignedAfterAndByRaisePet(today, RaisePet.DOG))
.thenReturn(emptyMissionList);
when(missionHistoryRepository.findByAssignedDateAndRaisePet(today, mission.getRaisePet()))
.thenReturn(Optional.empty());

when(missionRepository.findNotInMissionsAndByRaisePet(emptyMissionList, RaisePet.DOG))
when(missionRepository.findNotInMissionsAndByRaisePet(
emptyMissionList, mission.getRaisePet()))
.thenReturn(emptyMissionList);

when(missionHistoryRepository.save(any(MissionHistory.class)))
.thenAnswer(invocation -> invocation.getArgument(0));

// When: getOrCreateTodayMission 을 호출하면
CustomException exception =
assertThrows(CustomException.class, () -> missionService.getOrCreateTodayMission());
Expand Down Expand Up @@ -185,9 +197,9 @@ public void setUp() {

// When
MissionUpdateRequest updateRequest =
new MissionUpdateRequest("Updated Mission", RaisePet.DOG);
new MissionUpdateRequest("Updated Mission", RaisePet.DOG, "Complete");
MissionUpdateResponse missionUpdateResponse =
missionService.updateMission(1L, updateRequest);
missionService.updateMission(mission.getId(), updateRequest);

// Then
assertThat(missionUpdateResponse.title()).isEqualTo("Updated Mission");
Expand All @@ -200,7 +212,8 @@ public void setUp() {
void 미션_수정_실패_미션이_없는_경우() {
// Given
when(missionRepository.findById(anyLong())).thenReturn(Optional.empty());
MissionUpdateRequest updateRequest = new MissionUpdateRequest("Test Mission", RaisePet.DOG);
MissionUpdateRequest updateRequest =
new MissionUpdateRequest("Test Mission", RaisePet.DOG, "Complete");

// When & Then
assertThrows(CustomException.class, () -> missionService.updateMission(1L, updateRequest));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,12 @@ class MissionHistoryRepositoryTest {
@Test
void 미션_히스토리_생성_성공() {
// Given: 오늘 날짜를 기준으로 미션 히스토리가 있다 (생성할 예정)
Mission mission = Mission.builder().title("Test Mission").raisePet(RaisePet.DOG).build();
Mission mission =
Mission.builder()
.title("Test Mission")
.raisePet(RaisePet.DOG)
.completeMessage("Complete")
.build();
missionRepository.save(mission);
LocalDate today = LocalDate.now();

Expand All @@ -41,14 +46,19 @@ class MissionHistoryRepositoryTest {

// Then: 저장된 미션 히스토리가 올바른지 검증한다
assertThat(savedMissionHistory.getId()).isNotNull();
assertThat(savedMissionHistory.getMission().getTitle()).isEqualTo("Test Mission");
assertThat(savedMissionHistory.getMission().getTitle()).isEqualTo(mission.getTitle());
assertThat(savedMissionHistory.getAssignedDate()).isEqualTo(today);
}

@Test
void 미션_히스토리_특정_날짜_조회_성공() {
// Given: 오늘 날짜를 기준으로 저장된 객체가 있다
Mission mission = Mission.builder().title("Test Mission").raisePet(RaisePet.CAT).build();
Mission mission =
Mission.builder()
.title("Test Mission")
.raisePet(RaisePet.CAT)
.completeMessage("Complete")
.build();
missionRepository.save(mission);
LocalDate today = LocalDate.now();

Expand All @@ -62,7 +72,7 @@ class MissionHistoryRepositoryTest {

// Then: 가져온 미션 히스토리가 올바른지 검증한다
assertThat(foundMissionHistory).isPresent();
assertThat(foundMissionHistory.get().getMission().getTitle()).isEqualTo("Test Mission");
assertThat(foundMissionHistory.get().getMission().getTitle()).isEqualTo(mission.getTitle());
assertThat(foundMissionHistory.get().getAssignedDate()).isEqualTo(today);
}
}
Loading

0 comments on commit 33a6455

Please sign in to comment.