Skip to content

Commit

Permalink
fix : [#3] 날짜별 신청 가능한 특강 목록 조회
Browse files Browse the repository at this point in the history
  • Loading branch information
kjh418 committed Oct 3, 2024
1 parent e93af13 commit 6fbc4cb
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,23 @@
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;

@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("특강을 찾을 수 없습니다.");
}
Expand All @@ -33,7 +33,7 @@ public Lecture getLecture(String lectureCode) {

// 모든 특강 조회
public List<LectureDto> getAllLectures() {
List<LectureEntity> entities = lecturesRepository.findAll();
List<LectureEntity> entities = lectureRepository.findAll();
return entities.stream()
.map(entity -> {
LectureItemEntity lectureItem = lectureItemRepository.findByLectureItemCode(entity.getLectureCode());
Expand All @@ -43,9 +43,25 @@ public List<LectureDto> getAllLectures() {
.collect(Collectors.toList());
}

// 신청 가능한 강의 조회
public List<LectureDto> getAvailableLecturesByDate(LocalDate targetDate) {

// 해당 날짜의 강의 조회
List<LectureItemEntity> 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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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<LectureDto> availableLectures = lectureService.getAvailableLecturesByDate(targetDate);

// then : 신청 가능한 강의 목록 확인
assertThat(availableLectures).hasSize(1);
assertThat(availableLectures).extracting("lectureItemCode").containsExactly("LE001");
}
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,24 @@
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;
import org.mockito.InjectMocks;
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)
Expand All @@ -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;
Expand All @@ -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<RegistrationEntity> 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<RegistrationEntity> 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);
Expand All @@ -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
Expand Down

0 comments on commit 6fbc4cb

Please sign in to comment.