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