diff --git a/build.gradle b/build.gradle index 41632a84..8642318d 100644 --- a/build.gradle +++ b/build.gradle @@ -114,6 +114,7 @@ jacocoTestReport { '**/dto/**', '**/common/**', "**/repository/*", + "**/domain/**" ]) }) ) @@ -145,7 +146,8 @@ jacocoTestCoverageVerification { '*.*Application', '*.dto.*', '*.common.*', - '*.repository.*' + '*.repository.*', + "*.domain.*" ] + Qdomains } } diff --git a/http/hello.http b/http/hello.http deleted file mode 100644 index d95c94fa..00000000 --- a/http/hello.http +++ /dev/null @@ -1,2 +0,0 @@ -### 테스트 -GET localhost:8080/hello diff --git a/src/main/java/com/odiga/fiesta/common/ApiResponse.java b/src/main/java/com/odiga/fiesta/common/BasicResponse.java similarity index 55% rename from src/main/java/com/odiga/fiesta/common/ApiResponse.java rename to src/main/java/com/odiga/fiesta/common/BasicResponse.java index 56a40c49..715cf557 100644 --- a/src/main/java/com/odiga/fiesta/common/ApiResponse.java +++ b/src/main/java/com/odiga/fiesta/common/BasicResponse.java @@ -9,38 +9,38 @@ @Getter @JsonInclude(JsonInclude.Include.NON_NULL) -public class ApiResponse { +public class BasicResponse { private final int statusCode; - private final HttpStatus status; // reason phrase + private final String status; // reason phrase private final String message; private final T data; @Builder - private ApiResponse(HttpStatus status, String message, T data) { + private BasicResponse(HttpStatus status, String message, T data) { this.statusCode = status.value(); - this.status = status; + this.status = status.getReasonPhrase(); this.message = message; this.data = data; } - public static ApiResponse of(HttpStatus status, String message, T data) { - return ApiResponse.builder() + public static BasicResponse of(HttpStatus status, String message, T data) { + return BasicResponse.builder() .status(status) .message(message) .data(data) .build(); } - public static ApiResponse of(HttpStatus status, T data) { + public static BasicResponse of(HttpStatus status, T data) { return of(status, status.name(), data); } - public static ApiResponse ok(T data) { + public static BasicResponse ok(T data) { return of(HttpStatus.OK, data); } - public static ApiResponse ok(String message, T data) { + public static BasicResponse ok(String message, T data) { return of(HttpStatus.OK, message, data); } } diff --git a/src/main/java/com/odiga/fiesta/festival/controller/FestivalController.java b/src/main/java/com/odiga/fiesta/festival/controller/FestivalController.java new file mode 100644 index 00000000..e55e412c --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/controller/FestivalController.java @@ -0,0 +1,78 @@ +package com.odiga.fiesta.festival.controller; + +import java.util.List; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.odiga.fiesta.common.BasicResponse; +import com.odiga.fiesta.festival.dto.response.CategoryResponse; +import com.odiga.fiesta.festival.dto.response.CompanionResponse; +import com.odiga.fiesta.festival.dto.response.MoodResponse; +import com.odiga.fiesta.festival.dto.response.PriorityResponse; +import com.odiga.fiesta.festival.service.CategoryService; +import com.odiga.fiesta.festival.service.CompanionService; +import com.odiga.fiesta.festival.service.MoodService; +import com.odiga.fiesta.festival.service.PriorityService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + +@Tag(name = "Festival", description = "페스티벌 관련 API") +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/festivals") +public class FestivalController { + + private final MoodService moodService; + private final CategoryService categoryService; + private final CompanionService companionService; + private final PriorityService priorityService; + + @Operation( + summary = "모든 페스티벌 분위기 타입 조회", + description = "페스티벌 분위기 타입들을 조회합니다." + ) + @GetMapping("/moods") + public ResponseEntity>> getAllMoods() { + final BasicResponse> moodResponses = BasicResponse.ok( + "페스티벌 분위기 조회 성공", moodService.getAllMoods()); + return ResponseEntity.ok(moodResponses); + } + + @Operation( + summary = "모든 페스티벌 분류 조회", + description = "페스티벌 분류들을 조회합니다." + ) + @GetMapping("/categories") + public ResponseEntity>> getCategories() { + final BasicResponse> categoryResponses = BasicResponse.ok( + "페스티벌 카테고리 조회 성공", categoryService.getAllCategories()); + return ResponseEntity.ok(categoryResponses); + } + + @Operation( + summary = "모든 일행 분류 조회", + description = "일행 분류들을 조회합니다." + ) + @GetMapping("/companions") + public ResponseEntity>> getCompanions() { + final BasicResponse> companionResponses = BasicResponse.ok( + "페스티벌 일행 분류 조회 성공", companionService.getAllCompanions()); + return ResponseEntity.ok(companionResponses); + } + + @Operation( + summary = "모든 페스티벌 우선순위 분류 조회", + description = "페스티벌 우선순위 분류들을 조회합니다." + ) + @GetMapping("/priorities") + public ResponseEntity>> getPriorities() { + final BasicResponse> priorityResponses = BasicResponse.ok( + "페스티벌 우선순위 조회 성공", priorityService.getAllPriorities()); + return ResponseEntity.ok(priorityResponses); + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/domain/Category.java b/src/main/java/com/odiga/fiesta/festival/domain/Category.java new file mode 100644 index 00000000..1600e9a6 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/domain/Category.java @@ -0,0 +1,32 @@ +package com.odiga.fiesta.festival.domain; + +import static jakarta.persistence.GenerationType.*; +import static lombok.AccessLevel.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = PROTECTED) +public class Category { + + @Id + @GeneratedValue(strategy = IDENTITY) + @Column(name = "category_id") + private Long id; + + @Column(nullable = false) + private String category; + + @Builder + public Category(Long id, String category) { + this.id = id; + this.category = category; + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/domain/Companion.java b/src/main/java/com/odiga/fiesta/festival/domain/Companion.java new file mode 100644 index 00000000..9406b9a1 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/domain/Companion.java @@ -0,0 +1,32 @@ +package com.odiga.fiesta.festival.domain; + +import static jakarta.persistence.GenerationType.*; +import static lombok.AccessLevel.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = PROTECTED) +public class Companion { + + @Id + @GeneratedValue(strategy = IDENTITY) + @Column(name = "companion_type_id") + private Long id; + + @Column(name = "companion_type", nullable = false) + private String companionType; + + @Builder + public Companion(Long id, String companionType) { + this.id = id; + this.companionType = companionType; + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/domain/Mood.java b/src/main/java/com/odiga/fiesta/festival/domain/Mood.java new file mode 100644 index 00000000..69f9031b --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/domain/Mood.java @@ -0,0 +1,32 @@ +package com.odiga.fiesta.festival.domain; + +import static jakarta.persistence.GenerationType.*; +import static lombok.AccessLevel.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = PROTECTED) +public class Mood { + + @Id + @GeneratedValue(strategy = IDENTITY) + @Column(name = "mood_id") + private Long id; + + @Column(nullable = false) + private String mood; + + @Builder + public Mood(Long id, String mood) { + this.id = id; + this.mood = mood; + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/domain/Priority.java b/src/main/java/com/odiga/fiesta/festival/domain/Priority.java new file mode 100644 index 00000000..26bb969a --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/domain/Priority.java @@ -0,0 +1,32 @@ +package com.odiga.fiesta.festival.domain; + +import static jakarta.persistence.GenerationType.*; +import static lombok.AccessLevel.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = PROTECTED) +public class Priority { + + @Id + @GeneratedValue(strategy = IDENTITY) + @Column(name = "priority_id") + private Long id; + + @Column(nullable = false) + private String priority; + + @Builder + public Priority(Long id, String priority) { + this.id = id; + this.priority = priority; + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/dto/response/CategoryResponse.java b/src/main/java/com/odiga/fiesta/festival/dto/response/CategoryResponse.java new file mode 100644 index 00000000..41adc0a9 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/dto/response/CategoryResponse.java @@ -0,0 +1,23 @@ +package com.odiga.fiesta.festival.dto.response; + +import static lombok.AccessLevel.*; + +import com.odiga.fiesta.festival.domain.Category; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor(access = PRIVATE) +public class CategoryResponse { + + private final Long categoryId; + private final String category; + + public static CategoryResponse of(final Category category) { + return new CategoryResponse( + category.getId(), + category.getCategory() + ); + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/dto/response/CompanionResponse.java b/src/main/java/com/odiga/fiesta/festival/dto/response/CompanionResponse.java new file mode 100644 index 00000000..fc30c3a2 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/dto/response/CompanionResponse.java @@ -0,0 +1,23 @@ +package com.odiga.fiesta.festival.dto.response; + +import static lombok.AccessLevel.*; + +import com.odiga.fiesta.festival.domain.Companion; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor(access = PRIVATE) +public class CompanionResponse { + + private final Long companionId; + private final String companionType; + + public static CompanionResponse of(final Companion companion) { + return new CompanionResponse( + companion.getId(), + companion.getCompanionType() + ); + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/dto/response/MoodResponse.java b/src/main/java/com/odiga/fiesta/festival/dto/response/MoodResponse.java new file mode 100644 index 00000000..ad14abc9 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/dto/response/MoodResponse.java @@ -0,0 +1,23 @@ +package com.odiga.fiesta.festival.dto.response; + +import static lombok.AccessLevel.*; + +import com.odiga.fiesta.festival.domain.Mood; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor(access = PRIVATE) +public class MoodResponse { + + private final Long moodId; + private final String mood; + + public static MoodResponse of(final Mood mood) { + return new MoodResponse( + mood.getId(), + mood.getMood() + ); + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/dto/response/PriorityResponse.java b/src/main/java/com/odiga/fiesta/festival/dto/response/PriorityResponse.java new file mode 100644 index 00000000..bc55e067 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/dto/response/PriorityResponse.java @@ -0,0 +1,23 @@ +package com.odiga.fiesta.festival.dto.response; + +import static lombok.AccessLevel.*; + +import com.odiga.fiesta.festival.domain.Priority; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor(access = PRIVATE) +public class PriorityResponse { + + private final Long priorityId; + private final String priority; + + public static PriorityResponse of(final Priority priority) { + return new PriorityResponse( + priority.getId(), + priority.getPriority() + ); + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/repository/CategoryRepository.java b/src/main/java/com/odiga/fiesta/festival/repository/CategoryRepository.java new file mode 100644 index 00000000..fdda6936 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/repository/CategoryRepository.java @@ -0,0 +1,8 @@ +package com.odiga.fiesta.festival.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.odiga.fiesta.festival.domain.Category; + +public interface CategoryRepository extends JpaRepository { +} diff --git a/src/main/java/com/odiga/fiesta/festival/repository/CompanionRepository.java b/src/main/java/com/odiga/fiesta/festival/repository/CompanionRepository.java new file mode 100644 index 00000000..e68ce26b --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/repository/CompanionRepository.java @@ -0,0 +1,8 @@ +package com.odiga.fiesta.festival.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.odiga.fiesta.festival.domain.Companion; + +public interface CompanionRepository extends JpaRepository { +} diff --git a/src/main/java/com/odiga/fiesta/festival/repository/MoodRepository.java b/src/main/java/com/odiga/fiesta/festival/repository/MoodRepository.java new file mode 100644 index 00000000..5064a410 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/repository/MoodRepository.java @@ -0,0 +1,8 @@ +package com.odiga.fiesta.festival.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.odiga.fiesta.festival.domain.Mood; + +public interface MoodRepository extends JpaRepository { +} diff --git a/src/main/java/com/odiga/fiesta/festival/repository/PriorityRepository.java b/src/main/java/com/odiga/fiesta/festival/repository/PriorityRepository.java new file mode 100644 index 00000000..25520fa5 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/repository/PriorityRepository.java @@ -0,0 +1,8 @@ +package com.odiga.fiesta.festival.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.odiga.fiesta.festival.domain.Priority; + +public interface PriorityRepository extends JpaRepository { +} diff --git a/src/main/java/com/odiga/fiesta/festival/service/CategoryService.java b/src/main/java/com/odiga/fiesta/festival/service/CategoryService.java new file mode 100644 index 00000000..a8895200 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/service/CategoryService.java @@ -0,0 +1,28 @@ +package com.odiga.fiesta.festival.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.odiga.fiesta.festival.domain.Category; +import com.odiga.fiesta.festival.dto.response.CategoryResponse; +import com.odiga.fiesta.festival.repository.CategoryRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class CategoryService { + + private final CategoryRepository categoryRepository; + + public List getAllCategories() { + final List categories = categoryRepository.findAll(); + return categories.stream() + .map(CategoryResponse::of) + .toList(); + } + +} diff --git a/src/main/java/com/odiga/fiesta/festival/service/CompanionService.java b/src/main/java/com/odiga/fiesta/festival/service/CompanionService.java new file mode 100644 index 00000000..78eac4ba --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/service/CompanionService.java @@ -0,0 +1,27 @@ +package com.odiga.fiesta.festival.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.odiga.fiesta.festival.domain.Companion; +import com.odiga.fiesta.festival.dto.response.CompanionResponse; +import com.odiga.fiesta.festival.repository.CompanionRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class CompanionService { + + private final CompanionRepository companionRepository; + + public List getAllCompanions() { + final List companions = companionRepository.findAll(); + return companions.stream() + .map(CompanionResponse::of) + .toList(); + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/service/MoodService.java b/src/main/java/com/odiga/fiesta/festival/service/MoodService.java new file mode 100644 index 00000000..09ad590c --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/service/MoodService.java @@ -0,0 +1,27 @@ +package com.odiga.fiesta.festival.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.odiga.fiesta.festival.domain.Mood; +import com.odiga.fiesta.festival.dto.response.MoodResponse; +import com.odiga.fiesta.festival.repository.MoodRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MoodService { + + private final MoodRepository moodRepository; + + public List getAllMoods() { + final List moods = moodRepository.findAll(); + return moods.stream() + .map(MoodResponse::of) + .toList(); + } +} diff --git a/src/main/java/com/odiga/fiesta/festival/service/PriorityService.java b/src/main/java/com/odiga/fiesta/festival/service/PriorityService.java new file mode 100644 index 00000000..49ceca79 --- /dev/null +++ b/src/main/java/com/odiga/fiesta/festival/service/PriorityService.java @@ -0,0 +1,27 @@ +package com.odiga.fiesta.festival.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.odiga.fiesta.festival.domain.Priority; +import com.odiga.fiesta.festival.dto.response.PriorityResponse; +import com.odiga.fiesta.festival.repository.PriorityRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class PriorityService { + + private final PriorityRepository priorityRepository; + + public List getAllPriorities() { + final List priorities = priorityRepository.findAll(); + return priorities.stream() + .map(PriorityResponse::of) + .toList(); + } +} diff --git a/src/main/java/com/odiga/fiesta/hello/controller/HelloController.java b/src/main/java/com/odiga/fiesta/hello/controller/HelloController.java deleted file mode 100644 index ada96d49..00000000 --- a/src/main/java/com/odiga/fiesta/hello/controller/HelloController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.odiga.fiesta.hello.controller; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.odiga.fiesta.common.ApiResponse; - -@RestController -public class HelloController { - - @GetMapping("/hello") - public ResponseEntity> hello() { - ApiResponse response = ApiResponse.ok("API 응답 테스트", "Hello, world !"); - return ResponseEntity.ok(response); - } - -} diff --git a/src/test/java/com/odiga/fiesta/ControllerTestSupport.java b/src/test/java/com/odiga/fiesta/ControllerTestSupport.java index 3157b329..73b53b69 100644 --- a/src/test/java/com/odiga/fiesta/ControllerTestSupport.java +++ b/src/test/java/com/odiga/fiesta/ControllerTestSupport.java @@ -2,17 +2,23 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; -import com.odiga.fiesta.hello.controller.HelloController; import com.fasterxml.jackson.databind.ObjectMapper; +import com.odiga.fiesta.festival.controller.FestivalController; +import com.odiga.fiesta.festival.service.CategoryService; +import com.odiga.fiesta.festival.service.CompanionService; +import com.odiga.fiesta.festival.service.MoodService; +import com.odiga.fiesta.festival.service.PriorityService; @ActiveProfiles("test") @WithMockUser @WebMvcTest(controllers = { - HelloController.class, // 사용하는 컨트롤러 여기에 추가 + // 사용하는 컨트롤러 여기에 추가 + FestivalController.class }) public abstract class ControllerTestSupport { @Autowired @@ -22,6 +28,15 @@ public abstract class ControllerTestSupport { protected ObjectMapper objectMapper; // 모킹할 빈 추가 - // @MockBean - // protected ProductService productService; + @MockBean + protected CategoryService categoryService; + + @MockBean + protected CompanionService companionService; + + @MockBean + protected MoodService moodService; + + @MockBean + protected PriorityService priorityService; } diff --git a/src/test/java/com/odiga/fiesta/festival/controller/FestivalControllerTest.java b/src/test/java/com/odiga/fiesta/festival/controller/FestivalControllerTest.java new file mode 100644 index 00000000..3b65d13d --- /dev/null +++ b/src/test/java/com/odiga/fiesta/festival/controller/FestivalControllerTest.java @@ -0,0 +1,111 @@ +package com.odiga.fiesta.festival.controller; + +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import com.odiga.fiesta.ControllerTestSupport; +import com.odiga.fiesta.festival.dto.response.CategoryResponse; +import com.odiga.fiesta.festival.dto.response.CompanionResponse; +import com.odiga.fiesta.festival.dto.response.MoodResponse; +import com.odiga.fiesta.festival.dto.response.PriorityResponse; +import com.odiga.fiesta.festival.service.CategoryService; +import com.odiga.fiesta.festival.service.CompanionService; +import com.odiga.fiesta.festival.service.MoodService; +import com.odiga.fiesta.festival.service.PriorityService; + +class FestivalControllerTest extends ControllerTestSupport { + + @Autowired + private MoodService moodService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private CompanionService companionService; + + @Autowired + private PriorityService priorityService; + + @DisplayName("모든 페스티벌 분위기를 조회한다.") + @Test + void getAllMoods() throws Exception { + // given + String message = "페스티벌 분위기 조회 성공"; + + List mockMoods = List.of(); + when(moodService.getAllMoods()).thenReturn(mockMoods); + + // when // then + mockMvc.perform( + get("/api/v1/festivals/moods") + ).andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.message").value(message)) + .andExpect(jsonPath("$.data").isArray()); + } + + @DisplayName("모든 카테고리를 조회한다.") + @Test + void getAllCategories() throws Exception { + // given + String message = "페스티벌 카테고리 조회 성공"; + + List mockCategories = List.of(); + when(categoryService.getAllCategories()).thenReturn(mockCategories); + + // when // then + mockMvc.perform( + get("/api/v1/festivals/categories") + ).andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.message").value(message)) + .andExpect(jsonPath("$.data").isArray()); + + } + + @DisplayName("모든 일행 타입을 조회한다.") + @Test + void getAllCompanions() throws Exception { + // given + String message = "페스티벌 일행 분류 조회 성공"; + + List mockCompanions = List.of(); + when(companionService.getAllCompanions()).thenReturn(mockCompanions); + + // when // then + mockMvc.perform( + get("/api/v1/festivals/companions") + ).andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.message").value(message)) + .andExpect(jsonPath("$.data").isArray()); + } + + @DisplayName("모든 페스티벌 우선순위 타입을 조회한다.") + @Test + void getAllPriorities() throws Exception { + // given + String message = "페스티벌 우선순위 조회 성공"; + + List mockPriorities = List.of(); + when(priorityService.getAllPriorities()).thenReturn(mockPriorities); + + // when // then + mockMvc.perform( + get("/api/v1/festivals/priorities") + ).andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.message").value(message)) + .andExpect(jsonPath("$.data").isArray()); + } + +} diff --git a/src/test/java/com/odiga/fiesta/festival/service/CategoryServiceTest.java b/src/test/java/com/odiga/fiesta/festival/service/CategoryServiceTest.java new file mode 100644 index 00000000..d217b1be --- /dev/null +++ b/src/test/java/com/odiga/fiesta/festival/service/CategoryServiceTest.java @@ -0,0 +1,46 @@ +package com.odiga.fiesta.festival.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import com.odiga.fiesta.MockTestSupport; +import com.odiga.fiesta.festival.domain.Category; +import com.odiga.fiesta.festival.dto.response.CategoryResponse; +import com.odiga.fiesta.festival.repository.CategoryRepository; + +class CategoryServiceTest extends MockTestSupport { + + @InjectMocks + private CategoryService categoryService; + + @Mock + private CategoryRepository categoryRepository; + + @DisplayName("모든 카테고리를 반환한다.") + @Test + void getAllCategories() { + // given + List categories = List.of( + Category.builder().id(1L).category("문화").build(), + Category.builder().id(2L).category("영화").build() + ); + + given(categoryRepository.findAll()) + .willReturn(categories); + + // when + final List actual = categoryService.getAllCategories(); + + // then + assertThat(actual).usingRecursiveComparison() + .isEqualTo(categories.stream().map(CategoryResponse::of).toList()); + } + +} diff --git a/src/test/java/com/odiga/fiesta/festival/service/CompanionServiceTest.java b/src/test/java/com/odiga/fiesta/festival/service/CompanionServiceTest.java new file mode 100644 index 00000000..54658ba3 --- /dev/null +++ b/src/test/java/com/odiga/fiesta/festival/service/CompanionServiceTest.java @@ -0,0 +1,45 @@ +package com.odiga.fiesta.festival.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import com.odiga.fiesta.MockTestSupport; +import com.odiga.fiesta.festival.domain.Companion; +import com.odiga.fiesta.festival.dto.response.CompanionResponse; +import com.odiga.fiesta.festival.repository.CompanionRepository; + +class CompanionServiceTest extends MockTestSupport { + + @InjectMocks + private CompanionService companionService; + + @Mock + private CompanionRepository companionRepository; + + @DisplayName("모든 일행 타입을 반환한다.") + @Test + void getAllCompanions() { + // given + List companions = List.of( + Companion.builder().id(1L).companionType("가족").build(), + Companion.builder().id(2L).companionType("친구").build() + ); + + given(companionRepository.findAll()) + .willReturn(companions); + + // when + final List actual = companionService.getAllCompanions(); + + // then + assertThat(actual).usingRecursiveComparison() + .isEqualTo(companions.stream().map(CompanionResponse::of).toList()); + } +} diff --git a/src/test/java/com/odiga/fiesta/festival/service/MoodServiceTest.java b/src/test/java/com/odiga/fiesta/festival/service/MoodServiceTest.java new file mode 100644 index 00000000..582756ea --- /dev/null +++ b/src/test/java/com/odiga/fiesta/festival/service/MoodServiceTest.java @@ -0,0 +1,45 @@ +package com.odiga.fiesta.festival.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import com.odiga.fiesta.MockTestSupport; +import com.odiga.fiesta.festival.domain.Mood; +import com.odiga.fiesta.festival.dto.response.MoodResponse; +import com.odiga.fiesta.festival.repository.MoodRepository; + +class MoodServiceTest extends MockTestSupport { + + @InjectMocks + private MoodService moodService; + + @Mock + private MoodRepository moodRepository; + + @DisplayName("모든 분위기 타입을 반환한다.") + @Test + void getAllMoods() { + // given + List moods = List.of( + Mood.builder().id(1L).mood("낭만적인").build(), + Mood.builder().id(2L).mood("모험적인").build() + ); + + given(moodRepository.findAll()) + .willReturn(moods); + + // when + final List actual = moodService.getAllMoods(); + + // then + assertThat(actual).usingRecursiveComparison() + .isEqualTo(moods.stream().map(MoodResponse::of).toList()); + } +} diff --git a/src/test/java/com/odiga/fiesta/festival/service/PriorityServiceTest.java b/src/test/java/com/odiga/fiesta/festival/service/PriorityServiceTest.java new file mode 100644 index 00000000..310d360a --- /dev/null +++ b/src/test/java/com/odiga/fiesta/festival/service/PriorityServiceTest.java @@ -0,0 +1,45 @@ +package com.odiga.fiesta.festival.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import com.odiga.fiesta.MockTestSupport; +import com.odiga.fiesta.festival.domain.Priority; +import com.odiga.fiesta.festival.dto.response.PriorityResponse; +import com.odiga.fiesta.festival.repository.PriorityRepository; + +class PriorityServiceTest extends MockTestSupport { + + @InjectMocks + private PriorityService priorityService; + + @Mock + private PriorityRepository priorityRepository; + + @DisplayName("모든 페스티벌 우선순위 항목을 반환한다.") + @Test + void getAllPriorities() { + // given + List priorities = List.of( + Priority.builder().id(1L).priority("주제 관심사 일치").build(), + Priority.builder().id(2L).priority("위치").build() + ); + + given(priorityRepository.findAll()) + .willReturn(priorities); + + // when + final List actual = priorityService.getAllPriorities(); + + // then + assertThat(actual).usingRecursiveComparison() + .isEqualTo(priorities.stream().map(PriorityResponse::of).toList()); + } +} diff --git a/src/test/java/com/odiga/fiesta/hello/controller/HelloControllerTest.java b/src/test/java/com/odiga/fiesta/hello/controller/HelloControllerTest.java deleted file mode 100644 index 0801c855..00000000 --- a/src/test/java/com/odiga/fiesta/hello/controller/HelloControllerTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.odiga.fiesta.hello.controller; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import com.odiga.fiesta.ControllerTestSupport; - -class HelloControllerTest extends ControllerTestSupport { - - @DisplayName("/hello 요청을 보내면 요청이 성공한다.") - @Test - void requestHello() throws Exception { - // given - - // when // then - mockMvc.perform( - get("/hello") - ) - .andDo(print()) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.statusCode").value(200)) - .andExpect(jsonPath("$.status").value("OK")) - .andExpect(jsonPath("$.message").value("API 응답 테스트")) - .andExpect(jsonPath("$.data").isString()); - } - - @DisplayName("정의되지 않은 url에 요청을 보내면 404 에러가 발생한다.") - @Test - void request404() throws Exception { - // given - - // when // then - mockMvc.perform( - get("/hello123") - ) - .andDo(print()) - .andExpect(status().isNotFound()) - .andExpect(jsonPath("$.statusCode").value(404)); - } -}