Skip to content

Commit 72b5980

Browse files
committed
added tests with SQLDelight library
1 parent c8fe9bc commit 72b5980

File tree

4 files changed

+168
-1
lines changed

4 files changed

+168
-1
lines changed

build.gradle.kts

+10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ plugins {
1010
alias(libs.plugins.detekt)
1111
alias(libs.plugins.dokka)
1212
alias(libs.plugins.kover)
13+
alias(libs.plugins.sqldelight)
1314
id("maven-publish")
1415
id("signing")
1516
}
@@ -87,7 +88,15 @@ kotlin {
8788
}
8889
}
8990
val jsTest by getting {
91+
sqldelight {
92+
databases {
93+
create("Database") {
94+
packageName.set("com.example")
95+
generateAsync.set(true)
9096

97+
}
98+
}
99+
}
91100
}
92101

93102
val publicationsFromMainHost =
@@ -178,6 +187,7 @@ kotlin {
178187
password = System.getenv("SONATYPE_PASSWORD") ?: localProperties["sonatype.password"] as String?
179188
}
180189
}
190+
mavenLocal()
181191
}
182192
}
183193

gradle/libs.versions.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
1919
dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
2020
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
2121
kotlin-js = { id = "org.jetbrains.kotlin.js", version.ref = "kotlin" }
22-
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
22+
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
23+
sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
CREATE TABLE hockeyPlayer (
2+
player_number INTEGER PRIMARY KEY NOT NULL,
3+
full_name TEXT NOT NULL
4+
);
5+
6+
CREATE INDEX hockeyPlayer_full_name ON hockeyPlayer(full_name);
7+
8+
INSERT INTO hockeyPlayer (player_number, full_name)
9+
VALUES (15, 'Ryan Getzlaf');
10+
11+
12+
selectAll:
13+
SELECT *
14+
FROM hockeyPlayer;
15+
16+
selectWithLimit:
17+
SELECT *
18+
FROM hockeyPlayer LIMIT ?,?;
19+
20+
insert:
21+
INSERT INTO hockeyPlayer(player_number, full_name)
22+
VALUES (?, ?);
23+
24+
insertFullPlayerObject:
25+
INSERT INTO hockeyPlayer(player_number, full_name)
26+
VALUES ?;
27+
28+
updateName:
29+
UPDATE hockeyPlayer SET full_name = ? WHERE player_number = ?;
30+
31+
deletePlayer:
32+
DELETE FROM hockeyPlayer WHERE player_number = ?;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package cz.sazel.sqldelight.node.sqlite3
2+
3+
import com.example.Database
4+
import com.example.HockeyPlayer
5+
import kotlinx.coroutines.flow.take
6+
import kotlinx.coroutines.flow.toCollection
7+
import kotlinx.coroutines.test.runTest
8+
import kotlin.test.Test
9+
import kotlin.test.assertContains
10+
import kotlin.test.assertEquals
11+
12+
class DriverWithLibraryTest {
13+
14+
private lateinit var driver: SQLite3Driver
15+
private val dbName = "driver_test.db"
16+
17+
private fun withDatabase(fn: suspend Database.() -> Unit) = runTest {
18+
val dbName = this@DriverWithLibraryTest.dbName
19+
js("var fs=require('fs'); if(fs.existsSync(dbName)) fs.unlinkSync(dbName)")
20+
try {
21+
driver = initSqlite3SqlDriver(filename = "driver_test.db", schema = Database.Schema)
22+
val database = Database(driver)
23+
database.fn()
24+
} finally {
25+
js("require('fs').unlinkSync(dbName)")
26+
}
27+
}
28+
29+
@Test
30+
fun testInitialContents() = withDatabase {
31+
playerQueries.selectAll().executeAsFlow().toCollection(mutableListOf()).let {
32+
assertEquals(initialPlayer, it.first())
33+
assertEquals(1, it.size)
34+
}
35+
}
36+
37+
@Test
38+
fun testInsert() = withDatabase {
39+
val insertedPlayer = HockeyPlayer(player_number = 8, full_name = "Teemu Selanne")
40+
transaction {
41+
playerQueries.insertFullPlayerObject(insertedPlayer)
42+
}
43+
playerQueries.selectAll().executeAsFlow().toCollection(mutableListOf()).let {
44+
assertContains(it, initialPlayer)
45+
assertContains(it, insertedPlayer)
46+
assertEquals(2, it.size)
47+
}
48+
}
49+
50+
@Test
51+
fun testInsertWithCancelledTransaction() = withDatabase {
52+
val insertedPlayer = HockeyPlayer(player_number = 18, full_name = "Saku Koivu")
53+
try {
54+
transaction {
55+
playerQueries.insertFullPlayerObject(insertedPlayer)
56+
error("Rollback")
57+
}
58+
} catch (e: Exception) {
59+
// do nothing
60+
} finally {
61+
playerQueries.selectAll().executeAsFlow().toCollection(mutableListOf()).let {
62+
assertContains(it, initialPlayer)
63+
assertEquals(1, it.size)
64+
}
65+
}
66+
}
67+
68+
@Test
69+
fun testMultipleInsertsAndPartialCursorRead() = withDatabase {
70+
val insertedPlayers = (0..10).map { HockeyPlayer(player_number = 100L + it, full_name = "Player $it") }
71+
transaction {
72+
insertedPlayers.forEach {
73+
playerQueries.insertFullPlayerObject(it)
74+
}
75+
}
76+
playerQueries.selectAll().executeAsFlow().take(4).toCollection(mutableListOf()).let {
77+
println(it)
78+
assertContains(it, initialPlayer)
79+
assertEquals(4, it.size)
80+
}
81+
}
82+
83+
@Test
84+
fun testUpdate() = withDatabase {
85+
val updatedPlayer = initialPlayer.copy(full_name = "Petr Sykora")
86+
transaction {
87+
playerQueries.updateName(updatedPlayer.full_name, initialPlayer.player_number)
88+
}
89+
playerQueries.selectAll().executeAsFlow().toCollection(mutableListOf()).let {
90+
assertContains(it, updatedPlayer)
91+
assertEquals(1, it.size)
92+
}
93+
}
94+
95+
@Test
96+
fun testDelete() = withDatabase {
97+
transaction {
98+
playerQueries.deletePlayer(initialPlayer.player_number)
99+
}
100+
playerQueries.selectAll().executeAsFlow().toCollection(mutableListOf()).let {
101+
assertEquals(0, it.size)
102+
}
103+
}
104+
105+
@Test
106+
fun testSelectWithLimit() = withDatabase {
107+
val insertedPlayers = (0..100).map { HockeyPlayer(player_number = 100L + it, full_name = "Player $it") }
108+
transaction {
109+
insertedPlayers.forEach {
110+
playerQueries.insertFullPlayerObject(it)
111+
}
112+
}
113+
val list1 = playerQueries.selectWithLimit(0, 50).executeAsFlow().toCollection(mutableListOf())
114+
println(list1.size)
115+
val list2 = playerQueries.selectWithLimit(50, 99).executeAsFlow().toCollection(mutableListOf())
116+
println(list2.size)
117+
val list3 = playerQueries.selectAll().executeAsFlow().toCollection(mutableListOf())
118+
println(list3.size)
119+
}
120+
121+
private companion object {
122+
val initialPlayer = HockeyPlayer(player_number = 15, full_name = "Ryan Getzlaf")
123+
}
124+
}

0 commit comments

Comments
 (0)