@@ -7,6 +7,7 @@ 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
10
11
import kotlinx.coroutines.flow.first
11
12
import kotlinx.coroutines.flow.map
12
13
import kotlinx.coroutines.withContext
@@ -21,6 +22,7 @@ import kotlin.test.assertFailsWith
21
22
import kotlin.test.assertFalse
22
23
import kotlin.test.assertTrue
23
24
import kotlin.time.Duration.Companion.minutes
25
+ import kotlin.time.Duration.Companion.seconds
24
26
25
27
expect val emulatorHost: String
26
28
expect val context: Any
@@ -53,6 +55,9 @@ class FirebaseDatabaseTest {
53
55
54
56
database = Firebase .database(app).apply {
55
57
useEmulator(emulatorHost, 9000 )
58
+ setLoggingEnabled(true )
59
+ }.also {
60
+ it.goOnline()
56
61
}
57
62
}
58
63
@@ -63,155 +68,169 @@ class FirebaseDatabaseTest {
63
68
}
64
69
}
65
70
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
- }
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
+ // }
81
204
82
205
@Test
83
- fun testChildCount () = runTest {
206
+ fun testUpdateChildrenOnDisconnect () = runBlockingTest {
84
207
setupRealtimeData()
85
- val dataSnapshot = database
86
- .reference(" FirebaseRealtimeDatabaseTest" )
87
- .valueEvents
88
- .first()
89
-
90
- val firebaseDatabaseChildCount = dataSnapshot.child(" values" ).children.count()
91
- assertEquals(3 , firebaseDatabaseChildCount)
92
- }
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
- }
114
-
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" )
155
-
156
- testReference.setValue(2.0 )
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()
157
221
158
- val value = testReference
159
- .valueEvents
160
- .first()
161
- .value<Double >()
162
222
163
- assertEquals(2.0 , value)
164
223
165
- testReference.setValue(ServerValue .increment(5.0 ))
166
- val updatedValue = testReference
167
- .valueEvents
168
- .first()
169
- .value<Double >()
224
+ ensureDatabaseDisconnected()
170
225
171
- assertEquals(7.0 , updatedValue)
172
- }
226
+ delay(10000 )
173
227
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" ))
228
+ // database.goOnline()
229
+ // ensureDatabaseConnected()
230
+ assertFalse(valueEvents.first().exists)
186
231
}
187
232
}
188
233
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
-
215
234
private suspend fun setupRealtimeData () {
216
235
ensureDatabaseConnected()
217
236
val firebaseDatabaseTestReference = database
@@ -240,8 +259,14 @@ class FirebaseDatabaseTest {
240
259
}
241
260
242
261
private suspend fun ensureDatabaseConnected () = withContext(Dispatchers .Default .limitedParallelism(1 )) {
243
- withTimeout(2 .minutes ) {
262
+ withTimeout(10 .seconds ) {
244
263
database.reference(" .info/connected" ).valueEvents.first { it.value() }
245
264
}
246
265
}
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
+ }
247
272
}
0 commit comments