@@ -7,7 +7,6 @@ import dev.gitlive.firebase.initialize
7
7
import dev.gitlive.firebase.runBlockingTest
8
8
import dev.gitlive.firebase.runTest
9
9
import kotlinx.coroutines.Dispatchers
10
- import kotlinx.coroutines.delay
11
10
import kotlinx.coroutines.flow.first
12
11
import kotlinx.coroutines.flow.map
13
12
import kotlinx.coroutines.withContext
@@ -22,7 +21,6 @@ import kotlin.test.assertFailsWith
22
21
import kotlin.test.assertFalse
23
22
import kotlin.test.assertTrue
24
23
import kotlin.time.Duration.Companion.minutes
25
- import kotlin.time.Duration.Companion.seconds
26
24
27
25
expect val emulatorHost: String
28
26
expect val context: Any
@@ -55,9 +53,6 @@ class FirebaseDatabaseTest {
55
53
56
54
database = Firebase .database(app).apply {
57
55
useEmulator(emulatorHost, 9000 )
58
- setLoggingEnabled(true )
59
- }.also {
60
- it.goOnline()
61
56
}
62
57
}
63
58
@@ -68,169 +63,155 @@ class FirebaseDatabaseTest {
68
63
}
69
64
}
70
65
71
- // @Test
72
- // fun testSetValue() = runTest {
73
- // ensureDatabaseConnected()
74
- // val testValue = "test"
75
- // val testReference = database.reference("testPath")
76
- //
77
- // testReference.setValue(testValue)
78
- //
79
- // val testReferenceValue = testReference
80
- // .valueEvents
81
- // .first()
82
- // .value<String>()
83
- //
84
- // assertEquals(testValue, testReferenceValue)
85
- // }
86
- //
87
- // @Test
88
- // fun testChildCount() = runTest {
89
- // setupRealtimeData()
90
- // val dataSnapshot = database
91
- // .reference("FirebaseRealtimeDatabaseTest")
92
- // .valueEvents
93
- // .first()
94
- //
95
- // val firebaseDatabaseChildCount = dataSnapshot.child("values").children.count()
96
- // assertEquals(3, firebaseDatabaseChildCount)
97
- // }
98
- //
99
- // @Test
100
- // fun testBasicIncrementTransaction() = runTest {
101
- // ensureDatabaseConnected()
102
- // val data = DatabaseTest("PostOne", 2)
103
- // val userRef = database.reference("users/user_1/post_id_1")
104
- // setupDatabase(userRef, data, DatabaseTest.serializer())
105
- //
106
- // // Check database before transaction
107
- // val userDocBefore = userRef.valueEvents.first().value(DatabaseTest.serializer())
108
- // assertEquals(data.title, userDocBefore.title)
109
- // assertEquals(data.likes, userDocBefore.likes)
110
- //
111
- // // Run transaction
112
- // val transactionSnapshot = userRef.runTransaction(DatabaseTest.serializer()) { it.copy(likes = it.likes + 1) }
113
- // val userDocAfter = transactionSnapshot.value(DatabaseTest.serializer())
114
- //
115
- // // Check the database after transaction
116
- // assertEquals(data.title, userDocAfter.title)
117
- // assertEquals(data.likes + 1, userDocAfter.likes)
118
- // }
119
- //
120
- // @Test
121
- // fun testBasicDecrementTransaction() = runTest {
122
- // ensureDatabaseConnected()
123
- // val data = DatabaseTest("PostTwo", 2)
124
- // val userRef = database.reference("users/user_1/post_id_2")
125
- // setupDatabase(userRef, data, DatabaseTest.serializer())
126
- //
127
- // // Check database before transaction
128
- // val userDocBefore = userRef.valueEvents.first().value(DatabaseTest.serializer())
129
- // assertEquals(data.title, userDocBefore.title)
130
- // assertEquals(data.likes, userDocBefore.likes)
131
- //
132
- // // Run transaction
133
- // val transactionSnapshot = userRef.runTransaction(DatabaseTest.serializer()) { it.copy(likes = it.likes - 1) }
134
- // val userDocAfter = transactionSnapshot.value(DatabaseTest.serializer())
135
- //
136
- // // Check the database after transaction
137
- // assertEquals(data.title, userDocAfter.title)
138
- // assertEquals(data.likes - 1, userDocAfter.likes)
139
- // }
140
- //
141
- // @Test
142
- // fun testSetServerTimestamp() = runTest {
143
- // ensureDatabaseConnected()
144
- // val testReference = database.reference("testSetServerTimestamp")
145
- //
146
- // testReference.setValue(ServerValue.TIMESTAMP)
147
- //
148
- // val timestamp = testReference
149
- // .valueEvents
150
- // .first()
151
- // .value<Long>()
152
- //
153
- // assertTrue(timestamp > 0)
154
- // }
155
- //
156
- // @Test
157
- // fun testIncrement() = runTest {
158
- // ensureDatabaseConnected()
159
- // val testReference = database.reference("testIncrement")
160
- //
161
- // testReference.setValue(2.0)
162
- //
163
- // val value = testReference
164
- // .valueEvents
165
- // .first()
166
- // .value<Double>()
167
- //
168
- // assertEquals(2.0, value)
169
- //
170
- // testReference.setValue(ServerValue.increment(5.0))
171
- // val updatedValue = testReference
172
- // .valueEvents
173
- // .first()
174
- // .value<Double>()
175
- //
176
- // assertEquals(7.0, updatedValue)
177
- // }
178
- //
179
- // @Test
180
- // fun testBreakRules() = runTest {
181
- // ensureDatabaseConnected()
182
- // val reference = database
183
- // .reference("FirebaseRealtimeDatabaseTest")
184
- // val child = reference.child("lastActivity")
185
- // assertFailsWith<DatabaseException> {
186
- // child.setValue("stringNotAllowed")
187
- // }
188
- // child.setValue(2)
189
- // assertFailsWith<DatabaseException> {
190
- // reference.updateChildren(mapOf("lastActivity" to "stringNotAllowed"))
191
- // }
192
- // }
193
- //
194
- // @Test
195
- // fun testUpdateChildren() = runTest {
196
- // setupRealtimeData()
197
- // val reference = database
198
- // .reference("FirebaseRealtimeDatabaseTest")
199
- // val valueEvents = reference.child("lastActivity").valueEvents
200
- // assertTrue(valueEvents.first().exists)
201
- // reference.updateChildren(mapOf("test" to false, "nested" to mapOf("lastActivity" to null), "lastActivity" to null))
202
- // assertFalse(valueEvents.first().exists)
203
- // }
66
+ @Test
67
+ fun testSetValue () = runTest {
68
+ ensureDatabaseConnected()
69
+ val testValue = " test"
70
+ val testReference = database.reference(" testPath" )
71
+
72
+ testReference.setValue(testValue)
73
+
74
+ val testReferenceValue = testReference
75
+ .valueEvents
76
+ .first()
77
+ .value<String >()
78
+
79
+ assertEquals(testValue, testReferenceValue)
80
+ }
204
81
205
82
@Test
206
- fun testUpdateChildrenOnDisconnect () = runBlockingTest {
83
+ fun testChildCount () = runTest {
207
84
setupRealtimeData()
208
- withTimeout(120 .seconds) {
209
- val reference = database
210
- .reference(" FirebaseRealtimeDatabaseTest" )
211
- val valueEvents = reference.child(" lastActivity" ).valueEvents
212
- assertTrue(valueEvents.first().exists)
213
- reference.onDisconnect().updateChildren(
214
- mapOf (
215
- " test" to false ,
216
- " nested" to mapOf (" lastActivity" to null ),
217
- " lastActivity" to null
218
- )
219
- )
220
- database.goOffline()
85
+ val dataSnapshot = database
86
+ .reference(" FirebaseRealtimeDatabaseTest" )
87
+ .valueEvents
88
+ .first()
221
89
90
+ val firebaseDatabaseChildCount = dataSnapshot.child(" values" ).children.count()
91
+ assertEquals(3 , firebaseDatabaseChildCount)
92
+ }
222
93
94
+ @Test
95
+ fun testBasicIncrementTransaction () = runTest {
96
+ ensureDatabaseConnected()
97
+ val data = DatabaseTest (" PostOne" , 2 )
98
+ val userRef = database.reference(" users/user_1/post_id_1" )
99
+ setupDatabase(userRef, data, DatabaseTest .serializer())
100
+
101
+ // Check database before transaction
102
+ val userDocBefore = userRef.valueEvents.first().value(DatabaseTest .serializer())
103
+ assertEquals(data.title, userDocBefore.title)
104
+ assertEquals(data.likes, userDocBefore.likes)
105
+
106
+ // Run transaction
107
+ val transactionSnapshot = userRef.runTransaction(DatabaseTest .serializer()) { it.copy(likes = it.likes + 1 ) }
108
+ val userDocAfter = transactionSnapshot.value(DatabaseTest .serializer())
109
+
110
+ // Check the database after transaction
111
+ assertEquals(data.title, userDocAfter.title)
112
+ assertEquals(data.likes + 1 , userDocAfter.likes)
113
+ }
223
114
224
- ensureDatabaseDisconnected()
115
+ @Test
116
+ fun testBasicDecrementTransaction () = runTest {
117
+ ensureDatabaseConnected()
118
+ val data = DatabaseTest (" PostTwo" , 2 )
119
+ val userRef = database.reference(" users/user_1/post_id_2" )
120
+ setupDatabase(userRef, data, DatabaseTest .serializer())
121
+
122
+ // Check database before transaction
123
+ val userDocBefore = userRef.valueEvents.first().value(DatabaseTest .serializer())
124
+ assertEquals(data.title, userDocBefore.title)
125
+ assertEquals(data.likes, userDocBefore.likes)
126
+
127
+ // Run transaction
128
+ val transactionSnapshot = userRef.runTransaction(DatabaseTest .serializer()) { it.copy(likes = it.likes - 1 ) }
129
+ val userDocAfter = transactionSnapshot.value(DatabaseTest .serializer())
130
+
131
+ // Check the database after transaction
132
+ assertEquals(data.title, userDocAfter.title)
133
+ assertEquals(data.likes - 1 , userDocAfter.likes)
134
+ }
135
+
136
+ @Test
137
+ fun testSetServerTimestamp () = runTest {
138
+ ensureDatabaseConnected()
139
+ val testReference = database.reference(" testSetServerTimestamp" )
140
+
141
+ testReference.setValue(ServerValue .TIMESTAMP )
142
+
143
+ val timestamp = testReference
144
+ .valueEvents
145
+ .first()
146
+ .value<Long >()
147
+
148
+ assertTrue(timestamp > 0 )
149
+ }
150
+
151
+ @Test
152
+ fun testIncrement () = runTest {
153
+ ensureDatabaseConnected()
154
+ val testReference = database.reference(" testIncrement" )
225
155
226
- delay( 10000 )
156
+ testReference.setValue( 2.0 )
227
157
228
- // database.goOnline()
229
- // ensureDatabaseConnected()
230
- assertFalse(valueEvents.first().exists)
158
+ val value = testReference
159
+ .valueEvents
160
+ .first()
161
+ .value<Double >()
162
+
163
+ assertEquals(2.0 , value)
164
+
165
+ testReference.setValue(ServerValue .increment(5.0 ))
166
+ val updatedValue = testReference
167
+ .valueEvents
168
+ .first()
169
+ .value<Double >()
170
+
171
+ assertEquals(7.0 , updatedValue)
172
+ }
173
+
174
+ @Test
175
+ fun testBreakRules () = runTest {
176
+ ensureDatabaseConnected()
177
+ val reference = database
178
+ .reference(" FirebaseRealtimeDatabaseTest" )
179
+ val child = reference.child(" lastActivity" )
180
+ assertFailsWith<DatabaseException > {
181
+ child.setValue(" stringNotAllowed" )
182
+ }
183
+ child.setValue(2 )
184
+ assertFailsWith<DatabaseException > {
185
+ reference.updateChildren(mapOf (" lastActivity" to " stringNotAllowed" ))
231
186
}
232
187
}
233
188
189
+ @Test
190
+ fun testUpdateChildren () = runTest {
191
+ setupRealtimeData()
192
+ val reference = database
193
+ .reference(" FirebaseRealtimeDatabaseTest" )
194
+ val valueEvents = reference.child(" lastActivity" ).valueEvents
195
+ assertTrue(valueEvents.first().exists)
196
+ reference.updateChildren(mapOf (" test" to false , " nested" to mapOf (" lastActivity" to null ), " lastActivity" to null ))
197
+ assertFalse(valueEvents.first().exists)
198
+ }
199
+
200
+ @Test
201
+ fun testUpdateChildrenOnDisconnect () = runTest {
202
+ setupRealtimeData()
203
+ val reference = database
204
+ .reference(" FirebaseRealtimeDatabaseTest" )
205
+ val valueEvents = reference.child(" lastActivity" ).valueEvents
206
+ assertTrue(valueEvents.first().exists)
207
+ reference.onDisconnect().updateChildren(mapOf (" test" to false , " nested" to mapOf (" lastActivity" to null ), " lastActivity" to null ))
208
+ database.goOffline()
209
+
210
+ database.goOnline()
211
+ ensureDatabaseConnected()
212
+ assertFalse(valueEvents.first().exists)
213
+ }
214
+
234
215
private suspend fun setupRealtimeData () {
235
216
ensureDatabaseConnected()
236
217
val firebaseDatabaseTestReference = database
@@ -259,14 +240,8 @@ class FirebaseDatabaseTest {
259
240
}
260
241
261
242
private suspend fun ensureDatabaseConnected () = withContext(Dispatchers .Default .limitedParallelism(1 )) {
262
- withTimeout(10 .seconds ) {
243
+ withTimeout(2 .minutes ) {
263
244
database.reference(" .info/connected" ).valueEvents.first { it.value() }
264
245
}
265
246
}
266
-
267
- private suspend fun ensureDatabaseDisconnected () = withContext(Dispatchers .Default .limitedParallelism(1 )) {
268
- withTimeout(10 .seconds) {
269
- database.reference(" .info/connected" ).valueEvents.first { ! it.value<Boolean >() }
270
- }
271
- }
272
247
}
0 commit comments