From d169df7452dbd230a47ac02da2b575f6d9f7bc34 Mon Sep 17 00:00:00 2001 From: kjh Date: Thu, 3 Oct 2024 17:25:45 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat/test=20:=20[#3]=20=ED=8A=B9=EA=B0=95?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C,=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=EB=B3=84=EB=A1=9C=20=EC=8B=A0=EC=B2=AD=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=9C=20=ED=8A=B9=EA=B0=95=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/LectureService.java | 28 +++++++++++++++---- .../repository/LectureItemRepository.java | 6 ++++ .../controller/LectureController.java | 13 +++++++-- .../interfaces/dto/lecture/LectureDto.java | 7 +++-- .../service/LectureServiceTest.java | 26 +++++++++++++++++ 5 files changed, 69 insertions(+), 11 deletions(-) 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/infrastructure/repository/LectureItemRepository.java b/src/main/java/hhplus/lecture/infrastructure/repository/LectureItemRepository.java index 10fb10b..390ab41 100644 --- a/src/main/java/hhplus/lecture/infrastructure/repository/LectureItemRepository.java +++ b/src/main/java/hhplus/lecture/infrastructure/repository/LectureItemRepository.java @@ -3,8 +3,14 @@ import hhplus.lecture.infrastructure.persistence.LectureItemEntity; import org.springframework.data.jpa.repository.JpaRepository; +import java.time.LocalDate; +import java.util.List; + public interface LectureItemRepository extends JpaRepository { // 특강 정보 LectureItemEntity findByLectureItemCode(String lectureItemCode); + + // 신청 가능한 특강 목록 + List findAllByLectureDate(LocalDate targetDate); } diff --git a/src/main/java/hhplus/lecture/interfaces/controller/LectureController.java b/src/main/java/hhplus/lecture/interfaces/controller/LectureController.java index e10cd65..e3f0daa 100644 --- a/src/main/java/hhplus/lecture/interfaces/controller/LectureController.java +++ b/src/main/java/hhplus/lecture/interfaces/controller/LectureController.java @@ -6,13 +6,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.List; @RestController @RequestMapping("/lectures") public class LectureController { private final LectureService lectureService; - private final RegistrationService registrationService; // 특강 목록 구현 @GetMapping @@ -21,8 +21,15 @@ public ResponseEntity> getLectures() { return ResponseEntity.ok(lectureDtos); } - public LectureController(LectureService lectureService, RegistrationService registrationService) { + // 신청 가능한 특강 목록 + @GetMapping("/date/{targetDate}") + public ResponseEntity> getAvailableLecturesByDate(@PathVariable String targetDate) { + LocalDate date = LocalDate.parse(targetDate); + List availableLectures = lectureService.getAvailableLecturesByDate(date); + return ResponseEntity.ok(availableLectures); + } + + public LectureController(LectureService lectureService) { this.lectureService = lectureService; - this.registrationService = registrationService; } } diff --git a/src/main/java/hhplus/lecture/interfaces/dto/lecture/LectureDto.java b/src/main/java/hhplus/lecture/interfaces/dto/lecture/LectureDto.java index 762ea68..87df08e 100644 --- a/src/main/java/hhplus/lecture/interfaces/dto/lecture/LectureDto.java +++ b/src/main/java/hhplus/lecture/interfaces/dto/lecture/LectureDto.java @@ -14,7 +14,8 @@ @Getter @NoArgsConstructor public class LectureDto { - private String lectureCode; // 강의 코드 + private String lectureItemCode; // 특정 강의의 세부 사항 + private String lectureCode; // 전체 강의 private String lectureName; // 강의명 private String instructorCode; // 강사 코드 private String instructorName; // 강사명 @@ -22,7 +23,8 @@ public class LectureDto { private int maxCapacity; // 정원 - public LectureDto(String lectureCode, String lectureName, String instructorCode, String instructorName, LocalDate lectureDate, int maxCapacity) { + public LectureDto(String lectureItemCode, String lectureCode, String lectureName, String instructorCode, String instructorName, LocalDate lectureDate, int maxCapacity) { + this.lectureItemCode = lectureItemCode; this.lectureCode = lectureCode; this.lectureName = lectureName; this.instructorCode = instructorCode; @@ -33,6 +35,7 @@ public LectureDto(String lectureCode, String lectureName, String instructorCode, public static LectureDto fromEntity(LectureEntity entity, LectureItemEntity lectureItem, String instructorName) { return new LectureDto( + lectureItem.getLectureItemCode(), entity.getLectureCode(), entity.getLectureName(), entity.getInstructorCode(), diff --git a/src/test/java/hhplus/lecture/application/service/LectureServiceTest.java b/src/test/java/hhplus/lecture/application/service/LectureServiceTest.java index 810a667..fbb170f 100644 --- a/src/test/java/hhplus/lecture/application/service/LectureServiceTest.java +++ b/src/test/java/hhplus/lecture/application/service/LectureServiceTest.java @@ -15,6 +15,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.time.LocalDate; +import java.time.format.DateTimeParseException; import java.util.Arrays; import java.util.List; import java.util.NoSuchElementException; @@ -103,4 +104,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", targetDate, 30, 1); + LectureItemEntity lectureItem2 = new LectureItemEntity("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"); + } } From 92559183eba659c90895747e0f2dae52619c2264 Mon Sep 17 00:00:00 2001 From: kjh Date: Thu, 3 Oct 2024 17:56:48 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat/test=20:=20[#2]=20=ED=8A=B9=EA=B0=95?= =?UTF-8?q?=20=EC=8B=A0=EC=B2=AD=20(=EC=84=B1=EA=B3=B5,=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/RegistrationService.java | 20 ++++++++--- .../controller/RegistrationController.java | 35 +++++++++++++++++++ .../service/RegistrationServiceTest.java | 27 ++++++++++++++ 3 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 src/main/java/hhplus/lecture/interfaces/controller/RegistrationController.java diff --git a/src/main/java/hhplus/lecture/application/service/RegistrationService.java b/src/main/java/hhplus/lecture/application/service/RegistrationService.java index 546d879..700c97a 100644 --- a/src/main/java/hhplus/lecture/application/service/RegistrationService.java +++ b/src/main/java/hhplus/lecture/application/service/RegistrationService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.List; @Service public class RegistrationService { @@ -24,16 +25,27 @@ public Lecture lectureDetail(String lectureCode){ // 특강 신청 성공 여부 public boolean registerLecture(String userCode, String lectureCode) { - LectureItemEntity entity = lectureItemRepository.findByLectureItemCode(lectureCode); - if(entity == null || entity.getCurrentCapacity() >= entity.getMaxCapacity()){ + // 기존 신청 내역 확인 + List existingRegistrations = registrationRepository.findByUserCode(userCode); + + boolean alreadyRegistered = existingRegistrations.stream() + .anyMatch(registration -> registration.getLectureItemCode().equals(lectureCode)); + + if (alreadyRegistered) { + return false; // 이미 신청한 강의인 경우 + } + + LectureItemEntity lectureItem = lectureItemRepository.findByLectureItemCode(lectureCode); + + if(lectureItem == null || lectureItem.getCurrentCapacity() >= lectureItem.getMaxCapacity()){ return false; } // 신청자수 증가 - entity.addRegistration(); + lectureItem.addRegistration(); // 강의 수강자에 추가 - lectureItemRepository.save(entity); + lectureItemRepository.save(lectureItem); // 신청 내역에 추가 saveRegistration(userCode, lectureCode); diff --git a/src/main/java/hhplus/lecture/interfaces/controller/RegistrationController.java b/src/main/java/hhplus/lecture/interfaces/controller/RegistrationController.java new file mode 100644 index 0000000..8ed58f5 --- /dev/null +++ b/src/main/java/hhplus/lecture/interfaces/controller/RegistrationController.java @@ -0,0 +1,35 @@ +package hhplus.lecture.interfaces.controller; + +import hhplus.lecture.application.service.RegistrationService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequestMapping("/api") +public class RegistrationController { + + private final RegistrationService registrationService; + + @PostMapping("/lectures/{lectureItemCode}/register") + public ResponseEntity registerForLecture( + @PathVariable String lectureItemCode, + @RequestBody Map requestBody) { + + String userCode = requestBody.get("userCode"); + + boolean success = registrationService.registerLecture(userCode, lectureItemCode); + if (success) { + return ResponseEntity.ok("등록 성공"); + } else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("등록 실패"); + } + } + + + public RegistrationController(RegistrationService registrationService) { + this.registrationService = registrationService; + } +} diff --git a/src/test/java/hhplus/lecture/application/service/RegistrationServiceTest.java b/src/test/java/hhplus/lecture/application/service/RegistrationServiceTest.java index d51ba1f..086d29c 100644 --- a/src/test/java/hhplus/lecture/application/service/RegistrationServiceTest.java +++ b/src/test/java/hhplus/lecture/application/service/RegistrationServiceTest.java @@ -2,6 +2,7 @@ import hhplus.lecture.domain.model.RegistrationStatus; import hhplus.lecture.infrastructure.persistence.LectureItemEntity; +import hhplus.lecture.infrastructure.persistence.RegistrationEntity; import hhplus.lecture.infrastructure.repository.LectureItemRepository; import hhplus.lecture.infrastructure.repository.RegistrationRepository; import org.junit.jupiter.api.Test; @@ -11,6 +12,8 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.argThat; @@ -65,4 +68,28 @@ class RegistrationServiceTest { registration.getStatus() == RegistrationStatus.APPROVAL )); } + + @Test + void 동일한_신청자는_동일한_강의에_대해_한_번의_수강_신청만_성공해야한다() { + // given: 특정 강의와 사용자 설정 + String lectureItemCode = "LE001"; + String userCode = "00001"; + + // 이미 신청한 등록 정보 설정 + RegistrationEntity existingRegistration = new RegistrationEntity(userCode, lectureItemCode, RegistrationStatus.APPROVAL, LocalDateTime.now()); + List existingRegistrations = List.of(existingRegistration); + + // mock 설정 + when(registrationRepository.findByUserCode(userCode)).thenReturn(existingRegistrations); + + // when: 동일한 강의에 대해 다시 신청 시도 + boolean result = registrationService.registerLecture(userCode, lectureItemCode); + + // then: 신청 실패 확인 + assertThat(result).isFalse(); + + // verify: repository의 findByUserCode 메서드가 호출되었는지 확인 + verify(registrationRepository).findByUserCode(userCode); + } + } From 54b863282bcbf7851192a0ddc586c0a0e0c582f1 Mon Sep 17 00:00:00 2001 From: kjh Date: Thu, 3 Oct 2024 18:02:05 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat/test=20:=20[#4]=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EB=B3=84=20=ED=8A=B9=EA=B0=95=20=EC=8B=A0=EC=B2=AD=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=EB=AA=A9=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/UserService.java | 19 ++++--- .../persistence/UserEntity.java | 6 +-- .../interfaces/controller/UserController.java | 27 ++++++++++ .../application/service/UserServiceTest.java | 52 +++++++++++++------ 4 files changed, 76 insertions(+), 28 deletions(-) create mode 100644 src/main/java/hhplus/lecture/interfaces/controller/UserController.java diff --git a/src/main/java/hhplus/lecture/application/service/UserService.java b/src/main/java/hhplus/lecture/application/service/UserService.java index 7d24006..8d2810b 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,10 @@ 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 InstructorRepository instructorRepository; // 사용자 조회 (사용자 상세정보 + 강의 신청 내역) public UserResponseDto getUserAndRegisteredLectures(String userCode) { @@ -36,9 +34,9 @@ public UserResponseDto getUserAndRegisteredLectures(String userCode) { // 강의 내역 List registeredLectures = registrations.stream() .map(registration -> { - // lectureItemCode를 통해 LectureItemEntity를 가져옵니다. + // lectureItemCode를 이용하여 LectureItemEntity 가지고 오기 LectureItemEntity lectureItem = lectureItemRepository.findByLectureItemCode(registration.getLectureItemCode()); - // LectureEntity를 통해 LectureDto 생성 + // 강사명 가지고 오기 LectureEntity lectureEntity = lectureRepository.findByLectureCode(lectureItem.getLectureItemCode()); String instructorName = instructorRepository.findByInstructorCode(lectureEntity.getInstructorCode()).getInstructorName(); return LectureDto.fromEntity(lectureEntity, lectureItem, instructorName); @@ -47,10 +45,11 @@ public UserResponseDto getUserAndRegisteredLectures(String userCode) { } // 생성자 - public UserService(UsersRepository usersRepository, RegistrationRepository registrationRepository, LectureService lectureService, InstructorRepository instructorRepository) { + public UserService(UsersRepository usersRepository, RegistrationRepository registrationRepository, LectureItemRepository lectureItemRepository,InstructorRepository instructorRepository, LectureRepository lectureRepository) { this.usersRepository = usersRepository; this.registrationRepository = registrationRepository; - this.lectureService = lectureService; + this.lectureItemRepository = lectureItemRepository; this.instructorRepository = instructorRepository; + this.lectureRepository = lectureRepository; } } diff --git a/src/main/java/hhplus/lecture/infrastructure/persistence/UserEntity.java b/src/main/java/hhplus/lecture/infrastructure/persistence/UserEntity.java index 36afda8..fd1eb0e 100644 --- a/src/main/java/hhplus/lecture/infrastructure/persistence/UserEntity.java +++ b/src/main/java/hhplus/lecture/infrastructure/persistence/UserEntity.java @@ -14,13 +14,13 @@ public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; // 자동 증가하는 ID (기본 키) + private Long userId; @Column(nullable = false, unique = true, length = 8) - private String userCode; // 사용자 고유 코드 (예: 학번) + private String userCode; @Column(nullable = false, length = 20) - private String userName; // 사용자 이름 + private String userName; public UserEntity(String userCode, String userName) { this.userCode = userCode; diff --git a/src/main/java/hhplus/lecture/interfaces/controller/UserController.java b/src/main/java/hhplus/lecture/interfaces/controller/UserController.java new file mode 100644 index 0000000..aca295d --- /dev/null +++ b/src/main/java/hhplus/lecture/interfaces/controller/UserController.java @@ -0,0 +1,27 @@ +package hhplus.lecture.interfaces.controller; + +import hhplus.lecture.application.service.UserService; +import hhplus.lecture.interfaces.dto.user.UserResponseDto; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/users") +public class UserController { + + private final UserService userService; + + // 사용자가 신청한 강의 조회 + @GetMapping("/{userCode}/lectures") + public ResponseEntity getUserRegisteredLectures(@PathVariable String userCode) { + UserResponseDto userResponse = userService.getUserAndRegisteredLectures(userCode); + return ResponseEntity.ok(userResponse); + } + + public UserController(UserService userService) { + this.userService = userService; + } +} diff --git a/src/test/java/hhplus/lecture/application/service/UserServiceTest.java b/src/test/java/hhplus/lecture/application/service/UserServiceTest.java index 6ad5e34..f448036 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) @@ -31,6 +29,15 @@ class UserServiceTest { @Mock private RegistrationRepository registrationRepository; + @Mock + private LectureItemRepository lectureItemRepository; + + @Mock + private InstructorRepository instructorRepository; + + @Mock + private LectureRepository lectureRepository; + @Mock private LectureService lectureService; @@ -53,21 +60,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", LocalDate.now(), 30, 0); + LectureItemEntity lectureItem2 = new LectureItemEntity("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 +94,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 From ae75727d0e84470eddf55e31e6906783c77bca8b Mon Sep 17 00:00:00 2001 From: kjh Date: Thu, 3 Oct 2024 20:46:26 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix=20:=20=EA=B0=81=20Entity=EC=9D=98=20id?= =?UTF-8?q?=20=ED=98=95=EC=8B=9D=EC=97=90=20=EB=A7=9E=EC=B6=B0=20Long?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lecture/infrastructure/repository/InstructorRepository.java | 2 +- .../infrastructure/repository/LectureItemRepository.java | 2 +- .../lecture/infrastructure/repository/LectureRepository.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/hhplus/lecture/infrastructure/repository/InstructorRepository.java b/src/main/java/hhplus/lecture/infrastructure/repository/InstructorRepository.java index 2a16e46..0853778 100644 --- a/src/main/java/hhplus/lecture/infrastructure/repository/InstructorRepository.java +++ b/src/main/java/hhplus/lecture/infrastructure/repository/InstructorRepository.java @@ -3,7 +3,7 @@ import hhplus.lecture.infrastructure.persistence.InstructorEntity; import org.springframework.data.jpa.repository.JpaRepository; -public interface InstructorRepository extends JpaRepository { +public interface InstructorRepository extends JpaRepository { // 코드번호로 강사 조회 InstructorEntity findByInstructorCode(String instructorCode); diff --git a/src/main/java/hhplus/lecture/infrastructure/repository/LectureItemRepository.java b/src/main/java/hhplus/lecture/infrastructure/repository/LectureItemRepository.java index 390ab41..ee7c145 100644 --- a/src/main/java/hhplus/lecture/infrastructure/repository/LectureItemRepository.java +++ b/src/main/java/hhplus/lecture/infrastructure/repository/LectureItemRepository.java @@ -6,7 +6,7 @@ import java.time.LocalDate; import java.util.List; -public interface LectureItemRepository extends JpaRepository { +public interface LectureItemRepository extends JpaRepository { // 특강 정보 LectureItemEntity findByLectureItemCode(String lectureItemCode); diff --git a/src/main/java/hhplus/lecture/infrastructure/repository/LectureRepository.java b/src/main/java/hhplus/lecture/infrastructure/repository/LectureRepository.java index 7080595..ec914eb 100644 --- a/src/main/java/hhplus/lecture/infrastructure/repository/LectureRepository.java +++ b/src/main/java/hhplus/lecture/infrastructure/repository/LectureRepository.java @@ -3,7 +3,7 @@ import hhplus.lecture.infrastructure.persistence.LectureEntity; import org.springframework.data.jpa.repository.JpaRepository; -public interface LectureRepository extends JpaRepository { +public interface LectureRepository extends JpaRepository { // 강의 조회 LectureEntity findByLectureCode(String lectureCode);