From 7213fdc7ef2b002759f78d00e17c03529b5d1752 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Mon, 30 Jun 2025 21:28:50 +0900 Subject: [PATCH 1/7] fix map search --- .../producer/common/dto/enums/SuccessCode.java | 2 ++ .../producer/domain/controller/MapController.java | 4 +++- .../server/producer/domain/service/MapService.java | 13 ++++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/producer/src/main/java/server/producer/common/dto/enums/SuccessCode.java b/producer/src/main/java/server/producer/common/dto/enums/SuccessCode.java index 9d68369..fcd4dca 100644 --- a/producer/src/main/java/server/producer/common/dto/enums/SuccessCode.java +++ b/producer/src/main/java/server/producer/common/dto/enums/SuccessCode.java @@ -22,6 +22,8 @@ public enum SuccessCode { LOGOUT_SUCCESS(20012, "로그아웃 성공"), USER_DELETE_SUCCESS(20013, "회원 탈퇴 성공"), USER_UPDATE_REJECT(20014, "회원 정보 수정 거절(서울지역이 아닙니다)"), + MAP_SEARCH_SUCCESS(20015, "지도 검색 성공"), + MAP_SEARCH_REJECT(20016, "지도 검색 거절(서울지역이 아닙니다)"), //201 CREATED ROOM_REQUEST_POST_SUCCESS(20101, "입주 신청 성공"), SOCIAL_SIGNUP_SUCCESS(20102, "소셜 회원가입 성공"); diff --git a/producer/src/main/java/server/producer/domain/controller/MapController.java b/producer/src/main/java/server/producer/domain/controller/MapController.java index a677f91..16dd8e7 100644 --- a/producer/src/main/java/server/producer/domain/controller/MapController.java +++ b/producer/src/main/java/server/producer/domain/controller/MapController.java @@ -22,7 +22,9 @@ public ApiResponseDto searchPropertiesOnMap(@RequestBody Filt try { Long userId = SecurityUtil.getCurrentUserId(); FilterResponseDto responseDto = mapService.searchProperties(requestDto, userId); - return ApiResponseDto.success(SuccessCode.HOUSE_GET_SUCCESS, responseDto); + return ApiResponseDto.success(SuccessCode.MAP_SEARCH_SUCCESS, responseDto); + } catch (IllegalArgumentException e) { + return ApiResponseDto.success(SuccessCode.MAP_SEARCH_REJECT, null); } catch (InvalidRequestException invalidRequestException) { return ApiResponseDto.fail(ErrorCode.MISSING_REQUIRED_PARAMETER); } catch (Exception e) { diff --git a/producer/src/main/java/server/producer/domain/service/MapService.java b/producer/src/main/java/server/producer/domain/service/MapService.java index 465919c..19935de 100644 --- a/producer/src/main/java/server/producer/domain/service/MapService.java +++ b/producer/src/main/java/server/producer/domain/service/MapService.java @@ -24,7 +24,18 @@ public class MapService { public FilterResponseDto searchProperties(FilterRequestDto requestDto, Long userId){ User user = userRepository.findById(userId) .orElseThrow(() -> new EntityNotFoundException("User not found")); - if (requestDto.getLatitude() == null || requestDto.getLongitude() == null) { + + if (requestDto.getLocation() != null) { + String[] locationsStrings = requestDto.getLocation().split(" "); + if (locationsStrings.length >= 3) { + requestDto.setLocation(locationsStrings[0] + " " + locationsStrings[1] + " " + locationsStrings[2]); + if (!locationsStrings[0].equals("서울")) { + throw new IllegalArgumentException("Invalid location"); + } + } + } + if (requestDto.getLatitude() == null || requestDto.getLongitude() == null || requestDto.getLocation() == null) { + requestDto.setLocation(user.getLocation()); requestDto.setLatitude(user.getLatitude()); requestDto.setLongitude(user.getLongitude()); } From 4e49ed782e98535bb8e9169087d3b212db0d01d6 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Mon, 30 Jun 2025 21:29:58 +0900 Subject: [PATCH 2/7] fix map search --- .../main/java/server/producer/domain/service/MapService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/producer/src/main/java/server/producer/domain/service/MapService.java b/producer/src/main/java/server/producer/domain/service/MapService.java index 19935de..d72e990 100644 --- a/producer/src/main/java/server/producer/domain/service/MapService.java +++ b/producer/src/main/java/server/producer/domain/service/MapService.java @@ -29,7 +29,7 @@ public FilterResponseDto searchProperties(FilterRequestDto requestDto, Long user String[] locationsStrings = requestDto.getLocation().split(" "); if (locationsStrings.length >= 3) { requestDto.setLocation(locationsStrings[0] + " " + locationsStrings[1] + " " + locationsStrings[2]); - if (!locationsStrings[0].equals("서울")) { + if (!locationsStrings[0].contains("서울")) { throw new IllegalArgumentException("Invalid location"); } } From e8191a1156a7e0b04a3b4622933732eb71954c93 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Mon, 30 Jun 2025 21:30:17 +0900 Subject: [PATCH 3/7] fix map search --- .../main/java/server/producer/domain/service/UserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/producer/src/main/java/server/producer/domain/service/UserService.java b/producer/src/main/java/server/producer/domain/service/UserService.java index 0fd81a0..9bb4af1 100644 --- a/producer/src/main/java/server/producer/domain/service/UserService.java +++ b/producer/src/main/java/server/producer/domain/service/UserService.java @@ -131,7 +131,7 @@ public LocationUpdateResponseDto updateLocation(Long userId, LocationUpdateReque try { String[] locationParts = requestDto.getLocation().split(" "); if (locationParts.length >= 3) { - if (locationParts[0].equals("서울특별시")) { + if (locationParts[0].contains("서울")) { User user = userRepository.findById(userId) .orElseThrow(() -> new EntityNotFoundException("User not found")); user.setLatitude(requestDto.getLatitude()); From b3ff75d370f9ec38f4f8897f3c4f63ff6b14f8a0 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Mon, 30 Jun 2025 23:14:07 +0900 Subject: [PATCH 4/7] fix map search --- .../server/producer/domain/controller/MapController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/producer/src/main/java/server/producer/domain/controller/MapController.java b/producer/src/main/java/server/producer/domain/controller/MapController.java index 16dd8e7..2864c76 100644 --- a/producer/src/main/java/server/producer/domain/controller/MapController.java +++ b/producer/src/main/java/server/producer/domain/controller/MapController.java @@ -24,7 +24,12 @@ public ApiResponseDto searchPropertiesOnMap(@RequestBody Filt FilterResponseDto responseDto = mapService.searchProperties(requestDto, userId); return ApiResponseDto.success(SuccessCode.MAP_SEARCH_SUCCESS, responseDto); } catch (IllegalArgumentException e) { - return ApiResponseDto.success(SuccessCode.MAP_SEARCH_REJECT, null); + FilterResponseDto responseDto = FilterResponseDto.builder() + .houses(new ArrayList<>()) + .latitude(37.55348) + .longitude(126.9381) + .build(); + return ApiResponseDto.success(SuccessCode.MAP_SEARCH_REJECT, responseDto); } catch (InvalidRequestException invalidRequestException) { return ApiResponseDto.fail(ErrorCode.MISSING_REQUIRED_PARAMETER); } catch (Exception e) { From 6253db270f72f08aa5f9a692194ca1fd216820b0 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Tue, 1 Jul 2025 00:12:24 +0900 Subject: [PATCH 5/7] fix response empty list --- .../repository/FilterRepositoryTest.java | 120 ----- .../repository/HouseRepositoryTest.java | 277 ----------- .../domain/repository/UserRepositoryTest.java | 169 ------- .../java/domain/service/HouseServiceTest.java | 468 ------------------ .../java/domain/service/MapServiceTest.java | 124 ----- .../java/domain/service/RoomServiceTest.java | 4 - .../java/domain/service/UserServiceTest.java | 152 ------ 7 files changed, 1314 deletions(-) delete mode 100644 producer/src/test/java/domain/repository/FilterRepositoryTest.java delete mode 100644 producer/src/test/java/domain/repository/HouseRepositoryTest.java delete mode 100644 producer/src/test/java/domain/repository/UserRepositoryTest.java delete mode 100644 producer/src/test/java/domain/service/HouseServiceTest.java delete mode 100644 producer/src/test/java/domain/service/MapServiceTest.java delete mode 100644 producer/src/test/java/domain/service/RoomServiceTest.java delete mode 100644 producer/src/test/java/domain/service/UserServiceTest.java diff --git a/producer/src/test/java/domain/repository/FilterRepositoryTest.java b/producer/src/test/java/domain/repository/FilterRepositoryTest.java deleted file mode 100644 index 9a2074d..0000000 --- a/producer/src/test/java/domain/repository/FilterRepositoryTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package domain.repository; - -import entity.*; -import jakarta.persistence.EntityManager; -import jakarta.transaction.Transactional; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.ContextConfiguration; -import server.producer.ProducerApplication; -import server.producer.common.LocationLabeler; -import server.producer.domain.dto.request.FilterRequestDto; -import server.producer.domain.repository.FilterRepository; - -import java.time.LocalDate; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -@DataJpaTest -@ContextConfiguration(classes = ProducerApplication.class) -@EntityScan(basePackages = "entity") -@Import({FilterRepository.class, LocationLabeler.class}) -@Transactional -public class FilterRepositoryTest { - - @Autowired - private EntityManager entityManager; - - @Autowired - private FilterRepository filterRepository; - - @Autowired - private LocationLabeler locationLabeler; - - @BeforeEach - void setUp() { - // User 저장 - User user = new User(); - user.setName("Test User"); - user.setLocation("Test Location"); - entityManager.persist(user); - - // House 저장 - House house1 = createHouse(1L, "#차분한", "서대무구 무슨동", "Test Location", true, 12, GenderPolicyType.남성전용,1); - House house2 = createHouse(2L, "Cozy", "Seocho", "Relaxing", false, 24, GenderPolicyType.여성전용,0); - - // Room 저장 - createRoom(101L, "Room 101", 500000, 1300000, null, house1); - createRoom(201L, "Room 201", 800000, 7000000, null, house2); - - entityManager.flush(); - entityManager.clear(); - } - - @Test - void testFindFilteredHouses() { - FilterRequestDto filter = new FilterRequestDto( - "서대문구 무슨동", // House의 location - List.of("#차분한"), // House의 moodTags - new FilterRequestDto.Range(10, 1500), // deposit 범위 - new FilterRequestDto.Range(30, 1000), // monthlyRent 범위 - List.of(GenderPolicyType.남성전용.toString()), // House의 genderPolicyType - null, // Room의 contractPeriod 관련 조건 - List.of("1인실", "2인실", "3인실", "4인실"), // occupancyTypes (빈 리스트) - List.of(6,12) // contractTerm 조건 - ); - - List filteredHouses = filterRepository.findFilteredHouses(filter); - - assertNotNull(filteredHouses); - assertEquals(1, filteredHouses.size()); - assertEquals("Sample House 1", filteredHouses.get(0).getName()); - } - - private House createHouse(Long id, String moodTag, String location, String locationDescription, - boolean isPinned, int contractTerm, GenderPolicyType genderPolicy, int label) { - House house = new House(); - house.setName("Sample House " + id); - house.setLocation(location); - house.setLatitude(34.3); - house.setLongitude(33.3); - house.setMainImgUrl("https://www.example.com"); - house.setMoodTag(moodTag); - house.setContractTerm(contractTerm); - house.setGenderPolicy(genderPolicy); - house.setLabel(label); - - entityManager.persist(house); - - if (isPinned) { - User user = entityManager.find(User.class, 1L); - Pin pin = new Pin(); - pin.setHouse(house); - pin.setUser(user); - entityManager.persist(pin); - house.getPins().add(pin); - user.getPins().add(pin); - } - - return house; - } - - private Room createRoom(Long id, String name, int monthlyRent, int deposit, LocalDate contractDate, House house) { - Room room = new Room(); - room.setName(name); - room.setMonthlyRent(monthlyRent); - room.setDeposit(deposit); - room.setContractPeriod(contractDate); - room.setStatus(0); - room.setOccupancyType(2); - room.setGender(GenderType.남성); - room.setHouse(house); // House와 직접 연결 - entityManager.persist(room); - return room; - } -} \ No newline at end of file diff --git a/producer/src/test/java/domain/repository/HouseRepositoryTest.java b/producer/src/test/java/domain/repository/HouseRepositoryTest.java deleted file mode 100644 index ea2382d..0000000 --- a/producer/src/test/java/domain/repository/HouseRepositoryTest.java +++ /dev/null @@ -1,277 +0,0 @@ -package domain.repository; - -import entity.*; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; -import org.springframework.test.context.ContextConfiguration; -import server.producer.ProducerApplication; -import server.producer.domain.repository.HouseRepository; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; - -@DataJpaTest -@ContextConfiguration(classes = ProducerApplication.class) -@EntityScan(basePackages = "entity") -public class HouseRepositoryTest { - @Autowired - private TestEntityManager entityManager; - - @Autowired - private HouseRepository houseRepository; - - @Test - void testFindHouseDetailsById_ValidHouseId() { - // Given - House house = new House(); - house.setName("루미 100호점"); - house.setLatitude(37.5665); - house.setLongitude(126.9780); - house.setLocation("마포구 상수동"); - house.setLocationDescription("자이아파트"); - house.setMoodTag("#아늑한"); - house.setSubMoodTag("#즐거운 #활기찬"); - house.setRoomMood("조용하고 깔끔한 환경을 선호합니다."); - house.setMainImgUrl("house_main.jpg"); - house.setMainImgDescription("메인이미지 상세설명"); - house.setFacilityImgUrl("facility_img.jpg"); - house.setFacilityImgDescription("시설이미지 상세설명"); - house.setFloorImgUrl("floor_plan.jpg"); - house.setContractTerm(12); - house.setGenderPolicy(GenderPolicyType.남녀공용); - house.setGroundRule("담배 피지 말기#변기 막히지 말기"); - house.setKitchenFacility("냉장고#싱크대"); - house.setSafetyLivingFacility("소화기#티비"); - - Room room = new Room(); - room.setName("Room 1"); - room.setMonthlyRent(500000); - room.setDeposit(5000000); - room.setFacility("에어컨#와이파이"); - room.setContractPeriod(LocalDate.of(2025, 12, 31)); - room.setGender(GenderType.혼성); - room.setStatus(1); - room.setOccupancyType(2); - room.setMainImgUrl("room_main.jpg"); - room.setManagementFee("1/n"); - room.setHouse(house); - - Pin pin = new Pin(); - pin.setHouse(house); - - house.getRooms().add(room); - house.getPins().add(pin); - - // 저장 - entityManager.persist(house); - entityManager.flush(); - - // When - Optional houseWithRooms = houseRepository.findHouseWithRoomsById(house.getId()); - List roomsWithOccupancies = houseRepository.findRoomsAndRoomOccupanciesByHouseId(house.getId()); - Optional houseWithPins = houseRepository.findHouseWithPinsById(house.getId()); - - // Then - assertTrue(houseWithRooms.isPresent()); - assertTrue(houseWithPins.isPresent()); - assertEquals(1, roomsWithOccupancies.size()); - - House foundHouse = houseWithRooms.get(); - assertEquals("루미 100호점", foundHouse.getName()); - assertEquals(1, foundHouse.getRooms().size()); - assertEquals("Room 1", foundHouse.getRooms().get(0).getName()); - assertEquals(1, houseWithPins.get().getPins().size()); - } - - @Test - void testFindHouseDetailsById_InvalidHouseId() { - // Given - Long invalidHouseId = 999L; - - // When - Optional houseWithRooms = houseRepository.findHouseWithRoomsById(invalidHouseId); - List roomsWithOccupancies = houseRepository.findRoomsAndRoomOccupanciesByHouseId(invalidHouseId); - Optional houseWithPins = houseRepository.findHouseWithPinsById(invalidHouseId); - - // Then - assertTrue(houseWithRooms.isEmpty()); - assertTrue(roomsWithOccupancies.isEmpty()); - assertTrue(houseWithPins.isEmpty()); - } - - @Test - void testFindPinnedHouseByUserId() { - // Given: Mock 데이터 생성 - Long userId = 1L; - - // 사용자 생성 및 영속화 - User user = new User(); - user.setId(userId); - user.setName("Test User"); - user.setLocation("서울"); - user = entityManager.merge(user); - - // 하우스 생성 - House house1 = new House(); - house1.setName("Test House 1"); - house1.setLocation("서울 강남구"); - house1.setLocationDescription("강남아파트"); - house1.setFacilityImgUrl("facility_img_url_1.jpg"); - house1.setFacilityImgDescription("Facility description 1"); - house1.setMainImgUrl("main_img_url_1.jpg"); - house1.setMainImgDescription("Main img description 1"); - house1.setLatitude(37.5665); - house1.setLongitude(126.9780); - house1.setMoodTag("#편안한"); - house1.setSubMoodTag("#활기찬"); - house1.setRoomMood("아늑한 방"); - house1.setFloorImgUrl("floor_img_1.jpg"); - house1.setContractTerm(12); - house1.setGenderPolicy(GenderPolicyType.남녀공용); - house1.setGroundRule("금연"); - house1.setKitchenFacility("싱크대#냉장고"); - house1.setSafetyLivingFacility("소화기#응급키트"); - - House house2 = new House(); - house2.setName("Test House 2"); - house2.setLocation("서울 마포구"); - house2.setLocationDescription("레미안 아파트"); - house2.setFacilityImgUrl("facility_img_url_2.jpg"); - house2.setFacilityImgDescription("Facility description 2"); - house2.setMainImgUrl("main_img_url_2.jpg"); - house2.setMainImgDescription("Main img description 2"); - house2.setLatitude(37.5665); - house2.setLongitude(126.9780); - house2.setMoodTag("#활기찬"); - house2.setSubMoodTag("#편안한"); - house2.setRoomMood("활기찬 방"); - house2.setFloorImgUrl("floor_img_2.jpg"); - house2.setContractTerm(6); - house2.setGenderPolicy(GenderPolicyType.남녀공용); - house2.setGroundRule("소음 금지"); - house2.setKitchenFacility("전자레인지#가스레인지"); - house2.setSafetyLivingFacility("CCTV#소화기"); - - // 핀 생성 및 사용자와 연결 - Pin pin1 = new Pin(); - pin1.setHouse(house1); - pin1.setUser(user); - - Pin pin2 = new Pin(); - pin2.setHouse(house2); - pin2.setUser(user); - - house1.getPins().add(pin1); - house2.getPins().add(pin2); - - // 데이터 저장 - entityManager.persist(house1); - entityManager.persist(house2); - entityManager.flush(); - - // When: findPinnedHouseByUserId 호출 - List pinnedHouses = houseRepository.findPinnedHouseByUserId(userId); - - // Then: 결과 검증 - assertNotNull(pinnedHouses); - assertEquals(2, pinnedHouses.size()); - - House foundHouse1 = pinnedHouses.get(0); - House foundHouse2 = pinnedHouses.get(1); - - assertEquals("Test House 1", foundHouse1.getName()); - assertEquals("서울 강남구", foundHouse1.getLocation()); - assertEquals(1, foundHouse1.getPins().size()); - assertEquals(userId, foundHouse1.getPins().get(0).getUser().getId()); - - assertEquals("Test House 2", foundHouse2.getName()); - assertEquals("서울 마포구", foundHouse2.getLocation()); - assertEquals(1, foundHouse2.getPins().size()); - assertEquals(userId, foundHouse2.getPins().get(0).getUser().getId()); - } - - @Test - void testFindAllRoomsByHouseId() { - // Given: 테스트용 House와 Room 데이터 생성 - House house = new House(); - house.setName("Test House"); - house.setLocation("서울 강남구"); - house.setLocationDescription("강남구 중심부"); - house.setFacilityImgUrl("facility_img_url.jpg"); - house.setFacilityImgDescription("시설 이미지 설명"); - house.setMainImgUrl("main_img_url.jpg"); - house.setMainImgDescription("메인 이미지 설명"); - house.setLatitude(37.5665); - house.setLongitude(126.9780); - house.setMoodTag("#편안한"); - house.setSubMoodTag("#활기찬"); - house.setRoomMood("조용한 방"); - house.setFloorImgUrl("floor_img_url.jpg"); - house.setContractTerm(12); - house.setGenderPolicy(GenderPolicyType.남녀공용); - house.setGroundRule("금연"); - house.setKitchenFacility("싱크대, 냉장고"); - house.setSafetyLivingFacility("CCTV, 소화기"); - - Room room1 = new Room(); - room1.setName("Room 1"); - room1.setMonthlyRent(500000); - room1.setDeposit(5000000); - room1.setFacility("에어컨, 와이파이"); - room1.setContractPeriod(LocalDate.of(2025, 12, 31)); - room1.setGender(GenderType.혼성); - room1.setStatus(1); - room1.setOccupancyType(2); - room1.setMainImgUrl("room1_main.jpg"); - room1.setManagementFee("1/n"); - room1.setHouse(house); - - Room room2 = new Room(); - room2.setName("Room 2"); - room2.setMonthlyRent(700000); - room2.setDeposit(7000000); - room2.setFacility("히터, 책상"); - room2.setContractPeriod(LocalDate.of(2026, 12, 31)); - room2.setGender(GenderType.혼성); - room2.setStatus(1); - room2.setOccupancyType(1); - room2.setMainImgUrl("room2_main.jpg"); - room2.setManagementFee("2/n"); - room2.setHouse(house); - - house.getRooms().add(room1); - house.getRooms().add(room2); - - // House와 Room 영속화 - entityManager.persist(house); - entityManager.persist(room1); - entityManager.persist(room2); - entityManager.flush(); - - // When: findAllRoomsByHouseId 호출 - List rooms = houseRepository.findAllRoomsByHouseId(house.getId()); - - // Then: 조회 결과 검증 - assertNotNull(rooms); - assertEquals(2, rooms.size()); - - Room foundRoom1 = rooms.get(0); - Room foundRoom2 = rooms.get(1); - - assertEquals("Room 1", foundRoom1.getName()); - assertEquals(500000, foundRoom1.getMonthlyRent()); - assertEquals("에어컨, 와이파이", foundRoom1.getFacility()); - assertEquals("room1_main.jpg", foundRoom1.getMainImgUrl()); - - assertEquals("Room 2", foundRoom2.getName()); - assertEquals(700000, foundRoom2.getMonthlyRent()); - assertEquals("히터, 책상", foundRoom2.getFacility()); - assertEquals("room2_main.jpg", foundRoom2.getMainImgUrl()); - } -} diff --git a/producer/src/test/java/domain/repository/UserRepositoryTest.java b/producer/src/test/java/domain/repository/UserRepositoryTest.java deleted file mode 100644 index 33634c6..0000000 --- a/producer/src/test/java/domain/repository/UserRepositoryTest.java +++ /dev/null @@ -1,169 +0,0 @@ -package domain.repository; - -import entity.*; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityNotFoundException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.context.ContextConfiguration; -import server.producer.ProducerApplication; -import server.producer.domain.repository.HouseRepository; -import server.producer.domain.repository.UserRepository; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; - -@DataJpaTest -@ContextConfiguration(classes = ProducerApplication.class) -@EntityScan(basePackages = "entity") -public class UserRepositoryTest { - - @Autowired - private UserRepository userRepository; - - @Autowired - private EntityManager em; - - Long testUserId = 1L; - - @BeforeEach - void setUp() { - // 사용자 생성 및 저장 - User user1 = createUser("John Doe", "서대문구 대현동"); - User user2 = createUser("Jane Doe", "강남구 역삼동"); - - // 하우스와 방 생성 및 저장 - House house = createHouse("Dream House", "Gangnam", "Near the station", "Modern", "Peaceful"); - Room room = createRoom("Room 101", 500000, 5000000, GenderType.남성, house); - - // 최근 본 하우스 연관 설정 및 저장 - linkRecentlyViewedHouse(user1, house); - - // 저장된 엔티티의 ID를 가져옴 - testUserId = user1.getId(); - - // Flush to ensure persistence in each test - em.flush(); - } - - @Test - void testFindLocationById_ValidUserId() { - // given - Long userId = testUserId; - - // when - Optional location = userRepository.findLocationById(userId); - - // then - assertTrue(location.isPresent()); - assertEquals("서대문구 대현동", location.get()); - } - - @Test - void testFindLocationById_InvalidUserId() { - // given - Long userId = testUserId + 5; - - // when - Optional location = userRepository.findLocationById(userId); - - // then - assertTrue(location.isEmpty()); - } - - - @Test - void testFindByIdWithHousesAndRooms() { - // Arrange - Long userId = testUserId; - - // Act - Optional optionalUser = userRepository.findUserWithRecentlyViewedHouses(userId); - - // Debugging: Optional 상태 확인 - if (optionalUser.isEmpty()) { - System.out.println("No user found with userId: " + userId); - } - - // Assert - assertTrue(optionalUser.isPresent(), "User should be found"); - - User user = optionalUser.get(); - System.out.println("User found: " + user.getName()); - assertEquals("John Doe", user.getName()); - assertEquals(1, user.getRecentlyViewedHouses().size(), "User should have 1 recently viewed house"); - - RecentlyViewedHouse rvh = user.getRecentlyViewedHouses().get(0); - assertNotNull(rvh.getHouse(), "Recently viewed house should not be null"); - assertEquals("Dream House", rvh.getHouse().getName(), "House name should match"); - - House house = rvh.getHouse(); - assertEquals(1, house.getRooms().size(), "House should have 1 room"); - - Room room = house.getRooms().get(0); - assertEquals("Room 101", room.getName(), "Room name should match"); - assertEquals(500000, room.getMonthlyRent(), "Room monthly rent should match"); - } - - private User createUser(String name, String location) { - User user = new User(); - user.setName(name); - user.setLocation(location); - return userRepository.save(user); - } - - private House createHouse(String name, String location, String locationDescription, String moodTag, String subMoodTag) { - House house = new House(); - house.setName(name); - house.setLatitude(37.5665); - house.setLongitude(126.9780); - house.setRoomMood("Cozy"); - house.setGroundRule("No Smoking"); - house.setLocation(location); - house.setLocationDescription(locationDescription); - house.setMoodTag(moodTag); - house.setSubMoodTag(subMoodTag); - house.setGenderPolicy(GenderPolicyType.남성전용); - house.setMainImgUrl("https://example.com/main.jpg"); - house.setMainImgDescription("Main Image"); - house.setFacilityImgUrl("https://example.com/facility.jpg"); - house.setFacilityImgDescription("Facility Image"); - house.setContractTerm(12); - house.setSafetyLivingFacility("CCTV"); - house.setKitchenFacility("Fully Equipped"); - em.persist(house); - return house; - } - - private Room createRoom(String name, int monthlyRent, int deposit, GenderType genderType, House house) { - Room room = new Room(); - room.setName(name); - room.setMonthlyRent(monthlyRent); - room.setDeposit(deposit); - room.setFacility("Bed, Desk"); - room.setGender(genderType); - room.setStatus(0); - room.setOccupancyType(1); - room.setMainImgUrl("https://example.com/room.jpg"); - room.setManagementFee("5000"); - room.setHouse(house); - house.getRooms().add(room); - em.persist(room); - return room; - } - - private void linkRecentlyViewedHouse(User user, House house) { - RecentlyViewedHouse recentlyViewedHouse = new RecentlyViewedHouse(); - recentlyViewedHouse.setUser(user); - recentlyViewedHouse.setHouse(house); - recentlyViewedHouse.setViewedAt(java.time.LocalDateTime.now()); - house.getRecentlyViewedHouses().add(recentlyViewedHouse); - user.getRecentlyViewedHouses().add(recentlyViewedHouse); - em.persist(recentlyViewedHouse); // 명시적으로 persist 호출 - } - -} \ No newline at end of file diff --git a/producer/src/test/java/domain/service/HouseServiceTest.java b/producer/src/test/java/domain/service/HouseServiceTest.java deleted file mode 100644 index eefd20b..0000000 --- a/producer/src/test/java/domain/service/HouseServiceTest.java +++ /dev/null @@ -1,468 +0,0 @@ -package domain.service; -import entity.*; -import jakarta.persistence.EntityNotFoundException; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.springframework.beans.factory.annotation.Autowired; -import server.producer.common.LocationLabeler; -import server.producer.domain.dto.response.*; -import server.producer.domain.repository.HouseRepository; -import server.producer.domain.repository.PinRepository; -import server.producer.domain.repository.RecentlyViewedHouseRepository; -import server.producer.domain.repository.UserRepository; -import server.producer.domain.service.HouseService; - -import java.sql.Date; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -public class HouseServiceTest { - - @Mock - private LocationLabeler locationLabeler; - - @Mock - private HouseRepository houseRepository; - - @Mock - private UserRepository userRepository; - - @Mock - private PinRepository pinRepository; - - @Mock - private RecentlyViewedHouseRepository recentlyViewedHouseRepository; - - @InjectMocks - private HouseService houseService; - - @BeforeEach - void setUp() { - MockitoAnnotations.openMocks(this); - } - @Test - void testGetPinnedHouses() { - // Given: Mock 데이터 준비 - Long userId = 1L; - - // House Mock 데이터 생성 - House house1 = createHouse(1L, "#활기찬", "서울 강남구", "자이 아파트", true, 12, "https://example.com/images/house1.jpg"); - House house2 = createHouse(2L, "#차분한", "서울 송파구", "오피스텔", true, 6, "https://example.com/images/house2.jpg"); - - // houseRepository 동작 설정 - when(houseRepository.findPinnedHouseByUserId(userId)).thenReturn(List.of(house1, house2)); - - // When: 서비스 호출 - PinnedListResponseDto response = houseService.getPinnedHouses(userId); - - // Then: 검증 - assertNotNull(response); // 응답이 null이 아님 - assertEquals(2, response.pinnedHouses().size()); // 반환된 집의 개수 검증 - - // House 1 검증 - PinnedListResponseDto.PinnedHouseDto houseDto1 = response.pinnedHouses().get(0); - assertEquals(1L, houseDto1.houseId()); - assertEquals("서울 강남구", houseDto1.location()); - assertEquals("자이 아파트", houseDto1.locationDescription()); - assertEquals("30~40", houseDto1.monthlyRent()); // Mock된 값에 따라 예상 값 - assertEquals("100~300", houseDto1.deposit()); - assertEquals("1,2,3인실", houseDto1.occupancyTypes()); - assertEquals("남녀공용", houseDto1.genderPolicy()); - assertEquals(true, houseDto1.isPinned()); - assertEquals(12, houseDto1.contractTerm()); - assertEquals("https://example.com/images/house1.jpg", houseDto1.mainImgUrl()); - assertEquals("#활기찬", houseDto1.moodTag()); - - // House 2 검증 - PinnedListResponseDto.PinnedHouseDto houseDto2 = response.pinnedHouses().get(1); - assertEquals(2L, houseDto2.houseId()); - assertEquals("서울 송파구", houseDto2.location()); - assertEquals("오피스텔", houseDto2.locationDescription()); - assertEquals("30~40", houseDto2.monthlyRent()); // Mock된 값에 따라 예상 값 - assertEquals("100~300", houseDto2.deposit()); - assertEquals("1,2,3인실", houseDto2.occupancyTypes()); - assertEquals("남녀공용", houseDto2.genderPolicy()); - assertEquals(true, houseDto2.isPinned()); - assertEquals(6, houseDto2.contractTerm()); - assertEquals("https://example.com/images/house2.jpg", houseDto2.mainImgUrl()); - assertEquals("#차분한", houseDto2.moodTag()); - } - - @Test - void testGetHousesByMoodAndLocation() { - // Mock 데이터 준비 - Long userId = 1L; - String location = "서대문구 연희동"; - String moodTag = "#차분한"; - - // UserRepository 동작 설정 - when(userRepository.findLocationById(anyLong())).thenReturn(Optional.of(location)); - - // location labeler - when(locationLabeler.findLabelByLocation(anyString())).thenReturn(1); - - // HouseRepository 동작 설정 - House house1 = createHouse(1L, moodTag, location, "자이아파트", true, 6, "https://example.com/images/house1.jpg"); - House house2 = createHouse(2L, moodTag, location, "자이아파트", true, 6, "https://example.com/images/house2.jpg"); - - when(houseRepository.findByLabelAndMoodTag(eq(1), eq(moodTag))) - .thenReturn(List.of(house1, house2)); - - // given - MoodHouseResponseDto result = houseService.getHousesByMoodAndLocation(moodTag, userId); - - // 검증 - assertEquals(moodTag, result.moodTag()); - assertEquals(2, result.houses().size()); - - MoodHouseResponseDto.MoodHouseDto houseDto1 = result.houses().get(0); - assertEquals(1L, houseDto1.houseId()); - assertEquals("30~40", houseDto1.monthlyRent()); - assertEquals(location, houseDto1.location()); - assertEquals("100~300", houseDto1.deposit()); - assertEquals("1,2,3인실", houseDto1.occupancyTypes()); - assertEquals(location, houseDto1.location()); - assertEquals("남녀공용", houseDto1.genderPolicy()); - assertEquals("자이아파트", houseDto1.locationDescription()); - assertEquals(true, houseDto1.isPinned()); - assertEquals(6, houseDto1.contractTerm()); - assertEquals("https://example.com/images/house1.jpg", houseDto1.mainImgUrl()); - - MoodHouseResponseDto.MoodHouseDto houseDto2 = result.houses().get(1); - assertEquals(2L, houseDto2.houseId()); - assertEquals("30~40", houseDto2.monthlyRent()); - assertEquals("100~300", houseDto2.deposit()); - assertEquals(moodTag, result.moodTag()); - - } - - - private House createHouse(Long id, String moodTag, - String location, String locationDescription, - boolean isPinned, int contractTerm, String mainImgUrl) { - House house = new House(); - house.setId(id); - house.setName("Sample House " + id); - house.setLatitude(37.5665 + id * 0.001); // 예제 좌표 - house.setLongitude(126.978 + id * 0.001); // 예제 좌표 - house.setRoomMood("Cozy"); - house.setGroundRule("No smoking"); - house.setLocation(location); - house.setLocationDescription(locationDescription); - house.setMoodTag(moodTag); - house.setSubMoodTag("#추가태그"); - house.setGenderPolicy(GenderPolicyType.남녀공용); // Enum 변환 - house.setMainImgUrl(mainImgUrl); - house.setMainImgDescription("Main image of house " + id); - house.setFacilityImgUrl("https://example.com/images/facility" + id + ".jpg"); - house.setFacilityImgDescription("Facility image of house " + id); - house.setContractTerm(contractTerm); - house.setSafetyLivingFacility("소화기"); - house.setKitchenFacility("냉장고"); - - // Room 생성 및 추가 - List rooms = new ArrayList<>(); - for (int i = 0; i < 3; i++) { - Room room = new Room(); - room.setId((id * 10) + i); // 유니크한 Room ID - room.setHouse(house); - room.setName("Room " + (i + 1)); - room.setMonthlyRent(300000 + (i * 50000)); - room.setDeposit(1000000 + (i * 1000000)); - room.setOccupancyType(i + 1); - room.setStatus(1); // 활성 상태 - room.setMainImgUrl("https://example.com/images/room" + ((id * 10) + i) + ".jpg"); - room.setManagementFee("100000"); - rooms.add(room); - } - house.setRooms(rooms); - // Pin 생성 및 추가 - if (isPinned) { - Pin pin = new Pin(); - pin.setId(id); - pin.setHouse(house); - User user = new User(); - user.setId(1L); // Mock user - user.setName("Test User"); - pin.setUser(user); - house.setPins(List.of(pin)); - } - return house; - } - - @Test - void testGetHouseDetailsWithRecentlyViewedHouse() { - // Given: Mock 데이터 준비 - Long houseId = 1L; - Long userId = 2L; - - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy-MM-dd"); - - // House, Room, and Pin Mock 데이터 생성 - House mockHouse = createMockHouse(houseId, "루미 100호점(이대역)", "서울 강남구", "전반적으로 조용하고 깔끔한 환경을 선호하는 아침형 룸메이트들이에요."); - Room mockRoom1 = createMockRoom(101L, "1A", 2, "남성", 300000, 5000000, LocalDate.of(2024, 12, 31), "100000"); - Room mockRoom2 = createMockRoom(102L, "2A", 1, "여성", 200000, 3000000, LocalDate.of(2025, 1, 17), "50000"); - - mockHouse.setRooms(List.of(mockRoom1, mockRoom2)); - - House mockHouseWithPins = createMockHouseWithPins(mockHouse, userId); - - RecentlyViewedHouse mockRecentlyViewedHouse = new RecentlyViewedHouse(); - mockRecentlyViewedHouse.setId(1L); - - // User 설정 - User mockUser = new User(); - mockUser.setId(userId); - mockUser.setName("Test User"); - mockUser.setLocation("서울 강남구"); - - // House 설정 - mockRecentlyViewedHouse.setUser(mockUser); - mockRecentlyViewedHouse.setHouse(mockHouse); - mockRecentlyViewedHouse.setViewedAt(LocalDateTime.now()); - - // Mock 동작 설정 - when(houseRepository.findHouseWithRoomsById(houseId)).thenReturn(Optional.of(mockHouse)); - when(houseRepository.findRoomsAndRoomOccupanciesByHouseId(houseId)).thenReturn(List.of(mockRoom1, mockRoom2)); - when(userRepository.getReferenceById(userId)).thenReturn(mockUser); - when(houseRepository.getReferenceById(houseId)).thenReturn(mockHouse); - when(recentlyViewedHouseRepository.findByUserIdAndHouseId(userId, houseId)) - .thenReturn(Optional.of(mockRecentlyViewedHouse)); - - // When: 서비스 호출 - HouseDetailsResponseDto response = houseService.getHouseDetails(houseId, userId); - - // Then: 응답 검증 - assertNotNull(response); // 응답이 null이 아님 - - // HouseInfoDto 검증 - HouseDetailsResponseDto.HouseInfoDto houseInfo = response.houseInfo(); - assertEquals(houseId, houseInfo.houseId()); - assertEquals("루미 100호점(이대역)", houseInfo.name()); - assertEquals("서울 강남구", houseInfo.location()); - assertEquals("전반적으로 조용하고 깔끔한 환경을 선호하는 아침형 룸메이트들이에요.", houseInfo.roomMood()); - - // RoomDto 검증 - assertEquals(2, response.rooms().size()); - HouseDetailsResponseDto.RoomDto roomDto1 = response.rooms().get(0); - assertEquals(101L, roomDto1.roomId()); - assertEquals("1A", roomDto1.name()); - assertFalse(roomDto1.status()); - assertEquals(2, roomDto1.occupancyType()); - assertEquals("남성", roomDto1.gender()); - assertEquals(300000, roomDto1.monthlyRent()); - assertEquals(5000000, roomDto1.deposit()); - assertEquals("24-12-31", roomDto1.contractPeriod().format(formatter)); - - // 최근 본 매물 기록 검증 - verify(recentlyViewedHouseRepository).save(argThat(entry -> - entry != null && - entry.getUser() != null && - entry.getUser().getId().equals(userId) && - entry.getHouse() != null && - entry.getHouse().getId().equals(houseId) - )); - } - - private House createMockHouse(Long houseId, String name, String location, String roomMood) { - House house = new House(); - house.setId(houseId); - house.setName(name); - house.setLocation(location); - house.setRoomMood(roomMood); - house.setGroundRule("요리 후 바로 설거지해요#청소는 주3회 돌아가면서 해요"); - house.setSafetyLivingFacility("소화기#비상구"); - house.setKitchenFacility("냉장고#전자레인지"); - house.setGenderPolicy(GenderPolicyType.남녀공용); - return house; - } - private Room createMockRoom(Long roomId, String name, int occupancyType, String gender, int monthlyRent, - int deposit, LocalDate contractPeriod, String managementFee) { - Room room = new Room(); - room.setId(roomId); - room.setName(name); - room.setOccupancyType(occupancyType); - room.setGender(GenderType.valueOf(gender)); - room.setMonthlyRent(monthlyRent); - room.setDeposit(deposit); - room.setContractPeriod(contractPeriod); - room.setManagementFee(managementFee); - room.setStatus(occupancyType); - return room; - } - private House createMockHouseWithPins(House house, Long userId) { - Pin pin = new Pin(); - pin.setHouse(house); - - User user = new User(); - user.setId(userId); - pin.setUser(user); - - house.setPins(List.of(pin)); - return house; - } - - @Test - void testTogglePin_AddPin() { - // Given - Long userId = 1L; - Long houseId = 2L; - - User mockUser = new User(); - mockUser.setId(userId); - - House mockHouse = new House(); - mockHouse.setId(houseId); - - when(pinRepository.findByUserIdAndHouseId(userId, houseId)).thenReturn(List.of()); - when(userRepository.getReferenceById(userId)).thenReturn(mockUser); - when(houseRepository.getReferenceById(houseId)).thenReturn(mockHouse); - - // When - boolean result = houseService.togglePin(userId, houseId).isPinned(); - - // Then - assertTrue(result); // 핀이 추가되므로 true 반환 - verify(pinRepository, times(1)).save(argThat(pin -> - pin.getUser().equals(mockUser) && - pin.getHouse().equals(mockHouse) - )); - verify(pinRepository, never()).deleteById(anyLong()); // 삭제는 호출되지 않아야 함 - } - - @Test - void testTogglePin_RemovePin() { - // Given - Long userId = 1L; - Long houseId = 2L; - - Pin existingPin = new Pin(); - existingPin.setId(1L); - - when(pinRepository.findByUserIdAndHouseId(userId, houseId)).thenReturn(List.of(existingPin)); - - // When - boolean result = houseService.togglePin(userId, houseId).isPinned(); - - // Then - assertFalse(result); // 핀이 삭제되므로 false 반환 - verify(pinRepository, times(1)).deleteAllInBatch(List.of(existingPin)); // 삭제 메서드 호출 확인 - verify(pinRepository, never()).save(any(Pin.class)); // 저장은 호출되지 않아야 함 - } - - @Test - void testGetHouseImages_Success() { - // Given - Long houseId = 1L; - - // Mock House 객체 생성 - House mockHouse = new House(); - mockHouse.setId(houseId); - mockHouse.setMainImgUrl("https://example.com/main.jpg"); - mockHouse.setMainImgDescription("메인 이미지 상세설명"); - mockHouse.setFacilityImgUrl("https://example.com/facility1.jpg https://example.com/facility2.jpg"); - mockHouse.setFacilityImgDescription("시설 이미지 상세설명"); - mockHouse.setFloorImgUrl("https://example.com/floor.jpg"); - - when(houseRepository.findById(houseId)).thenReturn(Optional.of(mockHouse)); - - // When - ImageDetailsResponseDto response = houseService.getHouseImages(houseId); - - // Then - assertNotNull(response); // 응답이 null이 아님 - assertNotNull(response.images()); // images 필드가 null이 아님 - - ImageDetailsResponseDto.Images images = response.images(); - assertEquals("https://example.com/main.jpg", images.mainImgUrl()); - assertEquals("메인 이미지 상세설명", images.mainImgDescription()); - assertEquals( - List.of("https://example.com/facility1.jpg", "https://example.com/facility2.jpg"), - images.facilityImgUrls() - ); - assertEquals("시설 이미지 상세설명", images.facilityImgDescription()); - assertEquals("https://example.com/floor.jpg", images.floorImgUrl()); - - // Verify Repository 호출 확인 - verify(houseRepository, times(1)).findById(houseId); - } - - @Test - void testGetHouseImages_HouseNotFound() { - // Given - Long houseId = 1L; - - when(houseRepository.findById(houseId)).thenReturn(Optional.empty()); - - // When & Then - EntityNotFoundException exception = assertThrows(EntityNotFoundException.class, () -> { - houseService.getHouseImages(houseId); - }); - - assertEquals("House not found.", exception.getMessage()); - - // Verify Repository 호출 확인 - verify(houseRepository, times(1)).findById(houseId); - } - - @Test - void testGetHouseRooms() { - // Given: Mock 데이터 생성 - Room mockRoom1 = createMockRoom(1L, "1A", "책상#침대#옷장", 2, 1, "https://example.com/room1.jpg https://example.com/room1-2.jpg"); - Room mockRoom2 = createMockRoom(2L, "2A", "책상#침대#의자", 1, 1, "https://example.com/room2.jpg"); - - List mockRooms = List.of(mockRoom1, mockRoom2); - - // When: 변환 로직 호출 - List roomDtos = mockRooms.stream() - .sorted(Comparator.comparing(Room::getId)) - .map(room -> RoomDetailsResponseDto.Room.builder() - .roomId(room.getId()) - .name(room.getName()) - .facility(Arrays.asList(room.getFacility().split("#"))) - .status(room.getStatus() != room.getOccupancyType()) - .mainImageUrl(Arrays.asList(room.getMainImgUrl().split(" "))) - .build()) - .toList(); - - // Then: 변환 결과 검증 - assertEquals(2, roomDtos.size()); - - // Room 1 검증 - RoomDetailsResponseDto.Room roomDto1 = roomDtos.get(0); - assertEquals(1L, roomDto1.roomId()); - assertEquals("1A", roomDto1.name()); - assertEquals(List.of("책상", "침대", "옷장"), roomDto1.facility()); - assertTrue(roomDto1.status()); - assertEquals(List.of("https://example.com/room1.jpg", "https://example.com/room1-2.jpg"), roomDto1.mainImageUrl()); - - // Room 2 검증 - RoomDetailsResponseDto.Room roomDto2 = roomDtos.get(1); - assertEquals(2L, roomDto2.roomId()); - assertEquals("2A", roomDto2.name()); - assertEquals(List.of("책상", "침대", "의자"), roomDto2.facility()); - assertFalse(roomDto2.status()); - assertEquals(List.of("https://example.com/room2.jpg"), roomDto2.mainImageUrl()); - } - - private Room createMockRoom(Long roomId, String name, String facility, int occupancyType, int status, String mainImgUrl) { - Room room = new Room(); - room.setId(roomId); - room.setName(name); - room.setFacility(facility); - room.setOccupancyType(occupancyType); - room.setStatus(status); - room.setMainImgUrl(mainImgUrl); - return room; - } -} diff --git a/producer/src/test/java/domain/service/MapServiceTest.java b/producer/src/test/java/domain/service/MapServiceTest.java deleted file mode 100644 index 0ed420f..0000000 --- a/producer/src/test/java/domain/service/MapServiceTest.java +++ /dev/null @@ -1,124 +0,0 @@ -package domain.service; - -import entity.*; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import server.producer.domain.dto.request.FilterRequestDto; -import server.producer.domain.dto.response.FilterResponseDto; -import server.producer.domain.repository.FilterRepository; -import server.producer.domain.service.MapService; - -import java.time.LocalDate; -import java.util.*; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -public class MapServiceTest { - @Mock - private FilterRepository filterRepository; - - @BeforeEach - void setUp() { - MockitoAnnotations.openMocks(this); - } - - @InjectMocks - private MapService mapService; - - @Test - void testsearchProperties(){ - // HouseRepository 동작 설정 - House house1 = createHouse(1L, "#차분한", "서대문구 대현동", "자이아파트", true, 6, "https://example.com/images/house1.jpg"); - House house2 = createHouse(2L, "#차분한", "서대문구 대현동", "자이아파트", true, 6, "https://example.com/images/house2.jpg"); - - // given - List genderPolicy = new ArrayList(); - genderPolicy.add("여성전용"); - genderPolicy.add("남성전용"); - List occp = List.of("1인실", "2인실"); - List contractPeiods = List.of(6,12); - Long userId = 1L; - FilterRequestDto requestDto = new FilterRequestDto( - "서울특별시 서대문구 대현동 11-1", - List.of("#차분한"), - new FilterRequestDto.Range(0, 1000), - new FilterRequestDto.Range(0,1000), - genderPolicy, - null, - occp, - contractPeiods - ); - - // Mock - when(filterRepository.findFilteredHouses(any())).thenReturn(List.of(house1, house2)); - - // when - FilterResponseDto result = mapService.searchProperties(requestDto, userId); - - //then - FilterResponseDto.HouseMapDto result1 = result.houses().get(0); - assertEquals(result.houses().size(), 2); - assertEquals(result1.location(), "서대문구 대현동"); - assertEquals(result1.genderPolicy(), "여성전용"); - assertEquals(result1.moodTag(), "#차분한"); - assertEquals(result1.contractTerm(), 6); - } - - private House createHouse(Long id, String moodTag, - String location, String locationDescription, - boolean isPinned, int contractTerm, String mainImgUrl) { - House house = new House(); - house.setId(id); - house.setName("Sample House " + id); - house.setLatitude(37.5665 + id * 0.001); // 예제 좌표 - house.setLongitude(126.978 + id * 0.001); // 예제 좌표 - house.setRoomMood("Cozy"); - house.setGroundRule("No smoking"); - house.setLocation(location); - house.setLocationDescription(locationDescription); - house.setMoodTag(moodTag); - house.setSubMoodTag("#추가태그"); - house.setGenderPolicy(GenderPolicyType.여성전용); // Enum 변환 - house.setMainImgUrl(mainImgUrl); - house.setMainImgDescription("Main image of house " + id); - house.setFacilityImgUrl("https://example.com/images/facility" + id + ".jpg"); - house.setFacilityImgDescription("Facility image of house " + id); - house.setContractTerm(contractTerm); - house.setSafetyLivingFacility("소화기"); - house.setKitchenFacility("냉장고"); - - // Room 생성 및 추가 - List rooms = new ArrayList<>(); - for (int i = 0; i < 3; i++) { - Room room = new Room(); - room.setId((id * 10) + i); // 유니크한 Room ID - room.setHouse(house); - room.setName("Room " + (i + 1)); - room.setMonthlyRent(300000 + (i * 50000)); - room.setDeposit(1000000 + (i * 1000000)); - room.setOccupancyType(i + 1); - room.setStatus(0); // 활성 상태 - room.setMainImgUrl("https://example.com/images/room" + ((id * 10) + i) + ".jpg"); - room.setManagementFee("100000"); - rooms.add(room); - } - house.setRooms(rooms); - // Pin 생성 및 추가 - if (isPinned) { - Pin pin = new Pin(); - pin.setId(id); - pin.setHouse(house); - User user = new User(); - user.setId(1L); // Mock user - user.setName("Test User"); - pin.setUser(user); - house.setPins(List.of(pin)); - } - return house; - } -} diff --git a/producer/src/test/java/domain/service/RoomServiceTest.java b/producer/src/test/java/domain/service/RoomServiceTest.java deleted file mode 100644 index 60fa651..0000000 --- a/producer/src/test/java/domain/service/RoomServiceTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package domain.service; - -public class RoomServiceTest { -} diff --git a/producer/src/test/java/domain/service/UserServiceTest.java b/producer/src/test/java/domain/service/UserServiceTest.java deleted file mode 100644 index 2c1cd66..0000000 --- a/producer/src/test/java/domain/service/UserServiceTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package domain.service; - -import entity.*; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import server.producer.domain.dto.response.HomeInfoResponseDto; -import server.producer.domain.repository.HouseRepository; -import server.producer.domain.repository.RecentlyViewedHouseRepository; -import server.producer.domain.repository.UserRepository; -import server.producer.domain.service.UserService; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.when; - -import entity.User; -import server.producer.domain.dto.response.MyPageResponseDto; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -public class UserServiceTest { - @Mock - private UserRepository userRepository; - - @Mock - private RecentlyViewedHouseRepository recentlyViewedHouseRepository; - - @Mock - private HouseRepository houseRepository; - - @BeforeEach - void setUp() { - MockitoAnnotations.openMocks(this); - } - - @InjectMocks - private UserService userService; - - @Test - void testGetMyPage() { - // Given - Long userId = 1L; - User mockUser = createUserWithHousesAndRooms(userId); - - when(userRepository.findUserWithRecentlyViewedHouses(userId)).thenReturn(Optional.of(mockUser)); - - // When - MyPageResponseDto response = userService.getMyPage(userId); - - // Then - assertNotNull(response); - assertEquals("Test User 1", response.nickname()); // nickname 필드가 기대값과 일치 - } - - @Test - void getUserInfoAndRecentlyViewedHouse(){ - //given - Long userId = 1L; - User user = createUserWithHousesAndRooms(userId); - - when(userRepository.findUserWithRecentlyViewedHouses(anyLong())) - .thenReturn(Optional.of(user)); - when(recentlyViewedHouseRepository.findByUserIdOrderByViewedAtDesc(user.getId())) - .thenReturn(user.getRecentlyViewedHouses().stream().toList()); - - - //when - HomeInfoResponseDto result = userService.getUserInfoAndRecentlyViewedHouse(userId); - HomeInfoResponseDto.RecentlyViewedHouseDto resultHouse = result.recentlyViewedHouses().get(0); - - // then - assertEquals("유저동", result.location()); - assertEquals(2, result.recentlyViewedHouses().size()); - assertEquals(1L, resultHouse.houseId()); - assertEquals("서대문구 대현동", resultHouse.location()); - assertEquals(12, resultHouse.contractTerm()); - assertEquals("https://example.com/images/house" + 1 + ".jpg", resultHouse.mainImgUrl()); - assertEquals("#차분한", resultHouse.moodTag()); - } - - private User createUserWithHousesAndRooms(Long userId) { - // User 생성 - User user = new User(); - user.setId(userId); - user.setName("Test User " + userId); - user.setLocation("서대문구 유저동"); - - // RecentlyViewedHouse 리스트 생성 - List recentlyViewedHouses = new ArrayList<>(); - - for (long houseId = 1; houseId <= 2; houseId++) { // 두 개의 House 생성 - // House 생성 - House house = new House(); - house.setId(houseId); - house.setName("Sample House " + houseId); - house.setLatitude(37.5665 + houseId * 0.001); // 예제 좌표 - house.setLongitude(126.978 + houseId * 0.001); // 예제 좌표 - house.setRoomMood("Cozy"); - house.setGroundRule("No smoking"); - house.setLocation("서대문구 대현동"); - house.setLocationDescription("자이아파트 " + houseId); - house.setMoodTag("#차분한"); - house.setSubMoodTag("#추가태그"); - house.setGenderPolicy(GenderPolicyType.남녀공용); - house.setMainImgUrl("https://example.com/images/house" + houseId + ".jpg"); - house.setMainImgDescription("Main image of house " + houseId); - house.setFacilityImgUrl("https://example.com/images/facility" + houseId + ".jpg"); - house.setFacilityImgDescription("Facility image of house " + houseId); - house.setContractTerm(12); - house.setSafetyLivingFacility("소화기"); - house.setKitchenFacility("냉장고"); - - // Room 리스트 생성 - List rooms = new ArrayList<>(); - for (int i = 1; i <= 3; i++) { // 각 House에 3개의 Room 생성 - Room room = new Room(); - room.setId(houseId * 10 + i); // 유니크한 Room ID - room.setHouse(house); - room.setName("Room " + i); - room.setMonthlyRent(300000 + i * 50000); - room.setDeposit(1000000 + i * 100000); - room.setOccupancyType(i % 2 == 0 ? 2 : 1); // 1인실 또는 2인실 - room.setStatus(1); // 활성 상태 - room.setMainImgUrl("https://example.com/images/room" + (houseId * 10 + i) + ".jpg"); - room.setManagementFee("100000"); - rooms.add(room); - } - house.setRooms(rooms); - - // RecentlyViewedHouse 생성 - RecentlyViewedHouse recentlyViewedHouse = new RecentlyViewedHouse(); - recentlyViewedHouse.setId(houseId); - recentlyViewedHouse.setViewedAt(LocalDateTime.now().minusDays(houseId)); // 최근 조회 날짜 - recentlyViewedHouse.setUser(user); - recentlyViewedHouse.setHouse(house); - - recentlyViewedHouses.add(recentlyViewedHouse); - } - - // User에 RecentlyViewedHouse 리스트 추가 - user.setRecentlyViewedHouses(recentlyViewedHouses); - - return user; - } -} From a08fcf60154d08abc49899c43af5d672fc3c4ed8 Mon Sep 17 00:00:00 2001 From: mr8356 Date: Tue, 1 Jul 2025 00:16:07 +0900 Subject: [PATCH 6/7] fix response empty list --- .../domain/controller/MapController.java | 1 + .../external/service/QueueServiceTest.java | 71 ------------------- 2 files changed, 1 insertion(+), 71 deletions(-) delete mode 100644 producer/src/test/java/external/service/QueueServiceTest.java diff --git a/producer/src/main/java/server/producer/domain/controller/MapController.java b/producer/src/main/java/server/producer/domain/controller/MapController.java index 2864c76..58732a5 100644 --- a/producer/src/main/java/server/producer/domain/controller/MapController.java +++ b/producer/src/main/java/server/producer/domain/controller/MapController.java @@ -10,6 +10,7 @@ import server.producer.domain.dto.request.FilterRequestDto; import server.producer.domain.dto.response.FilterResponseDto; import server.producer.domain.service.MapService; +import java.util.ArrayList; @RestController @RequestMapping("/v1/maps") diff --git a/producer/src/test/java/external/service/QueueServiceTest.java b/producer/src/test/java/external/service/QueueServiceTest.java deleted file mode 100644 index dc6f510..0000000 --- a/producer/src/test/java/external/service/QueueServiceTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package external.service; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import dto.TourRequestDto; -import entity.GenderType; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.redis.core.StringRedisTemplate; -import server.producer.ProducerApplication; -import server.producer.external.service.redis.QueueService; - -import java.time.LocalDate; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -@SpringBootTest(classes = ProducerApplication.class) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -class QueueServiceTest { - - @Autowired - private StringRedisTemplate redisTemplate; - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private QueueService queueService; - - private final String queueName = "testQueue"; - - @BeforeEach - void setUp() { - redisTemplate.delete(queueName); - } - - @Test - void testSendMessage() throws JsonProcessingException { - // given - TourRequestDto message = createTourMessage(); - - // when - queueService.sendMessage(queueName, message); - - // then - // Redis에서 데이터 확인 - String storedMessage = redisTemplate.opsForList().leftPop(queueName); - assertNotNull(storedMessage, "Message should be stored in Redis"); - - // JSON 역직렬화로 데이터 검증 - TourRequestDto deserializedMessage = objectMapper.readValue(storedMessage, TourRequestDto.class); - assertEquals(message, deserializedMessage); - } - - TourRequestDto createTourMessage(){ - TourRequestDto message = TourRequestDto.builder() - .name("김루미") - .birth(LocalDate.of(2002,3,5)) - .gender(GenderType.남성.toString()) - .phoneNumber("01012345678") - .preferredDate(LocalDate.of(2025,1,11)) - .message("당신의 방에 관심이 많습니다") - .roomId(1L) - .houseId(1L).build(); - return message; - } -} \ No newline at end of file From 32cbcc9796e8e548eda055817806b00b8180b4cc Mon Sep 17 00:00:00 2001 From: mr8356 Date: Tue, 1 Jul 2025 00:41:44 +0900 Subject: [PATCH 7/7] fix status --- .../server/producer/domain/repository/FilterRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/producer/src/main/java/server/producer/domain/repository/FilterRepository.java b/producer/src/main/java/server/producer/domain/repository/FilterRepository.java index 89c712a..1b431fc 100644 --- a/producer/src/main/java/server/producer/domain/repository/FilterRepository.java +++ b/producer/src/main/java/server/producer/domain/repository/FilterRepository.java @@ -41,7 +41,7 @@ public List findFilteredHouses(FilterRequestDto filter) { filter.getMonthlyRentRange().getMin() * TENTHOUSAND, filter.getMonthlyRentRange().getMax() * TENTHOUSAND)); - predicates.add(cb.notEqual(room.get("status"), room.get("occupancyType"))); + // predicates.add(cb.notEqual(room.get("status"), room.get("occupancyType"))); // Optional 조건: moodTags (리스트, OR 조건) if (filter.getMoodTags() != null && !filter.getMoodTags().isEmpty()) {