Skip to content

Commit d765d74

Browse files
author
Bas Buijsen
committed
add tests
1 parent 2ad430d commit d765d74

File tree

11 files changed

+146
-3
lines changed

11 files changed

+146
-3
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.gitlive.firebase.storage
2+
3+
import android.net.Uri
4+
5+
actual fun createTestData(): Data {
6+
return Data("test".toByteArray())
7+
}

firebase-storage/src/androidMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ import kotlinx.coroutines.channels.awaitClose
2020
import kotlinx.coroutines.channels.trySendBlocking
2121
import kotlinx.coroutines.flow.FlowCollector
2222
import kotlinx.coroutines.flow.callbackFlow
23+
import kotlinx.coroutines.flow.channelFlow
2324
import kotlinx.coroutines.flow.emitAll
25+
import kotlinx.coroutines.flow.first
26+
import kotlinx.coroutines.launch
2427
import kotlinx.coroutines.tasks.await
2528

2629
actual val Firebase.storage get() =
@@ -77,6 +80,14 @@ actual class StorageReference(val android: com.google.firebase.storage.StorageRe
7780
}
7881
}
7982

83+
actual suspend fun putData(data: Data, metadata: FirebaseStorageMetadata?) {
84+
if (metadata != null) {
85+
android.putBytes(data.data, metadata.toStorageMetadata()).await().run {}
86+
} else {
87+
android.putBytes(data.data).await().run {}
88+
}
89+
}
90+
8091
actual fun putFileResumable(file: File, metadata: FirebaseStorageMetadata?): ProgressFlow {
8192
val android = if (metadata != null) {
8293
android.putFile(file.uri, metadata.toStorageMetadata())
@@ -118,6 +129,8 @@ actual class ListResult(android: com.google.firebase.storage.ListResult) {
118129

119130
actual class File(val uri: Uri)
120131

132+
actual class Data(val data: ByteArray)
133+
121134
actual typealias FirebaseStorageException = com.google.firebase.storage.StorageException
122135

123136
fun FirebaseStorageMetadata.toStorageMetadata(): StorageMetadata {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.gitlive.firebase.storage
2+
3+
import android.net.Uri
4+
5+
actual fun createTestData(): Data {
6+
return Data("test".toByteArray())
7+
}

firebase-storage/src/commonMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import dev.gitlive.firebase.Firebase
44
import dev.gitlive.firebase.FirebaseApp
55
import dev.gitlive.firebase.FirebaseException
66
import kotlinx.coroutines.flow.Flow
7+
import kotlinx.coroutines.flow.channelFlow
8+
import kotlinx.coroutines.flow.first
9+
import kotlinx.coroutines.launch
710

811
/** Returns the [FirebaseStorage] instance of the default [FirebaseApp]. */
912
expect val Firebase.storage: FirebaseStorage
@@ -44,6 +47,8 @@ expect class StorageReference {
4447

4548
suspend fun putFile(file: File, metadata: FirebaseStorageMetadata? = null)
4649

50+
suspend fun putData(data: Data, metadata: FirebaseStorageMetadata? = null)
51+
4752
fun putFileResumable(file: File, metadata: FirebaseStorageMetadata? = null): ProgressFlow
4853
}
4954

@@ -55,6 +60,8 @@ expect class ListResult {
5560

5661
expect class File
5762

63+
expect class Data
64+
5865
sealed class Progress(val bytesTransferred: Number, val totalByteCount: Number) {
5966
class Running internal constructor(bytesTransferred: Number, totalByteCount: Number): Progress(bytesTransferred, totalByteCount)
6067
class Paused internal constructor(bytesTransferred: Number, totalByteCount: Number): Progress(bytesTransferred, totalByteCount)

firebase-storage/src/commonTest/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,16 @@ import dev.gitlive.firebase.Firebase
88
import dev.gitlive.firebase.FirebaseOptions
99
import dev.gitlive.firebase.apps
1010
import dev.gitlive.firebase.initialize
11+
import dev.gitlive.firebase.runBlockingTest
12+
import kotlinx.coroutines.flow.channelFlow
13+
import kotlinx.coroutines.flow.first
14+
import kotlinx.coroutines.launch
15+
import kotlin.test.AfterTest
1116
import kotlin.test.BeforeTest
17+
import kotlin.test.Test
18+
import kotlin.test.assertContentEquals
19+
import kotlin.test.assertEquals
20+
import kotlin.test.assertNotNull
1221

1322
expect val emulatorHost: String
1423
expect val context: Any
@@ -35,6 +44,61 @@ class FirebaseStorageTest {
3544

3645
storage = Firebase.storage(app).apply {
3746
useEmulator(emulatorHost, 9199)
47+
setMaxOperationRetryTimeMillis(10000)
48+
setMaxUploadRetryTimeMillis(10000)
3849
}
3950
}
40-
}
51+
52+
@AfterTest
53+
fun deinitializeFirebase() = runBlockingTest {
54+
Firebase.apps(context).forEach {
55+
it.delete()
56+
}
57+
}
58+
59+
@Test
60+
fun testStorageNotNull() {
61+
assertNotNull(storage)
62+
}
63+
64+
@Test
65+
fun testUploadShouldNotCrash() = runBlockingTest {
66+
val data = createTestData()
67+
val ref = storage.reference("test").child("testFile.txt")
68+
ref.putData(data)
69+
}
70+
71+
@Test
72+
fun testUploadMetadata() = runBlockingTest {
73+
val data = createTestData()
74+
val ref = storage.reference("test").child("testFile.txt")
75+
val metadata = storageMetadata {
76+
contentType = "text/plain"
77+
}
78+
ref.putData(data, metadata)
79+
80+
val metadataResult = ref.getMetadata()
81+
82+
assertNotNull(metadataResult)
83+
assertNotNull(metadataResult.contentType)
84+
assertEquals(metadataResult.contentType, metadata.contentType)
85+
}
86+
87+
@Test
88+
fun testUploadCustomMetadata() = runBlockingTest {
89+
val data = createTestData()
90+
val ref = storage.reference("test").child("testFile.txt")
91+
val metadata = storageMetadata {
92+
contentType = "text/plain"
93+
setCustomMetadata("key", "value")
94+
}
95+
ref.putData(data, metadata)
96+
97+
val metadataResult = ref.getMetadata()
98+
99+
assertNotNull(metadataResult)
100+
assertEquals(metadataResult.customMetadata["key"], metadata.customMetadata["key"])
101+
}
102+
}
103+
104+
expect fun createTestData(): Data

firebase-storage/src/iosMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import kotlinx.coroutines.channels.trySendBlocking
2323
import kotlinx.coroutines.flow.FlowCollector
2424
import kotlinx.coroutines.flow.callbackFlow
2525
import kotlinx.coroutines.flow.emitAll
26+
import platform.Foundation.NSData
2627
import platform.Foundation.NSError
2728
import platform.Foundation.NSURL
2829

@@ -87,7 +88,13 @@ actual class StorageReference(val ios: FIRStorageReference) {
8788
}
8889
}
8990

90-
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?) = ios.awaitResult { putFile(file.url, metadata?.toFIRMetadata(), completion = it) }.run {}
91+
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?) = ios.awaitResult { callback ->
92+
putFile(file.url, metadata?.toFIRMetadata(), callback)
93+
}.run {}
94+
95+
actual suspend fun putData(data: Data, metadata: FirebaseStorageMetadata?) = ios.awaitResult { callback ->
96+
putData(data.data, metadata?.toFIRMetadata(), callback)
97+
}.run {}
9198

9299
actual fun putFileResumable(file: File, metadata: FirebaseStorageMetadata?): ProgressFlow {
93100
val ios = ios.putFile(file.url, metadata?.toFIRMetadata())
@@ -133,6 +140,8 @@ actual class ListResult(ios: FIRStorageListResult) {
133140

134141
actual class File(val url: NSURL)
135142

143+
actual class Data(val data: NSData)
144+
136145
actual class FirebaseStorageException(message: String): FirebaseException(message)
137146

138147
suspend inline fun <T> T.await(function: T.(callback: (NSError?) -> Unit) -> Unit) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package dev.gitlive.firebase.storage
2+
3+
import kotlinx.cinterop.BetaInteropApi
4+
import kotlinx.cinterop.utf8
5+
import platform.Foundation.NSCoder
6+
import platform.Foundation.NSData
7+
import platform.Foundation.NSSearchPathDirectory
8+
import platform.Foundation.NSSearchPathDomainMask
9+
import platform.Foundation.NSSearchPathForDirectoriesInDomains
10+
import platform.Foundation.NSString
11+
import platform.Foundation.NSURL
12+
import platform.Foundation.NSUTF8StringEncoding
13+
import platform.Foundation.create
14+
import platform.Foundation.dataUsingEncoding
15+
16+
@OptIn(BetaInteropApi::class)
17+
actual fun createTestData(): Data {
18+
val value = NSString.create(string = "test")
19+
return Data(value.dataUsingEncoding(NSUTF8StringEncoding, false)!!)
20+
}

firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/storage.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ actual class StorageReference(val js: dev.gitlive.firebase.storage.externals.Sto
6363

6464
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?): Unit = rethrow { uploadBytes(js, file, metadata?.toStorageMetadata()).await() }
6565

66+
actual suspend fun putData(data: Data, metadata: FirebaseStorageMetadata?): Unit = rethrow { uploadBytes(js, data.data, metadata?.toStorageMetadata()).await() }
67+
6668
actual fun putFileResumable(file: File, metadata: FirebaseStorageMetadata?): ProgressFlow = rethrow {
6769
val uploadTask = uploadBytesResumable(js, file, metadata?.toStorageMetadata())
6870

@@ -101,6 +103,7 @@ actual class ListResult(js: dev.gitlive.firebase.storage.externals.ListResult) {
101103
}
102104

103105
actual typealias File = org.w3c.files.File
106+
actual class Data(val data: org.khronos.webgl.Uint8Array)
104107

105108
actual open class FirebaseStorageException(code: String, cause: Throwable) :
106109
FirebaseException(code, cause)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dev.gitlive.firebase.storage
2+
3+
actual fun createTestData(): Data {
4+
TODO("Not yet implemented")
5+
}

firebase-storage/src/jvmMain/kotlin/dev/gitlive/firebase/storage/storage.jvm.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ actual class StorageReference {
7777
actual suspend fun putFile(file: File, metadata: FirebaseStorageMetadata?) {
7878
}
7979

80+
actual suspend fun putData(data: Data, metadata: FirebaseStorageMetadata?) {
81+
}
8082
}
8183

8284
actual class ListResult {
@@ -89,4 +91,5 @@ actual class ListResult {
8991
}
9092

9193
actual class File
92-
actual class FirebaseStorageException internal constructor(message: String) : FirebaseException(message)
94+
actual class FirebaseStorageException internal constructor(message: String) : FirebaseException(message)
95+
actual class Data

0 commit comments

Comments
 (0)