From 47c00aeeebbb254f605149e2fcf1137a8467f952 Mon Sep 17 00:00:00 2001 From: qkr10 Date: Fri, 18 Jul 2025 15:04:43 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=99=B8=EB=B6=80=EC=99=80=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=EB=90=98=EB=8A=94=20=ED=86=B5=ED=95=A9=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=8A=94=20=ED=8A=B9=EC=A0=95=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=EC=9D=B4=20=EC=9E=88=EC=9D=84=EB=95=8C?= =?UTF-8?q?=EB=A7=8C=20=EC=8B=A4=ED=96=89=ED=95=98=EA=B2=8C=20=EB=A7=8C?= =?UTF-8?q?=EB=93=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/gradle.yml | 2 +- .../CommonPresignedUrlControllerTest.java | 29 ++- .../service/EquipmentServiceTest.java | 175 ------------------ .../com/backend/server/util/S3ApiUtil.java | 22 +-- 4 files changed, 36 insertions(+), 192 deletions(-) delete mode 100644 src/test/java/com/backend/server/api/user/equipment/service/EquipmentServiceTest.java diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 4347f9dd..efc0a3cf 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -56,4 +56,4 @@ jobs: uses: gradle/actions/setup-gradle@v4 - name: Build with Gradle - run: ./gradlew build \ No newline at end of file + run: SPRING_PROFILES_ACTIVE=integration-test ./gradlew test \ No newline at end of file diff --git a/src/test/java/com/backend/server/api/common/s3/controller/CommonPresignedUrlControllerTest.java b/src/test/java/com/backend/server/api/common/s3/controller/CommonPresignedUrlControllerTest.java index 90b7c8dc..6d72aa02 100644 --- a/src/test/java/com/backend/server/api/common/s3/controller/CommonPresignedUrlControllerTest.java +++ b/src/test/java/com/backend/server/api/common/s3/controller/CommonPresignedUrlControllerTest.java @@ -7,11 +7,14 @@ import com.backend.server.config.ControllerTest; import com.backend.server.util.S3ApiUtil; import com.jayway.jsonpath.JsonPath; +import java.time.LocalDateTime; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.IfProfileValue; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit.jupiter.EnabledIf; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; @@ -26,11 +29,13 @@ class CommonPresignedUrlControllerTest { class Presigned_URL_API_는 { @Test - @IfProfileValue(name = "spring.profiles.active", value = "integration-test") + @EnabledIf(expression = "#{'${spring.profiles.active:default}' == 'integration-test'}", loadContext = true) void 파일_업로드가_가능한_URL을_응답한다() throws Exception { + /* presigned url 을 발급받습니다. */ //given - final String fileName = "asdf.txt"; - final String fileContent = "Hello World!"; + final String fileContent = LocalDateTime.now().toString(); + final String fileName = String.format("%s.txt", fileContent); + System.out.printf("file name : %s\tfile content : %s\n", fileName, fileContent); //when ResultActions result = mockMvc.perform(get("/api/s3/presigned-url") @@ -41,16 +46,30 @@ class Presigned_URL_API_는 { String responseJson = result.andReturn().getResponse().getContentAsString(); String presignedUrl = JsonPath.parse(responseJson).read("$.data", String.class); + /* presigned url 을 발급받습니다. */ + /* presigned url 로 파일이 잘 업로드 되는지 테스트 */ + //given s3ApiUtil.upload(presignedUrl, fileContent); try { - assertThat(s3ApiUtil.get(fileName)) + //when + ResponseEntity response = s3ApiUtil.get(fileName); + + //then + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.getBody()) .as("업로드한 파일 내용과 업로드된 파일 내용이 일치하는지 확인합니다.") .isEqualTo(fileContent); } finally { + // 테스트로 업로드한 파일을 삭제하고, 잘 삭제되었는지 확인합니다. s3ApiUtil.delete(fileName); + + assertThat(s3ApiUtil.get(fileName)) + .as("테스트용 파일이 삭제되었는지 확인합니다.") + .isNull(); } + /* presigned url 로 파일이 잘 업로드 되는지 테스트 */ } } } \ No newline at end of file diff --git a/src/test/java/com/backend/server/api/user/equipment/service/EquipmentServiceTest.java b/src/test/java/com/backend/server/api/user/equipment/service/EquipmentServiceTest.java deleted file mode 100644 index 09254852..00000000 --- a/src/test/java/com/backend/server/api/user/equipment/service/EquipmentServiceTest.java +++ /dev/null @@ -1,175 +0,0 @@ -//package com.backend.server.api.user.equipment.service; -// -//import com.backend.server.api.common.dto.LoginUser; -//import com.backend.server.api.common.notification.dto.CommonNotificationDto; -//import com.backend.server.api.common.notification.service.CommonNotificationService; -//import com.backend.server.api.user.equipment.dto.equipment.EquipmentActionRequest; -//import com.backend.server.model.entity.*; -//import com.backend.server.model.entity.enums.EquipmentAction; -//import com.backend.server.model.entity.enums.Status; -//import com.backend.server.model.entity.equipment.Equipment; -//import com.backend.server.model.entity.equipment.EquipmentCart; -//import com.backend.server.model.entity.equipment.EquipmentCategory; -//import com.backend.server.model.entity.equipment.EquipmentModel; -//import com.backend.server.model.repository.user.UserRepository; -//import com.backend.server.model.repository.equipment.EquipmentCartRepository; -//import com.backend.server.model.repository.equipment.EquipmentRepository; -//import org.junit.jupiter.api.*; -//import org.junit.jupiter.api.extension.ExtendWith; -//import org.mockito.*; -//import org.mockito.junit.jupiter.MockitoExtension; -// -//import java.time.LocalDateTime; -//import java.util.*; -// -//import static org.junit.jupiter.api.Assertions.assertThrows; -//import static org.mockito.ArgumentMatchers.any; -//import static org.mockito.Mockito.*; -// -//@ExtendWith(MockitoExtension.class) -//class EquipmentServiceTest { -// -// @Mock private EquipmentRepository equipmentRepository; -// @Mock private UserRepository userRepository; -// @Mock private EquipmentCartRepository equipmentCartRepository; -// @Mock private CommonNotificationService notificationService; -// @InjectMocks private EquipmentService equipmentService; -// -// private LoginUser loginUser; -// private User user; -// private Equipment equipment; -// private EquipmentCategory category; -// -// @BeforeEach -// void setUp() { -// loginUser = LoginUser.builder().id(1L).grade(1).name("테스트유저").build(); -// user = User.builder().id(1L).grade(1).name("테스트유저").build(); -// category = EquipmentCategory.builder().name("카메라").englishCode("CAMERA").maxRentalCount(10).build(); -// EquipmentModel model = EquipmentModel.builder().name("Canon").build(); -// -// equipment = Equipment.builder() -// .id(101L) -// .equipmentCategory(category) -// .equipmentModel(model) -// .status(Status.AVAILABLE) -// .restrictionGrade("2,3,4") -// .build(); -// } -// -// @Nested -// class AddToCartTests { -//// -////@Test -//// void addToCart_success() { -//// when(userRepository.findById(user.getId())).thenReturn(Optional.of(user)); -//// when(equipmentRepository.findById(equipment.getId())).thenReturn(Optional.of(equipment)); -//// when(equipmentCartRepository.existsByUserIdAndEquipmentId(user.getId(), equipment.getId())).thenReturn(false); -//// -//// equipmentService.addToCart(loginUser, List.of(equipment.getId())); -//// -//// verify(equipmentCartRepository).save(any(EquipmentCart.class)); -//// } -//// -//// @Test -//// void addToCart_gradeRestricted_throwsException() { -//// user = user.toBuilder().grade(3).build(); // 제한된 학년 -//// when(userRepository.findById(user.getId())).thenReturn(Optional.of(user)); -//// when(equipmentRepository.findById(equipment.getId())).thenReturn(Optional.of(equipment)); -//// -//// assertThrows(IllegalStateException.class, () -> -//// equipmentService.addToCart(loginUser, List.of(equipment.getId())) -//// ); -//// } -//// } -// @Nested -// class HandleUserActionTests { -// private EquipmentActionRequest request; -// private LocalDateTime startDate = LocalDateTime.now().plusDays(1); -// private LocalDateTime endDate = LocalDateTime.now().plusDays(3); -// -//// @BeforeEach -//// void setup() { -//// request = EquipmentActionRequest.builder() -//// .equipmentIds(List.of(equipment.getId())) -//// .startDate(startDate) -//// .endDate(endDate) -//// .build(); -//// } -// -// @Test -// void handleRentRequest_success() { -// EquipmentActionRequest rentRequest = request.toBuilder() -// .action(EquipmentActionRequest.Action.RENT_REQUEST) -// .build(); -// -// when(userRepository.findById(loginUser.getId())).thenReturn(Optional.of(user)); -// when(equipmentRepository.findByIdForUpdate(equipment.getId())).thenReturn(Optional.of(equipment)); -// -// equipmentService.handleUserAction(loginUser, rentRequest); -// -// verify(equipmentRepository).save(any(Equipment.class)); -// verify(equipmentCartRepository).deleteByUserIdAndEquipmentId(user.getId(), equipment.getId()); -// verify(notificationService).createNotificationToAdmins(any(CommonNotificationDto.class)); -// } -// -// @Test -// void handleRentCancel_success() { -// Equipment rented = equipment.toBuilder() -// .status(Status.RENTAL_PENDING) -// .renter(user) -// .startRentTime(startDate) -// .endRentTime(endDate) -// .build(); -// -// EquipmentActionRequest rentCancelRequest = request.toBuilder() -// .action(EquipmentActionRequest.Action.RENT_CANCEL) -// .build(); -// -// when(userRepository.findById(loginUser.getId())).thenReturn(Optional.of(user)); -// when(equipmentRepository.findByIdForUpdate(equipment.getId())).thenReturn(Optional.of(rented)); -// -// equipmentService.handleUserAction(loginUser, rentCancelRequest); -// -// verify(equipmentRepository).save(any(Equipment.class)); -// } -// -// @Test -// void handleReturnRequest_success() { -// Equipment inUse = equipment.toBuilder() -// .status(Status.IN_USE) -// .renter(user) -// .build(); -// -// EquipmentActionRequest returnRequest = request.toBuilder() -// .action(EquipmentActionRequest.Action.RETURN_REQUEST) -// .build(); -// -// when(userRepository.findById(loginUser.getId())).thenReturn(Optional.of(user)); -// when(equipmentRepository.findByIdForUpdate(equipment.getId())).thenReturn(Optional.of(inUse)); -// -// equipmentService.handleUserAction(loginUser, returnRequest); -// -// verify(equipmentRepository).save(any(Equipment.class)); -// } -// -// @Test -// void handleReturnCancel_success() { -// Equipment returnPending = equipment.toBuilder() -// .status(Status.RETURN_PENDING) -// .renter(user) -// .build(); -// -// EquipmentActionRequest returnCancelRequest = request.toBuilder() -// .action(EquipmentActionRequest.Action.RETURN_CANCEL) -// .build(); -// -// when(userRepository.findById(loginUser.getId())).thenReturn(Optional.of(user)); -// when(equipmentRepository.findByIdForUpdate(equipment.getId())).thenReturn(Optional.of(returnPending)); -// -// equipmentService.handleUserAction(loginUser, returnCancelRequest); -// -// verify(equipmentRepository).save(any(Equipment.class)); -// } -// } -// -// diff --git a/src/test/java/com/backend/server/util/S3ApiUtil.java b/src/test/java/com/backend/server/util/S3ApiUtil.java index 98a8fd52..15a4d974 100644 --- a/src/test/java/com/backend/server/util/S3ApiUtil.java +++ b/src/test/java/com/backend/server/util/S3ApiUtil.java @@ -37,20 +37,20 @@ public void upload(String presignedUrl, String content) { assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); } - public String get(String fileKey) { + public ResponseEntity get(String fileKey) { final String url = String.format("https://%s.s3.%s.amazonaws.com/%s", s3Properties.getBucket(), s3Properties.getRegion(), fileKey); - ResponseEntity response = restTemplate.exchange( - url, - HttpMethod.GET, - new HttpEntity<>(new HttpHeaders()), - String.class - ); - - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); - - return response.getBody(); + try { + return restTemplate.exchange( + url, + HttpMethod.GET, + new HttpEntity<>(new HttpHeaders()), + String.class + ); + } catch (RuntimeException e) { + return null; + } } public void delete(String fileKey) {