11import { mount } from '@vue/test-utils'
2- import { describe , expect , it } from 'vitest'
2+ import { beforeEach , describe , expect , it } from 'vitest'
33import {
44 addDoc ,
55 doc as originalDoc ,
66 DocumentData ,
77 DocumentReference ,
88 FirestoreError ,
99} from 'firebase/firestore'
10- import { expectType , setupFirestoreRefs , tds , firestore } from '../utils'
10+ import {
11+ expectType ,
12+ setupFirestoreRefs ,
13+ tds ,
14+ firestore ,
15+ firebaseApp ,
16+ } from '../utils'
1117import { nextTick , ref , shallowRef , unref , type Ref } from 'vue'
1218import { isPOJO , _MaybeRef , _Nullable } from '../../src/shared'
1319import {
@@ -17,6 +23,10 @@ import {
1723 _RefFirestore ,
1824} from '../../src'
1925import { mockWarn } from '../vitest-mock-warn'
26+ import {
27+ useSSRInitialState ,
28+ _initialStatesMap ,
29+ } from '../../src/ssr/initialState'
2030
2131describe (
2232 'Firestore documents' ,
@@ -57,6 +67,11 @@ describe(
5767 }
5868 }
5969
70+ beforeEach ( ( ) => {
71+ // delete any ssr state
72+ _initialStatesMap . delete ( firebaseApp )
73+ } )
74+
6075 it ( 'binds a document' , async ( ) => {
6176 const { wrapper, itemRef, data } = factory ( )
6277
@@ -118,6 +133,45 @@ describe(
118133 expect ( data . value ! . id ) . toBe ( itemRef . id )
119134 } )
120135
136+ it ( 'sets pending while loading' , async ( ) => {
137+ const itemRef = shallowRef ( doc ( 'a' ) )
138+ const { pending, promise } = factory ( { ref : itemRef } )
139+
140+ expect ( pending . value ) . toBe ( true )
141+ await promise . value
142+ expect ( pending . value ) . toBe ( false )
143+
144+ // set the target to a new ref so it can be loaded again
145+ itemRef . value = doc ( 'b' )
146+
147+ await nextTick ( ) // for the watcher to trigger
148+ expect ( pending . value ) . toBe ( true )
149+ await promise . value
150+ expect ( pending . value ) . toBe ( false )
151+ } )
152+
153+ it ( 'sets pending to false if there is an initial value (ssr)' , async ( ) => {
154+ const itemRef = shallowRef ( doc ( ) )
155+ useSSRInitialState ( { f : { a : 1 } , r : { } , s : { } , u : { } } , firebaseApp )
156+ const { pending, promise } = factory ( {
157+ ref : itemRef ,
158+ options : { ssrKey : 'a' } ,
159+ } )
160+
161+ expect ( pending . value ) . toBe ( false )
162+ await promise . value
163+ expect ( pending . value ) . toBe ( false )
164+ } )
165+
166+ it ( 'skips setting pending if the object is an empty ref' , async ( ) => {
167+ const itemRef = shallowRef ( )
168+ const { pending, promise } = factory ( { ref : itemRef } )
169+
170+ expect ( pending . value ) . toBe ( false )
171+ await promise . value
172+ expect ( pending . value ) . toBe ( false )
173+ } )
174+
121175 it ( 'manually unbinds a document' , async ( ) => {
122176 const { itemRef, data, stop : unbind } = factory ( )
123177
0 commit comments