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+ throw RuntimeException (" Rollback" )
57+ }
58+ } catch (e: Exception ) {
59+
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