Skip to content

Commit fceb0be

Browse files
committed
fix(test): Reset database before setup(grant)
1 parent c6a6b65 commit fceb0be

17 files changed

Lines changed: 381 additions & 575 deletions

src/main/resources/database/archive/functions.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CREATE OR REPLACE FUNCTION archive.archive_user_on_delete () RETURNS TRIGGER AS '
22
BEGIN
3-
INSERT INTO archive.users (id, email, username, nickname, readme, email_public, provider, role, created_at, updated_at) OVERRIDING SYSTEM VALUE
4-
VALUES (OLD.id, OLD.email, OLD.username, OLD.nickname, OLD.readme, OLD.email_public, OLD.provider, OLD.role, OLD.created_at, OLD.updated_at);
3+
INSERT INTO archive.users (id, email, username, nickname, readme, email_public, github_username, github_verified, provider, role, created_at, updated_at) OVERRIDING SYSTEM VALUE
4+
VALUES (OLD.id, OLD.email, OLD.username, OLD.nickname, OLD.readme, OLD.email_public, OLD.provider, OLD.github_username, OLD.github_verified, OLD.role, OLD.created_at, OLD.updated_at);
55
RETURN OLD;
66
END
77
' LANGUAGE plpgsql;

src/test/kotlin/me/loghub/api/controller/article/ArticleCommentControllerTest.kt

Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,53 +4,50 @@ import me.loghub.api.dto.article.comment.PostArticleCommentDTO
44
import me.loghub.api.dto.auth.token.TokenDTO
55
import me.loghub.api.entity.user.User
66
import me.loghub.api.service.test.TestGrantService
7+
import me.loghub.api.util.resetDatabase
78
import org.junit.jupiter.api.*
89
import org.springframework.beans.factory.annotation.Autowired
910
import org.springframework.boot.test.context.SpringBootTest
1011
import org.springframework.boot.test.web.client.TestRestTemplate
11-
import org.springframework.core.io.ClassPathResource
1212
import org.springframework.http.HttpHeaders
1313
import org.springframework.http.HttpStatus
1414
import org.springframework.http.RequestEntity
1515
import org.springframework.http.ResponseEntity
1616
import org.springframework.jdbc.core.JdbcTemplate
17-
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils
18-
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator
1917
import org.springframework.test.context.ActiveProfiles
2018
import kotlin.test.assertEquals
2119

2220
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
21+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
2322
@TestClassOrder(ClassOrderer.OrderAnnotation::class)
2423
@ActiveProfiles("test")
2524
class ArticleCommentControllerTest(
2625
@Autowired private val rest: TestRestTemplate,
2726
@Autowired private val jdbcTemplate: JdbcTemplate,
2827
) {
29-
companion object {
30-
lateinit var member1: User
31-
lateinit var member1Token: TokenDTO
32-
lateinit var member2: User
33-
lateinit var member2Token: TokenDTO
34-
35-
object ArticleComment {
36-
object Id {
37-
const val BY_MEMBER1 = 1L
38-
const val INVALID = 999L
39-
}
40-
}
28+
lateinit var member1: User
29+
lateinit var member1Token: TokenDTO
30+
lateinit var member2: User
31+
lateinit var member2Token: TokenDTO
4132

42-
@JvmStatic
43-
@BeforeAll
44-
fun setup(@Autowired grantService: TestGrantService) {
45-
val (member1, member1Token) = grantService.grant("member1")
46-
this.member1 = member1
47-
this.member1Token = member1Token
48-
val (member2, member2Token) = grantService.grant("member2")
49-
this.member2 = member2
50-
this.member2Token = member2Token
33+
object ArticleComment {
34+
object Id {
35+
const val BY_MEMBER1 = 1L
36+
const val INVALID = 999L
5137
}
5238
}
5339

40+
@BeforeAll
41+
fun setup(@Autowired grantService: TestGrantService) {
42+
resetDatabase(jdbcTemplate)
43+
val (member1, member1Token) = grantService.grant("member1")
44+
this.member1 = member1
45+
this.member1Token = member1Token
46+
val (member2, member2Token) = grantService.grant("member2")
47+
this.member2 = member2
48+
this.member2Token = member2Token
49+
}
50+
5451
private inline fun <reified T> getComments(articleId: Long) =
5552
rest.getForEntity("/articles/${articleId}/comments", T::class.java)
5653

@@ -88,23 +85,12 @@ class ArticleCommentControllerTest(
8885
return rest.exchange(request.build(), T::class.java)
8986
}
9087

91-
private fun resetDatabase() {
92-
val dataSource = jdbcTemplate.dataSource
93-
?: error("DataSource is required for resetting database")
94-
val populator = ResourceDatabasePopulator().apply {
95-
addScript(ClassPathResource("/database/data/truncate.sql"))
96-
addScript(ClassPathResource("/database/data/test.sql"))
97-
}
98-
99-
DatabasePopulatorUtils.execute(populator, dataSource)
100-
}
101-
10288
@Nested
10389
@Order(1)
10490
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
10591
inner class GetComments {
10692
@BeforeAll
107-
fun setupDatabase() = resetDatabase()
93+
fun setupDatabase() = resetDatabase(jdbcTemplate)
10894

10995
@Test
11096
fun `getComments - ok`() {
@@ -119,7 +105,7 @@ class ArticleCommentControllerTest(
119105
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
120106
inner class GetReplies {
121107
@BeforeAll
122-
fun setupDatabase() = resetDatabase()
108+
fun setupDatabase() = resetDatabase(jdbcTemplate)
123109

124110
@Test
125111
fun `getReplies - ok`() {
@@ -138,7 +124,7 @@ class ArticleCommentControllerTest(
138124
)
139125

140126
@BeforeAll
141-
fun setupDatabase() = resetDatabase()
127+
fun setupDatabase() = resetDatabase(jdbcTemplate)
142128

143129
@Test
144130
fun `postComment - unauthenticated`() {
@@ -170,7 +156,7 @@ class ArticleCommentControllerTest(
170156
)
171157

172158
@BeforeAll
173-
fun setupDatabase() = resetDatabase()
159+
fun setupDatabase() = resetDatabase(jdbcTemplate)
174160

175161
@Test
176162
fun `editComment - unauthenticated`() {
@@ -203,7 +189,7 @@ class ArticleCommentControllerTest(
203189
@TestMethodOrder(MethodOrderer.OrderAnnotation::class)
204190
inner class DeleteComment {
205191
@BeforeAll
206-
fun setupDatabase() = resetDatabase()
192+
fun setupDatabase() = resetDatabase(jdbcTemplate)
207193

208194
@Test
209195
fun `deleteComment - unauthenticated`() {

src/test/kotlin/me/loghub/api/controller/article/ArticleControllerTest.kt

Lines changed: 31 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,61 +4,58 @@ import me.loghub.api.dto.article.*
44
import me.loghub.api.dto.auth.token.TokenDTO
55
import me.loghub.api.entity.user.User
66
import me.loghub.api.service.test.TestGrantService
7+
import me.loghub.api.util.resetDatabase
78
import org.junit.jupiter.api.*
89
import org.springframework.beans.factory.annotation.Autowired
910
import org.springframework.boot.test.context.SpringBootTest
1011
import org.springframework.boot.test.web.client.TestRestTemplate
11-
import org.springframework.core.io.ClassPathResource
1212
import org.springframework.data.domain.Page
1313
import org.springframework.http.HttpHeaders
1414
import org.springframework.http.HttpStatus
1515
import org.springframework.http.RequestEntity
1616
import org.springframework.http.ResponseEntity
1717
import org.springframework.jdbc.core.JdbcTemplate
18-
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils
19-
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator
2018
import org.springframework.test.context.ActiveProfiles
2119
import org.springframework.web.util.UriComponentsBuilder
2220
import kotlin.test.Test
2321
import kotlin.test.assertEquals
2422

2523
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
24+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
2625
@TestClassOrder(ClassOrderer.OrderAnnotation::class)
2726
@ActiveProfiles("test")
2827
class ArticleControllerTest(
2928
@Autowired private val rest: TestRestTemplate,
3029
@Autowired private val jdbcTemplate: JdbcTemplate,
3130
) {
32-
companion object {
33-
lateinit var member1: User
34-
lateinit var member1Token: TokenDTO
35-
lateinit var member2: User
36-
lateinit var member2Token: TokenDTO
37-
38-
object Article {
39-
object Id {
40-
const val BY_MEMBER1 = 1L
41-
const val INVALID = 999L
42-
}
43-
44-
object Slug {
45-
const val BY_MEMBER1 = "article-1"
46-
const val INVALID = "unknown-article"
47-
}
31+
lateinit var member1: User
32+
lateinit var member1Token: TokenDTO
33+
lateinit var member2: User
34+
lateinit var member2Token: TokenDTO
35+
36+
object Article {
37+
object Id {
38+
const val BY_MEMBER1 = 1L
39+
const val INVALID = 999L
4840
}
4941

50-
@JvmStatic
51-
@BeforeAll
52-
fun setup(@Autowired grantService: TestGrantService) {
53-
val (member1, member1Token) = grantService.grant("member1")
54-
this.member1 = member1
55-
this.member1Token = member1Token
56-
val (member2, member2Token) = grantService.grant("member2")
57-
this.member2 = member2
58-
this.member2Token = member2Token
42+
object Slug {
43+
const val BY_MEMBER1 = "article-1"
44+
const val INVALID = "unknown-article"
5945
}
6046
}
6147

48+
@BeforeAll
49+
fun setup(@Autowired grantService: TestGrantService) {
50+
resetDatabase(jdbcTemplate)
51+
val (member1, member1Token) = grantService.grant("member1")
52+
this.member1 = member1
53+
this.member1Token = member1Token
54+
val (member2, member2Token) = grantService.grant("member2")
55+
this.member2 = member2
56+
this.member2Token = member2Token
57+
}
58+
6259
private inline fun <reified T> searchArticles(uri: String) =
6360
rest.getForEntity(uri, T::class.java)
6461

@@ -93,23 +90,12 @@ class ArticleControllerTest(
9390
return rest.exchange(request.build(), T::class.java)
9491
}
9592

96-
private fun resetDatabase() {
97-
val dataSource = jdbcTemplate.dataSource
98-
?: error("DataSource is required for resetting database")
99-
val populator = ResourceDatabasePopulator().apply {
100-
addScript(ClassPathResource("/database/data/truncate.sql"))
101-
addScript(ClassPathResource("/database/data/test.sql"))
102-
}
103-
104-
DatabasePopulatorUtils.execute(populator, dataSource)
105-
}
106-
10793
@Nested
10894
@Order(1)
10995
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
11096
inner class SearchArticles {
11197
@BeforeAll
112-
fun setupDatabase() = resetDatabase()
98+
fun setupDatabase() = resetDatabase(jdbcTemplate)
11399

114100
@Test
115101
fun `searchArticles - ok - no params`() {
@@ -152,7 +138,7 @@ class ArticleControllerTest(
152138
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
153139
inner class GetArticle {
154140
@BeforeAll
155-
fun setupDatabase() = resetDatabase()
141+
fun setupDatabase() = resetDatabase(jdbcTemplate)
156142

157143
@Test
158144
fun `getArticle - not_found`() {
@@ -173,7 +159,7 @@ class ArticleControllerTest(
173159
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
174160
inner class GetArticleForEdit {
175161
@BeforeAll
176-
fun setupDatabase() = resetDatabase()
162+
fun setupDatabase() = resetDatabase(jdbcTemplate)
177163

178164
@Test
179165
fun `getArticleForEdit - unauthorized`() {
@@ -213,7 +199,7 @@ class ArticleControllerTest(
213199
)
214200

215201
@BeforeAll
216-
fun setupDatabase() = resetDatabase()
202+
fun setupDatabase() = resetDatabase(jdbcTemplate)
217203

218204
@Test
219205
fun `postArticle - unauthorized`() {
@@ -258,7 +244,7 @@ class ArticleControllerTest(
258244
)
259245

260246
@BeforeAll
261-
fun setupDatabase() = resetDatabase()
247+
fun setupDatabase() = resetDatabase(jdbcTemplate)
262248

263249
@Test
264250
fun `editArticle - unauthorized`() {
@@ -297,7 +283,7 @@ class ArticleControllerTest(
297283
@TestMethodOrder(MethodOrderer.OrderAnnotation::class)
298284
inner class DeleteArticle {
299285
@BeforeAll
300-
fun setupDatabase() = resetDatabase()
286+
fun setupDatabase() = resetDatabase(jdbcTemplate)
301287

302288
@Test
303289
fun `deleteArticle - unauthorized`() {

0 commit comments

Comments
 (0)