Skip to content

Commit

Permalink
feat/test : [#4] 사용자별 특강 신청 완료 목록
Browse files Browse the repository at this point in the history
  • Loading branch information
kjh418 committed Oct 3, 2024
1 parent 9255918 commit 54b8632
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 28 deletions.
19 changes: 9 additions & 10 deletions src/main/java/hhplus/lecture/application/service/UserService.java
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,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) {
Expand All @@ -36,9 +34,9 @@ public UserResponseDto getUserAndRegisteredLectures(String userCode) {
// 강의 내역
List<LectureDto> 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);
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<UserResponseDto> getUserRegisteredLectures(@PathVariable String userCode) {
UserResponseDto userResponse = userService.getUserAndRegisteredLectures(userCode);
return ResponseEntity.ok(userResponse);
}

public UserController(UserService userService) {
this.userService = userService;
}
}
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 @@ -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;

Expand All @@ -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<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", 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);
Expand All @@ -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
Expand Down

0 comments on commit 54b8632

Please sign in to comment.