@@ -5,103 +5,150 @@ import { _, expect, sinon, uuid } from "../_test/test_environment";
5
5
6
6
import { FirestorePersistenceProvider } from "./FirestorePersistenceProvider" ;
7
7
import { PersistenceProvider } from "./PersistenceProvider" ;
8
+ import { PersistenceProviderMock } from "./PersistenceProviderMock" ;
8
9
import { PersistenceRecord } from "./PersistenceRecord" ;
9
10
import { RealtimeDbPersistenceProvider } from "./RealtimeDbPersistenceProvider" ;
10
- chaiUse ( chaiAsPromised ) ;
11
-
12
- function mock ( ) {
13
- const app = firebase . initializeTestApp ( { projectId : "unit-testing-" + Date . now ( ) , databaseName : "db" } ) ;
14
- const uniqueCollectionName = uuid ( ) ;
15
- const uniqueDocName = uuid ( ) ;
16
- const firestore = app . firestore ( ) ;
17
- const database = app . database ( ) ;
18
- const provider : PersistenceProvider = undefined as any ;
19
- const emptyPersistenceRecord : PersistenceRecord = { u : [ ] } ;
20
- const nonModifyingUpdater = ( pr : PersistenceRecord ) => pr ;
21
- return {
22
- app,
23
- firestore,
24
- database,
25
- uniqueCollectionName,
26
- uniqueDocName,
27
- provider,
28
- emptyPersistenceRecord,
29
- nonModifyingUpdater,
30
- } ;
31
- }
32
-
33
- const mockFirestoreProvider : typeof mock = ( ) => {
34
- const mockResult = mock ( ) ;
35
- const provider = new FirestorePersistenceProvider ( mockResult . firestore ) ;
36
- return { ...mockResult , provider } ;
37
- } ;
38
-
39
- const mockRealtimeProvider : typeof mock = ( ) => {
40
- const mockResult = mock ( ) ;
41
- const provider = new RealtimeDbPersistenceProvider ( mockResult . database ) ;
42
- return { ...mockResult , provider } ;
43
- } ;
44
-
45
- afterEach ( async ( ) => {
46
- await Promise . all ( firebase . apps ( ) . map ( app => app . delete ( ) ) ) ;
47
- } ) ;
48
11
49
- before ( "startup" , async function ( ) {
12
+ describe ( "PersistenceProviders" , function ( ) {
50
13
this . timeout ( 4000 ) ;
51
- const { firestore, database } = mock ( ) ;
52
- await firestore
53
- . collection ( "a" )
54
- . doc ( "a" )
55
- . get ( ) ;
56
- await database . ref ( "a" ) . set ( { a : "a" } ) ;
57
- } ) ;
58
14
59
- [
60
- { name : "FirestorePersistenceProvider" , mockFactory : mockFirestoreProvider } ,
61
- { name : "RealtimeDbPersistenceProvider" , mockFactory : mockRealtimeProvider } ,
62
- ] . forEach ( test =>
63
- describe ( test . name , ( ) => {
64
- it ( "Runs transaction code" , async ( ) => {
65
- const { provider, uniqueCollectionName, uniqueDocName, emptyPersistenceRecord } = test . mockFactory ( ) ;
66
- const spy = sinon . spy ( ) ;
67
- await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , record => {
68
- spy ( ) ;
69
- return emptyPersistenceRecord ;
15
+ function mock ( ) {
16
+ const app = firebase . initializeTestApp ( { projectId : "unit-testing-" + Date . now ( ) , databaseName : "db" } ) ;
17
+ const uniqueCollectionName = uuid ( ) ;
18
+ const uniqueDocName = uuid ( ) ;
19
+ const firestore = app . firestore ( ) ;
20
+ const database = app . database ( ) ;
21
+ const provider : PersistenceProvider = undefined as any ;
22
+ const emptyPersistenceRecord : PersistenceRecord = { u : [ ] } ;
23
+ const nonModifyingUpdater = ( pr : PersistenceRecord ) => pr ;
24
+ return {
25
+ app,
26
+ firestore,
27
+ database,
28
+ uniqueCollectionName,
29
+ uniqueDocName,
30
+ provider,
31
+ emptyPersistenceRecord,
32
+ nonModifyingUpdater,
33
+ } ;
34
+ }
35
+
36
+ const mockFirestoreProvider : typeof mock = ( ) => {
37
+ const mockResult = mock ( ) ;
38
+ const provider = new FirestorePersistenceProvider ( mockResult . firestore ) ;
39
+ return { ...mockResult , provider } ;
40
+ } ;
41
+
42
+ const mockRealtimeProvider : typeof mock = ( ) => {
43
+ const mockResult = mock ( ) ;
44
+ const provider = new RealtimeDbPersistenceProvider ( mockResult . database ) ;
45
+ return { ...mockResult , provider } ;
46
+ } ;
47
+
48
+ const mockMockProvider : typeof mock = ( ) => {
49
+ const mockResult = mock ( ) ;
50
+ const provider = new PersistenceProviderMock ( ) ;
51
+ return { ...mockResult , provider } ;
52
+ } ;
53
+
54
+ afterEach ( async ( ) => {
55
+ await Promise . all ( firebase . apps ( ) . map ( app => app . delete ( ) ) ) ;
56
+ } ) ;
57
+
58
+ before ( "startup" , async function ( ) {
59
+ this . timeout ( 4000 ) ;
60
+ const { firestore, database } = mock ( ) ;
61
+ await firestore
62
+ . collection ( "a" )
63
+ . doc ( "a" )
64
+ . get ( ) ;
65
+ await database . ref ( "a" ) . set ( { a : "a" } ) ;
66
+ } ) ;
67
+
68
+ [
69
+ { name : "FirestorePersistenceProvider" , mockFactory : mockFirestoreProvider } ,
70
+ { name : "RealtimeDbPersistenceProvider" , mockFactory : mockRealtimeProvider } ,
71
+ { name : "PersistenceProviderMock" , mockFactory : mockMockProvider } ,
72
+ ] . forEach ( test =>
73
+ describe ( test . name , ( ) => {
74
+ describe ( "#updateAndGet" , ( ) => {
75
+ it ( "Runs transaction code" , async ( ) => {
76
+ const {
77
+ provider,
78
+ uniqueCollectionName,
79
+ uniqueDocName,
80
+ emptyPersistenceRecord,
81
+ } = test . mockFactory ( ) ;
82
+ const spy = sinon . spy ( ) ;
83
+ await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , record => {
84
+ spy ( ) ;
85
+ return emptyPersistenceRecord ;
86
+ } ) ;
87
+ expect ( spy . callCount ) . to . be . equal ( 1 ) ;
88
+ } ) ;
89
+
90
+ it ( "Resolves when transaction callback is finshed" , async ( ) => {
91
+ const { provider, uniqueCollectionName, uniqueDocName } = test . mockFactory ( ) ;
92
+ const spy = sinon . spy ( ) ;
93
+ await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , record => {
94
+ spy ( ) ;
95
+ return { u : [ ] } ;
96
+ } ) ;
97
+ expect ( spy . callCount ) . to . be . equal ( 1 ) ;
98
+ } ) ;
99
+
100
+ it ( "Returns empty record when no data" , async ( ) => {
101
+ const { provider, uniqueCollectionName, uniqueDocName, nonModifyingUpdater } = test . mockFactory ( ) ;
102
+ const rec = await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , nonModifyingUpdater ) ;
103
+ expect ( rec . u )
104
+ . to . be . an ( "array" )
105
+ . with . length ( 0 ) ;
106
+ } ) ;
107
+
108
+ it ( "Saves record properly" , async ( ) => {
109
+ const { provider, uniqueCollectionName, uniqueDocName, nonModifyingUpdater } = test . mockFactory ( ) ;
110
+
111
+ const recToBeSaved : PersistenceRecord = {
112
+ u : [ 1 , 2 , 3 ] ,
113
+ } ;
114
+ await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , r => recToBeSaved ) ;
115
+
116
+ const recRetrived = await provider . updateAndGet (
117
+ uniqueCollectionName ,
118
+ uniqueDocName ,
119
+ nonModifyingUpdater ,
120
+ ) ;
121
+ expect ( recRetrived . u )
122
+ . to . be . an ( "array" )
123
+ . with . length ( recToBeSaved . u . length )
124
+ . that . have . members ( recToBeSaved . u ) ;
125
+ } ) ;
70
126
} ) ;
71
- expect ( spy . callCount ) . to . be . equal ( 1 ) ;
72
- } ) ;
73
-
74
- it ( "Resolves when transaction callback is finshed" , async ( ) => {
75
- const { provider, uniqueCollectionName, uniqueDocName } = test . mockFactory ( ) ;
76
- const spy = sinon . spy ( ) ;
77
- await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , record => {
78
- spy ( ) ;
79
- return { u : [ ] } ;
127
+
128
+ describe ( "#get" , ( ) => {
129
+ it ( "Returns empty record when no data" , async ( ) => {
130
+ const { provider, uniqueCollectionName, uniqueDocName } = test . mockFactory ( ) ;
131
+ const rec = await provider . get ( uniqueCollectionName , uniqueDocName ) ;
132
+ expect ( rec . u )
133
+ . to . be . an ( "array" )
134
+ . with . length ( 0 ) ;
135
+ } ) ;
136
+
137
+ it ( "Returns previously saved record" , async ( ) => {
138
+ const { provider, uniqueCollectionName, uniqueDocName } = test . mockFactory ( ) ;
139
+
140
+ const recToBeSaved : PersistenceRecord = {
141
+ u : [ 1 , 2 , 3 ] ,
142
+ } ;
143
+ await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , r => recToBeSaved ) ;
144
+
145
+ const recRetrived = await provider . get ( uniqueCollectionName , uniqueDocName ) ;
146
+ expect ( recRetrived . u )
147
+ . to . be . an ( "array" )
148
+ . with . length ( recToBeSaved . u . length )
149
+ . that . have . members ( recToBeSaved . u ) ;
150
+ } ) ;
80
151
} ) ;
81
- expect ( spy . callCount ) . to . be . equal ( 1 ) ;
82
- } ) ;
83
-
84
- it ( "Returns empty record when no data" , async ( ) => {
85
- const { provider, uniqueCollectionName, uniqueDocName, nonModifyingUpdater } = test . mockFactory ( ) ;
86
- const rec = await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , nonModifyingUpdater ) ;
87
- expect ( rec . u )
88
- . to . be . an ( "array" )
89
- . with . length ( 0 ) ;
90
- } ) ;
91
-
92
- it ( "Saves record properly" , async ( ) => {
93
- const { provider, uniqueCollectionName, uniqueDocName, nonModifyingUpdater } = test . mockFactory ( ) ;
94
-
95
- const recToBeSaved : PersistenceRecord = {
96
- u : [ 1 , 2 , 3 ] ,
97
- } ;
98
- await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , r => recToBeSaved ) ;
99
-
100
- const recRetrived = await provider . updateAndGet ( uniqueCollectionName , uniqueDocName , nonModifyingUpdater ) ;
101
- expect ( recRetrived . u )
102
- . to . be . an ( "array" )
103
- . with . length ( recToBeSaved . u . length )
104
- . that . have . members ( recToBeSaved . u ) ;
105
- } ) ;
106
- } ) ,
107
- ) ;
152
+ } ) ,
153
+ ) ;
154
+ } ) ;
0 commit comments