@@ -23,7 +23,12 @@ import * as sinonChai from 'sinon-chai';
23
23
import { testAuth , testUser , TestAuth } from '../../../test/helpers/mock_auth' ;
24
24
import { UserImpl } from '../user/user_impl' ;
25
25
import { _getInstance } from '../util/instantiator' ;
26
- import { PersistenceInternal , PersistenceType , StorageEventListener } from './' ;
26
+ import {
27
+ PersistenceInternal ,
28
+ PersistenceType ,
29
+ PersistenceValue ,
30
+ StorageEventListener
31
+ } from './' ;
27
32
import { inMemoryPersistence } from './in_memory' ;
28
33
import { KeyName , PersistenceUserManager } from './persistence_user_manager' ;
29
34
@@ -64,19 +69,78 @@ describe('core/persistence/persistence_user_manager', () => {
64
69
expect ( manager . persistence ) . to . eq ( _getInstance ( inMemoryPersistence ) ) ;
65
70
} ) ;
66
71
67
- it ( 'searches in order for a user ' , async ( ) => {
72
+ it ( 'chooses the first one available ' , async ( ) => {
68
73
const a = makePersistence ( ) ;
69
74
const b = makePersistence ( ) ;
70
75
const c = makePersistence ( ) ;
71
76
const search = [ a . persistence , b . persistence , c . persistence ] ;
72
77
const auth = await testAuth ( ) ;
73
- b . stub . _get . returns ( Promise . resolve ( testUser ( auth , 'uid' ) . toJSON ( ) ) ) ;
78
+ a . stub . _isAvailable . resolves ( false ) ;
79
+ a . stub . _get . onFirstCall ( ) . resolves ( testUser ( auth , 'uid' ) . toJSON ( ) ) ;
80
+ b . stub . _isAvailable . resolves ( true ) ;
74
81
75
82
const out = await PersistenceUserManager . create ( auth , search ) ;
83
+ expect ( a . stub . _isAvailable ) . to . have . been . calledOnce ;
84
+ expect ( b . stub . _isAvailable ) . to . have . been . calledOnce ;
85
+ expect ( c . stub . _isAvailable ) . to . not . have . been . called ;
86
+
87
+ // a should not be chosen since it is not available (despite having a user).
76
88
expect ( out . persistence ) . to . eq ( b . persistence ) ;
89
+ } ) ;
90
+
91
+ it ( 'searches in order for a user' , async ( ) => {
92
+ const a = makePersistence ( ) ;
93
+ const b = makePersistence ( ) ;
94
+ const c = makePersistence ( ) ;
95
+ const search = [ a . persistence , b . persistence , c . persistence ] ;
96
+ const auth = await testAuth ( ) ;
97
+ const user = testUser ( auth , 'uid' ) ;
98
+ a . stub . _isAvailable . resolves ( true ) ;
99
+ a . stub . _get . resolves ( user . toJSON ( ) ) ;
100
+ b . stub . _get . resolves ( testUser ( auth , 'wrong-uid' ) . toJSON ( ) ) ;
101
+
102
+ const out = await PersistenceUserManager . create ( auth , search ) ;
77
103
expect ( a . stub . _get ) . to . have . been . calledOnce ;
78
- expect ( b . stub . _get ) . to . have . been . calledOnce ;
104
+ expect ( b . stub . _get ) . not . to . have . been . called ;
79
105
expect ( c . stub . _get ) . not . to . have . been . called ;
106
+
107
+ expect ( out . persistence ) . to . eq ( a . persistence ) ;
108
+ expect ( ( await out . getCurrentUser ( ) ) ! . uid ) . to . eq ( user . uid ) ;
109
+ } ) ;
110
+
111
+ it ( 'migrate found user to the selected persistence and clear others' , async ( ) => {
112
+ const a = makePersistence ( ) ;
113
+ const b = makePersistence ( ) ;
114
+ const c = makePersistence ( ) ;
115
+ const search = [ a . persistence , b . persistence , c . persistence ] ;
116
+ const auth = await testAuth ( ) ;
117
+ const user = testUser ( auth , 'uid' ) ;
118
+ a . stub . _isAvailable . resolves ( true ) ;
119
+ b . stub . _get . resolves ( user . toJSON ( ) ) ;
120
+ c . stub . _get . resolves ( testUser ( auth , 'wrong-uid' ) . toJSON ( ) ) ;
121
+
122
+ let persistedUserInA : PersistenceValue | null = null ;
123
+ a . stub . _set . callsFake ( async ( _ , value ) => {
124
+ persistedUserInA = value ;
125
+ } ) ;
126
+ a . stub . _get . callsFake ( async ( ) => persistedUserInA ) ;
127
+
128
+ const out = await PersistenceUserManager . create ( auth , search ) ;
129
+ expect ( a . stub . _set ) . to . have . been . calledOnceWith (
130
+ 'firebase:authUser:test-api-key:test-app' ,
131
+ user . toJSON ( )
132
+ ) ;
133
+ expect ( b . stub . _set ) . to . not . have . been . called ;
134
+ expect ( c . stub . _set ) . to . not . have . been . called ;
135
+ expect ( b . stub . _remove ) . to . have . been . calledOnceWith (
136
+ 'firebase:authUser:test-api-key:test-app'
137
+ ) ;
138
+ expect ( c . stub . _remove ) . to . have . been . calledOnceWith (
139
+ 'firebase:authUser:test-api-key:test-app'
140
+ ) ;
141
+
142
+ expect ( out . persistence ) . to . eq ( a . persistence ) ;
143
+ expect ( ( await out . getCurrentUser ( ) ) ! . uid ) . to . eq ( user . uid ) ;
80
144
} ) ;
81
145
82
146
it ( 'uses default user key if none provided' , async ( ) => {
@@ -99,13 +163,17 @@ describe('core/persistence/persistence_user_manager', () => {
99
163
) ;
100
164
} ) ;
101
165
102
- it ( 'returns zeroth persistence if all else fails' , async ( ) => {
166
+ it ( 'returns in-memory persistence if all else fails' , async ( ) => {
103
167
const a = makePersistence ( ) ;
104
168
const b = makePersistence ( ) ;
105
169
const c = makePersistence ( ) ;
106
170
const search = [ a . persistence , b . persistence , c . persistence ] ;
171
+ a . stub . _isAvailable . resolves ( false ) ;
172
+ b . stub . _isAvailable . resolves ( false ) ;
173
+ c . stub . _isAvailable . resolves ( false ) ;
174
+
107
175
const out = await PersistenceUserManager . create ( auth , search ) ;
108
- expect ( out . persistence ) . to . eq ( a . persistence ) ;
176
+ expect ( out . persistence ) . to . eq ( _getInstance ( inMemoryPersistence ) ) ;
109
177
expect ( a . stub . _get ) . to . have . been . calledOnce ;
110
178
expect ( b . stub . _get ) . to . have . been . calledOnce ;
111
179
expect ( c . stub . _get ) . to . have . been . called ;
@@ -118,6 +186,7 @@ describe('core/persistence/persistence_user_manager', () => {
118
186
119
187
beforeEach ( async ( ) => {
120
188
const { persistence, stub } = makePersistence ( PersistenceType . SESSION ) ;
189
+ stub . _isAvailable . resolves ( true ) ;
121
190
persistenceStub = stub ;
122
191
manager = await PersistenceUserManager . create ( auth , [ persistence ] ) ;
123
192
} ) ;
0 commit comments