diff --git a/src/main/java/hhplus/lecture/application/service/LectureService.java b/src/main/java/hhplus/lecture/application/service/LectureService.java index cbbcdbf..6849b28 100644 --- a/src/main/java/hhplus/lecture/application/service/LectureService.java +++ b/src/main/java/hhplus/lecture/application/service/LectureService.java @@ -7,9 +7,9 @@ import hhplus.lecture.infrastructure.repository.LectureRepository; import hhplus.lecture.infrastructure.persistence.LectureEntity; import hhplus.lecture.interfaces.dto.lecture.LectureDto; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.util.List; import java.util.NoSuchElementException; import java.util.stream.Collectors; @@ -17,13 +17,13 @@ @Service public class LectureService { - private final LectureRepository lecturesRepository; + private final LectureRepository lectureRepository; private final LectureItemRepository lectureItemRepository; private final InstructorRepository instructorRepository; // 특강 정보 조회 public Lecture getLecture(String lectureCode) { - LectureEntity entity = lecturesRepository.findByLectureCode(lectureCode); + LectureEntity entity = lectureRepository.findByLectureCode(lectureCode); if(entity == null) { throw new NoSuchElementException("특강을 찾을 수 없습니다."); } @@ -33,7 +33,7 @@ public Lecture getLecture(String lectureCode) { // 모든 특강 조회 public List getAllLectures() { - List entities = lecturesRepository.findAll(); + List entities = lectureRepository.findAll(); return entities.stream() .map(entity -> { LectureItemEntity lectureItem = lectureItemRepository.findByLectureItemCode(entity.getLectureCode()); @@ -43,9 +43,25 @@ public List getAllLectures() { .collect(Collectors.toList()); } + // 신청 가능한 강의 조회 + public List getAvailableLecturesByDate(LocalDate targetDate) { + + // 해당 날짜의 강의 조회 + List lectureItems = lectureItemRepository.findAllByLectureDate(targetDate); + + return lectureItems.stream() + // 정원이 차지 않은 강의 조회 + .filter(item -> item.getCurrentCapacity() < item.getMaxCapacity()) + .map(item ->{ + LectureEntity lectureEntity = lectureRepository.findByLectureCode(item.getLectureItemCode()); + String instructorName = instructorRepository.findByInstructorCode(lectureEntity.getInstructorCode()).getInstructorName(); + return LectureDto.fromEntity(lectureEntity, item, instructorName); + }).collect(Collectors.toList()); + } + // 생성자 - public LectureService(LectureRepository lecturesRepository, LectureItemRepository lectureItemRepository, InstructorRepository instructorRepository) { - this.lecturesRepository = lecturesRepository; + public LectureService(LectureRepository lectureRepository, LectureItemRepository lectureItemRepository, InstructorRepository instructorRepository) { + this.lectureRepository = lectureRepository; this.lectureItemRepository = lectureItemRepository; this.instructorRepository = instructorRepository; } diff --git a/src/main/java/hhplus/lecture/application/service/UserService.java b/src/main/java/hhplus/lecture/application/service/UserService.java index 7d24006..6e7ad2c 100644 --- a/src/main/java/hhplus/lecture/application/service/UserService.java +++ b/src/main/java/hhplus/lecture/application/service/UserService.java @@ -7,7 +7,6 @@ import hhplus.lecture.infrastructure.repository.*; import hhplus.lecture.interfaces.dto.lecture.LectureDto; import hhplus.lecture.interfaces.dto.user.UserResponseDto; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -18,11 +17,11 @@ public class UserService { private final UsersRepository usersRepository; - private RegistrationRepository registrationRepository; - private LectureRepository lectureRepository; - private LectureItemRepository lectureItemRepository; - private LectureService lectureService; - private InstructorRepository instructorRepository; + private final RegistrationRepository registrationRepository; + private final LectureRepository lectureRepository; + private final LectureItemRepository lectureItemRepository; + private final LectureService lectureService; + private final InstructorRepository instructorRepository; // 사용자 조회 (사용자 상세정보 + 강의 신청 내역) public UserResponseDto getUserAndRegisteredLectures(String userCode) { @@ -47,10 +46,12 @@ public UserResponseDto getUserAndRegisteredLectures(String userCode) { } // 생성자 - public UserService(UsersRepository usersRepository, RegistrationRepository registrationRepository, LectureService lectureService, InstructorRepository instructorRepository) { + public UserService(UsersRepository usersRepository, RegistrationRepository registrationRepository, LectureService lectureService, InstructorRepository instructorRepository, LectureRepository lectureRepository, LectureItemRepository lectureItemRepository) { this.usersRepository = usersRepository; this.registrationRepository = registrationRepository; this.lectureService = lectureService; this.instructorRepository = instructorRepository; + this.lectureRepository = lectureRepository; + this.lectureItemRepository = lectureItemRepository; } } diff --git a/src/test/java/hhplus/lecture/application/service/LectureServiceTest.java b/src/test/java/hhplus/lecture/application/service/LectureServiceTest.java index 810a667..51ba940 100644 --- a/src/test/java/hhplus/lecture/application/service/LectureServiceTest.java +++ b/src/test/java/hhplus/lecture/application/service/LectureServiceTest.java @@ -81,8 +81,8 @@ class LectureServiceTest { when(lectureRepository.findAll()).thenReturn(lectureEntities); // LectureItemEntity - LectureItemEntity lectureItem1 = new LectureItemEntity("LE001", LocalDate.now(), 30, 0); - LectureItemEntity lectureItem2 = new LectureItemEntity("LE002", LocalDate.now(), 30, 0); + LectureItemEntity lectureItem1 = new LectureItemEntity("LE001", "LE001", LocalDate.now(), 30, 0); + LectureItemEntity lectureItem2 = new LectureItemEntity("LE002", "LE001", LocalDate.now(), 30, 0); when(lectureItemRepository.findByLectureItemCode("LE001")).thenReturn(lectureItem1); when(lectureItemRepository.findByLectureItemCode("LE002")).thenReturn(lectureItem2); @@ -103,4 +103,29 @@ class LectureServiceTest { assertThat(result.get(1).getLectureCode()).isEqualTo("LE002"); assertThat(result.get(1).getInstructorName()).isEqualTo("렌"); } + + @Test + void 날짜별_현재_신청가능한_특강_목록_조회(){ + // given : 특정 날짜 설정, 강의 목록 세팅 + LocalDate targetDate = LocalDate.of(2024,10,3); + + // 특강 목록 + LectureItemEntity lectureItem1 = new LectureItemEntity("LE001", "LE001",targetDate, 30, 1); + LectureItemEntity lectureItem2 = new LectureItemEntity("LE002", "LE002",targetDate, 30, 30); + + when(lectureItemRepository.findAllByLectureDate(targetDate)).thenReturn(List.of(lectureItem1, lectureItem2)); + + // 특강 상세 설정 + when(lectureRepository.findByLectureCode("LE001")).thenReturn(new LectureEntity("LE001", "JAVA", "IN001")); + + // 강사 설정 + when(instructorRepository.findByInstructorCode("IN001")).thenReturn(new InstructorEntity("IN001", "이석범")); + + // when : 특강 조회 + List availableLectures = lectureService.getAvailableLecturesByDate(targetDate); + + // then : 신청 가능한 강의 목록 확인 + assertThat(availableLectures).hasSize(1); + assertThat(availableLectures).extracting("lectureItemCode").containsExactly("LE001"); + } } diff --git a/src/test/java/hhplus/lecture/application/service/UserServiceTest.java b/src/test/java/hhplus/lecture/application/service/UserServiceTest.java index 6ad5e34..f0b0cc7 100644 --- a/src/test/java/hhplus/lecture/application/service/UserServiceTest.java +++ b/src/test/java/hhplus/lecture/application/service/UserServiceTest.java @@ -1,11 +1,8 @@ package hhplus.lecture.application.service; -import hhplus.lecture.domain.model.Lecture; import hhplus.lecture.domain.model.RegistrationStatus; -import hhplus.lecture.infrastructure.persistence.RegistrationEntity; -import hhplus.lecture.infrastructure.persistence.UserEntity; -import hhplus.lecture.infrastructure.repository.RegistrationRepository; -import hhplus.lecture.infrastructure.repository.UsersRepository; +import hhplus.lecture.infrastructure.persistence.*; +import hhplus.lecture.infrastructure.repository.*; import hhplus.lecture.interfaces.dto.user.UserResponseDto; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -13,14 +10,15 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.tuple; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -32,7 +30,13 @@ class UserServiceTest { private RegistrationRepository registrationRepository; @Mock - private LectureService lectureService; + private LectureItemRepository lectureItemRepository; + + @Mock + private InstructorRepository instructorRepository; + + @Mock + private LectureRepository lectureRepository; @InjectMocks private UserService userService; @@ -53,21 +57,32 @@ class UserServiceTest { } @Test - void 사용자_조회_시_사용자_정보와_신청한_특강_목록_출력(){ + void 사용자_조회_시_사용자_정보와_신청한_특강_목록_출력() { // given : 사용자 정보 + 신청한 특강 목록 설정 - String userCode = "00001"; + String userCode = "UC001"; UserEntity user = new UserEntity(userCode, "김지혜"); when(userRepository.findByUserCode(userCode)).thenReturn(user); // 강의 신청 내역 세팅 - List registrations = new ArrayList<>(); - registrations.add(new RegistrationEntity(userCode, "LE001", RegistrationStatus.APPROVAL, LocalDateTime.parse("2024-09-30T09:00:50"))); - registrations.add(new RegistrationEntity(userCode, "LE002", RegistrationStatus.APPROVAL, LocalDateTime.parse("2024-10-01T09:00:50"))); + List registrations = List.of( + new RegistrationEntity(userCode, "LE001", RegistrationStatus.APPROVAL, LocalDateTime.parse("2024-09-30T09:00:50")), + new RegistrationEntity(userCode, "LE002", RegistrationStatus.APPROVAL, LocalDateTime.parse("2024-10-01T09:00:50")) + ); when(registrationRepository.findByUserCode(userCode)).thenReturn(registrations); // 강의 상세 설정 - when(lectureService.getLecture("LE001")).thenReturn(new Lecture("LE001","JAVA","이석범")); - when(lectureService.getLecture("LE002")).thenReturn(new Lecture("LE002","Spring Boot","렌")); + LectureItemEntity lectureItem1 = new LectureItemEntity("LE001", "LE001", LocalDate.now(), 30, 0); + LectureItemEntity lectureItem2 = new LectureItemEntity("LE002", "LE002", LocalDate.now(), 30, 0); + when(lectureItemRepository.findByLectureItemCode("LE001")).thenReturn(lectureItem1); + when(lectureItemRepository.findByLectureItemCode("LE002")).thenReturn(lectureItem2); + + // 강의 상세 설정 + when(lectureRepository.findByLectureCode("LE001")).thenReturn(new LectureEntity("LE001", "JAVA", "IN001")); + when(lectureRepository.findByLectureCode("LE002")).thenReturn(new LectureEntity("LE002", "Spring Boot", "IN002")); + + // 강사 정보 설정 + when(instructorRepository.findByInstructorCode("IN001")).thenReturn(new InstructorEntity("IN001", "이석범")); + when(instructorRepository.findByInstructorCode("IN002")).thenReturn(new InstructorEntity("IN002", "렌")); // when : 사용자 조회 시 사용자 정보를 가지고 옴(강의 신청 목록 포함) UserResponseDto userDetail = userService.getUserAndRegisteredLectures(userCode); @@ -76,8 +91,12 @@ class UserServiceTest { assertThat(userDetail.getUser()).isEqualTo(user); assertThat(userDetail.getRegisteredLectures()).hasSize(2); assertThat(userDetail.getRegisteredLectures()) - .extracting("lectureCode") - .containsExactly("LE001", "LE002"); + .extracting("lectureCode", "instructorName") + .containsExactlyInAnyOrder( + // tuple : 여러 값을 함께 그룹화하여 확인할 수 있게 해줌 + tuple("LE001", "이석범"), + tuple("LE002", "렌") + ); } @Test