diff --git a/build.gradle b/build.gradle index deb5b63..2f0cfa8 100644 --- a/build.gradle +++ b/build.gradle @@ -69,6 +69,8 @@ dependencies { //webclient implementation 'org.springframework.boot:spring-boot-starter-webflux' + testImplementation 'org.assertj:assertj-core:3.26.3' + //swagger implementation 'io.swagger.core.v3:swagger-annotations:2.2.22' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4' diff --git a/src/main/java/com/opendata/domain/course/entity/Course.java b/src/main/java/com/opendata/domain/course/entity/Course.java index 7f6eba5..f8d867b 100644 --- a/src/main/java/com/opendata/domain/course/entity/Course.java +++ b/src/main/java/com/opendata/domain/course/entity/Course.java @@ -14,7 +14,7 @@ @Table(name = "course") @Builder @Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PRIVATE) public class Course extends BaseEntity { @Id diff --git a/src/main/java/com/opendata/domain/tourspot/entity/TourSpot.java b/src/main/java/com/opendata/domain/tourspot/entity/TourSpot.java index e728b3b..fb66d34 100644 --- a/src/main/java/com/opendata/domain/tourspot/entity/TourSpot.java +++ b/src/main/java/com/opendata/domain/tourspot/entity/TourSpot.java @@ -16,8 +16,8 @@ }) @Getter @Setter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor +@AllArgsConstructor @Builder public class TourSpot extends BaseEntity { diff --git a/src/main/java/com/opendata/domain/user/entity/User.java b/src/main/java/com/opendata/domain/user/entity/User.java index 7ef9ddf..86abaf0 100644 --- a/src/main/java/com/opendata/domain/user/entity/User.java +++ b/src/main/java/com/opendata/domain/user/entity/User.java @@ -10,6 +10,7 @@ @Entity @Table(name = "user") @Getter +@Setter @NoArgsConstructor @AllArgsConstructor @Builder diff --git a/src/test/java/com/opendata/CourseServiceTest.java b/src/test/java/com/opendata/CourseServiceTest.java new file mode 100644 index 0000000..5a79fe8 --- /dev/null +++ b/src/test/java/com/opendata/CourseServiceTest.java @@ -0,0 +1,100 @@ +package com.opendata; +import com.opendata.domain.course.dto.response.CourseResponse; +import com.opendata.domain.course.entity.Course; +import com.opendata.domain.course.entity.CourseComponent; +import com.opendata.domain.course.repository.CourseComponentRepository; +import com.opendata.domain.course.repository.CourseRepository; +import com.opendata.domain.course.service.CourseService; +import com.opendata.domain.user.entity.User; +import com.opendata.global.security.CustomUserDetails; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +@SpringBootTest +@Transactional // 테스트 환경에선 DB에 반영되지 않고 롤백. +class CourseServiceTest { + @Autowired + private CourseService courseService; + @Autowired + private CourseRepository courseRepository; + @Autowired + private CourseComponentRepository courseComponentRepository; + + private List result; + private String courseId; + + @BeforeEach + void setUp() { + result = courseService.recommendCourses( + 37.5665, 126.9780, + "2025-09-19 12:00", "2025-09-19 18:00", + "경복궁" + ); + courseId = result.get(0).courseId(); // 공통으로 쓸 ID + } + + + @Test + @DisplayName("코스 생성 테스트") + void recommendCourses_shouldReturnFromRealDb() { + assertThat(result).isNotEmpty(); + + result.forEach(course -> { + System.out.println("CourseId: " + course.courseId()); + course.courseComponentDtoList().forEach(component -> { + System.out.println(component.tourSpotName() + + " (" + component.tourspotId() + "), 시간: " + component.time() + + ", 혼잡도: " + component.congestionLevel()); + }); + }); + } + + @Test + @DisplayName("코스 즐겨찾기 테스트") + void likeCourse_shouldPostAtRealDb(){ + String parsedCourseId = courseId.split("tempCourse:")[1]; + String email = "kamillcream1@gmail.com"; + + User user = new User(); + user.setEmail(email); + + + CustomUserDetails userDetails = new CustomUserDetails(user); + + List coursesBefore = courseRepository.findAll(); + int beforeTest = coursesBefore.size(); + + courseService.likeCourse(parsedCourseId, userDetails); + + + List coursesAfter = courseRepository.findAll(); + + assertThat(coursesAfter).hasSize(beforeTest + 1); + assertThat(coursesAfter).isNotEmpty(); + assertThat(coursesAfter.get(0).getCourseComponents()).isNotEmpty(); + } + + @Test + @DisplayName("코스 상세정보 조회 테스트") + void fetchCourseDetailTest(){ + String parsedCourseId = courseId.split("tempCourse:")[1]; + + CourseResponse courseResponse = courseService.fetchCourseDetail(parsedCourseId); + courseResponse.courseComponentDtoList().forEach( + courseComponentDto ->{ + System.out.println(courseComponentDto.tourspotId()); + System.out.println(courseComponentDto.tourSpotName()); + } + ); + + assertThat(courseResponse).isNotNull(); + } +}