Skip to content

Commit 95af6b7

Browse files
committed
testcontainers
1 parent b1a0611 commit 95af6b7

File tree

7 files changed

+133
-2
lines changed

7 files changed

+133
-2
lines changed

build.gradle.kts

+9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ group = "com.example"
1111
version = "0.0.1-SNAPSHOT"
1212
java.sourceCompatibility = JavaVersion.VERSION_11
1313

14+
val testcontainersVersion = "1.15.3"
15+
val postgresVersion="42.2.14"
16+
1417
repositories {
1518
mavenCentral()
1619
}
@@ -30,6 +33,12 @@ dependencies {
3033
testImplementation("org.springframework.boot:spring-boot-starter-test")
3134
testImplementation("io.mockk:mockk:1.10.4")
3235
testImplementation("com.ninja-squad:springmockk:3.0.1")
36+
37+
testImplementation("org.testcontainers:testcontainers:$testcontainersVersion")
38+
testImplementation("org.testcontainers:junit-jupiter:$testcontainersVersion")
39+
testImplementation("org.testcontainers:postgresql:$testcontainersVersion")
40+
41+
implementation("org.postgresql:postgresql:$postgresVersion")
3342
}
3443

3544
tasks.withType<KotlinCompile> {

settings.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
rootProject.name = "spring-time-in-kotlin-episode4"
1+
rootProject.name = "spring-time-in-kotlin-episode5"

src/main/resources/application.properties

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
spring.datasource.driver-class-name=org.h2.Driver
1+
#spring.datasource.driver-class-name=org.h2.Driver
2+
spring.datasource.driver-class-name=org.postgresql.Driver
23
spring.datasource.url=jdbc:h2:file:./data/testdb
34
spring.datasource.username=sa
45
spring.datasource.password=password

src/main/resources/sql/schema.ddl

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CREATE TABLE messages (
2+
id VARCHAR(100) UNIQUE NOT NULL,
3+
text VARCHAR(500),
4+
CONSTRAINT id_messages PRIMARY KEY (id)
5+
);
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package demo
2+
3+
import org.junit.jupiter.api.Assertions.assertTrue
4+
import org.junit.jupiter.api.Test
5+
import org.testcontainers.junit.jupiter.Container
6+
import org.testcontainers.junit.jupiter.Testcontainers
7+
8+
@Testcontainers
9+
class IntegrationTests {
10+
11+
@Container
12+
var container = postgres("postgres:13-alpine") {
13+
// withExposedPorts(6379)
14+
withInitScript("schema.ddl")
15+
withDatabaseName("db")
16+
withUsername("user")
17+
withPassword("password")
18+
}
19+
20+
@Test
21+
fun `the container is up and running`() {
22+
assertTrue(container.isRunning)
23+
}
24+
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package demo
2+
3+
import demo.kx.uuid
4+
import org.assertj.core.api.Assertions
5+
import org.junit.jupiter.api.MethodOrderer
6+
import org.junit.jupiter.api.Order
7+
import org.junit.jupiter.api.Test
8+
import org.junit.jupiter.api.TestMethodOrder
9+
import org.springframework.beans.factory.annotation.Autowired
10+
import org.springframework.boot.test.context.SpringBootTest
11+
import org.springframework.boot.test.web.client.TestRestTemplate
12+
import org.springframework.boot.test.web.client.getForEntity
13+
import org.springframework.boot.test.web.client.getForObject
14+
import org.springframework.boot.test.web.client.postForObject
15+
import org.springframework.http.HttpStatus
16+
import org.springframework.test.context.DynamicPropertyRegistry
17+
import org.springframework.test.context.DynamicPropertySource
18+
import org.testcontainers.junit.jupiter.Container
19+
import org.testcontainers.junit.jupiter.Testcontainers
20+
import kotlin.random.Random
21+
22+
@Testcontainers
23+
@SpringBootTest(
24+
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
25+
)
26+
@TestMethodOrder(MethodOrderer.OrderAnnotation::class)
27+
class SpringBootIntegrationTests(@Autowired val client: TestRestTemplate) {
28+
companion object {
29+
@Container
30+
val container = postgres("postgres:13-alpine") {
31+
withInitScript("sql/schema.ddl")
32+
withDatabaseName("db")
33+
withUsername("user")
34+
withPassword("password")
35+
}
36+
37+
@JvmStatic
38+
@DynamicPropertySource
39+
fun datasourceConfig(registry: DynamicPropertyRegistry) {
40+
registry.add("spring.datasource.url", container::getJdbcUrl)
41+
registry.add("spring.datasource.password", container::getPassword)
42+
registry.add("spring.datasource.username", container::getUsername)
43+
}
44+
}
45+
46+
@Test
47+
@Order(1)
48+
fun `test hello endpoint`() {
49+
println(">>>>>>>>>>>>> Asserting Hello endpoint! >>>>>>>>>>>>>>>>>>>>>>>>> ")
50+
val entity = client.getForEntity<String>("/hello")
51+
Assertions.assertThat(entity.statusCode).isEqualTo(HttpStatus.OK)
52+
Assertions.assertThat(entity.body).contains("Hello")
53+
}
54+
55+
//TODO: remove
56+
val id = "e3b7f959-f5c2-3d07-86e3-cd9df75e0b83"//"${Random.nextInt()}".uuid()
57+
58+
@Test
59+
@Order(2)
60+
fun `testing if we can post and retrieve the data`() {
61+
// val id = "${Random.nextInt()}".uuid()
62+
val message = Message(id, "some message")
63+
client.postForObject<Message>("/", message)
64+
65+
val entity = client.getForEntity<String>("/$id")
66+
Assertions.assertThat(entity.statusCode).isEqualTo(HttpStatus.OK)
67+
Assertions.assertThat(entity.body).contains(message.id)
68+
Assertions.assertThat(entity.body).contains(message.text)
69+
70+
val msg = client.getForObject<Message>("/$id")!!
71+
Assertions.assertThat(entity.statusCode).isEqualTo(HttpStatus.OK)
72+
Assertions.assertThat(msg.id).isEqualTo(message.id)
73+
Assertions.assertThat(msg.text).contains(message.text)
74+
}
75+
76+
@Test
77+
@Order(3)
78+
fun `message not found`() {
79+
// val id = "${Random.nextInt()}".uuid()
80+
val entity = client.getForEntity<String>("/$id")
81+
Assertions.assertThat(entity.statusCode).isEqualTo(HttpStatus.NOT_FOUND)
82+
}
83+
}

src/test/kotlin/demo/common.kt

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package demo
2+
3+
import org.testcontainers.containers.JdbcDatabaseContainer
4+
import org.testcontainers.containers.PostgreSQLContainer
5+
import org.testcontainers.utility.DockerImageName
6+
7+
fun postgres(imageCoordinates: String, options: JdbcDatabaseContainer<Nothing>.() -> Unit) =
8+
PostgreSQLContainer<Nothing>(DockerImageName.parse(imageCoordinates)).apply(options)

0 commit comments

Comments
 (0)