Skip to content
This repository has been archived by the owner on Jan 15, 2024. It is now read-only.

Commit

Permalink
Merge pull request #97 from Mini-Team-6/feature/#93-exception-and-ref…
Browse files Browse the repository at this point in the history
…actor

Feature/#93 리팩토링 및 테스트 코드 작성
  • Loading branch information
yuhyun1 authored Nov 28, 2023
2 parents 503cd87 + c3bfad7 commit 33868ea
Show file tree
Hide file tree
Showing 16 changed files with 274 additions and 221 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public ResponseDto<List<AccommodationGetResponse>> searchAccommodations(
}

@GetMapping
public ResponseDto<AccommodationDetailGetResponse> searchAccommodations(
public ResponseDto<AccommodationDetailGetResponse> searchAccommodation(
@RequestParam String keyword,
@RequestParam(value = "area-code") AreaCode areaCode
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Builder;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponse;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public record AccommodationDetailGetResponse(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,6 @@
import org.springframework.data.jpa.repository.JpaRepository;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;

import java.util.List;

public interface AccommodationRepository extends JpaRepository<Accommodation, Long> {

List<Accommodation> findByNameContainingAndLocationAreaCode(String keyword, String areaCode);

List<Accommodation> findByNameContaining(String keyword);

List<Accommodation> findByLocationAreaCode(String areaCode);

}

Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,27 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ybe.mini.travelserver.domain.accommodation.dto.AccommodationDetailGetResponse;
import ybe.mini.travelserver.domain.accommodation.dto.AccommodationGetResponse;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;
import ybe.mini.travelserver.domain.accommodation.entity.AreaCode;
import ybe.mini.travelserver.domain.accommodation.repository.AccommodationRepository;
import ybe.mini.travelserver.global.api.TourAPIService;

import java.util.Collections;
import java.util.List;
import java.util.Objects;


@Service
@RequiredArgsConstructor
public class AccommodationService {

private final AccommodationRepository accommodationRepository;
private final TourAPIService tourAPIService;

public List<AccommodationGetResponse> bringAccommodations(
int pageNo, int numOfRows,
String keyword, AreaCode areaCode
) {
if (pageNo <= 0) {
return Collections.emptyList();
}
if (pageNo <= 0) return Collections.emptyList();

String areaCodeString = (areaCode != null) ? String.valueOf(areaCode.getCode()) : null;

Expand All @@ -39,7 +33,9 @@ public List<AccommodationGetResponse> bringAccommodations(
keyword,
areaCodeString);

return getResponseList(accommodations);
return accommodations.stream()
.map(AccommodationGetResponse::fromEntity)
.toList();
}

public AccommodationDetailGetResponse bringAccommodationFromAPI(String keyword, AreaCode areaCode) {
Expand All @@ -50,34 +46,5 @@ public AccommodationDetailGetResponse bringAccommodationFromAPI(String keyword,
return AccommodationDetailGetResponse.fromEntity(accommodation);
}

@Transactional(readOnly = true)
public List<AccommodationGetResponse> bringAccommodations(String keyword, String areaCode) {
List<Accommodation> accommodations;

if (!Objects.isNull(keyword) && !Objects.isNull(areaCode)) {
accommodations = accommodationRepository.findByNameContainingAndLocationAreaCode(keyword, areaCode);
} else if (!Objects.isNull(keyword)) {
accommodations = accommodationRepository.findByNameContaining(keyword);
} else if (!Objects.isNull(areaCode)) {
accommodations = accommodationRepository.findByLocationAreaCode(areaCode);
} else {
accommodations = accommodationRepository.findAll();
}

return getResponseList(accommodations);
}


private Accommodation bringAccommodation(Long accommodationId) {
return accommodationRepository
.findById(accommodationId).orElseThrow(RuntimeException::new);
}

private static List<AccommodationGetResponse> getResponseList(List<Accommodation> accommodations) {
return accommodations.stream()
.map(AccommodationGetResponse::fromEntity)
.toList();
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponse;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponseFromAPI;
import ybe.mini.travelserver.domain.room.service.RoomService;
import ybe.mini.travelserver.global.common.ResponseDto;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
import org.springframework.data.jpa.repository.JpaRepository;
import ybe.mini.travelserver.domain.room.entity.Room;

import java.util.List;
import java.util.Optional;


public interface RoomRepository extends JpaRepository<Room, Long> {
List<Room> findByAccommodationId(Long accommodationId);

Optional<Room> findByRoomTypeId(Long roomTypeId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponse;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponseFromAPI;
import ybe.mini.travelserver.domain.room.entity.Room;
import ybe.mini.travelserver.domain.room.repository.RoomRepository;
import ybe.mini.travelserver.global.api.TourAPIService;

import java.util.List;
Expand All @@ -15,28 +12,13 @@
@RequiredArgsConstructor
public class RoomService {

private final RoomRepository roomRepository;
private final TourAPIService tourAPIService;

@Transactional(readOnly = true)
public List<RoomGetResponse> bringRooms(Long accommodationId) {
return roomRepository.findByAccommodationId(accommodationId)
.stream()
.map(RoomGetResponse::fromEntity)
.toList();
}

public List<RoomGetResponseFromAPI> bringRoomsFromAPI(Long accommodationId) {
List<Room> rooms = tourAPIService.bringRooms(accommodationId);
return rooms.stream()
.map(RoomGetResponseFromAPI::fromEntity)
.toList();
}

@Transactional(readOnly = true)
public RoomGetResponse bringRoom(Long roomId) {
Room room = roomRepository.findById(roomId).orElseThrow(RuntimeException::new);
return RoomGetResponse.fromEntity(room);
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ybe.mini.travelserver.domain.accommodation;

import ybe.mini.travelserver.domain.accommodation.dto.AccommodationGetResponse;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;
import ybe.mini.travelserver.domain.accommodation.entity.Location;

Expand All @@ -20,7 +19,19 @@ protected Accommodation dummyAccommodation() {
.build();
}

protected AccommodationGetResponse dummyAccommodationGetResponse() {
return AccommodationGetResponse.fromEntity(dummyAccommodation());
protected Accommodation dummyAccommodation1() {
return Accommodation.builder()
.name("숙소 이름")
.location(Location.builder()
.address("숙소 주소")
.phone("숙소 전화번호")
.areaCode("지역 코드")
.latitude(36.57454563)
.longitude(127.645468423)
.build())
.image("이미지 URL")
.description("숙소 상세 설명")
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package ybe.mini.travelserver.domain.accommodation.controller;

import org.junit.jupiter.api.DisplayName;
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 org.springframework.http.HttpStatus;
import ybe.mini.travelserver.domain.accommodation.DummyAccommodation;
import ybe.mini.travelserver.domain.accommodation.dto.AccommodationDetailGetResponse;
import ybe.mini.travelserver.domain.accommodation.dto.AccommodationGetResponse;
import ybe.mini.travelserver.domain.accommodation.entity.AreaCode;
import ybe.mini.travelserver.domain.accommodation.service.AccommodationService;
import ybe.mini.travelserver.global.common.ResponseDto;

import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;

@ExtendWith(MockitoExtension.class)
class AccommodationControllerTest extends DummyAccommodation {
@Mock
AccommodationService accommodationService;
@InjectMocks
AccommodationController accommodationController;


@DisplayName("숙소 리스트 조회")
@Test
void SearchAccommodations_success() {
// given
List<AccommodationGetResponse> expectedAccommodations = Arrays.asList(
AccommodationGetResponse.fromEntity(dummyAccommodation()),
AccommodationGetResponse.fromEntity(dummyAccommodation1())
);
given(accommodationService.bringAccommodations(1, 10, "호텔", AreaCode.SEOUL))
.willReturn(expectedAccommodations);

// when
ResponseDto<List<AccommodationGetResponse>> responseDto =
accommodationController.searchAccommodations(1, "호텔", AreaCode.SEOUL);

// then
assertNotNull(responseDto);
assertEquals(HttpStatus.OK.value(), responseDto.status());
assertEquals(expectedAccommodations, responseDto.data());
then(accommodationService).should().bringAccommodations(1, 10, "호텔", AreaCode.SEOUL);

}

@DisplayName("숙소 상세 조회")
@Test
void SearchAccommodation_success() {
// given
AccommodationDetailGetResponse expectedAccommodation =
AccommodationDetailGetResponse.fromEntity(dummyAccommodation());
given(accommodationService.bringAccommodationFromAPI("호텔", AreaCode.SEOUL))
.willReturn(expectedAccommodation);

// when
ResponseDto<AccommodationDetailGetResponse> responseDto =
accommodationController.searchAccommodation("호텔", AreaCode.SEOUL);

// then
assertNotNull(responseDto);
assertEquals(HttpStatus.OK.value(), responseDto.status());
assertEquals(expectedAccommodation, responseDto.data());
then(accommodationService).should().bringAccommodationFromAPI("호텔", AreaCode.SEOUL);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package ybe.mini.travelserver.domain.accommodation.service;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.jupiter.MockitoExtension;
import ybe.mini.travelserver.domain.accommodation.DummyAccommodation;
import ybe.mini.travelserver.domain.accommodation.dto.AccommodationDetailGetResponse;
import ybe.mini.travelserver.domain.accommodation.dto.AccommodationGetResponse;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;
import ybe.mini.travelserver.domain.accommodation.entity.AreaCode;
import ybe.mini.travelserver.global.api.TourAPIService;

import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
class AccommodationServiceTest extends DummyAccommodation {
@Mock
TourAPIService tourAPIService;
@InjectMocks
AccommodationService accommodationService;

@DisplayName("숙소 리스트 조회")
@Test
void SearchAccommodations_success() {
// given
List<Accommodation> expectedAccommodations = Arrays.asList(
dummyAccommodation(), dummyAccommodation1()
);
List<AccommodationGetResponse> responseDto = expectedAccommodations.stream()
.map(AccommodationGetResponse::fromEntity)
.toList();
given(tourAPIService.bringAccommodations(eq(1), eq(10), eq("호텔"), eq("1")))
.willReturn(expectedAccommodations);

// when
List<AccommodationGetResponse> actualAccommodations =
accommodationService.bringAccommodations(1, 10, "호텔", AreaCode.SEOUL);

// then
assertNotNull(actualAccommodations);
assertEquals(responseDto.size(), actualAccommodations.size());
assertEquals(responseDto, actualAccommodations);
then(tourAPIService).should().bringAccommodations(eq(1), eq(10), eq("호텔"), eq("1"));

}

@DisplayName("숙소 상세 조회")
@Test
void SearchAccommodation_success() {
// given
Accommodation expectedAccommodation = dummyAccommodation();
AccommodationDetailGetResponse responseDto =
AccommodationDetailGetResponse.fromEntity(expectedAccommodation);
given(tourAPIService.bringAccommodation(eq("호텔"), eq("1")))
.willReturn(expectedAccommodation);

// when
AccommodationDetailGetResponse actualAccommodation =
accommodationService.bringAccommodationFromAPI("호텔", AreaCode.SEOUL);

// then
assertNotNull(actualAccommodation);
assertEquals(responseDto, actualAccommodation);
then(tourAPIService).should().bringAccommodation(eq("호텔"), eq("1"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;
import ybe.mini.travelserver.domain.room.entity.Room;

public class DummyObjectForController implements DummyObjectForRoom{
public class DummyObjectForControllerAndService implements DummyObjectForRoom{

public Room dummyRoom(Accommodation accommodation) {
return Room.builder()
Expand All @@ -19,8 +19,22 @@ public Room dummyRoom(Accommodation accommodation) {
.build();
}

public Room dummyRoom1(Accommodation accommodation) {
return Room.builder()
.capacity(4)
.description("객실 설명 2")
.image("이미지 2")
.name("객실 이름 2")
.price(85000)
.roomTypeId(2L)
.stock(20)
.accommodation(accommodation)
.build();
}

public Accommodation dummyAccommodation() {
return Accommodation.builder()
.id(1L)
.name("세인트존스 호텔")
.location(Location.builder()
.address("강원특별자치도 강릉시 창해로 307 ")
Expand Down
Loading

0 comments on commit 33868ea

Please sign in to comment.