@@ -545,37 +545,23 @@ apiDescribe('Database', (persistence: boolean) => {
545
545
546
546
apiDescribe ( 'onSnapshotsInSync listener' , ( ) => {
547
547
function createDocumentListener (
548
- deferred : Deferred < void > ,
549
548
target : firestore . DocumentReference ,
550
549
callback : ( snapshot : firestore . DocumentSnapshot ) => void
551
550
) : void {
552
551
target . onSnapshot ( snap => {
553
552
callback ( snap ) ;
554
- deferred . resolve ( ) ;
555
553
} ) ;
556
554
}
557
555
558
556
function createQueryListener (
559
- deferred : Deferred < void > ,
560
557
target : firestore . Query ,
561
558
callback : ( snapshot : firestore . QuerySnapshot ) => void
562
559
) : void {
563
560
target . onSnapshot ( snap => {
564
561
callback ( snap ) ;
565
- deferred . resolve ( ) ;
566
562
} ) ;
567
563
}
568
564
569
- it ( 'fires even if there are no local listeners' , ( ) => {
570
- const d1 = new Deferred < void > ( ) ;
571
- return withTestDb ( persistence , async db => {
572
- onSnapshotsInSync ( db , ( ) => {
573
- d1 . resolve ( ) ;
574
- } ) ;
575
- await d1 . promise ;
576
- } ) ;
577
- } ) ;
578
-
579
565
it ( 'fires after local listeners fire' , ( ) => {
580
566
const testDocs = {
581
567
a : { foo : 1 }
@@ -588,22 +574,25 @@ apiDescribe('Database', (persistence: boolean) => {
588
574
const d4 = new Deferred < void > ( ) ;
589
575
const doc = coll . doc ( 'a' ) ;
590
576
591
- createDocumentListener ( d1 , doc , snapshot => {
577
+ createDocumentListener ( doc , snapshot => {
592
578
firedValues . push ( 1 ) ;
579
+ d1 . resolve ( ) ;
593
580
} ) ;
594
- createDocumentListener ( d2 , doc , snapshot => {
581
+ createDocumentListener ( doc , snapshot => {
595
582
firedValues . push ( 2 ) ;
583
+ d2 . resolve ( ) ;
596
584
} ) ;
597
- createDocumentListener ( d3 , doc , snapshot => {
585
+ createDocumentListener ( doc , snapshot => {
598
586
firedValues . push ( 3 ) ;
587
+ d3 . resolve ( ) ;
599
588
} ) ;
600
589
onSnapshotsInSync ( doc . firestore , ( ) => {
601
590
firedValues . push ( 4 ) ;
602
591
d4 . resolve ( ) ;
603
592
} ) ;
604
593
605
594
await Promise . all ( [ d1 . promise , d2 . promise , d3 . promise , d4 . promise ] ) ;
606
- expect ( firedValues ) . to . deep . equal ( [ 1 , 2 , 3 , 4 ] ) ;
595
+ expect ( firedValues ) . to . deep . equal ( [ 4 , 1 , 2 , 3 , 4 ] ) ;
607
596
} ) ;
608
597
} ) ;
609
598
@@ -623,9 +612,10 @@ apiDescribe('Database', (persistence: boolean) => {
623
612
const query2 = coll . where ( 'foo' , '>' , 0 ) ;
624
613
const query3 = coll . where ( 'foo' , '>' , 0 ) ;
625
614
626
- createQueryListener ( d1 , query1 , snapshot => {
615
+ createQueryListener ( query1 , snapshot => {
627
616
firedValues . push ( 1 ) ;
628
617
pending . set ( query1 , snapshot ) ;
618
+ d1 . resolve ( ) ;
629
619
} ) ;
630
620
onSnapshotsInSync ( coll . doc ( ) . firestore , async ( ) => {
631
621
if ( pending . has ( query2 ) && pending . has ( query3 ) ) {
@@ -645,167 +635,22 @@ apiDescribe('Database', (persistence: boolean) => {
645
635
646
636
// Add duplicate queries and ensure that the onSnapshotsInSync callback
647
637
// was fired for each duplicate.
648
- createQueryListener ( d2 , query2 , snapshot => {
638
+ createQueryListener ( query2 , snapshot => {
649
639
firedValues . push ( 2 ) ;
650
640
pending . set ( query2 , snapshot ) ;
641
+ d2 . resolve ( ) ;
651
642
} ) ;
652
- createQueryListener ( d3 , query3 , snapshot => {
643
+ createQueryListener ( query3 , snapshot => {
653
644
firedValues . push ( 3 ) ;
654
645
pending . set ( query3 , snapshot ) ;
646
+ d3 . resolve ( ) ;
655
647
} ) ;
656
648
657
649
await Promise . all ( [ d2 . promise , d3 . promise , onSyncDeferred2 . promise ] ) ;
658
650
expect ( firedValues ) . to . deep . equal ( [ 2 , 5 , 3 , 4 ] ) ;
659
651
} ) ;
660
652
} ) ;
661
653
662
- it ( 'queues and fires multiple global listeners' , ( ) => {
663
- const testDocs = {
664
- a : { foo : 1 }
665
- } ;
666
- return withTestCollection ( persistence , testDocs , async coll => {
667
- let firedValues : number [ ] = [ ] ;
668
- const d1 = new Deferred < void > ( ) ;
669
- let d2 = new Deferred < void > ( ) ;
670
- let d3 = new Deferred < void > ( ) ;
671
- const doc = coll . doc ( 'a' ) ;
672
-
673
- createDocumentListener ( d1 , doc , snapshot => {
674
- firedValues . push ( 1 ) ;
675
- } ) ;
676
- onSnapshotsInSync ( doc . firestore , ( ) => {
677
- firedValues . push ( 2 ) ;
678
- d2 . resolve ( ) ;
679
- } ) ;
680
- onSnapshotsInSync ( doc . firestore , ( ) => {
681
- firedValues . push ( 3 ) ;
682
- d3 . resolve ( ) ;
683
- } ) ;
684
-
685
- await Promise . all ( [ d1 . promise , d2 . promise , d3 . promise ] ) ;
686
- expect ( firedValues ) . to . deep . equal ( [ 1 , 2 , 3 ] ) ;
687
- firedValues = [ ] ;
688
-
689
- // Set the doc and verify the global listeners fired last.
690
- d2 = new Deferred < void > ( ) ;
691
- d3 = new Deferred < void > ( ) ;
692
- await doc . set ( { foo : 3 } ) ;
693
- await Promise . all ( [ d2 . promise , d3 . promise ] ) ;
694
- expect ( firedValues ) . to . deep . equal ( [ 1 , 2 , 3 ] ) ;
695
- } ) ;
696
- } ) ;
697
-
698
- it ( 'fires global snapshot events for document snapshots' , ( ) => {
699
- const testDocs = {
700
- a : { foo : 1 } ,
701
- b : { foo : 2 }
702
- } ;
703
- return withTestCollection ( persistence , testDocs , async coll => {
704
- let pending : Map <
705
- firestore . DocumentReference ,
706
- firestore . DocumentSnapshot
707
- > = new Map ( ) ;
708
- let firedValues : number [ ] = [ ] ;
709
- let onSyncDeferred = new Deferred < void > ( ) ;
710
- const d1 = new Deferred < void > ( ) ;
711
- const d2 = new Deferred < void > ( ) ;
712
- const docA = coll . doc ( 'a' ) ;
713
- const docB = coll . doc ( 'b' ) ;
714
-
715
- createDocumentListener ( d1 , docA , snapshot => {
716
- firedValues . push ( 1 ) ;
717
- pending . set ( docA , snapshot ) ;
718
- } ) ;
719
- createDocumentListener ( d2 , docB , snapshot => {
720
- firedValues . push ( 2 ) ;
721
- pending . set ( docB , snapshot ) ;
722
- } ) ;
723
- onSnapshotsInSync ( docA . firestore , async ( ) => {
724
- // Ensure that all other listeners have fired first.
725
- if ( pending . has ( docA ) ) {
726
- firedValues . push ( 3 ) ;
727
- } else if ( pending . has ( docB ) ) {
728
- firedValues . push ( 4 ) ;
729
- }
730
- onSyncDeferred . resolve ( ) ;
731
- } ) ;
732
-
733
- // Wait for listeners to fire and reset values before adding onSnapshotsInSync.
734
- await Promise . all ( [ d1 . promise , d2 . promise , onSyncDeferred ] ) ;
735
- firedValues = [ ] ;
736
- pending = new Map ( ) ;
737
- onSyncDeferred = new Deferred < void > ( ) ;
738
-
739
- // Set docA and check for the global listener.
740
- await docA . set ( { foo : 3 } ) ;
741
- await onSyncDeferred . promise ;
742
- expect ( firedValues ) . to . deep . equal ( [ 1 , 3 ] ) ;
743
- pending = new Map ( ) ;
744
- firedValues = [ ] ;
745
- onSyncDeferred = new Deferred < void > ( ) ;
746
-
747
- // Set docB and check for the global listener.
748
- await docB . set ( { foo : 3 } ) ;
749
- await onSyncDeferred . promise ;
750
- expect ( firedValues ) . to . deep . equal ( [ 2 , 4 ] ) ;
751
- } ) ;
752
- } ) ;
753
-
754
- it ( 'fires global snapshot events for query snapshots' , ( ) => {
755
- const testDocs = {
756
- a : { foo : 1 } ,
757
- b : { foo : 2 }
758
- } ;
759
- return withTestCollection ( persistence , testDocs , async coll => {
760
- let pending : Map < firestore . Query , firestore . QuerySnapshot > = new Map ( ) ;
761
- let firedValues : number [ ] = [ ] ;
762
- let onSyncDeferred = new Deferred < void > ( ) ;
763
- const d1 = new Deferred < void > ( ) ;
764
- const d2 = new Deferred < void > ( ) ;
765
- const query1 = coll . where ( 'foo' , '>' , 0 ) ;
766
- const query2 = coll . where ( 'foo' , '==' , 3 ) ;
767
-
768
- createQueryListener ( d1 , query1 , snapshot => {
769
- firedValues . push ( 1 ) ;
770
- pending . set ( query1 , snapshot ) ;
771
- } ) ;
772
- createQueryListener ( d2 , query2 , snapshot => {
773
- firedValues . push ( 2 ) ;
774
- pending . set ( query2 , snapshot ) ;
775
- } ) ;
776
- onSnapshotsInSync ( coll . doc ( ) . firestore , async ( ) => {
777
- // Ensure that all other listeners have fired first.
778
- if ( pending . has ( query1 ) && pending . has ( query2 ) ) {
779
- firedValues . push ( 3 ) ;
780
- } else if ( pending . has ( query1 ) ) {
781
- firedValues . push ( 4 ) ;
782
- } else if ( pending . has ( query2 ) ) {
783
- firedValues . push ( 5 ) ;
784
- }
785
- onSyncDeferred . resolve ( ) ;
786
- } ) ;
787
-
788
- // Wait for listeners to fire and reset values.
789
- await Promise . all ( [ d1 . promise , d2 . promise , onSyncDeferred ] ) ;
790
- firedValues = [ ] ;
791
- pending = new Map ( ) ;
792
- onSyncDeferred = new Deferred < void > ( ) ;
793
-
794
- // Verify that query2 should not receive a snapshot.
795
- await coll . doc ( 'a' ) . set ( { foo : 2 } ) ;
796
- await onSyncDeferred . promise ;
797
- expect ( firedValues ) . to . deep . equal ( [ 1 , 4 ] ) ;
798
- pending = new Map ( ) ;
799
- firedValues = [ ] ;
800
- onSyncDeferred = new Deferred < void > ( ) ;
801
-
802
- // Verify that query1 and query2 each receive a snapshot.
803
- await coll . doc ( 'b' ) . set ( { foo : 3 } ) ;
804
- await onSyncDeferred . promise ;
805
- expect ( firedValues ) . to . deep . equal ( [ 1 , 2 , 3 ] ) ;
806
- } ) ;
807
- } ) ;
808
-
809
654
it ( 'fires global snapshot events for combinbations of queries and docs' , ( ) => {
810
655
const testDocs = {
811
656
a : { foo : 1 }
@@ -825,17 +670,20 @@ apiDescribe('Database', (persistence: boolean) => {
825
670
const query1 = coll . where ( 'foo' , '>' , 0 ) ;
826
671
const query2 = coll . where ( 'foo' , '>' , 1 ) ;
827
672
828
- createDocumentListener ( d1 , doc , snapshot => {
673
+ createDocumentListener ( doc , snapshot => {
829
674
firedValues . push ( 1 ) ;
830
675
pending . set ( doc , snapshot ) ;
676
+ d1 . resolve ( ) ;
831
677
} ) ;
832
- createQueryListener ( d2 , query1 , snapshot => {
678
+ createQueryListener ( query1 , snapshot => {
833
679
firedValues . push ( 2 ) ;
834
680
pending . set ( query1 , snapshot ) ;
681
+ d2 . resolve ( ) ;
835
682
} ) ;
836
- createQueryListener ( d3 , query2 , snapshot => {
683
+ createQueryListener ( query2 , snapshot => {
837
684
firedValues . push ( 3 ) ;
838
685
pending . set ( query2 , snapshot ) ;
686
+ d3 . resolve ( ) ;
839
687
} ) ;
840
688
841
689
// Wait for listeners to fire and reset values before adding onSnapshotsInSync.
@@ -857,48 +705,6 @@ apiDescribe('Database', (persistence: boolean) => {
857
705
expect ( firedValues [ 3 ] ) . to . equal ( 4 ) ;
858
706
} ) ;
859
707
} ) ;
860
-
861
- it ( 'does not fire if the user unregisters a listener' , ( ) => {
862
- const testDocs = {
863
- a : { foo : 1 }
864
- } ;
865
- return withTestCollection ( persistence , testDocs , async coll => {
866
- let pending : Map <
867
- firestore . DocumentReference ,
868
- firestore . DocumentSnapshot
869
- > = new Map ( ) ;
870
- let firedValues : number [ ] = [ ] ;
871
- const d1 = new Deferred < void > ( ) ;
872
- const d2 = new Deferred < void > ( ) ;
873
- let d3 = new Deferred < void > ( ) ;
874
- const doc = coll . doc ( 'a' ) ;
875
-
876
- createDocumentListener ( d1 , doc , snapshot => {
877
- firedValues . push ( 1 ) ;
878
- pending . set ( doc , snapshot ) ;
879
- } ) ;
880
- const unsubscribeFn = onSnapshotsInSync ( doc . firestore , ( ) => {
881
- firedValues . push ( 2 ) ;
882
- d2 . resolve ( ) ;
883
- } ) ;
884
- onSnapshotsInSync ( doc . firestore , ( ) => {
885
- firedValues . push ( 3 ) ;
886
- d3 . resolve ( ) ;
887
- } ) ;
888
-
889
- // Wait for listeners to fire and reset values.
890
- await Promise . all ( [ d1 . promise , d2 . promise , d3 . promise ] ) ;
891
- firedValues = [ ] ;
892
- pending = new Map ( ) ;
893
- d3 = new Deferred < void > ( ) ;
894
-
895
- // Remove a listener and make sure it does not fire.
896
- unsubscribeFn ( ) ;
897
- await doc . set ( { foo : 3 } ) ;
898
- await d3 . promise ;
899
- expect ( firedValues ) . to . deep . equal ( [ 1 , 3 ] ) ;
900
- } ) ;
901
- } ) ;
902
708
} ) ;
903
709
904
710
apiDescribe ( 'Queries are validated client-side' , ( persistence : boolean ) => {
0 commit comments