@@ -2,6 +2,7 @@ package dev.gitlive.firebase.firestore
2
2
3
3
import dev.gitlive.firebase.internal.decode
4
4
import dev.gitlive.firebase.runTest
5
+ import kotlinx.coroutines.CoroutineScope
5
6
import kotlinx.coroutines.Dispatchers
6
7
import kotlinx.coroutines.async
7
8
import kotlinx.coroutines.delay
@@ -90,10 +91,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
90
91
}
91
92
92
93
@Test
93
- fun testServerTimestampFieldValue () = runTest {
94
- val doc = firestore
94
+ fun testServerTimestampFieldValue () = testDocument(
95
+ firestore
95
96
.collection(" testServerTimestampFieldValue" )
96
- .document(" test" )
97
+ .document(" test" ),
98
+ ) { doc ->
97
99
doc.set(
98
100
FirestoreTimeTest .serializer(),
99
101
FirestoreTimeTest (" ServerTimestamp" , Timestamp (123 , 0 )),
@@ -107,11 +109,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
107
109
}
108
110
109
111
@Test
110
- fun testServerTimestampBehaviorNone () = runTest {
111
- val doc = firestore
112
+ fun testServerTimestampBehaviorNone () = testDocument(
113
+ firestore
112
114
.collection(" testServerTimestampBehaviorNone" )
113
- .document(" test${Random .nextInt()} " )
114
-
115
+ .document(" test${Random .nextInt()} " ),
116
+ ) { doc ->
115
117
val deferredPendingWritesSnapshot = async {
116
118
doc.snapshots.filter { it.exists }.first()
117
119
}
@@ -128,11 +130,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
128
130
}
129
131
130
132
@Test
131
- fun testServerTimestampBehaviorEstimate () = runTest {
132
- val doc = firestore
133
+ fun testServerTimestampBehaviorEstimate () = testDocument(
134
+ firestore
133
135
.collection(" testServerTimestampBehaviorEstimate" )
134
- .document(" test${Random .nextInt()} " )
135
-
136
+ .document(" test${Random .nextInt()} " ),
137
+ ) { doc ->
136
138
val deferredPendingWritesSnapshot = async {
137
139
doc.snapshots.filter { it.exists }.first()
138
140
}
@@ -147,11 +149,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
147
149
}
148
150
149
151
@Test
150
- fun testServerTimestampBehaviorPrevious () = runTest {
151
- val doc = firestore
152
+ fun testServerTimestampBehaviorPrevious () = testDocument(
153
+ firestore
152
154
.collection(" testServerTimestampBehaviorPrevious" )
153
- .document(" test${Random .nextInt()} " )
154
-
155
+ .document(" test${Random .nextInt()} " ),
156
+ ) { doc ->
155
157
val deferredPendingWritesSnapshot = async {
156
158
doc.snapshots.filter { it.exists }.first()
157
159
}
@@ -165,10 +167,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
165
167
}
166
168
167
169
@Test
168
- fun testDocumentAutoId () = runTest {
169
- val doc = firestore
170
+ fun testDocumentAutoId () = testDocument(
171
+ firestore
170
172
.collection(" testDocumentAutoId" )
171
- .document
173
+ .document,
174
+ ) { doc ->
172
175
173
176
doc.set(FirestoreTest .serializer(), FirestoreTest (" AutoId" ))
174
177
@@ -182,12 +185,20 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
182
185
}
183
186
184
187
@Test
185
- fun testUpdateValues () = runTest {
186
- val doc = firestore
188
+ fun testUpdateValues () = testDocument(
189
+ firestore
187
190
.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
+ )
191
202
val dataBefore = doc.get().data(FirestoreTest .serializer())
192
203
assertEquals(0 , dataBefore.count)
193
204
assertNull(dataBefore.optional)
@@ -197,8 +208,14 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
197
208
doc.update {
198
209
FirestoreTest ::count.name to 5
199
210
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
+ )
202
219
}
203
220
val dataAfter = doc.get().data(FirestoreTest .serializer())
204
221
assertEquals(5 , dataAfter.count)
@@ -208,11 +225,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
208
225
}
209
226
210
227
@Test
211
- fun testIncrementFieldValue () = runTest {
212
- val doc = firestore
228
+ fun testIncrementFieldValue () = testDocument(
229
+ firestore
213
230
.collection(" testFirestoreIncrementFieldValue" )
214
- .document(" test1" )
215
-
231
+ .document(" test1" ),
232
+ ) { doc ->
216
233
doc.set(FirestoreTest .serializer(), FirestoreTest (" increment1" , count = 0 ))
217
234
val dataBefore = doc.get().data(FirestoreTest .serializer())
218
235
assertEquals(0 , dataBefore.count)
@@ -223,11 +240,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
223
240
}
224
241
225
242
@Test
226
- fun testArrayUnion () = runTest {
227
- val doc = firestore
243
+ fun testArrayUnion () = testDocument(
244
+ firestore
228
245
.collection(" testFirestoreArrayUnion" )
229
- .document(" test1" )
230
-
246
+ .document(" test1" ),
247
+ ) { doc ->
231
248
doc.set(FirestoreTest .serializer(), FirestoreTest (" increment1" , list = listOf (" first" )))
232
249
val dataBefore = doc.get().data(FirestoreTest .serializer())
233
250
assertEquals(listOf (" first" ), dataBefore.list)
@@ -238,11 +255,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
238
255
}
239
256
240
257
@Test
241
- fun testArrayRemove () = runTest {
242
- val doc = firestore
258
+ fun testArrayRemove () = testDocument(
259
+ firestore
243
260
.collection(" testFirestoreArrayRemove" )
244
- .document(" test1" )
245
-
261
+ .document(" test1" ),
262
+ ) { doc ->
246
263
doc.set(FirestoreTest .serializer(), FirestoreTest (" increment1" , list = listOf (" first" , " second" )))
247
264
val dataBefore = doc.get().data(FirestoreTest .serializer())
248
265
assertEquals(listOf (" first" , " second" ), dataBefore.list)
@@ -253,17 +270,17 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
253
270
}
254
271
255
272
@Test
256
- fun testLegacyDoubleTimestamp () = runTest {
273
+ fun testLegacyDoubleTimestamp () = testDocument(
274
+ firestore
275
+ .collection(" testLegacyDoubleTimestamp" )
276
+ .document(" test${Random .nextInt()} " ),
277
+ ) { doc ->
257
278
@Serializable
258
279
data class DoubleTimestamp (
259
280
@Serializable(with = DoubleAsTimestampSerializer ::class )
260
281
val time : Double? ,
261
282
)
262
283
263
- val doc = firestore
264
- .collection(" testLegacyDoubleTimestamp" )
265
- .document(" test${Random .nextInt()} " )
266
-
267
284
val deferredPendingWritesSnapshot = async {
268
285
doc.snapshots.filter { it.exists }.first()
269
286
}
@@ -278,7 +295,11 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
278
295
}
279
296
280
297
@Test
281
- fun testLegacyDoubleTimestampWriteNewFormatRead () = runTest {
298
+ fun testLegacyDoubleTimestampWriteNewFormatRead () = testDocument(
299
+ firestore
300
+ .collection(" testLegacyDoubleTimestampEncodeDecode" )
301
+ .document(" testLegacy" ),
302
+ ) { doc ->
282
303
@Serializable
283
304
data class LegacyDocument (
284
305
@Serializable(with = DoubleAsTimestampSerializer ::class )
@@ -290,10 +311,6 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
290
311
val time : Timestamp ,
291
312
)
292
313
293
- val doc = firestore
294
- .collection(" testLegacyDoubleTimestampEncodeDecode" )
295
- .document(" testLegacy" )
296
-
297
314
val ms = 12345678.0
298
315
299
316
doc.set(LegacyDocument .serializer(), LegacyDocument (time = ms))
@@ -303,25 +320,25 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
303
320
}
304
321
305
322
@Test
306
- fun testGeoPointSerialization () = runTest {
323
+ fun testGeoPointSerialization () = testDocument(
324
+ firestore.collection(" geoPointSerialization" )
325
+ .document(" geoPointSerialization" ),
326
+ ) { doc ->
307
327
@Serializable
308
328
data class DataWithGeoPoint (val geoPoint : GeoPoint )
309
329
310
- fun getDocument () = firestore.collection(" geoPointSerialization" )
311
- .document(" geoPointSerialization" )
312
-
313
330
val data = DataWithGeoPoint (GeoPoint (12.34 , 56.78 ))
314
331
// store geo point
315
- getDocument() .set(DataWithGeoPoint .serializer(), data)
332
+ doc .set(DataWithGeoPoint .serializer(), data)
316
333
// restore data
317
- val savedData = getDocument() .get().data(DataWithGeoPoint .serializer())
334
+ val savedData = doc .get().data(DataWithGeoPoint .serializer())
318
335
assertEquals(data.geoPoint, savedData.geoPoint)
319
336
320
337
// update data
321
338
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)
323
340
// verify update
324
- val updatedSavedData = getDocument() .get().data(DataWithGeoPoint .serializer())
341
+ val updatedSavedData = doc .get().data(DataWithGeoPoint .serializer())
325
342
assertEquals(updatedData.geoPoint, updatedSavedData.geoPoint)
326
343
}
327
344
@@ -332,66 +349,82 @@ class DocumentReferenceTest : BaseFirebaseFirestoreTest() {
332
349
val documentReference : DocumentReference ,
333
350
)
334
351
335
- fun getCollection () = firestore.collection(" documentReferenceSerialization" )
336
- fun getDocument () = getCollection()
352
+ val collection = firestore.collection(" documentReferenceSerialization" )
353
+ val document = collection
337
354
.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,
358
381
)
382
+ } finally {
383
+ document.delete()
384
+ documentRef1.delete()
385
+ documentRef2.delete()
359
386
}
360
- // verify update
361
- val updatedSavedData = getDocument().get().data(DataWithDocumentReference .serializer())
362
- assertEquals(updatedData.documentReference.path, updatedSavedData.documentReference.path)
363
387
}
364
388
365
389
@Test
366
- fun testFieldValuesOps () = runTest {
390
+ fun testFieldValuesOps () = testDocument(
391
+ firestore.collection(" fieldValuesOps" )
392
+ .document(" fieldValuesOps" ),
393
+ ) { doc ->
367
394
@Serializable
368
395
data class TestData (val values : List <Int >)
369
- fun getDocument () = firestore.collection(" fieldValuesOps" )
370
- .document(" fieldValuesOps" )
371
396
372
397
val data = TestData (listOf (1 ))
373
398
// store
374
- getDocument() .set(TestData .serializer(), data)
399
+ doc .set(TestData .serializer(), data)
375
400
// append & verify
376
- getDocument() .update(FieldPath (TestData ::values.name) to FieldValue .arrayUnion(2 ))
401
+ doc .update(FieldPath (TestData ::values.name) to FieldValue .arrayUnion(2 ))
377
402
378
- var savedData = getDocument() .get().data(TestData .serializer())
403
+ var savedData = doc .get().data(TestData .serializer())
379
404
assertEquals(listOf (1 , 2 ), savedData.values)
380
405
381
406
// 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())
384
409
assertEquals(listOf (2 ), savedData.values)
385
410
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)
387
412
assertEquals(listOf (2 ), list)
388
413
// 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)
391
416
assertNull(deletedList)
392
417
}
393
418
394
419
private suspend fun nonSkippedDelay (timeout : Duration ) = withContext(Dispatchers .Default ) {
395
420
delay(timeout)
396
421
}
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
+ }
397
430
}
0 commit comments