diff --git a/src/main/java/com/asap/server/persistence/domain/user/User.java b/src/main/java/com/asap/server/persistence/domain/user/User.java index 67d02a77..a8941d1f 100644 --- a/src/main/java/com/asap/server/persistence/domain/user/User.java +++ b/src/main/java/com/asap/server/persistence/domain/user/User.java @@ -14,6 +14,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import java.util.Objects; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -48,4 +49,12 @@ public class User extends AuditingTimeEntity { public String getName() { return this.name.getValue(); } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof User)) { + return false; + } + return Objects.equals(this.id, ((User) obj).getId()); + } } diff --git a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepository.java b/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepository.java index 887a4673..bef67827 100644 --- a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepository.java +++ b/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepository.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Optional; -public interface TimeBlockRepository extends Repository, TimeBlockRepositoryCustom { +public interface TimeBlockRepository extends Repository { void save(final TimeBlock timeBlock); diff --git a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryCustom.java b/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryCustom.java deleted file mode 100644 index 1dd2afb3..00000000 --- a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryCustom.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.asap.server.persistence.repository.timeblock; - -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import java.util.List; - -public interface TimeBlockRepositoryCustom { - List findAllTimeBlockByMeeting(final Long meetingId); -} diff --git a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImpl.java b/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImpl.java deleted file mode 100644 index 30362dce..00000000 --- a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.asap.server.persistence.repository.timeblock; - -import static com.asap.server.persistence.domain.QAvailableDate.availableDate; -import static com.asap.server.persistence.domain.QTimeBlock.timeBlock; -import static com.asap.server.persistence.domain.QTimeBlockUser.timeBlockUser; - -import com.asap.server.persistence.repository.timeblock.dto.QTimeBlockDto; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import com.querydsl.jpa.impl.JPAQueryFactory; -import java.util.List; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class TimeBlockRepositoryImpl implements TimeBlockRepositoryCustom { - private final JPAQueryFactory queryFactory; - - @Override - public List findAllTimeBlockByMeeting(Long meetingId) { - return queryFactory.select( - new QTimeBlockDto( - availableDate.date.as("availableDate"), - timeBlock.timeSlot.as("timeSlot"), - timeBlock.weight.min().as("weight"), - timeBlockUser.user.id.count().as("userCount") - ) - ).from(availableDate) - .innerJoin(timeBlock).on(timeBlock.availableDate.id.eq(availableDate.id)) - .innerJoin(timeBlockUser).on(timeBlockUser.timeBlock.id.eq(timeBlock.id)) - .where(availableDate.meeting.id.eq(meetingId)) - .groupBy(availableDate.date, timeBlock.timeSlot) - .fetch(); - } -} diff --git a/src/main/java/com/asap/server/persistence/repository/timeblock/dto/TimeBlockDto.java b/src/main/java/com/asap/server/persistence/repository/timeblock/dto/TimeBlockDto.java deleted file mode 100644 index 8a739332..00000000 --- a/src/main/java/com/asap/server/persistence/repository/timeblock/dto/TimeBlockDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.asap.server.persistence.repository.timeblock.dto; - -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.querydsl.core.annotations.QueryProjection; -import org.jetbrains.annotations.NotNull; - -import java.time.LocalDate; - -public record TimeBlockDto( - LocalDate availableDate, - TimeSlot timeSlot, - int weight, - Long userCount -) implements Comparable { - @QueryProjection - public TimeBlockDto { - } - - @Override - public int compareTo(@NotNull TimeBlockDto o) { - if (this.availableDate.equals(o.availableDate)) - return Integer.compare(this.timeSlot.ordinal(), o.timeSlot.ordinal()); - return this.availableDate.compareTo(o.availableDate); - } -} diff --git a/src/main/java/com/asap/server/persistence/repository/user/UserRepository.java b/src/main/java/com/asap/server/persistence/repository/user/UserRepository.java index c0bc359f..d0d8dba1 100644 --- a/src/main/java/com/asap/server/persistence/repository/user/UserRepository.java +++ b/src/main/java/com/asap/server/persistence/repository/user/UserRepository.java @@ -17,4 +17,6 @@ public interface UserRepository extends Repository, UserRepositoryCu List findByMeeting(final Meeting meeting); int countByMeeting(final Meeting meeting); + + List findAllByMeetingId(final long meetingId); } diff --git a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java index 1a1a7a66..99e8e230 100644 --- a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java +++ b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java @@ -1,14 +1,8 @@ package com.asap.server.persistence.repository.user; import com.asap.server.persistence.domain.Meeting; -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.vo.UserVo; - -import java.time.LocalDate; import java.util.List; public interface UserRepositoryCustom { void updateUserIsFixedByMeeting(final Meeting meeting, final List users); - - List findByAvailableDateAndTimeSlots(Long meetingId, LocalDate availableDate, List timeSlots); } diff --git a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java index a0c5ce35..b7795fa3 100644 --- a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java +++ b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java @@ -1,16 +1,9 @@ package com.asap.server.persistence.repository.user; -import static com.asap.server.persistence.domain.QAvailableDate.availableDate; -import static com.asap.server.persistence.domain.QTimeBlock.timeBlock; -import static com.asap.server.persistence.domain.QTimeBlockUser.timeBlockUser; import static com.asap.server.persistence.domain.user.QUser.user; import com.asap.server.persistence.domain.Meeting; -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.vo.QUserVo; -import com.asap.server.service.vo.UserVo; import com.querydsl.jpa.impl.JPAQueryFactory; -import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; @@ -28,28 +21,4 @@ public void updateUserIsFixedByMeeting(Meeting meeting, List users) { ) .execute(); } - - @Override - public List findByAvailableDateAndTimeSlots( - Long meetingId, - LocalDate date, - List timeSlots - ) { - return queryFactory.select( - new QUserVo( - user.id, - user.name.value - ) - ).from(timeBlockUser) - .innerJoin(timeBlock).on(timeBlockUser.timeBlock.id.eq(timeBlock.id)) - .innerJoin(user).on(timeBlockUser.user.id.eq(user.id)) - .innerJoin(availableDate).on(timeBlock.availableDate.id.eq(availableDate.id)) - .where( - availableDate.date.eq(date) - .and(availableDate.meeting.id.eq(meetingId)) - .and(timeBlock.timeSlot.in(timeSlots)) - ) - .groupBy(user.id) - .fetch(); - } } diff --git a/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java b/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java index a80e6d48..2ff8b25b 100644 --- a/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java +++ b/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java @@ -1,33 +1,18 @@ package com.asap.server.presentation.controller.dto.response; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.ToString; - -import java.util.Arrays; +import com.asap.server.service.meeting.dto.BestMeetingTimeDto; import java.util.List; -@Getter -@ToString -@AllArgsConstructor -public class BestMeetingTimeResponseDto { - private int memberCount; - private MeetingTimeResponseDto bestDateTime; - private List otherDateTimes; - - private static final int FIRST_BEST_MEETING_INDEX = 0; - private static final int SECOND_BEST_MEETING_INDEX = 1; - private static final int THIRD_BEST_MEETING_INDEX = 2; - - public static BestMeetingTimeResponseDto of(int memberCount, List bestMeetingTimes) { +public record BestMeetingTimeResponseDto( + int memberCount, + MeetingTimeResponseDto bestDateTime, + List otherDateTimes +) { + public static BestMeetingTimeResponseDto of(final BestMeetingTimeDto bestMeetingTimeDto) { return new BestMeetingTimeResponseDto( - memberCount, - MeetingTimeResponseDto.of(bestMeetingTimes.get(FIRST_BEST_MEETING_INDEX)), - Arrays.asList( - MeetingTimeResponseDto.of(bestMeetingTimes.get(SECOND_BEST_MEETING_INDEX)), - MeetingTimeResponseDto.of(bestMeetingTimes.get(THIRD_BEST_MEETING_INDEX)) - ) + bestMeetingTimeDto.memberCount(), + bestMeetingTimeDto.bestDateTime(), + bestMeetingTimeDto.otherDateTimes() ); } } diff --git a/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java b/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java index d2a7fcb4..49cfd5a1 100644 --- a/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java +++ b/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java @@ -1,25 +1,27 @@ package com.asap.server.presentation.controller.dto.response; import com.asap.server.common.utils.DateUtil; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; -import com.asap.server.service.vo.UserVo; +import com.asap.server.service.meeting.dto.UserDto; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; import java.util.List; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; @Getter @ToString @AllArgsConstructor +@EqualsAndHashCode public class MeetingTimeResponseDto { private String month; private String day; private String dayOfWeek; private String startTime; private String endTime; - private List users; + private List users; - public static MeetingTimeResponseDto of(BestMeetingTimeWithUsersVo bestMeetingTime) { + public static MeetingTimeResponseDto of(BestMeetingTimeWithUsers bestMeetingTime) { if (bestMeetingTime == null) return null; return new MeetingTimeResponseDto( DateUtil.getMonth(bestMeetingTime.date()), diff --git a/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java b/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java index 8b6e2e24..e89302af 100644 --- a/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java +++ b/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java @@ -11,6 +11,7 @@ import com.asap.server.presentation.controller.dto.response.TimeTableResponseDto; import com.asap.server.presentation.controller.meeting.docs.MeetingRetrieveControllerDocs; import com.asap.server.service.MeetingService; +import com.asap.server.service.meeting.MeetingRetrieveService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,6 +22,7 @@ @RequiredArgsConstructor public class MeetingRetrieveController implements MeetingRetrieveControllerDocs { private final MeetingService meetingService; + private final MeetingRetrieveService meetingRetrieveService; @GetMapping("/{meetingId}/schedule") @Override @@ -69,7 +71,7 @@ public SuccessResponse getBestMeetingTime( ) { return SuccessResponse.success( Success.BEST_MEETING_SUCCESS, - meetingService.getBestMeetingTime(meetingId, userId) + BestMeetingTimeResponseDto.of(meetingRetrieveService.getBestMeetingTime(meetingId, userId)) ); } } diff --git a/src/main/java/com/asap/server/service/MeetingService.java b/src/main/java/com/asap/server/service/MeetingService.java index 8dcd4c90..55e1cc00 100644 --- a/src/main/java/com/asap/server/service/MeetingService.java +++ b/src/main/java/com/asap/server/service/MeetingService.java @@ -13,24 +13,18 @@ import com.asap.server.persistence.domain.ConfirmedDateTime; import com.asap.server.persistence.domain.Meeting; import com.asap.server.persistence.domain.Place; +import com.asap.server.persistence.domain.enums.Role; import com.asap.server.persistence.domain.user.Name; import com.asap.server.persistence.domain.user.User; -import com.asap.server.persistence.domain.enums.Role; import com.asap.server.persistence.repository.meeting.MeetingRepository; -import com.asap.server.persistence.repository.timeblock.TimeBlockRepository; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; import com.asap.server.presentation.controller.dto.request.MeetingConfirmRequestDto; import com.asap.server.presentation.controller.dto.request.MeetingSaveRequestDto; import com.asap.server.presentation.controller.dto.response.AvailableDatesDto; -import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; import com.asap.server.presentation.controller.dto.response.FixedMeetingResponseDto; import com.asap.server.presentation.controller.dto.response.MeetingSaveResponseDto; import com.asap.server.presentation.controller.dto.response.MeetingScheduleResponseDto; import com.asap.server.presentation.controller.dto.response.MeetingTitleResponseDto; import com.asap.server.presentation.controller.dto.response.TimeTableResponseDto; -import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; -import com.asap.server.service.vo.BestMeetingTimeVo; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -49,8 +43,6 @@ public class MeetingService { private final UserService userService; private final AvailableDateService availableDateService; private final JwtService jwtService; - private final MeetingTimeRecommendService meetingTimeRecommendService; - private final TimeBlockRepository timeBlockRepository; private final PasswordEncoder passwordEncoder; @Transactional @@ -185,20 +177,4 @@ public MeetingTitleResponseDto getIsFixedMeeting(final Long meetingId) throws Co .title(meeting.getTitle()) .build(); } - - public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final Long userId) { - Meeting meeting = meetingRepository.findById(meetingId) - .orElseThrow(() -> new NotFoundException(Error.MEETING_NOT_FOUND_EXCEPTION)); - - if (!meeting.authenticateHost(userId)) throw new UnauthorizedException(Error.INVALID_MEETING_HOST_EXCEPTION); - if (meeting.isConfirmedMeeting()) throw new ConflictException(MEETING_VALIDATION_FAILED_EXCEPTION); - - int userCount = userService.getMeetingUserCount(meeting); - List timeBlocks = timeBlockRepository.findAllTimeBlockByMeeting(meetingId); - - List bestMeetingTimes = meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), userCount); - List bestMeetingTimeWithUsers = userService.getBestMeetingInUsers(meetingId, bestMeetingTimes); - return BestMeetingTimeResponseDto.of(userCount, bestMeetingTimeWithUsers); - } - } diff --git a/src/main/java/com/asap/server/service/UserService.java b/src/main/java/com/asap/server/service/UserService.java index 491c3210..4e1883b2 100644 --- a/src/main/java/com/asap/server/service/UserService.java +++ b/src/main/java/com/asap/server/service/UserService.java @@ -11,21 +11,18 @@ import com.asap.server.common.jwt.JwtService; import com.asap.server.persistence.domain.AvailableDate; import com.asap.server.persistence.domain.Meeting; -import com.asap.server.persistence.domain.user.Name; -import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.domain.enums.Role; import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.persistence.domain.user.Name; +import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.meeting.MeetingRepository; import com.asap.server.persistence.repository.user.UserRepository; import com.asap.server.presentation.controller.dto.request.UserRequestDto; import com.asap.server.presentation.controller.dto.response.UserMeetingTimeResponseDto; import com.asap.server.presentation.controller.dto.response.UserTimeResponseDto; +import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.dto.UserMeetingScheduleRegisterDto; import com.asap.server.service.time.dto.UserTimeRegisterDto; -import com.asap.server.service.time.UserMeetingScheduleService; -import com.asap.server.service.vo.BestMeetingTimeVo; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; -import com.asap.server.service.vo.UserVo; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -113,7 +110,7 @@ private void createUserTimeBlock(final Meeting meeting, .stream() .map(timeSlot -> timeBlockService.searchTimeBlock(timeSlot, availableDate, registerDto.priority())).toList() .forEach(timeBlock -> timeBlock.addTimeBlockUsers(timeBlockUserService.create(timeBlock, user))); - userMeetingScheduleService.createUserMeetingSchedule(meeting.getId(), user.getId(), registerDto); + userMeetingScheduleService.createUserMeetingSchedule(user.getId(), meeting.getId(), registerDto); } private void isDuplicatedDate(final List registerDto) { @@ -146,31 +143,4 @@ public void setFixedUsers(final Meeting meeting, final List user .collect(Collectors.toList()); userRepository.updateUserIsFixedByMeeting(meeting, userIds); } - - public int getMeetingUserCount(final Meeting meeting) { - return userRepository.countByMeeting(meeting); - } - - public List getBestMeetingInUsers( - final Long meetingId, - final List bestMeetingTimes - ) { - return bestMeetingTimes.stream() - .map(bestMeetingTime -> getBestMeetingTimeInUsers(meetingId, bestMeetingTime)) - .collect(Collectors.toList()); - } - - private BestMeetingTimeWithUsersVo getBestMeetingTimeInUsers( - final Long meetingId, - final BestMeetingTimeVo bestMeetingTime - ) { - if (bestMeetingTime == null) { - return null; - } - List timeSlots = TimeSlot.getTimeSlots(bestMeetingTime.startTime().ordinal(), - bestMeetingTime.endTime().ordinal() - 1); - List users = userRepository.findByAvailableDateAndTimeSlots(meetingId, bestMeetingTime.date(), - timeSlots); - return BestMeetingTimeWithUsersVo.of(bestMeetingTime, users); - } } diff --git a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java new file mode 100644 index 00000000..203cedef --- /dev/null +++ b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java @@ -0,0 +1,85 @@ +package com.asap.server.service.meeting; + +import static com.asap.server.common.exception.Error.MEETING_VALIDATION_FAILED_EXCEPTION; + +import com.asap.server.common.exception.Error; +import com.asap.server.common.exception.model.ConflictException; +import com.asap.server.common.exception.model.NotFoundException; +import com.asap.server.common.exception.model.UnauthorizedException; +import com.asap.server.persistence.domain.Meeting; +import com.asap.server.persistence.domain.user.User; +import com.asap.server.persistence.repository.meeting.MeetingRepository; +import com.asap.server.service.meeting.dto.BestMeetingTimeDto; +import com.asap.server.service.meeting.dto.UserDto; +import com.asap.server.service.time.MeetingTimeRecommendService; +import com.asap.server.service.time.UserMeetingScheduleService; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.user.UserRetrieveService; +import com.asap.server.service.time.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; +import java.util.List; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MeetingRetrieveService { + private final MeetingRepository meetingRepository; + private final UserRetrieveService userRetrieveService; + private final MeetingTimeRecommendService meetingTimeRecommendService; + private final UserMeetingScheduleService userMeetingScheduleService; + + public BestMeetingTimeDto getBestMeetingTime(final Long meetingId, final Long userId) { + Meeting meeting = meetingRepository.findById(meetingId) + .orElseThrow(() -> new NotFoundException(Error.MEETING_NOT_FOUND_EXCEPTION)); + + if (!meeting.authenticateHost(userId)) { + throw new UnauthorizedException(Error.INVALID_MEETING_HOST_EXCEPTION); + } + if (meeting.isConfirmedMeeting()) { + throw new ConflictException(MEETING_VALIDATION_FAILED_EXCEPTION); + } + + int userCount = userRetrieveService.getMeetingUserCount(meeting); + + List timeBlocks = userMeetingScheduleService.getTimeBlocks(meetingId); + + List bestMeetingTimes = meetingTimeRecommendService.getBestMeetingTime( + timeBlocks, + meeting.getDuration(), + userCount + ); + + Map userIdToUserMap = userRetrieveService.getUserIdToUserMap(meetingId); + List bestMeetingTimeWithUsers = bestMeetingTimes.stream() + .map(bestMeetingTime -> mapToBestMeetingTimeWithUsers(bestMeetingTime, userIdToUserMap)) + .toList(); + + return BestMeetingTimeDto.of(userCount, bestMeetingTimeWithUsers); + } + + private BestMeetingTimeWithUsers mapToBestMeetingTimeWithUsers( + final BestMeetingTimeVo bestMeetingTime, + final Map userIdToUserMap + ) { + if (bestMeetingTime == null) { + return null; + } + + List userDtos = bestMeetingTime.userIds().stream() + .map(userId -> { + User user = userIdToUserMap.get(userId); + return new UserDto(user.getId(), user.getName()); + }) + .toList(); + + return new BestMeetingTimeWithUsers( + bestMeetingTime.date(), + bestMeetingTime.startTime(), + bestMeetingTime.endTime(), + bestMeetingTime.weight(), + userDtos + ); + } +} diff --git a/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java b/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java new file mode 100644 index 00000000..86a1daf9 --- /dev/null +++ b/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java @@ -0,0 +1,30 @@ +package com.asap.server.service.meeting.dto; + +import com.asap.server.presentation.controller.dto.response.MeetingTimeResponseDto; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; +import java.util.Arrays; +import java.util.List; + +public record BestMeetingTimeDto( + int memberCount, + MeetingTimeResponseDto bestDateTime, + List otherDateTimes +) { + private static final int FIRST_BEST_MEETING_INDEX = 0; + private static final int SECOND_BEST_MEETING_INDEX = 1; + private static final int THIRD_BEST_MEETING_INDEX = 2; + + public static BestMeetingTimeDto of( + final int memberCount, + final List bestMeetingTimes + ) { + return new BestMeetingTimeDto( + memberCount, + MeetingTimeResponseDto.of(bestMeetingTimes.get(FIRST_BEST_MEETING_INDEX)), + Arrays.asList( + MeetingTimeResponseDto.of(bestMeetingTimes.get(SECOND_BEST_MEETING_INDEX)), + MeetingTimeResponseDto.of(bestMeetingTimes.get(THIRD_BEST_MEETING_INDEX)) + ) + ); + } +} diff --git a/src/main/java/com/asap/server/service/meeting/dto/UserDto.java b/src/main/java/com/asap/server/service/meeting/dto/UserDto.java new file mode 100644 index 00000000..fec865dc --- /dev/null +++ b/src/main/java/com/asap/server/service/meeting/dto/UserDto.java @@ -0,0 +1,7 @@ +package com.asap.server.service.meeting.dto; + +public record UserDto( + Long id, + String name +) { +} diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java b/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java deleted file mode 100644 index 8e4edb08..00000000 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.asap.server.service.meeting.recommend.strategy; - -import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import com.asap.server.service.vo.BestMeetingTimeVo; -import java.util.List; - -public interface ContinuousMeetingTimeStrategy { - List find(List timeBlocks, Duration duration); -} diff --git a/src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java b/src/main/java/com/asap/server/service/time/MeetingTimeRecommendService.java similarity index 72% rename from src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java rename to src/main/java/com/asap/server/service/time/MeetingTimeRecommendService.java index c116021e..671aa280 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java +++ b/src/main/java/com/asap/server/service/time/MeetingTimeRecommendService.java @@ -1,15 +1,14 @@ -package com.asap.server.service.meeting.recommend; +package com.asap.server.service.time; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import com.asap.server.service.meeting.recommend.strategy.BestMeetingTimeStrategy; -import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; -import com.asap.server.service.meeting.recommend.strategy.MeetingTimeCasesStrategy; -import com.asap.server.service.vo.BestMeetingTimeVo; -import com.asap.server.service.vo.PossibleTimeCaseVo; +import com.asap.server.service.time.strategy.BestMeetingTimeStrategy; +import com.asap.server.service.time.strategy.ContinuousMeetingTimeStrategy; +import com.asap.server.service.time.strategy.MeetingTimeCasesStrategy; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.PossibleTimeCaseVo; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -22,7 +21,7 @@ public class MeetingTimeRecommendService { private final BestMeetingTimeStrategy bestMeetingTimeStrategy; public List getBestMeetingTime( - List timeBlocks, + List timeBlocks, final Duration duration, final int userCount ) { @@ -30,8 +29,8 @@ public List getBestMeetingTime( List bestMeetingTimes = new ArrayList<>(); for (PossibleTimeCaseVo timeCase : timeCases) { - List timeBlocksFilteredUserCount = timeBlocks.stream() - .filter(t -> t.userCount() == timeCase.memberCnt()) + List timeBlocksFilteredUserCount = timeBlocks.stream() + .filter(t -> t.userIds().size() == timeCase.memberCnt()) .toList(); List candidateMeetingTimes = @@ -59,7 +58,7 @@ public List getBestMeetingTime( return bestMeetingTimes; } - private boolean isRecommendedMeetingTime(TimeBlockDto timeBlock, BestMeetingTimeVo bestMeetingTime) { + private boolean isRecommendedMeetingTime(TimeBlockVo timeBlock, BestMeetingTimeVo bestMeetingTime) { return timeBlock.availableDate().isEqual(bestMeetingTime.date()) && bestMeetingTime.startTime().getIndex() <= timeBlock.timeSlot().getIndex() && bestMeetingTime.endTime().getIndex() >= timeBlock.timeSlot().getIndex(); diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/BestMeetingTimeStrategy.java b/src/main/java/com/asap/server/service/time/strategy/BestMeetingTimeStrategy.java similarity index 66% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/BestMeetingTimeStrategy.java rename to src/main/java/com/asap/server/service/time/strategy/BestMeetingTimeStrategy.java index ba2378d2..11b28865 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/BestMeetingTimeStrategy.java +++ b/src/main/java/com/asap/server/service/time/strategy/BestMeetingTimeStrategy.java @@ -1,7 +1,7 @@ -package com.asap.server.service.meeting.recommend.strategy; +package com.asap.server.service.time.strategy; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.util.List; public interface BestMeetingTimeStrategy { diff --git a/src/main/java/com/asap/server/service/time/strategy/ContinuousMeetingTimeStrategy.java b/src/main/java/com/asap/server/service/time/strategy/ContinuousMeetingTimeStrategy.java new file mode 100644 index 00000000..8dad06f1 --- /dev/null +++ b/src/main/java/com/asap/server/service/time/strategy/ContinuousMeetingTimeStrategy.java @@ -0,0 +1,10 @@ +package com.asap.server.service.time.strategy; + +import com.asap.server.persistence.domain.enums.Duration; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; +import java.util.List; + +public interface ContinuousMeetingTimeStrategy { + List find(List timeBlocks, Duration duration); +} diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/MeetingTimeCasesStrategy.java b/src/main/java/com/asap/server/service/time/strategy/MeetingTimeCasesStrategy.java similarity index 64% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/MeetingTimeCasesStrategy.java rename to src/main/java/com/asap/server/service/time/strategy/MeetingTimeCasesStrategy.java index 49a4f332..4eb22221 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/MeetingTimeCasesStrategy.java +++ b/src/main/java/com/asap/server/service/time/strategy/MeetingTimeCasesStrategy.java @@ -1,7 +1,7 @@ -package com.asap.server.service.meeting.recommend.strategy; +package com.asap.server.service.time.strategy; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.vo.PossibleTimeCaseVo; +import com.asap.server.service.time.vo.PossibleTimeCaseVo; import java.util.List; public interface MeetingTimeCasesStrategy { diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java b/src/main/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImpl.java similarity index 84% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java rename to src/main/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImpl.java index 29c73c65..8df6e980 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java +++ b/src/main/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImpl.java @@ -1,9 +1,9 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.recommend.strategy.BestMeetingTimeStrategy; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.strategy.BestMeetingTimeStrategy; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; @@ -27,12 +27,12 @@ public List find(List candidateMeetingTime private BestMeetingTimeVo createFirstMeetingTime(BestMeetingTimeVo candidate, Duration duration) { TimeSlot endTimeSlot = TimeSlot.getTimeSlot(candidate.startTime().getIndex() + duration.getNeedBlock()); - return new BestMeetingTimeVo(candidate.date(), candidate.startTime(), endTimeSlot, candidate.weight()); + return new BestMeetingTimeVo(candidate.date(), candidate.startTime(), endTimeSlot, candidate.weight(), candidate.userIds()); } private BestMeetingTimeVo createSecondMeetingTime(BestMeetingTimeVo candidate, Duration duration) { TimeSlot startTimeSlot = TimeSlot.getTimeSlot(candidate.endTime().getIndex() - duration.getNeedBlock()); - return new BestMeetingTimeVo(candidate.date(), startTimeSlot, candidate.endTime(), candidate.weight()); + return new BestMeetingTimeVo(candidate.date(), startTimeSlot, candidate.endTime(), candidate.weight(), candidate.userIds()); } private boolean isTimeBlockSufficientlyLong(BestMeetingTimeVo candidate, Duration duration) { diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java b/src/main/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImpl.java similarity index 66% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java rename to src/main/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImpl.java index 286088c7..68e0f176 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java +++ b/src/main/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImpl.java @@ -1,19 +1,18 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.strategy.ContinuousMeetingTimeStrategy; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import org.springframework.stereotype.Component; @Component public class ContinuousMeetingTimeStrategyImpl implements ContinuousMeetingTimeStrategy { @Override - public List find(List timeBlocks, Duration duration) { + public List find(List timeBlocks, Duration duration) { List response = new ArrayList<>(); if (timeBlocks.isEmpty()) { return response; @@ -23,8 +22,8 @@ public List find(List timeBlocks, Duration dura int endIdx = 1; while (endIdx < timeBlocks.size()) { - TimeBlockDto endTimeBlock = timeBlocks.get(endIdx - 1); - TimeBlockDto nextTimeBlock = timeBlocks.get(endIdx); + TimeBlockVo endTimeBlock = timeBlocks.get(endIdx - 1); + TimeBlockVo nextTimeBlock = timeBlocks.get(endIdx); if (isContinuous(endTimeBlock, nextTimeBlock)) { endIdx++; @@ -57,39 +56,41 @@ public List find(List timeBlocks, Duration dura } private void validateAndAddMeetingTime( - List timeBlocks, + List timeBlocks, Duration duration, int startIdx, int endIdx, List response ) { - TimeBlockDto startTimeBlock = timeBlocks.get(startIdx); - TimeBlockDto endTimeBlock = timeBlocks.get(endIdx - 1); + TimeBlockVo startTimeBlock = timeBlocks.get(startIdx); + TimeBlockVo endTimeBlock = timeBlocks.get(endIdx - 1); if (isSatisfiedDuration(startTimeBlock, endTimeBlock, duration)) { int weight = sumTimeBlocksWeight(timeBlocks, startIdx, endIdx); + List userIds = findUserIdsBetween(timeBlocks, startIdx, endIdx); TimeSlot endTimeSlot = TimeSlot.getTimeSlot(endTimeBlock.timeSlot().getIndex() + 1); response.add( new BestMeetingTimeVo( startTimeBlock.availableDate(), startTimeBlock.timeSlot(), endTimeSlot, - weight + weight, + userIds ) ); } } private boolean isContinuous( - TimeBlockDto endTimeBlock, - TimeBlockDto nextTimeBlock + TimeBlockVo endTimeBlock, + TimeBlockVo nextTimeBlock ) { return endTimeBlock.availableDate().isEqual(nextTimeBlock.availableDate()) && endTimeBlock.timeSlot().getIndex() + 1 == nextTimeBlock.timeSlot().getIndex(); } private boolean isSatisfiedDuration( - TimeBlockDto startTimeBlock, - TimeBlockDto endTimeBlock, + TimeBlockVo startTimeBlock, + TimeBlockVo endTimeBlock, Duration duration ) { int blockCnt = endTimeBlock.timeSlot().getIndex() - startTimeBlock.timeSlot().getIndex(); @@ -97,13 +98,24 @@ private boolean isSatisfiedDuration( } private int sumTimeBlocksWeight( - final List timeBlocks, + final List timeBlocks, final int startIdx, final int endIdx ) { int totalWeight = timeBlocks.subList(startIdx, endIdx).stream() - .mapToInt(TimeBlockDto::weight) + .mapToInt(TimeBlockVo::weight) .sum(); return totalWeight / (endIdx - startIdx); } + + private List findUserIdsBetween( + final List timeBlocks, + final int startIdx, + final int endIdx + ) { + return timeBlocks.subList(startIdx, endIdx).stream() + .flatMap(timeBlock -> timeBlock.userIds().stream()) + .distinct() + .toList(); + } } diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyImpl.java b/src/main/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyImpl.java similarity index 96% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyImpl.java rename to src/main/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyImpl.java index 989026b0..62ef4c4a 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyImpl.java +++ b/src/main/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyImpl.java @@ -1,8 +1,8 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.meeting.recommend.strategy.MeetingTimeCasesStrategy; -import com.asap.server.service.vo.PossibleTimeCaseVo; +import com.asap.server.service.time.strategy.MeetingTimeCasesStrategy; +import com.asap.server.service.time.vo.PossibleTimeCaseVo; import org.springframework.stereotype.Component; import java.util.ArrayList; diff --git a/src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java b/src/main/java/com/asap/server/service/time/vo/BestMeetingTimeVo.java similarity index 56% rename from src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java rename to src/main/java/com/asap/server/service/time/vo/BestMeetingTimeVo.java index 18c1592e..47430dc1 100644 --- a/src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java +++ b/src/main/java/com/asap/server/service/time/vo/BestMeetingTimeVo.java @@ -1,8 +1,9 @@ -package com.asap.server.service.vo; +package com.asap.server.service.time.vo; import com.asap.server.persistence.domain.enums.TimeSlot; import java.time.LocalDate; +import java.util.List; -public record BestMeetingTimeVo(LocalDate date, TimeSlot startTime, TimeSlot endTime, int weight) { +public record BestMeetingTimeVo(LocalDate date, TimeSlot startTime, TimeSlot endTime, int weight, List userIds) { } diff --git a/src/main/java/com/asap/server/service/vo/BestMeetingTimeWithUsersVo.java b/src/main/java/com/asap/server/service/time/vo/BestMeetingTimeWithUsers.java similarity index 63% rename from src/main/java/com/asap/server/service/vo/BestMeetingTimeWithUsersVo.java rename to src/main/java/com/asap/server/service/time/vo/BestMeetingTimeWithUsers.java index 9b46afe2..5390354a 100644 --- a/src/main/java/com/asap/server/service/vo/BestMeetingTimeWithUsersVo.java +++ b/src/main/java/com/asap/server/service/time/vo/BestMeetingTimeWithUsers.java @@ -1,22 +1,23 @@ -package com.asap.server.service.vo; +package com.asap.server.service.time.vo; import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.service.meeting.dto.UserDto; import java.time.LocalDate; import java.util.List; -public record BestMeetingTimeWithUsersVo( +public record BestMeetingTimeWithUsers( LocalDate date, TimeSlot startTime, TimeSlot endTime, int weight, - List users + List users ) { - public static BestMeetingTimeWithUsersVo of( + public static BestMeetingTimeWithUsers of( final BestMeetingTimeVo bestMeetingTimeVo, - final List users + final List users ) { - return new BestMeetingTimeWithUsersVo( + return new BestMeetingTimeWithUsers( bestMeetingTimeVo.date(), bestMeetingTimeVo.startTime(), bestMeetingTimeVo.endTime(), diff --git a/src/main/java/com/asap/server/service/vo/PossibleTimeCaseVo.java b/src/main/java/com/asap/server/service/time/vo/PossibleTimeCaseVo.java similarity index 76% rename from src/main/java/com/asap/server/service/vo/PossibleTimeCaseVo.java rename to src/main/java/com/asap/server/service/time/vo/PossibleTimeCaseVo.java index 78e9c733..43916489 100644 --- a/src/main/java/com/asap/server/service/vo/PossibleTimeCaseVo.java +++ b/src/main/java/com/asap/server/service/time/vo/PossibleTimeCaseVo.java @@ -1,4 +1,4 @@ -package com.asap.server.service.vo; +package com.asap.server.service.time.vo; import com.asap.server.persistence.domain.enums.Duration; diff --git a/src/main/java/com/asap/server/service/user/UserRetrieveService.java b/src/main/java/com/asap/server/service/user/UserRetrieveService.java new file mode 100644 index 00000000..6d4afa78 --- /dev/null +++ b/src/main/java/com/asap/server/service/user/UserRetrieveService.java @@ -0,0 +1,25 @@ +package com.asap.server.service.user; + +import com.asap.server.persistence.domain.Meeting; +import com.asap.server.persistence.domain.user.User; +import com.asap.server.persistence.repository.user.UserRepository; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserRetrieveService { + private final UserRepository userRepository; + + public int getMeetingUserCount(final Meeting meeting) { + return userRepository.countByMeeting(meeting); + } + + public Map getUserIdToUserMap(final Long meetingId) { + return userRepository + .findAllByMeetingId(meetingId).stream() + .collect(Collectors.toMap(User::getId, user -> user)); + } +} diff --git a/src/main/java/com/asap/server/service/vo/UserVo.java b/src/main/java/com/asap/server/service/vo/UserVo.java deleted file mode 100644 index f7ce13f8..00000000 --- a/src/main/java/com/asap/server/service/vo/UserVo.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.asap.server.service.vo; - -import com.querydsl.core.annotations.QueryProjection; - -public record UserVo( - Long id, - String name -) { - @QueryProjection - public UserVo { - } -} diff --git a/src/test/java/com/asap/server/common/generator/TimeBlockDtoGenerator.java b/src/test/java/com/asap/server/common/generator/TimeBlockDtoGenerator.java deleted file mode 100644 index 19f1f74d..00000000 --- a/src/test/java/com/asap/server/common/generator/TimeBlockDtoGenerator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.asap.server.common.generator; - -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -public class TimeBlockDtoGenerator { - private static final TimeSlot[] timeSlots = TimeSlot.values(); - - public static List generator( - LocalDate availableDate, - TimeSlot startTime, - TimeSlot endTime, - int weight, - long userCount - ) { - List timeBlocks = new ArrayList<>(); - for (int i = startTime.ordinal(); i <= endTime.ordinal(); i++) { - timeBlocks.add(new TimeBlockDto(availableDate, timeSlots[i], weight, userCount)); - } - return timeBlocks; - } -} diff --git a/src/test/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImplTest.java b/src/test/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImplTest.java deleted file mode 100644 index 602e7c82..00000000 --- a/src/test/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImplTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.asap.server.persistence.repository.timeblock; - -import com.asap.server.persistence.config.querydsl.QueryDslConfig; -import com.asap.server.persistence.domain.AvailableDate; -import com.asap.server.persistence.domain.Meeting; -import com.asap.server.persistence.domain.Place; -import com.asap.server.persistence.domain.TimeBlock; -import com.asap.server.persistence.domain.TimeBlockUser; -import com.asap.server.persistence.domain.user.Name; -import com.asap.server.persistence.domain.user.User; -import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.domain.enums.PlaceType; -import com.asap.server.persistence.domain.enums.Role; -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import jakarta.persistence.EntityManager; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.Import; - -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@DataJpaTest -@Import(QueryDslConfig.class) -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -class TimeBlockRepositoryImplTest { - @Autowired - EntityManager em; - @Autowired - TimeBlockRepository timeBlockRepositoryCustom; - - @Test - @DisplayName("2명의 사용자 모두 2개의 요일에 6_00 ~ 8_00까지 시간을 입력했을 때, 총 10개의 레코드를 불러온다.") - void findAllTimeBlockByMeetingTest() { - // given - Place place = Place.builder() - .placeType(PlaceType.OFFLINE) - .build(); - Meeting meeting = Meeting.builder() - .title("회의 테스트") - .password("0000") - .additionalInfo("") - .duration(Duration.HALF) - .place(place) - .build(); - em.persist(meeting); - - final Name name = new Name("KWY"); - final Name name2 = new Name("DSY"); - User user = User.builder() - .meeting(meeting) - .name(name) - .role(Role.HOST) - .build(); - User user2 = User.builder() - .meeting(meeting) - .name(name2) - .role(Role.MEMBER) - .build(); - em.persist(user); - em.persist(user2); - - AvailableDate availableDate = AvailableDate.builder() - .date(LocalDate.of(2024, 7, 9)) - .meeting(meeting) - .build(); - AvailableDate availableDate2 = AvailableDate.builder() - .date(LocalDate.of(2024, 7, 10)) - .meeting(meeting) - .build(); - em.persist(availableDate); - em.persist(availableDate2); - - List timeBlocks = createTimeBlocks(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_8_00); - List timeBlocks2 = createTimeBlocks(availableDate2, TimeSlot.SLOT_6_00, TimeSlot.SLOT_8_00); - List tbu = createTimeBlockUsers(timeBlocks, user); - List tbu2 = createTimeBlockUsers(timeBlocks2, user); - List tbu3 = createTimeBlockUsers(timeBlocks, user2); - List tbu4 = createTimeBlockUsers(timeBlocks2, user2); - - // when - List response = timeBlockRepositoryCustom.findAllTimeBlockByMeeting(meeting.getId()); - - // then - assertThat(response.size()).isEqualTo(10); - } - - private List createTimeBlocks(AvailableDate availableDate, TimeSlot startTime, TimeSlot endTime) { - List timeSlots = TimeSlot.getTimeSlots(startTime.ordinal(), endTime.ordinal()); - List timeBlocks = new ArrayList<>(); - for (TimeSlot timeSlot : timeSlots) { - final TimeBlock timeBlock = TimeBlock.builder() - .availableDate(availableDate) - .timeSlot(timeSlot) - .build(); - em.persist(timeBlock); - timeBlocks.add(timeBlock); - } - return timeBlocks; - } - - private List createTimeBlockUsers(List timeBlocks, User user) { - List timeBlockUsers = new ArrayList<>(); - for (TimeBlock timeBlock : timeBlocks) { - TimeBlockUser tbu = TimeBlockUser.builder() - .timeBlock(timeBlock) - .user(user) - .build(); - em.persist(tbu); - timeBlockUsers.add(tbu); - } - return timeBlockUsers; - } -} \ No newline at end of file diff --git a/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java b/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java new file mode 100644 index 00000000..25cc970c --- /dev/null +++ b/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java @@ -0,0 +1,250 @@ +package com.asap.server.service.meeting; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.Mockito.when; + +import com.asap.server.persistence.domain.Meeting; +import com.asap.server.persistence.domain.enums.Duration; +import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.persistence.domain.user.Name; +import com.asap.server.persistence.domain.user.User; +import com.asap.server.persistence.repository.meeting.MeetingRepository; +import com.asap.server.service.meeting.dto.BestMeetingTimeDto; +import com.asap.server.service.meeting.dto.UserDto; +import com.asap.server.service.time.MeetingTimeRecommendService; +import com.asap.server.service.time.UserMeetingScheduleService; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.user.UserRetrieveService; +import com.asap.server.service.time.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class MeetingRetrieveServiceTest { + @Mock + private MeetingRepository meetingRepository; + @Mock + private UserRetrieveService userRetrieveService; + @Mock + private MeetingTimeRecommendService meetingTimeRecommendService; + @Mock + private UserMeetingScheduleService userMeetingScheduleService; + @InjectMocks + private MeetingRetrieveService meetingRetrieveService; + + @Nested + @DisplayName("정상 응답 테스트") + class SuccessTestCase { + @DisplayName("추천된 회의 시간이 1가지 일 때, (회의 시간, null, null)을 반환한다.") + @Test + void test() { + // given + Meeting meeting = Meeting.builder() + .id(1L) + .host(User.builder().id(1L).build()) + .duration(Duration.HALF) + .build(); + User user = User.builder() + .id(1L) + .name(new Name("KWY")) + .build(); + User user2 = User.builder() + .id(2L) + .name(new Name("DSH")) + .build(); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)) + ); + when(meetingRepository.findById(1L)).thenReturn(Optional.of(meeting)); + when(userRetrieveService.getMeetingUserCount(meeting)).thenReturn(2); + when(userMeetingScheduleService.getTimeBlocks(1L)).thenReturn(timeBlocks); + when(meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), 2)).thenReturn( + Arrays.asList( + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, + List.of(1L, 2L)), + null, + null + ) + ); + when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); + + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsers( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_12_00, + TimeSlot.SLOT_12_30, + 0, + List.of( + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") + ) + ), + null, + null + ); + BestMeetingTimeDto expected = BestMeetingTimeDto.of(2, bestMeetingTimeWithUsers); + + // when + BestMeetingTimeDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + + // then + assertThat(expected).isEqualTo(result); + } + + @DisplayName("추천된 회의 시간이 2가지 일 때, (회의 시간1, 회의 시간2, null)을 반환한다.") + @Test + void test2() { + // given + Meeting meeting = Meeting.builder() + .id(1L) + .host(User.builder().id(1L).build()) + .duration(Duration.HALF) + .build(); + User user = User.builder() + .id(1L) + .name(new Name("KWY")) + .build(); + User user2 = User.builder() + .id(2L) + .name(new Name("DSH")) + .build(); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)) + ); + when(meetingRepository.findById(1L)).thenReturn(Optional.of(meeting)); + when(userRetrieveService.getMeetingUserCount(meeting)).thenReturn(2); + when(userMeetingScheduleService.getTimeBlocks(1L)).thenReturn(timeBlocks); + when(meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), 2)).thenReturn( + Arrays.asList( + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, + List.of(1L, 2L)), + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_13_00, TimeSlot.SLOT_13_30, 0, + List.of(1L, 2L)), + null + ) + ); + when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); + + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsers( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_12_00, + TimeSlot.SLOT_12_30, + 0, + List.of( + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") + ) + ), + new BestMeetingTimeWithUsers( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_13_00, + TimeSlot.SLOT_13_30, + 0, + List.of( + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") + ) + ), + null + ); + BestMeetingTimeDto expected = BestMeetingTimeDto.of(2, bestMeetingTimeWithUsers); + + // when + BestMeetingTimeDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + + // then + assertThat(expected).isEqualTo(result); + } + + @DisplayName("추천된 회의 시간이 3가지 일 때, (회의 시간1, 회의 시간2, 회의 시간3)을 반환한다.") + @Test + void test3() { + // given + Meeting meeting = Meeting.builder() + .id(1L) + .host(User.builder().id(1L).build()) + .duration(Duration.HALF) + .build(); + User user = User.builder() + .id(1L) + .name(new Name("KWY")) + .build(); + User user2 = User.builder() + .id(2L) + .name(new Name("DSH")) + .build(); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)) + ); + when(meetingRepository.findById(1L)).thenReturn(Optional.of(meeting)); + when(userRetrieveService.getMeetingUserCount(meeting)).thenReturn(2); + when(userMeetingScheduleService.getTimeBlocks(1L)).thenReturn(timeBlocks); + when(meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), 2)).thenReturn( + Arrays.asList( + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, + List.of(1L, 2L)), + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_13_00, TimeSlot.SLOT_13_30, 0, + List.of(1L, 2L)), + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0, + List.of(1L, 2L)) + ) + ); + when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); + + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsers( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_12_00, + TimeSlot.SLOT_12_30, + 0, + List.of( + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") + ) + ), + new BestMeetingTimeWithUsers( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_13_00, + TimeSlot.SLOT_13_30, + 0, + List.of( + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") + ) + ), + new BestMeetingTimeWithUsers( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_14_00, + TimeSlot.SLOT_14_30, + 0, + List.of( + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") + ) + ) + ); + BestMeetingTimeDto expected = BestMeetingTimeDto.of(2, bestMeetingTimeWithUsers); + + // when + BestMeetingTimeDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + + // then + assertThat(expected).isEqualTo(result); + } + } +} \ No newline at end of file diff --git a/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java b/src/test/java/com/asap/server/service/time/MeetingTimeRecommendServiceTest.java similarity index 51% rename from src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java rename to src/test/java/com/asap/server/service/time/MeetingTimeRecommendServiceTest.java index 3558b274..dd510059 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java +++ b/src/test/java/com/asap/server/service/time/MeetingTimeRecommendServiceTest.java @@ -1,23 +1,22 @@ -package com.asap.server.service.meeting.recommend; +package com.asap.server.service.time; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_00; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_30; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_13_00; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_13_30; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_15_00; -import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_15_30; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_16_00; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import com.asap.server.common.generator.TimeBlockDtoGenerator; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import com.asap.server.service.meeting.recommend.strategy.impl.BestMeetingTimeStrategyImpl; -import com.asap.server.service.meeting.recommend.strategy.impl.ContinuousMeetingTimeStrategyImpl; -import com.asap.server.service.meeting.recommend.strategy.impl.MeetingTimeCasesStrategyImpl; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.service.time.MeetingTimeRecommendService; +import com.asap.server.service.time.strategy.impl.BestMeetingTimeStrategyImpl; +import com.asap.server.service.time.strategy.impl.ContinuousMeetingTimeStrategyImpl; +import com.asap.server.service.time.strategy.impl.MeetingTimeCasesStrategyImpl; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.time.LocalDate; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -41,10 +40,10 @@ public void setUp() { public void getBestMeetingTime() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 0, 1L); - List timeBlocks = List.of(timeBlock); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L)); + List timeBlocks = List.of(timeBlock); - BestMeetingTimeVo expected = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); + BestMeetingTimeVo expected = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0, List.of(1L)); // when List result = meetingTimeRecommendService.getBestMeetingTime(timeBlocks, Duration.HALF, 1); @@ -60,12 +59,12 @@ public void getBestMeetingTime2() { LocalDate availableDate = LocalDate.of(2023, 7, 10); LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 0, 1L); - TimeBlockDto timeBlock2 = new TimeBlockDto(availableDate2, SLOT_12_30, 0, 1L); - List timeBlocks = List.of(timeBlock, timeBlock2); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L)); + TimeBlockVo timeBlock2 = new TimeBlockVo(availableDate2, SLOT_12_30, 0, List.of(1L)); + List timeBlocks = List.of(timeBlock, timeBlock2); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0, List.of(1L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0, List.of(1L)); List expected = Arrays.asList(e1, e2, null); // when @@ -83,15 +82,15 @@ public void getBestMeetingTime3() { LocalDate availableDate = LocalDate.of(2023, 7, 10); LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 0, 2L); - TimeBlockDto timeBlock2 = new TimeBlockDto(availableDate, SLOT_13_00, 0, 2L); - TimeBlockDto timeBlock3 = new TimeBlockDto(availableDate2, SLOT_12_30, 0, 2L); - TimeBlockDto timeBlock4 = new TimeBlockDto(availableDate2, SLOT_13_00, 0, 2L); - List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L, 2L)); + TimeBlockVo timeBlock2 = new TimeBlockVo(availableDate, SLOT_13_00, 0, List.of(1L, 2L)); + TimeBlockVo timeBlock3 = new TimeBlockVo(availableDate2, SLOT_12_30, 0, List.of(1L, 2L)); + TimeBlockVo timeBlock4 = new TimeBlockVo(availableDate2, SLOT_13_00, 0, List.of(1L, 2L)); + List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_13_00, SLOT_13_30, 0); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_13_00, SLOT_13_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2, e3); // when @@ -106,21 +105,24 @@ public void getBestMeetingTime3() { @DisplayName("최적의 회의시간이 2개이고 차선의 경우가 1개 있는 경우") public void getBestMeetingTime4() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); + LocalDate availableDate = LocalDate.of(2024, 7, 10); + LocalDate availableDate2 = LocalDate.of(2024, 7, 11); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)) + ); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_12_30, SLOT_13_00, 0, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; - - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 0, List.of(1L, 2L)); List expected = List.of(e1, e2, e3); // when @@ -135,21 +137,25 @@ public void getBestMeetingTime4() { @DisplayName("최적의 회의 시간이 3개일 때 우선순위가 가장 높은 회의 시간이 첫번째에 위치한다") public void getBestMeetingTime5() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); + LocalDate availableDate = LocalDate.of(2024, 7, 10); + LocalDate availableDate2 = LocalDate.of(2024, 7, 11); + + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_12_30, 6, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_13_00, 6, List.of(1L, 2L)) + ); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_12_30, SLOT_13_00, 6, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; - - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 6); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 6, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0, List.of(1L, 2L)); List expected = Arrays.asList(e1, e2, e3); // when @@ -166,10 +172,10 @@ public void getBestMeetingTime6() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 0, 2L); - List timeBlocks = List.of(timeBlock); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L, 2L)); + List timeBlocks = List.of(timeBlock); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0, List.of(1L, 2L)); List expected = Arrays.asList(e1, null, null); // when @@ -187,16 +193,16 @@ public void getBestMeetingTime7() { LocalDate availableDate2 = LocalDate.of(2023, 7, 11); LocalDate availableDate3 = LocalDate.of(2023, 7, 12); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 3, 3L); - TimeBlockDto timeBlock2 = new TimeBlockDto(availableDate, SLOT_12_30, 3, 3L); - TimeBlockDto timeBlock3 = new TimeBlockDto(availableDate2, SLOT_12_00, 4, 3L); - TimeBlockDto timeBlock4 = new TimeBlockDto(availableDate3, SLOT_12_00, 4, 3L); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 3, List.of(1L, 2L, 3L)); + TimeBlockVo timeBlock2 = new TimeBlockVo(availableDate, SLOT_12_30, 3, List.of(1L, 2L, 3L)); + TimeBlockVo timeBlock3 = new TimeBlockVo(availableDate2, SLOT_12_00, 4, List.of(1L, 2L, 3L)); + TimeBlockVo timeBlock4 = new TimeBlockVo(availableDate3, SLOT_12_00, 4, List.of(1L, 2L, 3L)); - List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); + List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 3); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_00, SLOT_12_30, 4); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate3, SLOT_12_00, SLOT_12_30, 4); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 3, List.of(1L, 2L, 3L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_00, SLOT_12_30, 4, List.of(1L, 2L, 3L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate3, SLOT_12_00, SLOT_12_30, 4, List.of(1L, 2L, 3L)); List expected = Arrays.asList(e1, e2, e3); // when @@ -210,12 +216,18 @@ public void getBestMeetingTime7() { @DisplayName("이미 추천한 시간대는 이후 조합에서 추천하지 않는다.") public void getBestMeetingTime8() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - - List timeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_00, 0, 2L); + LocalDate availableDate = LocalDate.of(2024, 7, 10); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)) + ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_30, 0, List.of(1L, 2L)); List expected = Arrays.asList(e1, null, null); // when diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java b/src/test/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImplTest.java similarity index 83% rename from src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java rename to src/test/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImplTest.java index f5364b8c..b878072d 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java +++ b/src/test/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImplTest.java @@ -1,11 +1,11 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.recommend.strategy.BestMeetingTimeStrategy; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.strategy.BestMeetingTimeStrategy; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.time.LocalDate; import java.util.List; import org.junit.jupiter.api.DisplayName; @@ -26,10 +26,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -45,11 +45,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_16_30, TimeSlot.SLOT_17_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_16_30, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -65,14 +65,14 @@ void test3() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_6_30, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_6_30, 0, List.of(1L, 2L)); BestMeetingTimeVo bestMeetingTimeVo2 = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_21_00, TimeSlot.SLOT_24_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_21_00, TimeSlot.SLOT_24_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo, bestMeetingTimeVo2); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_6_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_21_00, TimeSlot.SLOT_21_30, 0); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_23_30, TimeSlot.SLOT_24_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_6_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_21_00, TimeSlot.SLOT_21_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_23_30, TimeSlot.SLOT_24_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2, e3); // when @@ -94,10 +94,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -113,11 +113,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_18_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_18_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_00, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_17_00, TimeSlot.SLOT_18_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_17_00, TimeSlot.SLOT_18_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -139,10 +139,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -158,11 +158,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_19_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_19_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_17_30, TimeSlot.SLOT_19_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_17_30, TimeSlot.SLOT_19_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -184,10 +184,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -204,11 +204,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_20_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_20_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_18_00, TimeSlot.SLOT_20_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_18_00, TimeSlot.SLOT_20_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -230,10 +230,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -249,11 +249,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_21_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_21_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_18_30, TimeSlot.SLOT_21_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_18_30, TimeSlot.SLOT_21_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -275,10 +275,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -294,11 +294,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_22_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_22_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_19_00, TimeSlot.SLOT_22_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_19_00, TimeSlot.SLOT_22_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java b/src/test/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java similarity index 51% rename from src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java rename to src/test/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java index 2c50a6e8..c6e457a8 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java +++ b/src/test/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java @@ -1,15 +1,27 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; - -import static com.asap.server.persistence.domain.enums.TimeSlot.*; +package com.asap.server.service.time.strategy.impl; + +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_30; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_13_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_14_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_14_30; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_16_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_16_30; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_17_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_18_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_20_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_23_30; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_24_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_6_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_6_30; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import com.asap.server.common.generator.TimeBlockDtoGenerator; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.service.time.strategy.ContinuousMeetingTimeStrategy; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.time.LocalDate; -import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -24,11 +36,17 @@ class ContinuousMeetingTimeStrategyImplTest { @Nested class ReturnOneBestMeetingTimeVoByDuration { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List timeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_30, 0, 2L); - - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_16_00, 0); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)) + ); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0, List.of(1L, 2L)); List result = List.of(r1); @DisplayName("회의 진행 시간이 주어졌을 때, 12시부터 16시까지인 BestMeetingTimeVo를 반환한다.") @@ -48,23 +66,28 @@ void durationsTest(Duration duration) { @Nested class ReturnBestMeetingTimeVoByDuration { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate, SLOT_18_00, SLOT_19_30, 0, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_18_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_18_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_19_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_19_30, 0, List.of(1L, 2L)) + ); @DisplayName("회의 진행 시간이 2시간 이하일 때, 12시부터 16시까지, 18시부터 20시 까지인 BestMeetingTimeVo를 반환한다.") @ParameterizedTest @EnumSource(value = Duration.class, names = {"HALF", "HOUR", "HOUR_HALF", "TWO_HOUR"}) void durationsTest2(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_16_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate, SLOT_18_00, SLOT_20_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_18_00, SLOT_20_00, 0, List.of(1L, 2L)); List result = List.of(r1, r2); // when @@ -79,7 +102,7 @@ void durationsTest2(Duration duration) { @EnumSource(value = Duration.class, names = {"TWO_HOUR_HALF", "THREE_HOUR"}) void durationsTest3(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_16_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0, List.of(1L, 2L)); List result = List.of(r1); // when @@ -94,14 +117,15 @@ void durationsTest3(Duration duration) { @Nested class ReturnOneBestMeetingTimeVoByDuration2 { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List timeBlocks = TimeBlockDtoGenerator.generator(availableDate, SLOT_12_00, SLOT_12_00, 0, 2L); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)) + ); @DisplayName("회의 진행 시간이 30분일 때, 12시부터 12시 30분까지인 BestMeetingTimeVo를 반환한다.") @Test void durationHalfTest() { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_12_30, 0, List.of(1L, 2L)); List result = List.of(r1); // when @@ -126,24 +150,22 @@ void durationHourTest() { @Nested class ReturnBestMeetingTimeVoByDuration2 { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_13_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_12_00, SLOT_12_30, 0, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)) + ); @DisplayName("회의 진행 시간이 1시간 이하일 때, 12시부터 14시, 12시부터 13시까지인 BestMeetingTimeVo를 반환한다.") @ParameterizedTest @EnumSource(value = Duration.class, names = {"HALF", "HOUR"}) void durationsTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate2, SLOT_12_00, SLOT_13_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_12_00, SLOT_13_00, 0, List.of(1L, 2L)); List result = List.of(r1, r2); // when @@ -158,7 +180,7 @@ void durationsTest(Duration duration) { @EnumSource(value = Duration.class, names = {"HOUR_HALF", "TWO_HOUR"}) void durationsTest2(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0, List.of(1L, 2L)); List result = List.of(r1); // when @@ -184,24 +206,25 @@ void durationsTest3(Duration duration) { @Nested class ReturnBestMeetingTimeVoByDuration3 { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_13_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_14_30, SLOT_16_30, 0, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_30, 0, List.of(1L, 2L)) + ); @DisplayName("회의 진행 시간이 2시간 이하일 때, 2023-7-10일 12시부터 14시, 2023-7-11일 14시 30분부터 17시까지인 BestMeetingTimeVo를 반환한다.") @ParameterizedTest @EnumSource(value = Duration.class, names = {"HALF", "HOUR", "HOUR_HALF", "TWO_HOUR"}) void durationsTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate2, SLOT_14_30, SLOT_17_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_14_30, SLOT_17_00, 0, List.of(1L, 2L)); List result = List.of(r1, r2); // when @@ -216,7 +239,7 @@ void durationsTest(Duration duration) { @EnumSource(value = Duration.class, names = {"TWO_HOUR_HALF"}) void durationTwoHourHalfTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate2, SLOT_14_30, SLOT_17_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_14_30, SLOT_17_00, 0, List.of(1L, 2L)); List result = List.of(r1); // when @@ -245,19 +268,16 @@ class SumWeightTest { @Test void weightTest() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_13_30, 4, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_16_00, SLOT_16_00, 2, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; - - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 4); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate2, SLOT_16_00, SLOT_16_30, 2); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_00, 2, List.of(1L, 2L)) + ); + + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 4, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_16_00, SLOT_16_30, 2, List.of(1L, 2L)); List result = List.of(r1, r2); // when @@ -271,24 +291,18 @@ void weightTest() { @Test void weightTest2() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - LocalDate availableDate3 = LocalDate.of(2023, 7, 12); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_13_30, 2, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_16_00, SLOT_16_00, 4, 2L); - List tempTimeBlocks3 = TimeBlockDtoGenerator - .generator(availableDate3, SLOT_16_30, SLOT_16_30, 1, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - addAll(tempTimeBlocks3); - }}; - - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 2); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate2, SLOT_16_00, SLOT_16_30, 4); - BestMeetingTimeVo r3 = new BestMeetingTimeVo(availableDate3, SLOT_16_30, SLOT_17_00, 1); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 2, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 2, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 2, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 2, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_00, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 12), TimeSlot.SLOT_16_30, 1, List.of(1L, 2L)) + ); + + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 2, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_16_00, SLOT_16_30, 4, List.of(1L, 2L)); + BestMeetingTimeVo r3 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 12), SLOT_16_30, SLOT_17_00, 1, List.of(1L, 2L)); List result = List.of(r2, r1, r3); // when @@ -306,12 +320,11 @@ class TimeSlotEdgeTest { @Test void timeSlot6_00Test() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_6_00, SLOT_6_00, 0, 2L); - List timeBlocks = new ArrayList<>(tempTimeBlocks); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_6_00, 0, List.of(1L, 2L)) + ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_6_00, SLOT_6_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_6_00, SLOT_6_30, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -325,12 +338,11 @@ void timeSlot6_00Test() { @Test void timeSlot24_00Test() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_23_30, SLOT_23_30, 0, 2L); - List timeBlocks = new ArrayList<>(tempTimeBlocks); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_23_30, 0, List.of(1L, 2L)) + ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_23_30, SLOT_24_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_23_30, SLOT_24_00, 0, List.of(1L, 2L)); List expected = List.of(e1); // when diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyTest.java b/src/test/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyTest.java similarity index 99% rename from src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyTest.java rename to src/test/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyTest.java index fdf0e12d..99cf8896 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyTest.java +++ b/src/test/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyTest.java @@ -1,9 +1,9 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.meeting.recommend.strategy.MeetingTimeCasesStrategy; -import com.asap.server.service.vo.PossibleTimeCaseVo; +import com.asap.server.service.time.strategy.MeetingTimeCasesStrategy; +import com.asap.server.service.time.vo.PossibleTimeCaseVo; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/com/asap/server/service/user/UserRetrieveServiceTest.java b/src/test/java/com/asap/server/service/user/UserRetrieveServiceTest.java new file mode 100644 index 00000000..add5be18 --- /dev/null +++ b/src/test/java/com/asap/server/service/user/UserRetrieveServiceTest.java @@ -0,0 +1,61 @@ +package com.asap.server.service.user; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.Mockito.when; + +import com.asap.server.persistence.domain.user.User; +import com.asap.server.persistence.repository.user.UserRepository; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class UserRetrieveServiceTest { + @Mock + private UserRepository userRepository; + @InjectMocks + private UserRetrieveService userRetrieveService; + + @Test + @DisplayName("사용자가 존재할 때, userId를 키로 갖는 Map을 반환한다.") + void test() { + // given + List users = List.of( + User.builder().id(1L).build(), + User.builder().id(2L).build(), + User.builder().id(3L).build() + ); + when(userRepository.findAllByMeetingId(1L)).thenReturn(users); + Map expected = Map.of( + 1L, User.builder().id(1L).build(), + 2L, User.builder().id(2L).build(), + 3L, User.builder().id(3L).build() + ); + + // when + Map result = userRetrieveService.getUserIdToUserMap(1L); + + // then + assertThat(result).isEqualTo(expected); + } + + @Test + @DisplayName("사용자가 없을 때, 빈 Map을 반환한다.") + void test2() { + // given + when(userRepository.findAllByMeetingId(1L)).thenReturn(Collections.emptyList()); + Map expected = Map.of(); + + // when + Map result = userRetrieveService.getUserIdToUserMap(1L); + + // then + assertThat(result).isEqualTo(expected); + } +} \ No newline at end of file