-
Notifications
You must be signed in to change notification settings - Fork 168
/
Copy pathdatabase.kt
97 lines (79 loc) · 3.36 KB
/
database.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package dev.gitlive.firebase.database
import dev.gitlive.firebase.*
import kotlinx.coroutines.flow.first
import kotlinx.serialization.*
import kotlin.test.*
expect val emulatorHost: String
expect val context: Any
expect fun runTest(test: suspend () -> Unit)
class FirebaseDatabaseTest {
@Serializable
data class DatabaseTest(val title: String, val likes: Int = 0)
@BeforeTest
fun initializeFirebase() {
Firebase
.takeIf { Firebase.apps(context).isEmpty() }
?.apply {
initialize(
context,
FirebaseOptions(
applicationId = "1:846484016111:ios:dd1f6688bad7af768c841a",
apiKey = "AIzaSyCK87dcMFhzCz_kJVs2cT2AVlqOTLuyWV0",
databaseUrl = "http://fir-kotlin-sdk.firebaseio.com",
storageBucket = "fir-kotlin-sdk.appspot.com",
projectId = "fir-kotlin-sdk",
gcmSenderId = "846484016111"
)
)
Firebase.database.useEmulator(emulatorHost, 9000)
}
}
@Test
fun testBasicIncrementTransaction() = runTest {
val data = DatabaseTest("PostOne", 2)
val userRef = Firebase.database.reference("users/user_1/post_id_1")
setupDatabase(userRef, data, DatabaseTest.serializer())
// Check database before transaction
val userDocBefore = userRef.valueEvents.first().value(DatabaseTest.serializer())
assertEquals(data.title, userDocBefore.title)
assertEquals(data.likes, userDocBefore.likes)
// Run transaction
val transactionSnapshot = userRef.runTransaction(DatabaseTest.serializer()) { DatabaseTest(data.title, it.likes + 1) }
val userDocAfter = transactionSnapshot.value(DatabaseTest.serializer())
// Check the database after transaction
assertEquals(data.title, userDocAfter.title)
assertEquals(data.likes + 1, userDocAfter.likes)
// cleanUp Firebase
cleanUp()
}
@Test
fun testBasicDecrementTransaction() = runTest {
val data = DatabaseTest("PostTwo", 2)
val userRef = Firebase.database.reference("users/user_1/post_id_2")
setupDatabase(userRef, data, DatabaseTest.serializer())
// Check database before transaction
val userDocBefore = userRef.valueEvents.first().value(DatabaseTest.serializer())
assertEquals(data.title, userDocBefore.title)
assertEquals(data.likes, userDocBefore.likes)
// Run transaction
val transactionSnapshot = userRef.runTransaction(DatabaseTest.serializer()) { DatabaseTest(data.title, it.likes - 1) }
val userDocAfter = transactionSnapshot.value(DatabaseTest.serializer())
// Check the database after transaction
assertEquals(data.title, userDocAfter.title)
assertEquals(data.likes - 1, userDocAfter.likes)
// cleanUp Firebase
cleanUp()
}
private fun cleanUp() {
Firebase
.takeIf { Firebase.apps(context).isNotEmpty() }
?.apply { app.delete() }
}
private suspend fun <T> setupDatabase(ref: DatabaseReference, data: T, strategy: SerializationStrategy<T>) {
try {
ref.setValue(strategy, data)
} catch (err: DatabaseException) {
println(err)
}
}
}