Skip to content

Commit f53ed02

Browse files
committed
Use Konstruct to build test data
1 parent 41701f0 commit f53ed02

File tree

10 files changed

+38
-41
lines changed

10 files changed

+38
-41
lines changed

buildSrc/src/main/kotlin/kickstart.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ dependencies {
101101

102102
testkitImplementation(libs.hamkrest)
103103
testkitImplementation(libs.junit.api)
104+
testkitImplementation(libs.konstruct)
104105
testkitImplementation(libs.faker)
105106
testkitImplementation(libs.minutest)
106107
testkit(sourceSets["testkit"].output)

buildSrc/src/main/kotlin/libs.kt

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ object libs {
2121

2222
val konfig = "com.natpryce:konfig:1.6.10.0"
2323

24+
val konstruct = "com.vtence.konstruct:konstruct:0.6.0"
25+
2426
val mario = "com.vtence.mario:mario:0.3.3"
2527

2628
val minutest = "dev.minutest:minutest:2.0.0-rc4"

domain/build.gradle.kts

-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@ plugins {
22
id("kickstart")
33
}
44

5-
dependencies {
6-
testkitImplementation(libs.hamkrest)
7-
}
8-
95
tasks.jar {
106
isPreserveFileTimestamps = false
117
isReproducibleFileOrder = true

domain/src/main/kotlin/security/User.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ value class Username(val value: String): Serializable {
77
override fun toString() = value.lowercase()
88
}
99

10-
class User(val username: Username, private val password: PasswordHash) {
1110

11+
data class User(val username: Username, private val password: PasswordHash) {
1212
val passwordHash: String by password::value
1313

1414
fun checkPassword(secret: String) = password.validate(secret)

domain/src/testkit/kotlin/Builder.kt

-10
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package kickstart.security
22

3-
import kickstart.Builder
3+
import com.vtence.konstruct.Factory
4+
import com.vtence.konstruct.property
45

5-
class UserBuilder(
6-
var username: String = "john.doe",
7-
var password: String = "secret"
8-
): Builder<User> {
9-
override fun build(): User {
10-
return User(username, password)
11-
}
12-
}
6+
object UserMaker {
7+
val username = property<User, String>()
8+
val password = property<User, String>()
139

14-
fun user(build: UserBuilder.() -> Unit) = UserBuilder().apply(build)
10+
val user = Factory {
11+
User(
12+
username = it.valueOf(username) ?: "john.doe",
13+
password = it.valueOf(password) ?: "secret"
14+
)
15+
}
16+
}

integration/build.gradle.kts

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ dependencies {
1111
runtimeOnly(libs.postgres)
1212

1313
testkitImplementation(project(path = ":domain", configuration = "testkit"))
14-
testkitImplementation(libs.hamkrest)
1514
}
1615

1716
tasks.jar {

integration/src/main/kotlin/security/UsersDatabase.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import kickstart.db.eq
77

88
class UsersDatabase(private val db: StatementExecutor) : UserBase {
99

10-
fun add(user: User) {
10+
fun add(user: User): User {
1111
Users.insert(user.record).execute(db)
12+
return user
1213
}
1314

1415
override fun findBy(username: Username): User? {

integration/src/test/kotlin/security/UsersDatabaseTest.kt

+20-13
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ package kickstart.security
22

33
import com.natpryce.hamkrest.assertion.assertThat
44
import com.natpryce.hamkrest.present
5+
import com.vtence.konstruct.Provider
6+
import com.vtence.konstruct.a
7+
import com.vtence.konstruct.make
8+
import com.vtence.konstruct.with
59
import kickstart.db.AbstractDatabaseTest
10+
import kickstart.security.UserMaker.password
11+
import kickstart.security.UserMaker.user
12+
import kickstart.security.UserMaker.username
613
import org.junit.jupiter.api.BeforeEach
714
import org.junit.jupiter.api.Test
815
import org.junit.jupiter.api.assertThrows
@@ -21,9 +28,9 @@ class UsersDatabaseTest : AbstractDatabaseTest() {
2128

2229
@Test
2330
fun `round trips users`() {
24-
val samples = listOf(
25-
user { username = "[email protected]"; password = "american" },
26-
user { username = "[email protected]"; password = "british" }
31+
val samples = make(
32+
a(user, with(username, "[email protected]"), with(password,"american")),
33+
a(user, with(username, "[email protected]"), with(password,"british")),
2734
)
2835

2936
samples.forEach { assertCanBePersisted(it) }
@@ -32,9 +39,9 @@ class UsersDatabaseTest : AbstractDatabaseTest() {
3239
@Test
3340
fun `finds user by username`() {
3441
persist(
35-
user { username = "[email protected]" },
36-
user { username = "[email protected]" },
37-
user { username = "[email protected]"}
42+
a(user, with(username, "[email protected]")),
43+
a(user, with(username, "[email protected]")),
44+
a(user, with(username, "[email protected]")),
3845
)
3946
val match = db.findBy(Username("[email protected]"))
4047

@@ -43,12 +50,12 @@ class UsersDatabaseTest : AbstractDatabaseTest() {
4350

4451
@Test
4552
fun `refuses to add account if username is already taken`() {
46-
persist(user { username = "[email protected]" })
53+
persist(a(user, with(username, "[email protected]")),)
4754

48-
assertThrows<SQLException> { db.add(user { username = "[email protected]" }.build()) }
55+
assertThrows<SQLException> { persist(a(user, with(username, "[email protected]"))) }
4956
}
5057

51-
private fun assertCanBePersisted(user: UserBuilder) {
58+
private fun assertCanBePersisted(user: User) {
5259
assertReloadsWithSameState(persisted(user))
5360
}
5461

@@ -57,13 +64,13 @@ class UsersDatabaseTest : AbstractDatabaseTest() {
5764
assertThat("persisted entity", persisted, present(hasSameStateAs(original)))
5865
}
5966

60-
private fun persist(vararg users: UserBuilder) {
61-
users.forEach { persisted(it) }
67+
private fun persist(vararg users: Provider<User>) {
68+
users.forEach { persisted(it()) }
6269
}
6370

64-
private fun persisted(user: UserBuilder): User {
71+
private fun persisted(user: User): User {
6572
return transaction {
66-
user.build().also { db.add(it) }
73+
db.add(user)
6774
}
6875
}
6976
}

server/build.gradle.kts

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ dependencies {
1717

1818
runtimeOnly(libs.simple)
1919

20-
testkitImplementation(libs.hamkrest)
2120
testkitImplementation(libs.mario)
2221
testkitImplementation(libs.selenium.api)
2322
testkitImplementation(libs.selenium.chromedriver)

0 commit comments

Comments
 (0)