From b3f344cc9dbcd8bf7293816163be7a5746533a53 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Sun, 8 Sep 2024 00:46:47 +0900 Subject: [PATCH 1/6] =?UTF-8?q?Feat=20:=20=EA=B2=BD=EB=A7=A4=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=EA=B0=80=20=EC=9E=84=EB=B0=95=ED=95=9C=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91=EC=9D=B8=20=EA=B2=BD=EB=A7=A4=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 경매 종료가 임박한 진행중인 경매 목록 조회 추가 미흡 : 성능 개선 못함, /auction으로 엔드포인트 합쳐야 하는데 못했음, 테스트쪽 리뷰 받아야 함. --- .../api/auction/AuctionController.java | 28 +++++---- .../auction/repository/AuctionRepository.java | 3 + .../support/AuctionCriteriaRepository.java | 3 + .../AuctionCriteriaRepositoryImpl.java | 18 ++++++ .../auction/service/AuctionService.java | 3 + .../auction/service/AuctionServiceImpl.java | 29 +++++++++ .../auction/api/AuctionControllerTest.java | 10 +++ .../repository/AuctionRepositoryTest.java | 38 ++++++++++++ .../service/AuctionServiceImplTest.java | 61 +++++++++++++++++++ 9 files changed, 182 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index 206c94a1..23115c84 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -82,17 +82,23 @@ public ResponseEntity> getAuctionStatus(@PathVariable Long auc // } // return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, allAuctions)); // } -@GetMapping -@Operation(summary = "Get all auctions", description = "Retrieves all auctions.") -@ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") -public ResponseEntity>> getAllAuctions( - @RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, - @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory -) { - List auctions = auctionService.getAuctionsByFilter(productCategory,auctionCategory); - return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); -} - + @GetMapping + @Operation(summary = "Get all auctions", description = "Retrieves all auctions.") + @ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") + public ResponseEntity>> getAllAuctions( + @RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, + @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory + ) { + List auctions = auctionService.getAuctionsByFilter(productCategory,auctionCategory); + return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); + } + @GetMapping("/ending-soon") + @Operation(summary = "Get all auctions ending Soon", description = "Retrieves all auctions.") + @ApiResponse(responseCode = "200",description = "All auctions retrieved successfully") + public ResponseEntity>> getAllAuctionsEndingSoon() { + List auctions = auctionService.getAuctionsByEndTimeBetweenOrderByEndTimeAsc(); + return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); + } @GetMapping("/{auctionId}") @Operation(summary = "Get auction by ID", description = "Retrieves auction details by its ID.") @ApiResponse(responseCode = "200", description = "Auction retrieved successfully") diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java index 712534d9..bf9db4e6 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java @@ -5,10 +5,12 @@ import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.repository.support.AuctionCriteriaRepository; import com.tasksprints.auction.domain.product.model.ProductCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -23,5 +25,6 @@ public interface AuctionRepository extends JpaRepository, Auction List findAuctionsByAuctionCategory(AuctionCategory auctionCategory); List findAuctionByProduct_Category(ProductCategory productCategory); + List findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java index a4bc26f4..f54991f1 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java @@ -2,12 +2,15 @@ import com.tasksprints.auction.domain.auction.model.Auction; import com.tasksprints.auction.domain.auction.model.AuctionCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.product.model.ProductCategory; +import java.time.LocalDateTime; import java.util.List; public interface AuctionCriteriaRepository { public List getAuctionsByFilters(ProductCategory productCategory, AuctionCategory category); + public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java index ed513409..82ceb16f 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java @@ -1,14 +1,17 @@ package com.tasksprints.auction.domain.auction.repository.support; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import com.tasksprints.auction.domain.auction.model.Auction; import com.tasksprints.auction.domain.auction.model.AuctionCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.model.QAuction; import com.tasksprints.auction.domain.product.model.ProductCategory; import com.tasksprints.auction.domain.product.model.QProduct; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; @RequiredArgsConstructor @@ -27,4 +30,19 @@ public List getAuctionsByFilters( ProductCategory productCategory, .fetch(); } + @Override + public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus) { + QAuction auction = QAuction.auction; + + BooleanExpression endTimeBetween = auction.endTime.between(now, next24Hours); + BooleanExpression statusEquals = auction.auctionStatus.eq(auctionStatus); + + return queryFactory + .selectFrom(auction) + .where(endTimeBetween.and(statusEquals)) + .orderBy(auction.endTime.asc()) + .fetch(); + } + + } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index b3af75e7..72dc15e9 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -19,4 +19,7 @@ public interface AuctionService { AuctionResponse getAuctionById(Long auctionId); List getAuctionsByAuctionCategory(AuctionRequest.AuctionCategoryParam param); List getAuctionsByFilter(AuctionRequest.ProductCategoryParam productCategoryParam, AuctionRequest.AuctionCategoryParam auctionCategoryParam); + + List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(); + List getAuctionsEndWith24Hours(); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index dcba6772..c6e07c0c 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -135,4 +136,32 @@ public List getAuctionsByFilter(AuctionRequest.ProductCategoryP .map(AuctionResponse::of) .toList(); } + + @Override + public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc() { + // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime next24Hours = now.plusHours(24); + + //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 + List foundAuctions = auctionRepository.findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(now, next24Hours, AuctionStatus.ACTIVE); + + return foundAuctions.stream() + .map(AuctionResponse::of) + .toList(); + } + + @Override + public List getAuctionsEndWith24Hours() { + // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime next24Hours = now.plusHours(24); + + //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 + List foundAuctions = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); + + return foundAuctions.stream() + .map(AuctionResponse::of) + .toList(); + } } \ No newline at end of file diff --git a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java index e99c80e8..d7db3905 100644 --- a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java +++ b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java @@ -132,6 +132,16 @@ public void testFindAuctionByUsingWrongAuctionCategory_Success() throws Exceptio .andExpect(status().isOk()) .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); } + @Test + @DisplayName("마감 기한이 24시간 이하로 남은 경매 목록 조회") + public void testFindAuctionsEndWithin24Hours_Success() throws Exception { + + /* + 테스트 코드 추가 + * */ + + } + @Test @DisplayName("입찰 제출 성공") public void testSubmitBid_Success() throws Exception { diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 546cc4ee..961e141a 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -122,6 +122,34 @@ public void testFindAllUsingFilter() { } + @Test + @DisplayName("경매 마감 시간까지 24시간 이하로 남은 경매 목록 조회") + public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { + //given + Auction auction1 = createAuction(seller, LocalDateTime.now().plusHours(21), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction2 = createAuction(seller, LocalDateTime.now().plusHours(22), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction3 = createAuction(seller, LocalDateTime.now().plusHours(23), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction4 = createAuction(seller, LocalDateTime.now().plusHours(48), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction5 = createAuction(seller, LocalDateTime.now().plusHours(20), AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + + auctionRepository.saveAll(List.of(auction1, auction2, auction3, auction4, auction5)); + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime next24Hours = LocalDateTime.now().plusHours(24); + // when + List result = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); + //then + assertThat(result).hasSize(3); + // 오름차순 정렬 되었는지 확인 + LocalDateTime previousEndTime = null; + for (Auction auction : result) { + if (previousEndTime != null) { + assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); + } + previousEndTime = auction.getEndTime(); + } + } + private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { return Auction.create( LocalDateTime.now(), @@ -132,4 +160,14 @@ private Auction createAuction(User seller, AuctionCategory category, AuctionStat seller ); } + private Auction createAuction(User seller,LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 8c5c204a..f4ac3a27 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -23,6 +23,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -351,6 +352,56 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { assertThat(actualAuctions).isEmpty(); } } + @Nested + @DisplayName("경매 마감 시간이 24시간 이하인 경매 목록 조회") + class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { + @Test + @DisplayName("경매 마감 임박 목록 조회 : 성공") + public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Success() { + //given + Auction auction1 = createAuction(seller, LocalDateTime.now().plusHours(23), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction2 = createAuction(seller, LocalDateTime.now().plusHours(22), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction3 = createAuction(seller, LocalDateTime.now().plusHours(21), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction4 = createAuction(seller, LocalDateTime.now().plusHours(48), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction5 = createAuction(seller, LocalDateTime.now().plusHours(20), AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime next24Hours = now.plusHours(24); + + List unsortedAuctions = List.of(auction1, auction2, auction3); + List expectedAuctions = unsortedAuctions.stream() + .sorted(Comparator.comparing(Auction::getEndTime)) + .toList(); + + List expectedResponses = expectedAuctions.stream() + .map(AuctionResponse::of) + .toList(); + //when +// when(auctionRepository.getAuctionsEndWith24Hours( +// now, +// next24Hours, +// AuctionStatus.ACTIVE) +// ).thenReturn(expectedAuctions); + + /* + 위의 코드를 아래 부분으로 작성했는데, LocalDateTime.now()를 사용하기 때문에, + stub 하기 전 LocalDateTime.now와 service메서드 안에서 넣은 인자 LocalDateTime.now 간에 시간 차이가 생겨, 인자 매칭 에러가 생겨 fail됐음 + 그래서 getAuctionsEndWith24Hours의 인자를 now에서 +- 1초 정도 오차이면 expectedAuction을 리턴하는 것을 의도했으나.. + 검색으로 알아본 것이라 확신이 없어 리뷰 필요.. + * */ + when(auctionRepository.getAuctionsEndWith24Hours( + argThat(current -> current.isAfter(now.minusSeconds(1)) && current.isBefore(now.plusSeconds(1))), + argThat(nextHours -> nextHours.isAfter(next24Hours.minusSeconds(1)) && nextHours.isBefore(next24Hours.plusSeconds(1)) ) , + eq(AuctionStatus.ACTIVE))).thenReturn(expectedAuctions); + + + List actualResponses = auctionService.getAuctionsEndWith24Hours(); + + //then + assertThat(actualResponses).isEqualTo(expectedResponses); + + } + } private Auction createAuction(Long auctionId, User seller, AuctionStatus status) { return Auction.builder() @@ -363,4 +414,14 @@ private Auction createAuction(Long auctionId, User seller, AuctionStatus status) .seller(seller) .build(); } + private Auction createAuction(User seller,LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } } From 1edfd44b4cec0fb16550996b72185f51d17362e7 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Sun, 8 Sep 2024 01:12:15 +0900 Subject: [PATCH 2/6] =?UTF-8?q?style=20:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=ED=84=B0=20=EB=B9=8C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 포맷터 빌드 --- .../api/auction/AuctionController.java | 3 +- .../repository/AuctionRepositoryTest.java | 48 +++++++++---------- .../service/AuctionServiceImplTest.java | 33 +++++-------- 3 files changed, 36 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index 8bc22903..5ea89c88 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -80,7 +80,8 @@ public ResponseEntity> getAuctionStatus(@PathVariable Long auc @GetMapping @Operation(summary = "Get all auctions", description = "Retrieves all auctions.") @ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctions(@RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory) { + public ResponseEntity>> getAllAuctions(@RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, + @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory) { List auctions = auctionService.getAuctionsByFilter(productCategory, auctionCategory); return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index e920679d..8e40921a 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -46,6 +46,28 @@ public void setUp() { userRepository.save(seller); } + private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + LocalDateTime.now().plusDays(7), + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } + + private Auction createAuction(User seller, LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } + @Test @DisplayName("사용자 ID로 경매 목록 조회") public void testFindAuctionsByUserId() { @@ -153,30 +175,4 @@ public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { } } - private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { - return Auction.create( - LocalDateTime.now(), - LocalDateTime.now().plusDays(7), - BigDecimal.valueOf(100.00), - category, - status, - seller - LocalDateTime.now(), - LocalDateTime.now().plusDays(7), - BigDecimal.valueOf(100.00), - category, - status, - seller - ); - } - private Auction createAuction(User seller,LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { - return Auction.create( - LocalDateTime.now(), - endTime, - BigDecimal.valueOf(100.00), - category, - status, - seller - ); - } } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index b3eb44db..be01a99e 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -69,6 +69,16 @@ private Auction createAuction(Long auctionId, User seller, AuctionStatus status) .seller(seller) .build(); } + private Auction createAuction(User seller, LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } @Nested @DisplayName("경매 생성 테스트") @@ -418,25 +428,6 @@ public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Suc } } - private Auction createAuction(Long auctionId, User seller, AuctionStatus status) { - return Auction.builder() - .id(auctionId) - .auctionCategory(AuctionCategory.PUBLIC_PAID) - .auctionStatus(status) - .startTime(LocalDateTime.now()) - .endTime(LocalDateTime.now().plusDays(7)) - .startingBid(BigDecimal.valueOf(100.00)) - .seller(seller) - .build(); - } - private Auction createAuction(User seller,LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { - return Auction.create( - LocalDateTime.now(), - endTime, - BigDecimal.valueOf(100.00), - category, - status, - seller - ); - } + + } From f3f95cc462628114b046edbacac9c8567fd60129 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:45:37 +0900 Subject: [PATCH 3/6] =?UTF-8?q?Refactor=20:=20=EB=A7=88=EA=B0=90=EC=9D=B4?= =?UTF-8?q?=20=EC=96=BC=EB=A7=88=20=EC=95=88=EB=82=A8=EC=9D=80=20=EA=B2=BD?= =?UTF-8?q?=EB=A7=A4=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EC=97=90=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 마감이 얼마 안 남은 경매 목록 조회 메서드의 파라미터가 없던 것에서 now, next24Hours 추가 --- .../auction/api/auction/AuctionController.java | 5 +++-- .../domain/auction/service/AuctionService.java | 5 +++-- .../domain/auction/service/AuctionServiceImpl.java | 12 ++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index 5ea89c88..b4282ad8 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; @RestController @@ -89,8 +90,8 @@ public ResponseEntity>> getAllAuctions(@RequestP @GetMapping("/ending-soon") @Operation(summary = "Get all auctions ending Soon", description = "Retrieves all auctions.") @ApiResponse(responseCode = "200",description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctionsEndingSoon() { - List auctions = auctionService.getAuctionsByEndTimeBetweenOrderByEndTimeAsc(); + public ResponseEntity>> getAllAuctionsEndingSoon(@RequestParam("now") LocalDateTime now, @RequestParam("nextHours") LocalDateTime next24Hours) { + List auctions = auctionService.getAuctionsByEndTimeBetweenOrderByEndTimeAsc(now, next24Hours); return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); } @GetMapping("/{auctionId}") diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index 03a6bff7..d923a19b 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -3,6 +3,7 @@ import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; +import java.time.LocalDateTime; import java.util.List; /** @@ -27,6 +28,6 @@ public interface AuctionService { List getAuctionsByFilter(AuctionRequest.ProductCategoryParam productCategoryParam, AuctionRequest.AuctionCategoryParam auctionCategoryParam); - List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(); - List getAuctionsEndWith24Hours(); + List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours); + List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index 864e387e..776f96c2 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -139,10 +139,10 @@ public List getAuctionsByFilter(AuctionRequest.ProductCategoryP } @Override - public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc() { + public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours) { // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime next24Hours = now.plusHours(24); + //LocalDateTime now = LocalDateTime.now(); + //LocalDateTime next24Hours = now.plusHours(24); //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 List foundAuctions = auctionRepository.findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(now, next24Hours, AuctionStatus.ACTIVE); @@ -153,10 +153,10 @@ public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc() { } @Override - public List getAuctionsEndWith24Hours() { + public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours) { // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime next24Hours = now.plusHours(24); + // LocalDateTime now = LocalDateTime.now(); + // LocalDateTime next24Hours = now.plusHours(24); //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 List foundAuctions = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); From 066a43d3461bb463bdfb5c78ec44d8a8b9f28c40 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:48:00 +0900 Subject: [PATCH 4/6] =?UTF-8?q?Test:=20=EB=A7=88=EA=B0=90=20=EA=B8=B0?= =?UTF-8?q?=ED=95=9C=20=EC=96=BC=EB=A7=88=20=EC=95=88=20=EB=82=A8=EC=9D=80?= =?UTF-8?q?=20=EA=B2=BD=EB=A7=A4=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 테스트 케이스의 LocalDateTime을 고정 2. 테스트 대상이 아닌 파라미터는 테스트 픽스처에 넣음 3. assertAll로 컬렉션인 경우 끝까지 assertion하고 결과를 보여주도록 함 --- .../repository/AuctionRepositoryTest.java | 61 +++++++++-------- .../service/AuctionServiceImplTest.java | 68 +++++++------------ 2 files changed, 60 insertions(+), 69 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 8e40921a..f5eaa4dc 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -20,6 +20,7 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertTrue; @DataJpaTest @@ -48,23 +49,23 @@ public void setUp() { private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { return Auction.create( - LocalDateTime.now(), - LocalDateTime.now().plusDays(7), - BigDecimal.valueOf(100.00), - category, - status, - seller + LocalDateTime.now(), + LocalDateTime.now().plusDays(7), + BigDecimal.valueOf(100.00), + category, + status, + seller ); } - private Auction createAuction(User seller, LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { return Auction.create( - LocalDateTime.now(), - endTime, - BigDecimal.valueOf(100.00), - category, - status, - seller + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + AuctionCategory.PUBLIC_PAID, + status, + seller ); } @@ -151,28 +152,34 @@ public void testFindAllUsingFilter() { @DisplayName("경매 마감 시간까지 24시간 이하로 남은 경매 목록 조회") public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { //given - Auction auction1 = createAuction(seller, LocalDateTime.now().plusHours(21), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction2 = createAuction(seller, LocalDateTime.now().plusHours(22), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction3 = createAuction(seller, LocalDateTime.now().plusHours(23), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction4 = createAuction(seller, LocalDateTime.now().plusHours(48), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction5 = createAuction(seller, LocalDateTime.now().plusHours(20), AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); + LocalDateTime next24Hours = fixedNow.plusHours(24); + + Auction auction1 = createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE); + Auction auction2 = createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE); + Auction auction3 = createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE); + Auction auction4 = createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE); + Auction auction5 = createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING); auctionRepository.saveAll(List.of(auction1, auction2, auction3, auction4, auction5)); - LocalDateTime now = LocalDateTime.now(); - LocalDateTime next24Hours = LocalDateTime.now().plusHours(24); // when - List result = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); + List result = auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE); + //then assertThat(result).hasSize(3); - // 오름차순 정렬 되었는지 확인 - LocalDateTime previousEndTime = null; - for (Auction auction : result) { - if (previousEndTime != null) { - assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); + + assertAll("endTime을 기준으로 오름차순 정렬이 되었는지 확인", + () -> { + LocalDateTime previousEndTime = null; + for (Auction auction : result) { + if (previousEndTime != null) { + assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); + } + previousEndTime = auction.getEndTime(); } - previousEndTime = auction.getEndTime(); } + ); } } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index be01a99e..3e96e3d6 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -69,16 +69,18 @@ private Auction createAuction(Long auctionId, User seller, AuctionStatus status) .seller(seller) .build(); } - private Auction createAuction(User seller, LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { - return Auction.create( - LocalDateTime.now(), - endTime, - BigDecimal.valueOf(100.00), - category, - status, - seller - ); - } + + private Auction createAuction(Long auctionId, LocalDateTime endTime, AuctionStatus status) { + return Auction.builder() + .id(auctionId) + .auctionCategory(AuctionCategory.PUBLIC_PAID) + .auctionStatus(status) + .startTime(LocalDateTime.now()) + .endTime(endTime) + .startingBid(BigDecimal.valueOf(100.00)) + .seller(seller) + .build(); + } @Nested @DisplayName("경매 생성 테스트") @@ -377,6 +379,7 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { assertThat(actualAuctions).isEmpty(); } } + @Nested @DisplayName("경매 마감 시간이 24시간 이하인 경매 목록 조회") class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { @@ -384,50 +387,31 @@ class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { @DisplayName("경매 마감 임박 목록 조회 : 성공") public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Success() { //given - Auction auction1 = createAuction(seller, LocalDateTime.now().plusHours(23), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction2 = createAuction(seller, LocalDateTime.now().plusHours(22), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction3 = createAuction(seller, LocalDateTime.now().plusHours(21), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction4 = createAuction(seller, LocalDateTime.now().plusHours(48), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction5 = createAuction(seller, LocalDateTime.now().plusHours(20), AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); + LocalDateTime next24Hours = fixedNow.plusHours(24); - LocalDateTime now = LocalDateTime.now(); - LocalDateTime next24Hours = now.plusHours(24); + Auction auction1 = createAuction(1L, fixedNow.plusHours(23), AuctionStatus.ACTIVE); + Auction auction2 = createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE); + Auction auction3 = createAuction(3L, fixedNow.plusHours(21), AuctionStatus.ACTIVE); List unsortedAuctions = List.of(auction1, auction2, auction3); List expectedAuctions = unsortedAuctions.stream() - .sorted(Comparator.comparing(Auction::getEndTime)) - .toList(); + .sorted(Comparator.comparing(Auction::getEndTime)) + .toList(); List expectedResponses = expectedAuctions.stream() - .map(AuctionResponse::of) - .toList(); - //when -// when(auctionRepository.getAuctionsEndWith24Hours( -// now, -// next24Hours, -// AuctionStatus.ACTIVE) -// ).thenReturn(expectedAuctions); - - /* - 위의 코드를 아래 부분으로 작성했는데, LocalDateTime.now()를 사용하기 때문에, - stub 하기 전 LocalDateTime.now와 service메서드 안에서 넣은 인자 LocalDateTime.now 간에 시간 차이가 생겨, 인자 매칭 에러가 생겨 fail됐음 - 그래서 getAuctionsEndWith24Hours의 인자를 now에서 +- 1초 정도 오차이면 expectedAuction을 리턴하는 것을 의도했으나.. - 검색으로 알아본 것이라 확신이 없어 리뷰 필요.. - * */ - when(auctionRepository.getAuctionsEndWith24Hours( - argThat(current -> current.isAfter(now.minusSeconds(1)) && current.isBefore(now.plusSeconds(1))), - argThat(nextHours -> nextHours.isAfter(next24Hours.minusSeconds(1)) && nextHours.isBefore(next24Hours.plusSeconds(1)) ) , - eq(AuctionStatus.ACTIVE))).thenReturn(expectedAuctions); - - - List actualResponses = auctionService.getAuctionsEndWith24Hours(); + .map(AuctionResponse::of) + .toList(); + + when(auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE)).thenReturn(expectedAuctions); + List actualResponses = auctionService.getAuctionsEndWith24Hours(fixedNow, next24Hours); //then assertThat(actualResponses).isEqualTo(expectedResponses); + } } - } From 2499cc324a3861b2e248df611aa0ec90739727de Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Mon, 9 Sep 2024 00:45:29 +0900 Subject: [PATCH 5/6] =?UTF-8?q?test=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. createAuction 중복 코드 리스트로 수정 2. LocalDateTime.now()를 고정 시간으로 수정 3. AuctionServiceImplTest 중복 코드 삭제 --- .../repository/AuctionRepositoryTest.java | 20 ++++++++++--------- .../service/AuctionServiceImplTest.java | 18 +++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index f5eaa4dc..953e3d4b 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -49,8 +49,8 @@ public void setUp() { private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { return Auction.create( - LocalDateTime.now(), - LocalDateTime.now().plusDays(7), + LocalDateTime.of(2024, 8, 1, 10, 0), + LocalDateTime.of(2024, 9, 1, 10, 0), BigDecimal.valueOf(100.00), category, status, @@ -60,7 +60,7 @@ private Auction createAuction(User seller, AuctionCategory category, AuctionStat private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { return Auction.create( - LocalDateTime.now(), + LocalDateTime.of(2024, 8, 1, 10, 0), endTime, BigDecimal.valueOf(100.00), AuctionCategory.PUBLIC_PAID, @@ -155,13 +155,15 @@ public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); LocalDateTime next24Hours = fixedNow.plusHours(24); - Auction auction1 = createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE); - Auction auction2 = createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE); - Auction auction3 = createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE); - Auction auction4 = createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE); - Auction auction5 = createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING); + List auctions = List.of( + createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE), + createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE), + createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE), + createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE), + createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING) + ); - auctionRepository.saveAll(List.of(auction1, auction2, auction3, auction4, auction5)); + auctionRepository.saveAll(auctions); // when List result = auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE); diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 3e96e3d6..4bbbad41 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -63,8 +63,8 @@ private Auction createAuction(Long auctionId, User seller, AuctionStatus status) .id(auctionId) .auctionCategory(AuctionCategory.PUBLIC_PAID) .auctionStatus(status) - .startTime(LocalDateTime.now()) - .endTime(LocalDateTime.now().plusDays(7)) + .startTime(LocalDateTime.of(2024, 8, 1, 10, 0)) + .endTime(LocalDateTime.of(2024, 9, 1, 10, 0)) .startingBid(BigDecimal.valueOf(100.00)) .seller(seller) .build(); @@ -75,7 +75,7 @@ private Auction createAuction(Long auctionId, LocalDateTime endTime, AuctionStat .id(auctionId) .auctionCategory(AuctionCategory.PUBLIC_PAID) .auctionStatus(status) - .startTime(LocalDateTime.now()) + .startTime(LocalDateTime.of(2024, 8, 1, 10, 0)) .endTime(endTime) .startingBid(BigDecimal.valueOf(100.00)) .seller(seller) @@ -390,14 +390,10 @@ public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Suc LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); LocalDateTime next24Hours = fixedNow.plusHours(24); - Auction auction1 = createAuction(1L, fixedNow.plusHours(23), AuctionStatus.ACTIVE); - Auction auction2 = createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE); - Auction auction3 = createAuction(3L, fixedNow.plusHours(21), AuctionStatus.ACTIVE); - - List unsortedAuctions = List.of(auction1, auction2, auction3); - List expectedAuctions = unsortedAuctions.stream() - .sorted(Comparator.comparing(Auction::getEndTime)) - .toList(); + List expectedAuctions = List.of(createAuction(1L, fixedNow.plusHours(21), AuctionStatus.ACTIVE), + createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE), + createAuction(3L, fixedNow.plusHours(23), AuctionStatus.ACTIVE) + ); List expectedResponses = expectedAuctions.stream() .map(AuctionResponse::of) From a70040ef1440945b4ec9e411078c08bb12bf5d22 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:07:02 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor=20:=20endingSoon=20->=20/auction?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=ED=95=84=ED=84=B0=EB=A1=9C=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=ED=95=A9=EC=B9=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1: /auction에서 검색 조건별로 경매 목록을 조회한다. 미흡 : 파라미터를 SearchCondition이라는 DTO로 받아서 기존 테스트 다 깨져서 수정해야 함, 변경점에 대한 테스트 코드 없음. --- .../api/auction/AuctionController.java | 13 +- .../auction/dto/request/AuctionRequest.java | 20 +++ .../domain/auction/model/AuctionStatus.java | 10 +- .../support/AuctionCriteriaRepository.java | 7 +- .../AuctionCriteriaRepositoryImpl.java | 10 +- .../auction/service/AuctionService.java | 4 +- .../auction/service/AuctionServiceImpl.java | 21 ++- .../repository/AuctionRepositoryTest.java | 130 +++++++++--------- .../service/AuctionServiceImplTest.java | 90 ++++++------ 9 files changed, 177 insertions(+), 128 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index b4282ad8..04db8c8d 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -20,7 +20,6 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; @RestController @@ -81,19 +80,11 @@ public ResponseEntity> getAuctionStatus(@PathVariable Long auc @GetMapping @Operation(summary = "Get all auctions", description = "Retrieves all auctions.") @ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctions(@RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, - @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory) { - List auctions = auctionService.getAuctionsByFilter(productCategory, auctionCategory); + public ResponseEntity>> getAllAuctions(@RequestBody AuctionRequest.SearchCondition searchCondition) { + List auctions = auctionService.getAuctionsByFilter(searchCondition); return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); } - @GetMapping("/ending-soon") - @Operation(summary = "Get all auctions ending Soon", description = "Retrieves all auctions.") - @ApiResponse(responseCode = "200",description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctionsEndingSoon(@RequestParam("now") LocalDateTime now, @RequestParam("nextHours") LocalDateTime next24Hours) { - List auctions = auctionService.getAuctionsByEndTimeBetweenOrderByEndTimeAsc(now, next24Hours); - return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); - } @GetMapping("/{auctionId}") @Operation(summary = "Get auction by ID", description = "Retrieves auction details by its ID.") @ApiResponse(responseCode = "200", description = "Auction retrieved successfully") diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java index 4b262095..a2020db4 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java @@ -43,4 +43,24 @@ public ProductCategoryParam(String productCategory) { this.productCategory = ProductCategory.fromDisplayName(productCategory); } } + + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class AuctionStatusParam { + AuctionStatus auctionStatus; + + public AuctionStatusParam(String auctionStatus) { + this.auctionStatus = AuctionStatus.fromDisplayName(auctionStatus); + } + + } + @Getter + @AllArgsConstructor + public static class SearchCondition{ + String auctionCategory; + String productCategory; + LocalDateTime endTime; + String auctionStatus; + } } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java b/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java index 8401f93b..7b9cda2d 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java @@ -4,5 +4,13 @@ public enum AuctionStatus { PENDING, ACTIVE, CLOSED, - CANCELED + CANCELED; + + public static AuctionStatus fromDisplayName(String auctionStatus) { + try { + return AuctionStatus.valueOf(auctionStatus.toUpperCase()); // 대문자로 변환하여 비교 + } catch (IllegalArgumentException e) { + return AuctionStatus.ACTIVE; // 유효하지 않은 값일 경우 기본값으로 ACTIVE 반환 + } + } } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java index f54991f1..2458d84f 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java @@ -6,11 +6,16 @@ import com.tasksprints.auction.domain.product.model.ProductCategory; +import java.time.Duration; import java.time.LocalDateTime; import java.util.List; public interface AuctionCriteriaRepository { public List getAuctionsByFilters(ProductCategory productCategory, - AuctionCategory category); + AuctionCategory category, + LocalDateTime now, + LocalDateTime endTime, + AuctionStatus status); + //삭제해야 함 public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java index 9c899715..75ecd309 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java @@ -20,7 +20,10 @@ public class AuctionCriteriaRepositoryImpl implements AuctionCriteriaRepository private final JPAQueryFactory queryFactory; public List getAuctionsByFilters(ProductCategory productCategory, - AuctionCategory category + AuctionCategory category, + LocalDateTime now, + LocalDateTime endTime, + AuctionStatus status ) { QAuction auction = QAuction.auction; QProduct product = QProduct.product; @@ -28,10 +31,15 @@ public List getAuctionsByFilters(ProductCategory productCategory, .leftJoin(auction.product, product) // Auction과 Product 조인 .where(category != null ? auction.auctionCategory.eq(category) : null) .where(productCategory != null ? product.category.eq(productCategory) : null) // ProductCategory 필터 + .where((now != null && endTime != null) ? auction.endTime.between(now, endTime) : null) + .where(status != null ? auction.auctionStatus.eq(status) : null) + // orderBy는 성능 이슈로 일단 보류 +// .orderBy(auction.endTime.asc()) .fetch(); } + @Deprecated @Override public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus) { QAuction auction = QAuction.auction; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index d923a19b..35d63fd5 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -26,8 +26,10 @@ public interface AuctionService { List getAuctionsByAuctionCategory(AuctionRequest.AuctionCategoryParam param); - List getAuctionsByFilter(AuctionRequest.ProductCategoryParam productCategoryParam, AuctionRequest.AuctionCategoryParam auctionCategoryParam); + List getAuctionsByFilter(AuctionRequest.SearchCondition searchCondition); + @Deprecated List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours); + @Deprecated List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index 776f96c2..64187cff 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -6,6 +6,7 @@ import com.tasksprints.auction.domain.auction.exception.AuctionNotFoundException; import com.tasksprints.auction.domain.auction.exception.InvalidAuctionTimeException; import com.tasksprints.auction.domain.auction.model.Auction; +import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.repository.AuctionRepository; import com.tasksprints.auction.domain.user.exception.UserNotFoundException; @@ -128,16 +129,29 @@ public List getAuctionsByAuctionCategory(AuctionRequest.Auction * NULL 안정성 보장을 해줬음 **/ @Override - public List getAuctionsByFilter(AuctionRequest.ProductCategoryParam productCategoryParam, AuctionRequest.AuctionCategoryParam auctionCategoryParam) { + public List getAuctionsByFilter(AuctionRequest.SearchCondition searchCondition) { + LocalDateTime now = null; + //now는 endTime이 SeachCondition에 들어왔을 때만 값이 있어야 한다. (현재 시각 ~ User가 정한 시각까지 경매 목록 조회) + if (searchCondition.getEndTime() != null) { + now = LocalDateTime.now(); + } + List foundAuctions = auctionRepository.getAuctionsByFilters( - productCategoryParam != null ? productCategoryParam.getProductCategory() : null, - auctionCategoryParam != null ? auctionCategoryParam.getAuctionCategory() : null); +// productCategoryParam != null ? productCategoryParam.getProductCategory() : null, +// auctionCategoryParam != null ? auctionCategoryParam.getAuctionCategory() : null, + searchCondition.getProductCategory() !=null ? new AuctionRequest.ProductCategoryParam(searchCondition.getProductCategory()).getProductCategory() : null, + searchCondition.getAuctionCategory() != null ? new AuctionRequest.AuctionCategoryParam(searchCondition.getAuctionCategory()).getAuctionCategory() : null, + now, + searchCondition.getEndTime() != null ? searchCondition.getEndTime(): null, + searchCondition.getAuctionStatus() != null ? new AuctionRequest.AuctionStatusParam(searchCondition.getAuctionStatus()).getAuctionStatus() : null + ); return foundAuctions.stream() .map(AuctionResponse::of) .toList(); } + @Deprecated @Override public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours) { // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 @@ -152,6 +166,7 @@ public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalD .toList(); } + @Deprecated @Override public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours) { // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 953e3d4b..7f59b917 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -58,16 +58,16 @@ private Auction createAuction(User seller, AuctionCategory category, AuctionStat ); } - private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { - return Auction.create( - LocalDateTime.of(2024, 8, 1, 10, 0), - endTime, - BigDecimal.valueOf(100.00), - AuctionCategory.PUBLIC_PAID, - status, - seller - ); - } +// private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { +// return Auction.create( +// LocalDateTime.of(2024, 8, 1, 10, 0), +// endTime, +// BigDecimal.valueOf(100.00), +// AuctionCategory.PUBLIC_PAID, +// status, +// seller +// ); +// } @Test @DisplayName("사용자 ID로 경매 목록 조회") @@ -109,25 +109,25 @@ public void testFindAll() { } - @Test - @DisplayName("경매 유형이 []인 경매 목록 조회") - public void testFindAuctionsByAuctionCategory() { - //given - Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); - Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - Auction auction3 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - - auctionRepository.save(auction1); - auctionRepository.save(auction2); - auctionRepository.save(auction3); - - //when - List auctions = auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID); - - //then - assertThat(auctions).hasSize(2); - assertThat(auctions).allMatch(auction -> auction.getAuctionCategory() == AuctionCategory.PUBLIC_PAID); - } +// @Test +// @DisplayName("경매 유형이 []인 경매 목록 조회") +// public void testFindAuctionsByAuctionCategory() { +// //given +// Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); +// Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); +// Auction auction3 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); +// +// auctionRepository.save(auction1); +// auctionRepository.save(auction2); +// auctionRepository.save(auction3); +// +// //when +// List auctions = auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID); +// +// //then +// assertThat(auctions).hasSize(2); +// assertThat(auctions).allMatch(auction -> auction.getAuctionCategory() == AuctionCategory.PUBLIC_PAID); +// } @Test @DisplayName("QueryDSL 필터를 통해서 경매 목록 조회") @@ -138,7 +138,7 @@ public void testFindAllUsingFilter() { auctionRepository.save(auction1); auctionRepository.save(auction2); - List auctions = auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_FREE); + List auctions = auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_FREE, null, null, null); log.info(auctions.toString()); assertThat(auctions).hasSize(1); @@ -148,40 +148,40 @@ public void testFindAllUsingFilter() { } - @Test - @DisplayName("경매 마감 시간까지 24시간 이하로 남은 경매 목록 조회") - public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { - //given - LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); - LocalDateTime next24Hours = fixedNow.plusHours(24); - - List auctions = List.of( - createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE), - createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE), - createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE), - createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE), - createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING) - ); - - auctionRepository.saveAll(auctions); - - // when - List result = auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE); - - //then - assertThat(result).hasSize(3); - - assertAll("endTime을 기준으로 오름차순 정렬이 되었는지 확인", - () -> { - LocalDateTime previousEndTime = null; - for (Auction auction : result) { - if (previousEndTime != null) { - assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); - } - previousEndTime = auction.getEndTime(); - } - } - ); - } +// @Test +// @DisplayName("경매 마감 시간까지 24시간 이하로 남은 경매 목록 조회") +// public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { +// //given +// LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); +// LocalDateTime next24Hours = fixedNow.plusHours(24); +// +// List auctions = List.of( +// createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE), +// createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE), +// createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE), +// createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE), +// createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING) +// ); +// +// auctionRepository.saveAll(auctions); +// +// // when +// List result = auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE); +// +// //then +// assertThat(result).hasSize(3); +// +// assertAll("endTime을 기준으로 오름차순 정렬이 되었는지 확인", +// () -> { +// LocalDateTime previousEndTime = null; +// for (Auction auction : result) { +// if (previousEndTime != null) { +// assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); +// } +// previousEndTime = auction.getEndTime(); +// } +// } +// ); +// } } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 4bbbad41..3f828c89 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -317,22 +317,22 @@ void testGetAuctionById_AuctionNotFound() { @Nested @DisplayName("경매 유형이 []인 경매 목록 조회") class GetAuctionsByAuctionCategoryTests { - @Test - @DisplayName("경매 유형 조회 : [성공]") - public void testGetAuctionsByAuctionCategory_Success() { - Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); - Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); - List expectedAuctions = List.of(auction1, auction2); - - when(auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); - List expectedResponses = expectedAuctions.stream() - .map(AuctionResponse::of) - .collect(Collectors.toList()); - - List actualAuctions = auctionService.getAuctionsByAuctionCategory(param); - assertThat(actualAuctions).isEqualTo(expectedResponses); - } +// @Test +// @DisplayName("경매 유형 조회 : [성공]") +// public void testGetAuctionsByAuctionCategory_Success() { +// Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); +// Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); +// AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); +// List expectedAuctions = List.of(auction1, auction2); +// +// when(auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); +// List expectedResponses = expectedAuctions.stream() +// .map(AuctionResponse::of) +// .collect(Collectors.toList()); +// +// List actualAuctions = auctionService.getAuctionsByAuctionCategory(param); +// assertThat(actualAuctions).isEqualTo(expectedResponses); +// } @Test @DisplayName("경매 유형 조회 : [성공] -Criteria 사용") @@ -342,7 +342,7 @@ public void testGetAuctionsByAuctionCategory_Success_Criteria() { AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); List expectedAuctions = List.of(auction1, auction2); - when(auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); + when(auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_PAID, null, null, null)).thenReturn(expectedAuctions); List expectedResponses = expectedAuctions.stream() .map(AuctionResponse::of) .toList(); @@ -380,34 +380,34 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { } } - @Nested - @DisplayName("경매 마감 시간이 24시간 이하인 경매 목록 조회") - class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { - @Test - @DisplayName("경매 마감 임박 목록 조회 : 성공") - public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Success() { - //given - LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); - LocalDateTime next24Hours = fixedNow.plusHours(24); - - List expectedAuctions = List.of(createAuction(1L, fixedNow.plusHours(21), AuctionStatus.ACTIVE), - createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE), - createAuction(3L, fixedNow.plusHours(23), AuctionStatus.ACTIVE) - ); - - List expectedResponses = expectedAuctions.stream() - .map(AuctionResponse::of) - .toList(); - - when(auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE)).thenReturn(expectedAuctions); - List actualResponses = auctionService.getAuctionsEndWith24Hours(fixedNow, next24Hours); - - //then - assertThat(actualResponses).isEqualTo(expectedResponses); - - - } - } +// @Nested +// @DisplayName("경매 마감 시간이 24시간 이하인 경매 목록 조회") +// class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { +// @Test +// @DisplayName("경매 마감 임박 목록 조회 : 성공") +// public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Success() { +// //given +// LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); +// LocalDateTime next24Hours = fixedNow.plusHours(24); +// +// List expectedAuctions = List.of(createAuction(1L, fixedNow.plusHours(21), AuctionStatus.ACTIVE), +// createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE), +// createAuction(3L, fixedNow.plusHours(23), AuctionStatus.ACTIVE) +// ); +// +// List expectedResponses = expectedAuctions.stream() +// .map(AuctionResponse::of) +// .toList(); +// +// when(auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE)).thenReturn(expectedAuctions); +// List actualResponses = auctionService.getAuctionsEndWith24Hours(fixedNow, next24Hours); +// +// //then +// assertThat(actualResponses).isEqualTo(expectedResponses); +// +// +// } +// } }