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
3 changes: 3 additions & 0 deletions src/main/java/com/dokdok/meeting/service/MeetingService.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.dokdok.topic.entity.TopicType;
import com.dokdok.topic.repository.TopicAnswerRepository;
import com.dokdok.topic.repository.TopicRepository;
import com.dokdok.topic.service.TopicService;
import com.dokdok.user.entity.User;
import com.dokdok.user.service.UserValidator;
import lombok.RequiredArgsConstructor;
Expand All @@ -50,6 +51,7 @@ public class MeetingService {
private final MeetingMemberRepository meetingMemberRepository;
private final TopicRepository topicRepository;
private final TopicAnswerRepository topicAnswerRepository;
private final TopicService topicService;
private final GatheringRepository gatheringRepository;
private final GatheringMemberRepository gatheringMemberRepository;
private final GatheringValidator gatheringValidator;
Expand Down Expand Up @@ -155,6 +157,7 @@ public MeetingStatusResponse confirmMeeting(Long meetingId) {

meeting.changeStatus(MeetingStatus.CONFIRMED);
saveMeetingBookForUser(meeting, meeting.getGathering(), meeting.getMeetingLeader().getId());
topicService.createDefaultTopic(meeting);

return MeetingStatusResponse.from(meeting);
}
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/com/dokdok/topic/service/TopicService.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.dokdok.topic.entity.TopicLike;
import com.dokdok.topic.entity.TopicMessage;
import com.dokdok.topic.entity.TopicStatus;
import com.dokdok.topic.entity.TopicType;
import com.dokdok.topic.exception.TopicErrorCode;
import com.dokdok.topic.exception.TopicException;
import com.dokdok.topic.repository.TopicAnswerRepository;
Expand Down Expand Up @@ -50,6 +51,32 @@ public class TopicService {
private final MeetingValidator meetingValidator;
private final TopicValidator topicValidator;

@Transactional
public void createDefaultTopic(Meeting meeting) {
if (meeting == null || meeting.getId() == null) {
return;
}
if (topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId()) > 0) {
return;
}

User leader = meeting.getMeetingLeader();
if (leader == null) {
return;
}
TopicType type = TopicType.FREE;

Topic topic = Topic.create(
meeting,
leader,
type.getDisplayName(),
type.getDescription(),
type
);

topicRepository.save(topic);
}

@Transactional
public SuggestTopicResponse createTopic(
Long gatheringId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.dokdok.topic.entity.TopicType;
import com.dokdok.topic.repository.TopicAnswerRepository;
import com.dokdok.topic.repository.TopicRepository;
import com.dokdok.topic.service.TopicService;
import com.dokdok.user.entity.User;
import com.dokdok.user.service.UserValidator;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -68,6 +69,9 @@ class MeetingServiceTest {
@Mock
private TopicAnswerRepository topicAnswerRepository;

@Mock
private TopicService topicService;

@Mock
private GatheringRepository gatheringRepository;

Expand Down Expand Up @@ -561,6 +565,7 @@ void givenMeetingStatus_whenConfirm_thenMeetingStatusChange() {
MeetingMember savedMember = meetingMemberCaptor.getValue();
assertThat(savedMember.getUser().getId()).isEqualTo(leader.getId());
assertThat(savedMember.getMeetingRole()).isEqualTo(MeetingMemberRole.LEADER);
verify(topicService).createDefaultTopic(meeting);
}
}

Expand Down
55 changes: 55 additions & 0 deletions src/test/java/com/dokdok/topic/service/TopicServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,61 @@ void setUp() {
);
}

@Test
@DisplayName("기본 자유형 토픽이 없으면 생성한다")
void createDefaultTopic_Success() {
Meeting meeting = Meeting.builder()
.id(10L)
.meetingLeader(testUser)
.build();

given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId()))
.willReturn(0L);

topicService.createDefaultTopic(meeting);

var captor = org.mockito.ArgumentCaptor.forClass(Topic.class);
verify(topicRepository).save(captor.capture());
Topic saved = captor.getValue();
assertThat(saved.getMeeting()).isEqualTo(meeting);
assertThat(saved.getProposedBy()).isEqualTo(testUser);
assertThat(saved.getTopicType()).isEqualTo(TopicType.FREE);
assertThat(saved.getTitle()).isEqualTo(TopicType.FREE.getDisplayName());
assertThat(saved.getDescription()).isEqualTo(TopicType.FREE.getDescription());
}

@Test
@DisplayName("이미 토픽이 있으면 기본 토픽을 생성하지 않는다")
void createDefaultTopic_SkipWhenExists() {
Meeting meeting = Meeting.builder()
.id(10L)
.meetingLeader(testUser)
.build();

given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId()))
.willReturn(1L);

topicService.createDefaultTopic(meeting);

verify(topicRepository, never()).save(any());
}

@Test
@DisplayName("약속장이 없으면 기본 토픽을 생성하지 않는다")
void createDefaultTopic_SkipWhenLeaderMissing() {
Meeting meeting = Meeting.builder()
.id(10L)
.meetingLeader(null)
.build();

given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId()))
.willReturn(0L);

topicService.createDefaultTopic(meeting);

verify(topicRepository, never()).save(any());
}

@Test
@DisplayName("선택한 주제를 확정 상태로 변경한다")
void confirmTopics_Success() {
Expand Down