Skip to content

Commit 90f870c

Browse files
committed
Added several tests to stabilize tests
1 parent c612f9c commit 90f870c

File tree

8 files changed

+339
-234
lines changed

8 files changed

+339
-234
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,15 @@ citiesRef.where {
241241
}
242242
```
243243

244+
Similar methods exist for `update` methods in the Firestore module:
245+
246+
```kotlin
247+
documentRef.update {
248+
"field" to "value"
249+
"otherField".to(IntAsStringSerializer(), 1)
250+
}
251+
```
252+
244253
<h3><a href="https://kotlinlang.org/docs/reference/operator-overloading.html">Operator overloading</a></h3>
245254

246255
In cases where it makes sense, such as Firebase Functions HTTPS Callable, operator overloading is used:

firebase-firestore/src/commonTest/kotlin/dev/gitlive/firebase/firestore/DocumentReferenceTest.kt

Lines changed: 124 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dev.gitlive.firebase.firestore
22

33
import dev.gitlive.firebase.internal.decode
44
import dev.gitlive.firebase.runTest
5+
import kotlinx.coroutines.CoroutineScope
56
import kotlinx.coroutines.Dispatchers
67
import kotlinx.coroutines.async
78
import kotlinx.coroutines.delay
@@ -90,10 +91,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
9091
}
9192

9293
@Test
93-
fun testServerTimestampFieldValue() = runTest {
94-
val doc = firestore
94+
fun testServerTimestampFieldValue() = testDocument(
95+
firestore
9596
.collection("testServerTimestampFieldValue")
96-
.document("test")
97+
.document("test"),
98+
) { doc ->
9799
doc.set(
98100
FirestoreTimeTest.serializer(),
99101
FirestoreTimeTest("ServerTimestamp", Timestamp(123, 0)),
@@ -107,11 +109,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
107109
}
108110

109111
@Test
110-
fun testServerTimestampBehaviorNone() = runTest {
111-
val doc = firestore
112+
fun testServerTimestampBehaviorNone() = testDocument(
113+
firestore
112114
.collection("testServerTimestampBehaviorNone")
113-
.document("test${Random.nextInt()}")
114-
115+
.document("test${Random.nextInt()}"),
116+
) { doc ->
115117
val deferredPendingWritesSnapshot = async {
116118
doc.snapshots.filter { it.exists }.first()
117119
}
@@ -128,11 +130,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
128130
}
129131

130132
@Test
131-
fun testServerTimestampBehaviorEstimate() = runTest {
132-
val doc = firestore
133+
fun testServerTimestampBehaviorEstimate() = testDocument(
134+
firestore
133135
.collection("testServerTimestampBehaviorEstimate")
134-
.document("test${Random.nextInt()}")
135-
136+
.document("test${Random.nextInt()}"),
137+
) { doc ->
136138
val deferredPendingWritesSnapshot = async {
137139
doc.snapshots.filter { it.exists }.first()
138140
}
@@ -147,11 +149,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
147149
}
148150

149151
@Test
150-
fun testServerTimestampBehaviorPrevious() = runTest {
151-
val doc = firestore
152+
fun testServerTimestampBehaviorPrevious() = testDocument(
153+
firestore
152154
.collection("testServerTimestampBehaviorPrevious")
153-
.document("test${Random.nextInt()}")
154-
155+
.document("test${Random.nextInt()}"),
156+
) { doc ->
155157
val deferredPendingWritesSnapshot = async {
156158
doc.snapshots.filter { it.exists }.first()
157159
}
@@ -165,10 +167,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
165167
}
166168

167169
@Test
168-
fun testDocumentAutoId() = runTest {
169-
val doc = firestore
170+
fun testDocumentAutoId() = testDocument(
171+
firestore
170172
.collection("testDocumentAutoId")
171-
.document
173+
.document,
174+
) { doc ->
172175

173176
doc.set(FirestoreTest.serializer(), FirestoreTest("AutoId"))
174177

@@ -182,12 +185,20 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
182185
}
183186

184187
@Test
185-
fun testUpdateValues() = runTest {
186-
val doc = firestore
188+
fun testUpdateValues() = testDocument(
189+
firestore
187190
.collection("testFirestoreUpdateMultipleValues")
188-
.document("test1")
189-
190-
doc.set(FirestoreTest.serializer(), FirestoreTest("property", count = 0, nested = NestedObject("nested"), duration = 600.milliseconds))
191+
.document("test1"),
192+
) { doc ->
193+
doc.set(
194+
FirestoreTest.serializer(),
195+
FirestoreTest(
196+
"property",
197+
count = 0,
198+
nested = NestedObject("nested"),
199+
duration = 600.milliseconds,
200+
),
201+
)
191202
val dataBefore = doc.get().data(FirestoreTest.serializer())
192203
assertEquals(0, dataBefore.count)
193204
assertNull(dataBefore.optional)
@@ -197,8 +208,14 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
197208
doc.update {
198209
FirestoreTest::count.name to 5
199210
FieldPath(FirestoreTest::optional.name) to "notNull"
200-
FirestoreTest::nested.name.to(NestedObject.serializer(), NestedObject("newProperty"))
201-
FieldPath(FirestoreTest::duration.name).to(DurationAsLongSerializer(), 700.milliseconds)
211+
FirestoreTest::nested.name.to(
212+
NestedObject.serializer(),
213+
NestedObject("newProperty"),
214+
)
215+
FieldPath(FirestoreTest::duration.name).to(
216+
DurationAsIntSerializer(),
217+
700.milliseconds,
218+
)
202219
}
203220
val dataAfter = doc.get().data(FirestoreTest.serializer())
204221
assertEquals(5, dataAfter.count)
@@ -208,11 +225,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
208225
}
209226

210227
@Test
211-
fun testIncrementFieldValue() = runTest {
212-
val doc = firestore
228+
fun testIncrementFieldValue() = testDocument(
229+
firestore
213230
.collection("testFirestoreIncrementFieldValue")
214-
.document("test1")
215-
231+
.document("test1"),
232+
) { doc ->
216233
doc.set(FirestoreTest.serializer(), FirestoreTest("increment1", count = 0))
217234
val dataBefore = doc.get().data(FirestoreTest.serializer())
218235
assertEquals(0, dataBefore.count)
@@ -223,11 +240,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
223240
}
224241

225242
@Test
226-
fun testArrayUnion() = runTest {
227-
val doc = firestore
243+
fun testArrayUnion() = testDocument(
244+
firestore
228245
.collection("testFirestoreArrayUnion")
229-
.document("test1")
230-
246+
.document("test1"),
247+
) { doc ->
231248
doc.set(FirestoreTest.serializer(), FirestoreTest("increment1", list = listOf("first")))
232249
val dataBefore = doc.get().data(FirestoreTest.serializer())
233250
assertEquals(listOf("first"), dataBefore.list)
@@ -238,11 +255,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
238255
}
239256

240257
@Test
241-
fun testArrayRemove() = runTest {
242-
val doc = firestore
258+
fun testArrayRemove() = testDocument(
259+
firestore
243260
.collection("testFirestoreArrayRemove")
244-
.document("test1")
245-
261+
.document("test1"),
262+
) { doc ->
246263
doc.set(FirestoreTest.serializer(), FirestoreTest("increment1", list = listOf("first", "second")))
247264
val dataBefore = doc.get().data(FirestoreTest.serializer())
248265
assertEquals(listOf("first", "second"), dataBefore.list)
@@ -253,17 +270,17 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
253270
}
254271

255272
@Test
256-
fun testLegacyDoubleTimestamp() = runTest {
273+
fun testLegacyDoubleTimestamp() = testDocument(
274+
firestore
275+
.collection("testLegacyDoubleTimestamp")
276+
.document("test${Random.nextInt()}"),
277+
) { doc ->
257278
@Serializable
258279
data class DoubleTimestamp(
259280
@Serializable(with = DoubleAsTimestampSerializer::class)
260281
val time: Double?,
261282
)
262283

263-
val doc = firestore
264-
.collection("testLegacyDoubleTimestamp")
265-
.document("test${Random.nextInt()}")
266-
267284
val deferredPendingWritesSnapshot = async {
268285
doc.snapshots.filter { it.exists }.first()
269286
}
@@ -278,7 +295,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
278295
}
279296

280297
@Test
281-
fun testLegacyDoubleTimestampWriteNewFormatRead() = runTest {
298+
fun testLegacyDoubleTimestampWriteNewFormatRead() = testDocument(
299+
firestore
300+
.collection("testLegacyDoubleTimestampEncodeDecode")
301+
.document("testLegacy"),
302+
) { doc ->
282303
@Serializable
283304
data class LegacyDocument(
284305
@Serializable(with = DoubleAsTimestampSerializer::class)
@@ -290,10 +311,6 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
290311
val time: Timestamp,
291312
)
292313

293-
val doc = firestore
294-
.collection("testLegacyDoubleTimestampEncodeDecode")
295-
.document("testLegacy")
296-
297314
val ms = 12345678.0
298315

299316
doc.set(LegacyDocument.serializer(), LegacyDocument(time = ms))
@@ -303,25 +320,25 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
303320
}
304321

305322
@Test
306-
fun testGeoPointSerialization() = runTest {
323+
fun testGeoPointSerialization() = testDocument(
324+
firestore.collection("geoPointSerialization")
325+
.document("geoPointSerialization"),
326+
) { doc ->
307327
@Serializable
308328
data class DataWithGeoPoint(val geoPoint: GeoPoint)
309329

310-
fun getDocument() = firestore.collection("geoPointSerialization")
311-
.document("geoPointSerialization")
312-
313330
val data = DataWithGeoPoint(GeoPoint(12.34, 56.78))
314331
// store geo point
315-
getDocument().set(DataWithGeoPoint.serializer(), data)
332+
doc.set(DataWithGeoPoint.serializer(), data)
316333
// restore data
317-
val savedData = getDocument().get().data(DataWithGeoPoint.serializer())
334+
val savedData = doc.get().data(DataWithGeoPoint.serializer())
318335
assertEquals(data.geoPoint, savedData.geoPoint)
319336

320337
// update data
321338
val updatedData = DataWithGeoPoint(GeoPoint(87.65, 43.21))
322-
getDocument().update(FieldPath(DataWithGeoPoint::geoPoint.name) to updatedData.geoPoint)
339+
doc.update(FieldPath(DataWithGeoPoint::geoPoint.name) to updatedData.geoPoint)
323340
// verify update
324-
val updatedSavedData = getDocument().get().data(DataWithGeoPoint.serializer())
341+
val updatedSavedData = doc.get().data(DataWithGeoPoint.serializer())
325342
assertEquals(updatedData.geoPoint, updatedSavedData.geoPoint)
326343
}
327344

@@ -332,66 +349,82 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
332349
val documentReference: DocumentReference,
333350
)
334351

335-
fun getCollection() = firestore.collection("documentReferenceSerialization")
336-
fun getDocument() = getCollection()
352+
val collection = firestore.collection("documentReferenceSerialization")
353+
val document = collection
337354
.document("documentReferenceSerialization")
338-
val documentRef1 = getCollection().document("refDoc1").apply {
339-
set(mapOf("value" to 1))
340-
}
341-
val documentRef2 = getCollection().document("refDoc2").apply {
342-
set(mapOf("value" to 2))
343-
}
344-
345-
val data = DataWithDocumentReference(documentRef1)
346-
// store reference
347-
getDocument().set(DataWithDocumentReference.serializer(), data)
348-
// restore data
349-
val savedData = getDocument().get().data(DataWithDocumentReference.serializer())
350-
assertEquals(data.documentReference.path, savedData.documentReference.path)
351-
352-
// update data
353-
val updatedData = DataWithDocumentReference(documentRef2)
354-
getDocument().update {
355-
FieldPath(DataWithDocumentReference::documentReference.name).to(
356-
DocumentReferenceSerializer,
357-
updatedData.documentReference,
355+
val documentRef1 = collection.document("refDoc1")
356+
val documentRef2 = collection.document("refDoc2")
357+
358+
try {
359+
documentRef1.set(mapOf("value" to 1))
360+
documentRef2.set(mapOf("value" to 2))
361+
val data = DataWithDocumentReference(documentRef1)
362+
// store reference
363+
document.set(DataWithDocumentReference.serializer(), data)
364+
// restore data
365+
val savedData = document.get().data(DataWithDocumentReference.serializer())
366+
assertEquals(data.documentReference.path, savedData.documentReference.path)
367+
368+
// update data
369+
val updatedData = DataWithDocumentReference(documentRef2)
370+
document.update {
371+
FieldPath(DataWithDocumentReference::documentReference.name).to(
372+
DocumentReferenceSerializer,
373+
updatedData.documentReference,
374+
)
375+
}
376+
// verify update
377+
val updatedSavedData = document.get().data(DataWithDocumentReference.serializer())
378+
assertEquals(
379+
updatedData.documentReference.path,
380+
updatedSavedData.documentReference.path,
358381
)
382+
} finally {
383+
document.delete()
384+
documentRef1.delete()
385+
documentRef2.delete()
359386
}
360-
// verify update
361-
val updatedSavedData = getDocument().get().data(DataWithDocumentReference.serializer())
362-
assertEquals(updatedData.documentReference.path, updatedSavedData.documentReference.path)
363387
}
364388

365389
@Test
366-
fun testFieldValuesOps() = runTest {
390+
fun testFieldValuesOps() = testDocument(
391+
firestore.collection("fieldValuesOps")
392+
.document("fieldValuesOps"),
393+
) { doc ->
367394
@Serializable
368395
data class TestData(val values: List<Int>)
369-
fun getDocument() = firestore.collection("fieldValuesOps")
370-
.document("fieldValuesOps")
371396

372397
val data = TestData(listOf(1))
373398
// store
374-
getDocument().set(TestData.serializer(), data)
399+
doc.set(TestData.serializer(), data)
375400
// append & verify
376-
getDocument().update(FieldPath(TestData::values.name) to FieldValue.arrayUnion(2))
401+
doc.update(FieldPath(TestData::values.name) to FieldValue.arrayUnion(2))
377402

378-
var savedData = getDocument().get().data(TestData.serializer())
403+
var savedData = doc.get().data(TestData.serializer())
379404
assertEquals(listOf(1, 2), savedData.values)
380405

381406
// remove & verify
382-
getDocument().update(FieldPath(TestData::values.name) to FieldValue.arrayRemove(1))
383-
savedData = getDocument().get().data(TestData.serializer())
407+
doc.update(FieldPath(TestData::values.name) to FieldValue.arrayRemove(1))
408+
savedData = doc.get().data(TestData.serializer())
384409
assertEquals(listOf(2), savedData.values)
385410

386-
val list = getDocument().get().get(TestData::values.name, ListSerializer(Int.serializer()).nullable)
411+
val list = doc.get().get(TestData::values.name, ListSerializer(Int.serializer()).nullable)
387412
assertEquals(listOf(2), list)
388413
// delete & verify
389-
getDocument().update(FieldPath(TestData::values.name) to FieldValue.delete)
390-
val deletedList = getDocument().get().get(TestData::values.name, ListSerializer(Int.serializer()).nullable)
414+
doc.update(FieldPath(TestData::values.name) to FieldValue.delete)
415+
val deletedList = doc.get().get(TestData::values.name, ListSerializer(Int.serializer()).nullable)
391416
assertNull(deletedList)
392417
}
393418

394419
private suspend fun nonSkippedDelay(timeout: Duration) = withContext(Dispatchers.Default) {
395420
delay(timeout)
396421
}
422+
423+
private fun testDocument(document: DocumentReference, block: suspend CoroutineScope.(DocumentReference) -> Unit) = runTest {
424+
try {
425+
block(document)
426+
} finally {
427+
document.delete()
428+
}
429+
}
397430
}

0 commit comments

Comments
 (0)