diff --git a/backend/build.gradle b/backend/build.gradle index 85d59fd0b..310ce2635 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -51,6 +51,12 @@ dependencies { testAnnotationProcessor 'org.projectlombok:lombok' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + // testcontainers + testImplementation "org.testcontainers:testcontainers:1.20.4" + testImplementation "org.testcontainers:junit-jupiter:1.20.4" + testImplementation "org.testcontainers:mysql" + testImplementation 'org.testcontainers:localstack' + // cache implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'com.github.ben-manes.caffeine:caffeine:3.1.8' diff --git a/backend/src/main/java/kr/touroot/global/config/EmbeddedS3Config.java b/backend/src/main/java/kr/touroot/global/config/EmbeddedS3Config.java index 8d38c1339..f28cee4c7 100644 --- a/backend/src/main/java/kr/touroot/global/config/EmbeddedS3Config.java +++ b/backend/src/main/java/kr/touroot/global/config/EmbeddedS3Config.java @@ -14,7 +14,7 @@ import software.amazon.awssdk.services.s3.model.CreateBucketRequest; @Configuration -@Profile({"default", "local"}) +@Profile("local") public class EmbeddedS3Config { private static final int DYNAMIC_PORT_NUMBER_LOWER = 49152; diff --git a/backend/src/main/java/kr/touroot/global/exception/GlobalExceptionHandler.java b/backend/src/main/java/kr/touroot/global/exception/GlobalExceptionHandler.java index 3873cef15..8b0a2bb41 100644 --- a/backend/src/main/java/kr/touroot/global/exception/GlobalExceptionHandler.java +++ b/backend/src/main/java/kr/touroot/global/exception/GlobalExceptionHandler.java @@ -73,7 +73,7 @@ public ResponseEntity handleException(Exception exception) { @ExceptionHandler(S3UploadException.class) public ResponseEntity handleS3UploadException(S3UploadException exception) { - log.warn("S3_UPLOAD_EXCEPTION :: message = {}", exception.getMessage()); + log.warn("S3_UPLOAD_EXCEPTION :: stackTrace = ", exception); ExceptionResponse data = new ExceptionResponse("이미지 업로드에 실패했습니다."); return ResponseEntity.badRequest() diff --git a/backend/src/main/resources/logback-spring.xml b/backend/src/main/resources/logback-spring.xml index 4e0010402..5e4a36137 100644 --- a/backend/src/main/resources/logback-spring.xml +++ b/backend/src/main/resources/logback-spring.xml @@ -85,6 +85,12 @@ + + + + + + diff --git a/backend/src/test/java/kr/touroot/authentication/controller/LoginControllerTest.java b/backend/src/test/java/kr/touroot/authentication/controller/LoginControllerTest.java index bcea1543d..8c7eca515 100644 --- a/backend/src/test/java/kr/touroot/authentication/controller/LoginControllerTest.java +++ b/backend/src/test/java/kr/touroot/authentication/controller/LoginControllerTest.java @@ -15,6 +15,7 @@ import kr.touroot.authentication.infrastructure.JwtTokenProvider; import kr.touroot.authentication.infrastructure.KakaoOauthProvider; import kr.touroot.global.AcceptanceTest; +import kr.touroot.global.IntegrationTest; import kr.touroot.member.domain.Member; import kr.touroot.utils.DatabaseCleaner; import org.junit.jupiter.api.BeforeEach; @@ -26,7 +27,7 @@ @DisplayName("로그인 컨트롤러") @AcceptanceTest -class LoginControllerTest { +class LoginControllerTest extends IntegrationTest { @Autowired private JwtTokenProvider jwtTokenProvider; diff --git a/backend/src/test/java/kr/touroot/authentication/service/LoginServiceTest.java b/backend/src/test/java/kr/touroot/authentication/service/LoginServiceTest.java index 60a64546e..df3f8177f 100644 --- a/backend/src/test/java/kr/touroot/authentication/service/LoginServiceTest.java +++ b/backend/src/test/java/kr/touroot/authentication/service/LoginServiceTest.java @@ -12,6 +12,7 @@ import kr.touroot.authentication.fixture.OauthUserFixture; import kr.touroot.authentication.infrastructure.JwtTokenProvider; import kr.touroot.authentication.infrastructure.KakaoOauthProvider; +import kr.touroot.global.IntegrationTest; import kr.touroot.member.domain.Member; import kr.touroot.member.fixture.MemberFixture; import kr.touroot.member.repository.MemberRepository; @@ -24,7 +25,7 @@ @DisplayName("로그인 서비스") @ExtendWith(MockitoExtension.class) -class LoginServiceTest { +class LoginServiceTest extends IntegrationTest { private static final String AUTHENTICATION_CODE = "test-authentication-code"; private static final String REDIRECT_URI = "http%3A%2F%2Flocalhost%3A8080%2Fapi%2Fv1%2Flogin%2Foauth%2Fkakao"; diff --git a/backend/src/test/java/kr/touroot/global/AcceptanceTest.java b/backend/src/test/java/kr/touroot/global/AcceptanceTest.java index 248d0a373..b1faa108a 100644 --- a/backend/src/test/java/kr/touroot/global/AcceptanceTest.java +++ b/backend/src/test/java/kr/touroot/global/AcceptanceTest.java @@ -4,10 +4,12 @@ import java.lang.annotation.RetentionPolicy; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @Retention(RetentionPolicy.RUNTIME) @TestPropertySource(properties = {"spring.config.location = classpath:application-test.yml"}) +@ActiveProfiles("test") public @interface AcceptanceTest { } diff --git a/backend/src/test/java/kr/touroot/global/IntegrationTest.java b/backend/src/test/java/kr/touroot/global/IntegrationTest.java new file mode 100644 index 000000000..5a18e6aa2 --- /dev/null +++ b/backend/src/test/java/kr/touroot/global/IntegrationTest.java @@ -0,0 +1,51 @@ +package kr.touroot.global; + +import java.io.IOException; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.containers.localstack.LocalStackContainer; +import org.testcontainers.containers.localstack.LocalStackContainer.Service; +import org.testcontainers.utility.DockerImageName; + +public abstract class IntegrationTest { + + private static final DockerImageName MYSQL_IMAGE_NAME = DockerImageName.parse("mysql:8"); + private static final DockerImageName LOCALSTACK_IMAGE_NAME = DockerImageName.parse("localstack/localstack"); + private static final String S3_BUCKET_NAME = "test-bucket"; + + private static final MySQLContainer mySQLContainer; + private static final LocalStackContainer localStackContainer; + + static { + mySQLContainer = new MySQLContainer<>(MYSQL_IMAGE_NAME); + localStackContainer = new LocalStackContainer(LOCALSTACK_IMAGE_NAME).withServices(Service.S3); + + mySQLContainer.start(); + localStackContainer.start(); + + createS3Bucket(); + } + + private static void createS3Bucket() { + try { + localStackContainer.execInContainer("awslocal", "s3", "mb", "s3://" + S3_BUCKET_NAME); + } catch (IOException | InterruptedException e) { + throw new RuntimeException("S3 버킷을 생성하던 중 오류가 발생했습니다."); + } + } + + @DynamicPropertySource + private static void dynamicProperties(DynamicPropertyRegistry registry) { + // add MySQL Properties + registry.add("spring.datasource.url", mySQLContainer::getJdbcUrl); + registry.add("spring.datasource.driver-class-name", mySQLContainer::getDriverClassName); + registry.add("spring.datasource.username", mySQLContainer::getUsername); + registry.add("spring.datasource.password", mySQLContainer::getPassword); + + // add S3 Properties + registry.add("cloud.aws.s3.access-key", localStackContainer::getAccessKey); + registry.add("cloud.aws.s3.secret-key", localStackContainer::getSecretKey); + registry.add("cloud.aws.s3.endpoint", () -> localStackContainer.getEndpointOverride(Service.S3)); + } +} diff --git a/backend/src/test/java/kr/touroot/global/ServiceTest.java b/backend/src/test/java/kr/touroot/global/ServiceTest.java index 8422e47b9..626cd9a79 100644 --- a/backend/src/test/java/kr/touroot/global/ServiceTest.java +++ b/backend/src/test/java/kr/touroot/global/ServiceTest.java @@ -3,16 +3,20 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import kr.touroot.utils.DatabaseCleaner; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @Transactional(propagation = Propagation.NOT_SUPPORTED) @Import(value = {DatabaseCleaner.class}) @Retention(RetentionPolicy.RUNTIME) @TestPropertySource(properties = {"spring.config.location = classpath:application-test.yml"}) +@ActiveProfiles("test") public @interface ServiceTest { } diff --git a/backend/src/test/java/kr/touroot/global/config/S3TestConfig.java b/backend/src/test/java/kr/touroot/global/config/S3TestConfig.java new file mode 100644 index 000000000..ef0125966 --- /dev/null +++ b/backend/src/test/java/kr/touroot/global/config/S3TestConfig.java @@ -0,0 +1,41 @@ +package kr.touroot.global.config; + +import java.net.URI; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; + +@Configuration +@Profile("test") +public class S3TestConfig { + + private final String s3AccessKey; + private final String s3SecretKey; + private final String s3Endpoint; + + public S3TestConfig( + @Value("${cloud.aws.s3.access-key}") String s3AccessKey, + @Value("${cloud.aws.s3.secret-key}") String s3SecretKey, + @Value("${cloud.aws.s3.endpoint}") String s3Endpoint + ) { + this.s3AccessKey = s3AccessKey; + this.s3SecretKey = s3SecretKey; + this.s3Endpoint = s3Endpoint; + } + + @Bean(name = "s3Client", destroyMethod = "close") + public S3Client s3Client() { + AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create(s3AccessKey, s3SecretKey); + + return S3Client.builder() + .region(Region.AP_NORTHEAST_2) + .endpointOverride(URI.create(s3Endpoint)) + .credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials)) + .build(); + } +} diff --git a/backend/src/test/java/kr/touroot/image/infrastructure/AwsS3ProviderTest.java b/backend/src/test/java/kr/touroot/image/infrastructure/AwsS3ProviderTest.java index 64bc3d43d..0d5192b8c 100644 --- a/backend/src/test/java/kr/touroot/image/infrastructure/AwsS3ProviderTest.java +++ b/backend/src/test/java/kr/touroot/image/infrastructure/AwsS3ProviderTest.java @@ -5,6 +5,7 @@ import java.util.List; import kr.touroot.global.AcceptanceTest; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.exception.S3UploadException; import kr.touroot.image.domain.ImageFile; import org.junit.jupiter.api.DisplayName; @@ -14,8 +15,9 @@ import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; +@DisplayName("Aws S3 프로바이더") @AcceptanceTest -class AwsS3ProviderTest { +class AwsS3ProviderTest extends IntegrationTest { private final AwsS3Provider s3Provider; private final String temporaryStoragePath; diff --git a/backend/src/test/java/kr/touroot/member/controller/MemberControllerTest.java b/backend/src/test/java/kr/touroot/member/controller/MemberControllerTest.java index 27139f3ac..6310a831e 100644 --- a/backend/src/test/java/kr/touroot/member/controller/MemberControllerTest.java +++ b/backend/src/test/java/kr/touroot/member/controller/MemberControllerTest.java @@ -5,6 +5,7 @@ import io.restassured.RestAssured; import io.restassured.http.ContentType; import kr.touroot.global.AcceptanceTest; +import kr.touroot.global.IntegrationTest; import kr.touroot.member.dto.request.MemberRequest; import kr.touroot.member.fixture.MemberFixture; import kr.touroot.utils.DatabaseCleaner; @@ -18,7 +19,7 @@ @DisplayName("사용자 컨트롤러") @AcceptanceTest -class MemberControllerTest { +class MemberControllerTest extends IntegrationTest { private final DatabaseCleaner databaseCleaner; diff --git a/backend/src/test/java/kr/touroot/member/controller/MyPageControllerTest.java b/backend/src/test/java/kr/touroot/member/controller/MyPageControllerTest.java index 3676ead71..3182effa2 100644 --- a/backend/src/test/java/kr/touroot/member/controller/MyPageControllerTest.java +++ b/backend/src/test/java/kr/touroot/member/controller/MyPageControllerTest.java @@ -7,6 +7,7 @@ import java.util.List; import kr.touroot.authentication.infrastructure.JwtTokenProvider; import kr.touroot.global.AcceptanceTest; +import kr.touroot.global.IntegrationTest; import kr.touroot.image.domain.ImageFile; import kr.touroot.image.infrastructure.AwsS3Provider; import kr.touroot.member.domain.Member; @@ -25,7 +26,7 @@ @DisplayName("마이 페이지 컨트롤러") @AcceptanceTest -class MyPageControllerTest { +class MyPageControllerTest extends IntegrationTest { private final DatabaseCleaner databaseCleaner; private final JwtTokenProvider jwtTokenProvider; diff --git a/backend/src/test/java/kr/touroot/member/fixture/MemberFixture.java b/backend/src/test/java/kr/touroot/member/fixture/MemberFixture.java index 2f033a9df..3f88a5719 100644 --- a/backend/src/test/java/kr/touroot/member/fixture/MemberFixture.java +++ b/backend/src/test/java/kr/touroot/member/fixture/MemberFixture.java @@ -14,7 +14,7 @@ public enum MemberFixture { 1L, null, null, - "https://dev.touroot.kr/temporary/profile.png", + "https://dev.touroot.kr/images/profile.png", "리비", LoginType.KAKAO ), @@ -22,7 +22,7 @@ public enum MemberFixture { null, "email@gmail.com", "password", - "https://dev.touroot.kr/temporary/profile.png", + "https://dev.touroot.kr/images/profile.png", "뚜리", LoginType.DEFAULT ), diff --git a/backend/src/test/java/kr/touroot/member/service/MemberServiceTest.java b/backend/src/test/java/kr/touroot/member/service/MemberServiceTest.java index 0c15586f5..b01481f04 100644 --- a/backend/src/test/java/kr/touroot/member/service/MemberServiceTest.java +++ b/backend/src/test/java/kr/touroot/member/service/MemberServiceTest.java @@ -6,9 +6,10 @@ import java.util.List; import kr.touroot.authentication.infrastructure.PasswordEncryptor; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.ServiceTest; import kr.touroot.global.auth.dto.MemberAuth; -import kr.touroot.global.config.EmbeddedS3Config; +import kr.touroot.global.config.S3TestConfig; import kr.touroot.global.exception.BadRequestException; import kr.touroot.image.domain.ImageFile; import kr.touroot.image.infrastructure.AwsS3Provider; @@ -26,11 +27,17 @@ import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; + @DisplayName("사용자 서비스") -@Import(value = {MemberService.class, MemberTestHelper.class, PasswordEncryptor.class, AwsS3Provider.class, - EmbeddedS3Config.class}) +@Import(value = { + MemberService.class, + MemberTestHelper.class, + PasswordEncryptor.class, + AwsS3Provider.class, + S3TestConfig.class +}) @ServiceTest -class MemberServiceTest { +class MemberServiceTest extends IntegrationTest { private final MemberService memberService; private final MemberTestHelper testHelper; diff --git a/backend/src/test/java/kr/touroot/travelogue/controller/TravelogueControllerTest.java b/backend/src/test/java/kr/touroot/travelogue/controller/TravelogueControllerTest.java index 95a22eb1c..c0f32e6b3 100644 --- a/backend/src/test/java/kr/touroot/travelogue/controller/TravelogueControllerTest.java +++ b/backend/src/test/java/kr/touroot/travelogue/controller/TravelogueControllerTest.java @@ -18,8 +18,6 @@ import static kr.touroot.travelogue.fixture.TraveloguePlaceFixture.JEJU_FOLK_VILLAGE; import static kr.touroot.travelogue.fixture.TraveloguePlaceFixture.SEONGSAN_ILCHULBONG; import static org.hamcrest.Matchers.is; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -29,8 +27,8 @@ import java.util.List; import kr.touroot.authentication.infrastructure.JwtTokenProvider; import kr.touroot.global.AcceptanceTest; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.exception.dto.ExceptionResponse; -import kr.touroot.image.infrastructure.AwsS3Provider; import kr.touroot.member.domain.Member; import kr.touroot.tag.domain.Tag; import kr.touroot.tag.fixture.TagFixture; @@ -54,23 +52,19 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullSource; import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.data.domain.Page; import org.springframework.http.HttpHeaders; @DisplayName("여행기 컨트롤러") @AcceptanceTest -class TravelogueControllerTest { +class TravelogueControllerTest extends IntegrationTest { private final DatabaseCleaner databaseCleaner; private final TravelogueTestHelper testHelper; private final ObjectMapper objectMapper; private final JwtTokenProvider jwtTokenProvider; - @MockBean - private final AwsS3Provider s3Provider; @LocalServerPort private int port; @@ -83,14 +77,12 @@ public TravelogueControllerTest( DatabaseCleaner databaseCleaner, TravelogueTestHelper testHelper, ObjectMapper objectMapper, - JwtTokenProvider jwtTokenProvider, - AwsS3Provider s3Provider + JwtTokenProvider jwtTokenProvider ) { this.databaseCleaner = databaseCleaner; this.testHelper = testHelper; this.objectMapper = objectMapper; this.jwtTokenProvider = jwtTokenProvider; - this.s3Provider = s3Provider; } @BeforeEach @@ -103,9 +95,6 @@ void setUp() { tag = testHelper.initTagTestData(); travelogueWriterAccessToken = jwtTokenProvider.createToken(travelogueWriter.getId()) .accessToken(); - - Mockito.when(s3Provider.copyImageToPermanentStorage(any(String.class))) - .thenReturn(TRAVELOGUE_PHOTO_1.getUrl()); } @DisplayName("태그가 없는 여행기를 작성한다.") @@ -503,13 +492,9 @@ void findTraveloguesByKeywordWithoutSearchType() { @DisplayName("여행기를 수정한다.") @Test void updateTravelogue() { - Mockito.when(s3Provider.copyImageToPermanentStorage(any(String.class))) - .thenReturn(TravelogueResponseFixture.getUpdatedTravelogueResponse().thumbnail()); - Travelogue travelogue = testHelper.initTravelogueTestData(travelogueWriter); List days = getUpdateTravelogueDayRequests(); - saveImages(days); TravelogueRequest request = TravelogueRequestFixture.getUpdateTravelogueRequest(days); @@ -528,15 +513,6 @@ private List getUpdateTravelogueDayRequests() { return TravelogueRequestFixture.getUpdateTravelogueDayRequests(places); } - private void saveImages(List days) { - when(s3Provider.copyImageToPermanentStorage( - TravelogueRequestFixture.getTravelogueRequest(days).thumbnail()) - ).thenReturn(TravelogueResponseFixture.getTravelogueResponse().thumbnail()); - when(s3Provider.copyImageToPermanentStorage( - TravelogueRequestFixture.getTraveloguePhotoRequests().get(0).url()) - ).thenReturn(TravelogueResponseFixture.getTraveloguePhotoUrls().get(0)); - } - @DisplayName("존재하지 않는 여행기를 수정 시, 400을 응답한다.") @Test void updateTravelogueWithNotExist() { diff --git a/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueFixture.java b/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueFixture.java index e1c115b12..adfe2517d 100644 --- a/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueFixture.java +++ b/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueFixture.java @@ -15,7 +15,7 @@ public enum TravelogueFixture { JEJU_TRAVELOGUE( "제주에 하영 옵서", - "https://dev.touroot.kr/temporary/jeju_thumbnail.png" + "https://dev.touroot.kr/images/jeju_thumbnail.png" ), ; diff --git a/backend/src/test/java/kr/touroot/travelogue/fixture/TraveloguePhotoFixture.java b/backend/src/test/java/kr/touroot/travelogue/fixture/TraveloguePhotoFixture.java index 55238e9f9..901614c5c 100644 --- a/backend/src/test/java/kr/touroot/travelogue/fixture/TraveloguePhotoFixture.java +++ b/backend/src/test/java/kr/touroot/travelogue/fixture/TraveloguePhotoFixture.java @@ -10,17 +10,17 @@ @Getter public enum TraveloguePhotoFixture { - TRAVELOGUE_PHOTO_1(1, "https://dev.touroot.kr/temporary/image1.png"), - TRAVELOGUE_PHOTO_2(2, "https://dev.touroot.kr/temporary/image2.png"), - TRAVELOGUE_PHOTO_3(3, "https://dev.touroot.kr/temporary/image3.png"), - TRAVELOGUE_PHOTO_4(4, "https://dev.touroot.kr/temporary/image4.png"), - TRAVELOGUE_PHOTO_5(5, "https://dev.touroot.kr/temporary/image5.png"), - TRAVELOGUE_PHOTO_6(6, "https://dev.touroot.kr/temporary/image6.png"), - TRAVELOGUE_PHOTO_7(7, "https://dev.touroot.kr/temporary/image7.png"), - TRAVELOGUE_PHOTO_8(8, "https://dev.touroot.kr/temporary/image8.png"), - TRAVELOGUE_PHOTO_9(9, "https://dev.touroot.kr/temporary/image9.png"), - TRAVELOGUE_PHOTO_10(10, "https://dev.touroot.kr/temporary/image10.png"), - TRAVELOGUE_PHOTO_11(11, "https://dev.touroot.kr/temporary/image11.png"), + TRAVELOGUE_PHOTO_1(1, "https://dev.touroot.kr/images/image1.png"), + TRAVELOGUE_PHOTO_2(2, "https://dev.touroot.kr/images/image2.png"), + TRAVELOGUE_PHOTO_3(3, "https://dev.touroot.kr/images/image3.png"), + TRAVELOGUE_PHOTO_4(4, "https://dev.touroot.kr/images/image4.png"), + TRAVELOGUE_PHOTO_5(5, "https://dev.touroot.kr/images/image5.png"), + TRAVELOGUE_PHOTO_6(6, "https://dev.touroot.kr/images/image6.png"), + TRAVELOGUE_PHOTO_7(7, "https://dev.touroot.kr/images/image7.png"), + TRAVELOGUE_PHOTO_8(8, "https://dev.touroot.kr/images/image8.png"), + TRAVELOGUE_PHOTO_9(9, "https://dev.touroot.kr/images/image9.png"), + TRAVELOGUE_PHOTO_10(10, "https://dev.touroot.kr/images/image10.png"), + TRAVELOGUE_PHOTO_11(11, "https://dev.touroot.kr/images/image11.png"), ; private final int order; diff --git a/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueRequestFixture.java b/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueRequestFixture.java index 43ed8d60f..ada7d0953 100644 --- a/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueRequestFixture.java +++ b/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueRequestFixture.java @@ -17,7 +17,7 @@ private TravelogueRequestFixture() { public static TravelogueRequest getTravelogueRequest(List days) { return new TravelogueRequest( "제주에 하영 옵서", - "https://dev.touroot.kr/temporary/jeju_thumbnail.png", + "https://dev.touroot.kr/images/jeju_thumbnail.png", List.of(), days ); @@ -26,7 +26,7 @@ public static TravelogueRequest getTravelogueRequest(List public static TravelogueRequest getTravelogueRequest(List days, List tags) { return new TravelogueRequest( "제주에 하영 옵서", - "https://dev.touroot.kr/temporary/jeju_thumbnail.png", + "https://dev.touroot.kr/images/jeju_thumbnail.png", tags, days ); @@ -35,7 +35,7 @@ public static TravelogueRequest getTravelogueRequest(List public static TravelogueRequest getUpdateTravelogueRequest(List days) { return new TravelogueRequest( "삼춘! 제주에 하영 옵서!", - "https://dev.touroot.kr/temporary/jeju_thumbnail_2.png", + "https://dev.touroot.kr/images/jeju_thumbnail_2.png", List.of(), days ); @@ -86,22 +86,22 @@ public static TraveloguePositionRequest getTraveloguePositionRequest() { } public static List getTraveloguePhotoRequests() { - return List.of(new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image1.png")); + return List.of(new TraveloguePhotoRequest("https://dev.touroot.kr/images/image1.png")); } public static List getTraveloguePhotoRequestsOverLimit() { return List.of( - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image1.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image2.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image3.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image4.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image5.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image6.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image7.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image8.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image9.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image10.png"), - new TraveloguePhotoRequest("https://dev.touroot.kr/temporary/image11.png") + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image1.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image2.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image3.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image4.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image5.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image6.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image7.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image8.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image9.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image10.png"), + new TraveloguePhotoRequest("https://dev.touroot.kr/images/image11.png") ); } } diff --git a/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueResponseFixture.java b/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueResponseFixture.java index 42784a1b0..a0e5d51f6 100644 --- a/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueResponseFixture.java +++ b/backend/src/test/java/kr/touroot/travelogue/fixture/TravelogueResponseFixture.java @@ -28,8 +28,8 @@ public static TravelogueResponse getTravelogueResponse() { .createdAt(LocalDate.now()) .authorNickname("리비") .authorId(1L) - .authorProfileImageUrl("https://dev.touroot.kr/temporary/profile.png") - .thumbnail("https://dev.touroot.kr/temporary/jeju_thumbnail.png") + .authorProfileImageUrl("https://dev.touroot.kr/images/profile.png") + .thumbnail("https://dev.touroot.kr/images/jeju_thumbnail.png") .days(getTravelogueDayResponses()) .tags(List.of()) .isLiked(false) @@ -44,8 +44,8 @@ public static TravelogueResponse getUpdatedTravelogueResponse() { .createdAt(LocalDate.now()) .authorNickname("리비") .authorId(1L) - .authorProfileImageUrl("https://dev.touroot.kr/temporary/profile.png") - .thumbnail("https://dev.touroot.kr/temporary/jeju_thumbnail_2.png") + .authorProfileImageUrl("https://dev.touroot.kr/images/profile.png") + .thumbnail("https://dev.touroot.kr/images/jeju_thumbnail_2.png") .days(getUpdatedTravelogueDayResponses()) .tags(List.of()) .isLiked(false) @@ -60,8 +60,8 @@ public static TravelogueResponse getTravelogueResponseWithTag() { .createdAt(LocalDate.now()) .authorNickname("리비") .authorId(1L) - .authorProfileImageUrl("https://dev.touroot.kr/temporary/profile.png") - .thumbnail("https://dev.touroot.kr/temporary/jeju_thumbnail.png") + .authorProfileImageUrl("https://dev.touroot.kr/images/profile.png") + .thumbnail("https://dev.touroot.kr/images/jeju_thumbnail.png") .days(getTravelogueDayResponses()) .tags(List.of(TagFixture.TAG_1.getResponse(1L))) .likeCount(0L) @@ -76,8 +76,8 @@ public static TravelogueResponse getTravelogueResponseWithLike() { .createdAt(LocalDate.now()) .authorNickname("리비") .authorId(2L) - .authorProfileImageUrl("https://dev.touroot.kr/temporary/profile.png") - .thumbnail("https://dev.touroot.kr/temporary/jeju_thumbnail.png") + .authorProfileImageUrl("https://dev.touroot.kr/images/profile.png") + .thumbnail("https://dev.touroot.kr/images/jeju_thumbnail.png") .days(getTravelogueDayResponses()) .tags(List.of()) .isLiked(true) @@ -91,8 +91,8 @@ public static Page getTravelogueSimpleResponses() { .id(2L) .title("제주에 하영 옵서") .authorNickname("리비") - .authorProfileUrl("https://dev.touroot.kr/temporary/profile.png") - .thumbnail("https://dev.touroot.kr/temporary/jeju_thumbnail.png") + .authorProfileUrl("https://dev.touroot.kr/images/profile.png") + .thumbnail("https://dev.touroot.kr/images/jeju_thumbnail.png") .tags(List.of(TagFixture.TAG_1.getResponse(1L))) .likeCount(0L) .build(), @@ -100,8 +100,8 @@ public static Page getTravelogueSimpleResponses() { .id(1L) .title("제주에 하영 옵서") .authorNickname("리비") - .authorProfileUrl("https://dev.touroot.kr/temporary/profile.png") - .thumbnail("https://dev.touroot.kr/temporary/jeju_thumbnail.png") + .authorProfileUrl("https://dev.touroot.kr/images/profile.png") + .thumbnail("https://dev.touroot.kr/images/jeju_thumbnail.png") .tags(List.of()) .likeCount(1L) .build() @@ -116,8 +116,8 @@ public static Page getTravelogueSimpleResponsesOrderBy .id(1L) .title("제주에 하영 옵서") .authorNickname("리비") - .authorProfileUrl("https://dev.touroot.kr/temporary/profile.png") - .thumbnail("https://dev.touroot.kr/temporary/jeju_thumbnail.png") + .authorProfileUrl("https://dev.touroot.kr/images/profile.png") + .thumbnail("https://dev.touroot.kr/images/jeju_thumbnail.png") .tags(List.of()) .likeCount(1L) .build(), @@ -125,8 +125,8 @@ public static Page getTravelogueSimpleResponsesOrderBy .id(2L) .title("제주에 하영 옵서") .authorNickname("리비") - .authorProfileUrl("https://dev.touroot.kr/temporary/profile.png") - .thumbnail("https://dev.touroot.kr/temporary/jeju_thumbnail.png") + .authorProfileUrl("https://dev.touroot.kr/images/profile.png") + .thumbnail("https://dev.touroot.kr/images/jeju_thumbnail.png") .tags(List.of(TagFixture.TAG_1.getResponse(1L))) .likeCount(0L) .build() @@ -197,6 +197,6 @@ public static TraveloguePositionResponse getTraveloguePositionResponse() { } public static List getTraveloguePhotoUrls() { - return List.of("https://dev.touroot.kr/temporary/image1.png"); + return List.of("https://dev.touroot.kr/images/image1.png"); } } diff --git a/backend/src/test/java/kr/touroot/travelogue/helper/TravelogueTestHelper.java b/backend/src/test/java/kr/touroot/travelogue/helper/TravelogueTestHelper.java index a49439ba2..75ccbfdbc 100644 --- a/backend/src/test/java/kr/touroot/travelogue/helper/TravelogueTestHelper.java +++ b/backend/src/test/java/kr/touroot/travelogue/helper/TravelogueTestHelper.java @@ -218,7 +218,7 @@ public TravelogueLike persistTravelogueLike(Travelogue travelogue, Member liker) } public Member initKakaoMemberTestData() { - Member member = new Member(1L, "리비", "https://dev.touroot.kr/temporary/profile.png", LoginType.KAKAO); + Member member = new Member(1L, "리비", "https://dev.touroot.kr/images/profile.png", LoginType.KAKAO); return memberRepository.save(member); } diff --git a/backend/src/test/java/kr/touroot/travelogue/service/TravelogueCountryServiceTest.java b/backend/src/test/java/kr/touroot/travelogue/service/TravelogueCountryServiceTest.java index 9107a627b..b68a494ca 100644 --- a/backend/src/test/java/kr/touroot/travelogue/service/TravelogueCountryServiceTest.java +++ b/backend/src/test/java/kr/touroot/travelogue/service/TravelogueCountryServiceTest.java @@ -4,6 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertAll; import java.util.List; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.ServiceTest; import kr.touroot.travelogue.domain.Travelogue; import kr.touroot.travelogue.domain.TravelogueCountry; @@ -24,9 +25,7 @@ @DisplayName("여행기 국가 서비스") @Import(value = {TravelogueCountryService.class, TravelogueTestHelper.class}) @ServiceTest -class TravelogueCountryServiceTest { - - public static final int BASIC_PAGE_SIZE = 5; +class TravelogueCountryServiceTest extends IntegrationTest { private final TravelogueCountryService travelogueCountryService; private final DatabaseCleaner databaseCleaner; diff --git a/backend/src/test/java/kr/touroot/travelogue/service/TravelogueFacadeServiceTest.java b/backend/src/test/java/kr/touroot/travelogue/service/TravelogueFacadeServiceTest.java index 65becd7e5..54302365d 100644 --- a/backend/src/test/java/kr/touroot/travelogue/service/TravelogueFacadeServiceTest.java +++ b/backend/src/test/java/kr/touroot/travelogue/service/TravelogueFacadeServiceTest.java @@ -2,13 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; import java.util.List; import kr.touroot.authentication.infrastructure.PasswordEncryptor; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.ServiceTest; import kr.touroot.global.auth.dto.MemberAuth; +import kr.touroot.global.config.S3TestConfig; import kr.touroot.global.config.TestQueryDslConfig; import kr.touroot.global.exception.BadRequestException; import kr.touroot.global.exception.ForbiddenException; @@ -32,9 +32,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -44,6 +42,7 @@ @Import(value = { TravelogueFacadeService.class, TravelogueService.class, + S3TestConfig.class, AwsS3Provider.class, TravelogueImagePerpetuationService.class, TravelogueTagService.class, @@ -55,25 +54,21 @@ TestQueryDslConfig.class }) @ServiceTest -class TravelogueFacadeServiceTest { +class TravelogueFacadeServiceTest extends IntegrationTest { private final TravelogueFacadeService service; private final TravelogueTestHelper testHelper; private final DatabaseCleaner databaseCleaner; - @MockBean - private final AwsS3Provider s3Provider; @Autowired public TravelogueFacadeServiceTest( TravelogueFacadeService travelogueFacadeService, TravelogueTestHelper travelogueTestHelper, - DatabaseCleaner databaseCleaner, - AwsS3Provider s3Provider + DatabaseCleaner databaseCleaner ) { this.service = travelogueFacadeService; this.testHelper = travelogueTestHelper; this.databaseCleaner = databaseCleaner; - this.s3Provider = s3Provider; } @BeforeEach @@ -81,15 +76,9 @@ void setUp() { databaseCleaner.executeTruncate(); } - private void mockImageCopyProcess() { - when(s3Provider.copyImageToPermanentStorage(any(String.class))) - .thenReturn("https://dev.touroot.kr/image.png"); - } - @DisplayName("여행기를 생성할 수 있다.") @Test void createTravelogue() { - mockImageCopyProcess(); List days = getTravelogueDayRequests(); testHelper.initKakaoMemberTestData(); @@ -263,9 +252,6 @@ void findTraveloguesByNoneCountryCodeKeyword() { @DisplayName("여행기를 수정할 수 있다.") @Test void updateTravelogue() { - Mockito.when(s3Provider.copyImageToPermanentStorage(any(String.class))) - .thenReturn(TravelogueResponseFixture.getUpdatedTravelogueResponse().thumbnail()); - List days = getUpdateTravelogueDayRequests(); Member author = testHelper.initKakaoMemberTestData(); @@ -289,7 +275,6 @@ private List getUpdateTravelogueDayRequests() { @Test void updateTravelogueWithNotExist() { List days = getUpdateTravelogueDayRequests(); - mockImageCopyProcess(); Member author = testHelper.initKakaoMemberTestData(); testHelper.initTravelogueTestData(author); @@ -309,7 +294,6 @@ void updateByIdWithNotAuthor() { MemberAuth notAuthorAuth = new MemberAuth(testHelper.initKakaoMemberTestData().getId()); List days = getTravelogueDayRequests(); - mockImageCopyProcess(); TravelogueRequest request = TravelogueRequestFixture.getTravelogueRequest(days); diff --git a/backend/src/test/java/kr/touroot/travelogue/service/TravelogueLikeServiceTest.java b/backend/src/test/java/kr/touroot/travelogue/service/TravelogueLikeServiceTest.java index 509082643..4aba2e39a 100644 --- a/backend/src/test/java/kr/touroot/travelogue/service/TravelogueLikeServiceTest.java +++ b/backend/src/test/java/kr/touroot/travelogue/service/TravelogueLikeServiceTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.ServiceTest; import kr.touroot.member.domain.Member; import kr.touroot.travelogue.domain.Travelogue; @@ -17,7 +18,7 @@ @DisplayName("여행기 좋아요 서비스") @Import(value = {TravelogueLikeService.class, TravelogueTestHelper.class}) @ServiceTest -class TravelogueLikeServiceTest { +class TravelogueLikeServiceTest extends IntegrationTest { public static final int BASIC_PAGE_SIZE = 5; diff --git a/backend/src/test/java/kr/touroot/travelogue/service/TravelogueServiceTest.java b/backend/src/test/java/kr/touroot/travelogue/service/TravelogueServiceTest.java index 799ff8aba..aafb49fe0 100644 --- a/backend/src/test/java/kr/touroot/travelogue/service/TravelogueServiceTest.java +++ b/backend/src/test/java/kr/touroot/travelogue/service/TravelogueServiceTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import java.util.List; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.ServiceTest; import kr.touroot.global.config.TestQueryDslConfig; import kr.touroot.global.exception.BadRequestException; @@ -35,7 +36,7 @@ @DisplayName("여행기 서비스") @Import(value = {TravelogueService.class, TravelogueTestHelper.class, TestQueryDslConfig.class}) @ServiceTest -class TravelogueServiceTest { +class TravelogueServiceTest extends IntegrationTest { private final TravelogueService travelogueService; private final DatabaseCleaner databaseCleaner; diff --git a/backend/src/test/java/kr/touroot/travelplan/controller/PlaceTodoControllerTest.java b/backend/src/test/java/kr/touroot/travelplan/controller/PlaceTodoControllerTest.java index c9045c07e..2cd165528 100644 --- a/backend/src/test/java/kr/touroot/travelplan/controller/PlaceTodoControllerTest.java +++ b/backend/src/test/java/kr/touroot/travelplan/controller/PlaceTodoControllerTest.java @@ -7,6 +7,7 @@ import io.restassured.http.ContentType; import kr.touroot.authentication.infrastructure.JwtTokenProvider; import kr.touroot.global.AcceptanceTest; +import kr.touroot.global.IntegrationTest; import kr.touroot.member.domain.Member; import kr.touroot.travelplan.dto.request.TodoStatusUpdateRequest; import kr.touroot.travelplan.helper.TravelPlanTestHelper; @@ -20,7 +21,7 @@ @DisplayName("여행 계획 장소에 대한 TODO 컨트롤러") @AcceptanceTest -class PlaceTodoControllerTest { +class PlaceTodoControllerTest extends IntegrationTest { private final DatabaseCleaner databaseCleaner; private final JwtTokenProvider jwtTokenProvider; diff --git a/backend/src/test/java/kr/touroot/travelplan/controller/TravelPlanControllerTest.java b/backend/src/test/java/kr/touroot/travelplan/controller/TravelPlanControllerTest.java index ae3b7d986..a69b03832 100644 --- a/backend/src/test/java/kr/touroot/travelplan/controller/TravelPlanControllerTest.java +++ b/backend/src/test/java/kr/touroot/travelplan/controller/TravelPlanControllerTest.java @@ -15,13 +15,13 @@ import static kr.touroot.travelplan.fixture.TravelPlanPlaceFixture.SEONGSAN_ILCHULBONG; import static org.hamcrest.Matchers.is; -import com.fasterxml.jackson.databind.ObjectMapper; import io.restassured.RestAssured; import io.restassured.http.ContentType; import java.util.List; import java.util.UUID; import kr.touroot.authentication.infrastructure.JwtTokenProvider; import kr.touroot.global.AcceptanceTest; +import kr.touroot.global.IntegrationTest; import kr.touroot.member.domain.Member; import kr.touroot.travelplan.domain.TravelPlan; import kr.touroot.travelplan.dto.request.PlanRequest; @@ -37,9 +37,8 @@ @DisplayName("여행 계획 컨트롤러") @AcceptanceTest -class TravelPlanControllerTest { +class TravelPlanControllerTest extends IntegrationTest { - private final ObjectMapper objectMapper; private final DatabaseCleaner databaseCleaner; private final JwtTokenProvider jwtTokenProvider; private final TravelPlanTestHelper testHelper; @@ -52,10 +51,8 @@ class TravelPlanControllerTest { public TravelPlanControllerTest( DatabaseCleaner databaseCleaner, TravelPlanTestHelper testHelper, - JwtTokenProvider jwtTokenProvider, - ObjectMapper objectMapper + JwtTokenProvider jwtTokenProvider ) { - this.objectMapper = objectMapper; this.databaseCleaner = databaseCleaner; this.testHelper = testHelper; this.jwtTokenProvider = jwtTokenProvider; diff --git a/backend/src/test/java/kr/touroot/travelplan/helper/TravelPlanTestHelper.java b/backend/src/test/java/kr/touroot/travelplan/helper/TravelPlanTestHelper.java index 17597399a..a1bf64dd8 100644 --- a/backend/src/test/java/kr/touroot/travelplan/helper/TravelPlanTestHelper.java +++ b/backend/src/test/java/kr/touroot/travelplan/helper/TravelPlanTestHelper.java @@ -71,7 +71,7 @@ public static TravelPlaceTodo getTravelPlaceTodo(TravelPlanPlace travelPlanPlace public TravelPlan initTravelPlanTestData() { Member author = initMemberTestData(); - TravelPlan travelPlan = getTravelPlan("여행계획", LocalDate.MAX, author); + TravelPlan travelPlan = getTravelPlan("여행계획", LocalDate.now().plusDays(2), author); TravelPlanDay travelPlanDay = getTravelPlanDay(0, travelPlan); TravelPlanPlace travelPlanPlace = getTravelPlanPlace(0, "장소", "37.5175896", "127.0867236", travelPlanDay, "KR"); TravelPlaceTodo travelPlaceTodo = getTravelPlaceTodo(travelPlanPlace, "테스트짜기", 0, false); @@ -85,7 +85,7 @@ public TravelPlan initTravelPlanTestData() { } public TravelPlan initTravelPlanTestData(Member author) { - TravelPlan travelPlan = getTravelPlan("여행계획", LocalDate.MAX, author); + TravelPlan travelPlan = getTravelPlan("여행계획", LocalDate.now().plusDays(2), author); TravelPlanDay travelPlanDay = getTravelPlanDay(0, travelPlan); TravelPlanPlace travelPlanPlace = getTravelPlanPlace(0, "장소", "37.5175896", "127.0867236", travelPlanDay, "KR"); TravelPlaceTodo travelPlaceTodo = getTravelPlaceTodo(travelPlanPlace, "테스트짜기", 0, false); diff --git a/backend/src/test/java/kr/touroot/travelplan/service/PlaceTodoServiceTest.java b/backend/src/test/java/kr/touroot/travelplan/service/PlaceTodoServiceTest.java index 8e3284dc6..a783a862f 100644 --- a/backend/src/test/java/kr/touroot/travelplan/service/PlaceTodoServiceTest.java +++ b/backend/src/test/java/kr/touroot/travelplan/service/PlaceTodoServiceTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.ServiceTest; import kr.touroot.global.auth.dto.MemberAuth; import kr.touroot.global.config.TestQueryDslConfig; @@ -22,7 +23,7 @@ @DisplayName("TODO 서비스") @Import({PlaceTodoService.class, TravelPlanTestHelper.class, TestQueryDslConfig.class}) @ServiceTest -class PlaceTodoServiceTest { +class PlaceTodoServiceTest extends IntegrationTest { private final PlaceTodoService placeTodoService; private final DatabaseCleaner databaseCleaner; diff --git a/backend/src/test/java/kr/touroot/travelplan/service/TravelPlanFacadeServiceTest.java b/backend/src/test/java/kr/touroot/travelplan/service/TravelPlanFacadeServiceTest.java index 483922491..5699d16fd 100644 --- a/backend/src/test/java/kr/touroot/travelplan/service/TravelPlanFacadeServiceTest.java +++ b/backend/src/test/java/kr/touroot/travelplan/service/TravelPlanFacadeServiceTest.java @@ -7,9 +7,10 @@ import java.util.Collections; import java.util.List; import kr.touroot.authentication.infrastructure.PasswordEncryptor; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.ServiceTest; import kr.touroot.global.auth.dto.MemberAuth; -import kr.touroot.global.config.EmbeddedS3Config; +import kr.touroot.global.config.S3TestConfig; import kr.touroot.global.exception.BadRequestException; import kr.touroot.image.infrastructure.AwsS3Provider; import kr.touroot.member.domain.Member; @@ -37,10 +38,10 @@ PasswordEncryptor.class, TravelPlanTestHelper.class, AwsS3Provider.class, - EmbeddedS3Config.class + S3TestConfig.class }) @ServiceTest -class TravelPlanFacadeServiceTest { +class TravelPlanFacadeServiceTest extends IntegrationTest { private final TravelPlanFacadeService travelPlanFacadeService; private final DatabaseCleaner databaseCleaner; @@ -82,7 +83,7 @@ void createTravelPlan() { PlanDayRequest planDayRequest = new PlanDayRequest(List.of(planPlaceRequest)); PlanRequest request = PlanRequest.builder() .title("신나는 한강 여행") - .startDate(LocalDate.MAX) + .startDate(LocalDate.now().plusDays(2)) .days(List.of(planDayRequest)) .build(); @@ -134,7 +135,7 @@ void updateTravelPlan() { PlanDayRequest planDayRequest = new PlanDayRequest(List.of(planPlaceRequest)); PlanRequest request = PlanRequest.builder() .title("수정된 한강 여행") - .startDate(LocalDate.MAX) + .startDate(LocalDate.now().plusDays(2)) .days(List.of(planDayRequest)) .build(); diff --git a/backend/src/test/java/kr/touroot/travelplan/service/TravelPlanServiceTest.java b/backend/src/test/java/kr/touroot/travelplan/service/TravelPlanServiceTest.java index e19d623ed..8f7082cac 100644 --- a/backend/src/test/java/kr/touroot/travelplan/service/TravelPlanServiceTest.java +++ b/backend/src/test/java/kr/touroot/travelplan/service/TravelPlanServiceTest.java @@ -8,8 +8,8 @@ import java.util.Collections; import java.util.List; import java.util.UUID; +import kr.touroot.global.IntegrationTest; import kr.touroot.global.ServiceTest; -import kr.touroot.global.auth.dto.MemberAuth; import kr.touroot.global.exception.BadRequestException; import kr.touroot.global.exception.ForbiddenException; import kr.touroot.member.domain.Member; @@ -31,14 +31,13 @@ @DisplayName("여행 계획 서비스") @Import(value = {TravelPlanService.class, TravelPlanTestHelper.class}) @ServiceTest -class TravelPlanServiceTest { +class TravelPlanServiceTest extends IntegrationTest { private final TravelPlanService travelPlanService; private final TravelPlanRepository travelPlanRepository; private final DatabaseCleaner databaseCleaner; private final TravelPlanTestHelper testHelper; - private MemberAuth memberAuth; private Member author; @Autowired @@ -59,7 +58,6 @@ void setUp() { databaseCleaner.executeTruncate(); author = testHelper.initMemberTestData(); - memberAuth = new MemberAuth(author.getId()); } @DisplayName("여행 계획을 저장할 수 있다") @@ -152,7 +150,7 @@ void updateTravelPlan() { PlanDayRequest planDayRequest = new PlanDayRequest(List.of(planPlaceRequest)); PlanRequest request = PlanRequest.builder() .title("수정된 한강 여행") - .startDate(LocalDate.MAX) + .startDate(LocalDate.now().plusDays(2)) .days(List.of(planDayRequest)) .build(); diff --git a/backend/src/test/java/kr/touroot/utils/DatabaseCleaner.java b/backend/src/test/java/kr/touroot/utils/DatabaseCleaner.java index ada22125b..41b4e9fc6 100644 --- a/backend/src/test/java/kr/touroot/utils/DatabaseCleaner.java +++ b/backend/src/test/java/kr/touroot/utils/DatabaseCleaner.java @@ -15,9 +15,9 @@ public class DatabaseCleaner { public static final String CAMEL_CASE = "([a-z])([A-Z])"; public static final String SNAKE_CASE = "$1_$2"; private static final String TRUNCATE_TABLE = "TRUNCATE TABLE %s"; - private static final String ALTER_COLUMN_ID = "ALTER TABLE %s ALTER COLUMN id RESTART WITH 1"; - public static final String INTEGRITY_FALSE = "SET REFERENTIAL_INTEGRITY FALSE"; - public static final String INTEGRITY_TRUE = "SET REFERENTIAL_INTEGRITY TRUE"; + private static final String ALTER_COLUMN_ID = "ALTER TABLE %s AUTO_INCREMENT = 1"; + public static final String INTEGRITY_FALSE = "SET FOREIGN_KEY_CHECKS = 0"; + public static final String INTEGRITY_TRUE = "SET FOREIGN_KEY_CHECKS = 1"; @PersistenceContext private EntityManager entityManager; diff --git a/backend/src/test/resources/application-test.yml b/backend/src/test/resources/application-test.yml index bad48d5b4..edb8f66d0 100644 --- a/backend/src/test/resources/application-test.yml +++ b/backend/src/test/resources/application-test.yml @@ -15,7 +15,7 @@ security: cloud: aws: s3: - bucket: techcourse-project-2024 + bucket: test-bucket image-base-uri: https://dev.touroot.kr/ origin-storage-path: touroot/ temporary-storage-path: temporary/ @@ -23,27 +23,22 @@ cloud: server: port: 8081 spring: + config: + activate: + on-profile: test flyway: - enabled: false - datasource: - url: jdbc:h2:mem:test - h2: - console: - enabled: true - path: /h2-console + enabled: true jpa: show-sql: true properties: hibernate: format_sql: true hibernate: - ddl-auto: create - defer-datasource-initialization: true + ddl-auto: validate open-in-view: false sql: init: mode: never - cors: allowed-origins: http://localhost:3000