From 38be43ad46aae3380f2524a32d0df660e265eee9 Mon Sep 17 00:00:00 2001 From: DongminL Date: Wed, 25 Dec 2024 00:57:46 +0900 Subject: [PATCH 1/6] =?UTF-8?q?chore:=20test=20containers=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 ++++- src/test/resources/application-test.yml | 28 +++++++++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index ff827480..4f4c6b29 100644 --- a/build.gradle +++ b/build.gradle @@ -41,8 +41,11 @@ dependencies { // Test testImplementation 'org.springframework.boot:spring-boot-starter-test' - testRuntimeOnly 'com.h2database:h2' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testImplementation 'org.springframework.boot:spring-boot-testcontainers' + testImplementation 'org.testcontainers:testcontainers' + testImplementation 'org.testcontainers:junit-jupiter' + testImplementation "org.testcontainers:mariadb:1.19.7" // Swagger implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0' diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index 9c25ed60..758fa57c 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -1,16 +1,26 @@ spring: datasource: - driver-class-name: org.h2.Driver - url: jdbc:h2:mem/testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE - username: sa - password: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver + url: jdbc:tc:mariadb:11.5://test + username: test + password: test jpa: - show-sql: true hibernate: - ddl-auto: create-drop + ddl-auto: create + naming: + # 자바에서 카멜로 필드 작성하면 DB에 스네이크로 기록 + physical-strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy properties: hibernate: - format_sql: true - dialect: org.hibernate.dialect.H2Dialect - database: h2 + show_sql: true + format_sql: true # 이쁘게 보기 + dialect: org.hibernate.dialect.MariaDBDialect + +logging: + level: + org.springframework.jdbc.core.JdbcTemplate: DEBUG # JDBC 쿼리 로그로 출력 + org.springframework.jdbc.core.StatementCreatorUtils: TRACE + org.hibernate.SQL: DEBUG + org.hibernate.type.descriptor.sql: TRACE From 2a7894d325ae53660b3297e6e0d71c8b7b29be17 Mon Sep 17 00:00:00 2001 From: DongminL Date: Wed, 25 Dec 2024 00:58:54 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20mariadb=20test=20container=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/db/MariaDBTestContainer.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/java/org/programmers/signalbuddy/global/db/MariaDBTestContainer.java diff --git a/src/test/java/org/programmers/signalbuddy/global/db/MariaDBTestContainer.java b/src/test/java/org/programmers/signalbuddy/global/db/MariaDBTestContainer.java new file mode 100644 index 00000000..974c246f --- /dev/null +++ b/src/test/java/org/programmers/signalbuddy/global/db/MariaDBTestContainer.java @@ -0,0 +1,20 @@ +package org.programmers.signalbuddy.global.db; + +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; +import org.springframework.test.context.ActiveProfiles; +import org.testcontainers.containers.MariaDBContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +@Testcontainers +@ActiveProfiles("test") +@AutoConfigureTestDatabase(replace = Replace.NONE) +public interface MariaDBTestContainer { + + @Container + MariaDBContainer MARIADB_CONTAINER = new MariaDBContainer<>("mariadb:11.5") + .withDatabaseName("test") + .withUsername("test") + .withPassword("test"); +} From 6655860e714756a6ffd1d4068f948b651b0162e1 Mon Sep 17 00:00:00 2001 From: DongminL Date: Wed, 25 Dec 2024 00:59:24 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor:=20mariadb=20test=20container=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SignalBuddyApplicationTests.java | 3 ++- .../signalbuddy/global/support/JdbcTest.java | 23 +++++++++++++++++++ .../global/support/RepositoryTest.java | 19 ++++++++++----- .../global/support/ServiceTest.java | 22 ++++++++++++++---- 4 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 src/test/java/org/programmers/signalbuddy/global/support/JdbcTest.java diff --git a/src/test/java/org/programmers/signalbuddy/SignalBuddyApplicationTests.java b/src/test/java/org/programmers/signalbuddy/SignalBuddyApplicationTests.java index b53beab9..c91089e2 100644 --- a/src/test/java/org/programmers/signalbuddy/SignalBuddyApplicationTests.java +++ b/src/test/java/org/programmers/signalbuddy/SignalBuddyApplicationTests.java @@ -2,12 +2,13 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; @SpringBootTest @ActiveProfiles("test") -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) +@AutoConfigureTestDatabase(replace = Replace.NONE) class SignalBuddyApplicationTests { @Test diff --git a/src/test/java/org/programmers/signalbuddy/global/support/JdbcTest.java b/src/test/java/org/programmers/signalbuddy/global/support/JdbcTest.java new file mode 100644 index 00000000..e2d96783 --- /dev/null +++ b/src/test/java/org/programmers/signalbuddy/global/support/JdbcTest.java @@ -0,0 +1,23 @@ +package org.programmers.signalbuddy.global.support; + +import org.junit.jupiter.api.BeforeEach; +import org.programmers.signalbuddy.global.config.DataInitializer; +import org.programmers.signalbuddy.global.db.MariaDBTestContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@SpringBootTest +@Import(DataInitializer.class) +public abstract class JdbcTest implements MariaDBTestContainer { + + @Autowired + private DataInitializer dataInitializer; + + @BeforeEach + void delete() { + dataInitializer.clear(); + } +} diff --git a/src/test/java/org/programmers/signalbuddy/global/support/RepositoryTest.java b/src/test/java/org/programmers/signalbuddy/global/support/RepositoryTest.java index 73d62933..d7cb52b6 100644 --- a/src/test/java/org/programmers/signalbuddy/global/support/RepositoryTest.java +++ b/src/test/java/org/programmers/signalbuddy/global/support/RepositoryTest.java @@ -1,15 +1,22 @@ package org.programmers.signalbuddy.global.support; +import org.junit.jupiter.api.BeforeEach; +import org.programmers.signalbuddy.global.config.DataInitializer; import org.programmers.signalbuddy.global.config.TestQuerydslConfig; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.programmers.signalbuddy.global.db.MariaDBTestContainer; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; -import org.springframework.test.context.ActiveProfiles; @DataJpaTest -@ActiveProfiles("test") -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) -@Import(TestQuerydslConfig.class) -public abstract class RepositoryTest { +@Import({TestQuerydslConfig.class, DataInitializer.class}) +public abstract class RepositoryTest implements MariaDBTestContainer { + @Autowired + private DataInitializer dataInitializer; + + @BeforeEach + void delete() { + dataInitializer.clear(); + } } diff --git a/src/test/java/org/programmers/signalbuddy/global/support/ServiceTest.java b/src/test/java/org/programmers/signalbuddy/global/support/ServiceTest.java index 7c17625d..cdb3064c 100644 --- a/src/test/java/org/programmers/signalbuddy/global/support/ServiceTest.java +++ b/src/test/java/org/programmers/signalbuddy/global/support/ServiceTest.java @@ -1,12 +1,24 @@ package org.programmers.signalbuddy.global.support; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.programmers.signalbuddy.global.config.DataInitializer; +import org.programmers.signalbuddy.global.db.MariaDBTestContainer; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.junit.jupiter.SpringExtension; @SpringBootTest -@ActiveProfiles("test") -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) -public abstract class ServiceTest { +@Import(DataInitializer.class) +@ExtendWith(SpringExtension.class) +public abstract class ServiceTest implements MariaDBTestContainer { + @Autowired + private DataInitializer dataInitializer; + + @BeforeEach + void delete() { + dataInitializer.clear(); + } } From 5d4df7140ede769742d9aa9a12b55cde2d110891 Mon Sep 17 00:00:00 2001 From: DongminL Date: Wed, 25 Dec 2024 01:00:33 +0900 Subject: [PATCH 4/6] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/CrossroadServiceTest.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/test/java/org/programmers/signalbuddy/domain/crossroad/service/CrossroadServiceTest.java b/src/test/java/org/programmers/signalbuddy/domain/crossroad/service/CrossroadServiceTest.java index fa1c731f..e301c447 100644 --- a/src/test/java/org/programmers/signalbuddy/domain/crossroad/service/CrossroadServiceTest.java +++ b/src/test/java/org/programmers/signalbuddy/domain/crossroad/service/CrossroadServiceTest.java @@ -7,8 +7,6 @@ import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; import org.programmers.signalbuddy.domain.crossroad.dto.CrossroadApiResponse; import org.programmers.signalbuddy.domain.crossroad.entity.Crossroad; import org.programmers.signalbuddy.domain.crossroad.repository.CrossroadRepository; @@ -18,7 +16,6 @@ import org.springframework.transaction.annotation.Transactional; @Transactional -@ExtendWith(MockitoExtension.class) class CrossroadServiceTest extends ServiceTest { @Autowired @@ -30,19 +27,15 @@ class CrossroadServiceTest extends ServiceTest { @MockitoBean private CrossroadProvider crossroadProvider; - @DisplayName("Open API를 요청할 때, 페이지 수와 사이즈를 지정하고 다음 해당 데이터 저장") + @DisplayName("Open API를 요청할 때, 페이지 수와 사이즈를 지정하고 가져온 데이터 저장") @Test void saveCrossroadDates() { // given List expectedList = new ArrayList<>(); for (int i = 1; i <= 10; i++) { expectedList.add( - CrossroadApiResponse.builder() - .crossroadApiId("aaaaa" + i) - .name("aaaa" + i) - .lat(i * 5.0) - .lng(i * 7.0) - .build()); + CrossroadApiResponse.builder().crossroadApiId("aaaaa" + i).name("aaaa" + i) + .lat(i * 5.0).lng(i * 7.0).build()); } // when @@ -53,10 +46,18 @@ void saveCrossroadDates() { List actual = crossroadRepository.findAll(); SoftAssertions.assertSoftly(softAssertions -> { softAssertions.assertThat(actual.size()).isEqualTo(expectedList.size()); - softAssertions.assertThat(actual.get(5).getCrossroadApiId()).isEqualTo(expectedList.get(5).getCrossroadApiId()); - softAssertions.assertThat(actual.get(5).getName()).isEqualTo(expectedList.get(5).getName()); - softAssertions.assertThat(actual.get(5).getCoordinate().getX()).isEqualTo(expectedList.get(5).getLng()); - softAssertions.assertThat(actual.get(5).getCoordinate().getY()).isEqualTo(expectedList.get(5).getLat()); + + softAssertions.assertThat(actual.get(5).getCrossroadApiId()) + .isEqualTo(expectedList.get(5).getCrossroadApiId()); + + softAssertions.assertThat(actual.get(5).getName()) + .isEqualTo(expectedList.get(5).getName()); + + softAssertions.assertThat(actual.get(5).getCoordinate().getX()) + .isEqualTo(expectedList.get(5).getLng()); + + softAssertions.assertThat(actual.get(5).getCoordinate().getY()) + .isEqualTo(expectedList.get(5).getLat()); }); } } \ No newline at end of file From f954eab7908289ffaf027ea511ec334d2dafbc42 Mon Sep 17 00:00:00 2001 From: DongminL Date: Wed, 25 Dec 2024 01:00:42 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor:=20mariadb=20test=20container=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/bookmark/repository/BookmarkRepositoryTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/programmers/signalbuddy/domain/bookmark/repository/BookmarkRepositoryTest.java b/src/test/java/org/programmers/signalbuddy/domain/bookmark/repository/BookmarkRepositoryTest.java index c15ac0fa..beb48517 100644 --- a/src/test/java/org/programmers/signalbuddy/domain/bookmark/repository/BookmarkRepositoryTest.java +++ b/src/test/java/org/programmers/signalbuddy/domain/bookmark/repository/BookmarkRepositoryTest.java @@ -49,7 +49,7 @@ void testGetBookmarksWithPagination() { bookmarkRepository.save(bookmark); } - /* H2 데이터베이스에서 ST_X 함수 이용 X + /* H2 데이터베이스에서 ST_X 함수 이용 X*/ Pageable pageable = PageRequest.of(0, 5); Page bookmarksPage = bookmarkRepository.findPagedByMember(pageable, 1L); @@ -62,7 +62,7 @@ void testGetBookmarksWithPagination() { BookmarkResponse firstBookmark = bookmarksPage.getContent().get(0); assertThat(firstBookmark.getAddress()).isEqualTo("Address 1"); - */ + } } \ No newline at end of file From e51bbdf804fadf5a66019fcfa1336ad89a3db4df Mon Sep 17 00:00:00 2001 From: DongminL Date: Wed, 25 Dec 2024 01:02:47 +0900 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20=ED=8A=B8=EB=9E=9C=EC=9E=AD=EC=85=98?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=A1=A4=EB=B0=B1=20=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9D=80=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/service/CommentServiceTest.java | 6 +- .../FeedbackJdbcRepositoryTest.java | 55 ++++++++--------- .../global/config/DataInitializer.java | 61 +++++++++++++++++++ submodule | 2 +- 4 files changed, 91 insertions(+), 33 deletions(-) create mode 100644 src/test/java/org/programmers/signalbuddy/global/config/DataInitializer.java diff --git a/src/test/java/org/programmers/signalbuddy/domain/comment/service/CommentServiceTest.java b/src/test/java/org/programmers/signalbuddy/domain/comment/service/CommentServiceTest.java index e0d69b28..689cbebe 100644 --- a/src/test/java/org/programmers/signalbuddy/domain/comment/service/CommentServiceTest.java +++ b/src/test/java/org/programmers/signalbuddy/domain/comment/service/CommentServiceTest.java @@ -17,8 +17,8 @@ import org.programmers.signalbuddy.domain.comment.exception.CommentErrorCode; import org.programmers.signalbuddy.domain.comment.repository.CommentRepository; import org.programmers.signalbuddy.domain.feedback.dto.FeedbackWriteRequest; -import org.programmers.signalbuddy.domain.feedback.entity.enums.AnswerStatus; import org.programmers.signalbuddy.domain.feedback.entity.Feedback; +import org.programmers.signalbuddy.domain.feedback.entity.enums.AnswerStatus; import org.programmers.signalbuddy.domain.feedback.repository.FeedbackRepository; import org.programmers.signalbuddy.domain.member.MemberRole; import org.programmers.signalbuddy.domain.member.entity.Member; @@ -119,7 +119,7 @@ void writeCommentByAdmin() { commentService.writeComment(request, user); // then - Optional actual = commentRepository.findById(4L); + Optional actual = commentRepository.findById(2L); SoftAssertions.assertSoftly(softAssertions -> { softAssertions.assertThat(actual).get().isNotNull(); softAssertions.assertThat(actual.get().getCommentId()).isNotNull(); @@ -225,7 +225,7 @@ void deleteCommentByAdmin() { // when commentService.writeComment(request, user); - commentService.deleteComment(10L, user); + commentService.deleteComment(2L, user); // then SoftAssertions.assertSoftly(softAssertions -> { diff --git a/src/test/java/org/programmers/signalbuddy/domain/feedback/repository/FeedbackJdbcRepositoryTest.java b/src/test/java/org/programmers/signalbuddy/domain/feedback/repository/FeedbackJdbcRepositoryTest.java index fb9405d8..20e3713c 100644 --- a/src/test/java/org/programmers/signalbuddy/domain/feedback/repository/FeedbackJdbcRepositoryTest.java +++ b/src/test/java/org/programmers/signalbuddy/domain/feedback/repository/FeedbackJdbcRepositoryTest.java @@ -2,27 +2,28 @@ import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.AfterEach; +import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.programmers.signalbuddy.domain.feedback.dto.FeedbackResponse; import org.programmers.signalbuddy.domain.feedback.dto.FeedbackWriteRequest; import org.programmers.signalbuddy.domain.feedback.entity.Feedback; import org.programmers.signalbuddy.domain.member.MemberRole; import org.programmers.signalbuddy.domain.member.entity.Member; import org.programmers.signalbuddy.domain.member.entity.enums.MemberStatus; import org.programmers.signalbuddy.domain.member.repository.MemberRepository; +import org.programmers.signalbuddy.global.support.JdbcTest; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.jdbc.core.JdbcTemplate; -@Transactional -@SpringBootTest -@ActiveProfiles("test") -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) -class FeedbackJdbcRepositoryTest { +class FeedbackJdbcRepositoryTest extends JdbcTest { + + @Autowired + private JdbcTemplate jdbcTemplate; @Autowired private FeedbackJdbcRepository feedbackJdbcRepository; @@ -50,30 +51,26 @@ void setup() { feedbackList.add(Feedback.create(request, member)); } feedbackRepository.saveAll(feedbackList); - } - @AfterEach - void tearDown() { - feedbackRepository.deleteAll(); + jdbcTemplate.execute("CREATE FULLTEXT INDEX IF NOT EXISTS idx_subject_content ON feedbacks (subject, content)"); } - // TODO: H2를 MariaDB TestContainers로 바꾸면 테스트 코드 완성하기 @DisplayName("Full Text Search를 이용한 검색 쿼리") @Test void fullTextSearch() { -// // when -// Pageable pageable = PageRequest.of(3, 10); -// Page actual = feedbackJdbcRepository.fullTextSearch(pageable, "test", 0L); -// -// // then -// SoftAssertions.assertSoftly(softAssertions -> { -// softAssertions.assertThat(actual.getTotalElements()).isEqualTo(123); -// softAssertions.assertThat(actual.getTotalPages()).isEqualTo(13); -// softAssertions.assertThat(actual.getNumber()).isEqualTo(3); -// softAssertions.assertThat(actual.getContent().size()).isEqualTo(10); -// softAssertions.assertThat(actual.getContent().get(3).getFeedbackId()).isNotNull(); -// softAssertions.assertThat(actual.getContent().get(3).getMember().getMemberId()) -// .isEqualTo(member.getMemberId()); -// }); + // when + Pageable pageable = PageRequest.of(3, 10); + Page actual = feedbackJdbcRepository.fullTextSearch(pageable, "test", 0L); + + // then + SoftAssertions.assertSoftly(softAssertions -> { + softAssertions.assertThat(actual.getTotalElements()).isEqualTo(123); + softAssertions.assertThat(actual.getTotalPages()).isEqualTo(13); + softAssertions.assertThat(actual.getNumber()).isEqualTo(3); + softAssertions.assertThat(actual.getContent().size()).isEqualTo(10); + softAssertions.assertThat(actual.getContent().get(3).getFeedbackId()).isNotNull(); + softAssertions.assertThat(actual.getContent().get(3).getMember().getMemberId()) + .isEqualTo(member.getMemberId()); + }); } } \ No newline at end of file diff --git a/src/test/java/org/programmers/signalbuddy/global/config/DataInitializer.java b/src/test/java/org/programmers/signalbuddy/global/config/DataInitializer.java new file mode 100644 index 00000000..40a73c5b --- /dev/null +++ b/src/test/java/org/programmers/signalbuddy/global/config/DataInitializer.java @@ -0,0 +1,61 @@ +package org.programmers.signalbuddy.global.config; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import javax.sql.DataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.TestComponent; +import org.springframework.transaction.annotation.Transactional; + +@TestComponent +public class DataInitializer { + + private static final int OFF = 0; + private static final int ON = 1; + private static final int COLUMN_INDEX = 1; + + private final List tableNames = new ArrayList<>(); + + @Autowired + private DataSource dataSource; + + @PersistenceContext + private EntityManager entityManager; + + private void findDatabaseTableNames() { + try (final Statement statement = dataSource.getConnection().createStatement()) { + ResultSet resultSet = statement.executeQuery("SHOW TABLES"); + while (resultSet.next()) { + final String tableName = resultSet.getString(COLUMN_INDEX); + tableNames.add(tableName); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void truncate() { + setForeignKeyCheck(OFF); + for (String tableName : tableNames) { + entityManager.createNativeQuery(String.format("TRUNCATE TABLE %s", tableName)).executeUpdate(); + } + setForeignKeyCheck(ON); + } + + private void setForeignKeyCheck(int mode) { + entityManager.createNativeQuery(String.format("SET FOREIGN_KEY_CHECKS = %d", mode)).executeUpdate(); + } + + @Transactional + public void clear() { + if (tableNames.isEmpty()) { + findDatabaseTableNames(); + } + entityManager.clear(); + truncate(); + } +} diff --git a/submodule b/submodule index 697ffb2f..52e9a2be 160000 --- a/submodule +++ b/submodule @@ -1 +1 @@ -Subproject commit 697ffb2ffa4753413c842269a109c9b1b48473ec +Subproject commit 52e9a2be408affe7e70f04334f2cc6417380c933