@@ -18,6 +18,8 @@ limitations under the License.
18
18
import { logger } from "../../src/logger" ;
19
19
import { InteractiveAuth } from "../../src/interactive-auth" ;
20
20
import { MatrixError } from "../../src/http-api" ;
21
+ import { sleep } from "../../src/utils" ;
22
+ import { randomString } from "../../src/randomstring" ;
21
23
22
24
// Trivial client object to test interactive auth
23
25
// (we do not need TestClient here)
@@ -172,4 +174,107 @@ describe("InteractiveAuth", function() {
172
174
expect ( error . message ) . toBe ( 'No appropriate authentication flow found' ) ;
173
175
} ) ;
174
176
} ) ;
177
+
178
+ describe ( "requestEmailToken" , ( ) => {
179
+ it ( "increases auth attempts" , async ( ) => {
180
+ const doRequest = jest . fn ( ) ;
181
+ const stateUpdated = jest . fn ( ) ;
182
+ const requestEmailToken = jest . fn ( ) ;
183
+ requestEmailToken . mockImplementation ( async ( ) => ( { sid : "" } ) ) ;
184
+
185
+ const ia = new InteractiveAuth ( {
186
+ matrixClient : new FakeClient ( ) ,
187
+ doRequest, stateUpdated, requestEmailToken,
188
+ } ) ;
189
+
190
+ await ia . requestEmailToken ( ) ;
191
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 1 , undefined ) ;
192
+ requestEmailToken . mockClear ( ) ;
193
+ await ia . requestEmailToken ( ) ;
194
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 2 , undefined ) ;
195
+ requestEmailToken . mockClear ( ) ;
196
+ await ia . requestEmailToken ( ) ;
197
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 3 , undefined ) ;
198
+ requestEmailToken . mockClear ( ) ;
199
+ await ia . requestEmailToken ( ) ;
200
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 4 , undefined ) ;
201
+ requestEmailToken . mockClear ( ) ;
202
+ await ia . requestEmailToken ( ) ;
203
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 5 , undefined ) ;
204
+ } ) ;
205
+
206
+ it ( "increases auth attempts" , async ( ) => {
207
+ const doRequest = jest . fn ( ) ;
208
+ const stateUpdated = jest . fn ( ) ;
209
+ const requestEmailToken = jest . fn ( ) ;
210
+ requestEmailToken . mockImplementation ( async ( ) => ( { sid : "" } ) ) ;
211
+
212
+ const ia = new InteractiveAuth ( {
213
+ matrixClient : new FakeClient ( ) ,
214
+ doRequest, stateUpdated, requestEmailToken,
215
+ } ) ;
216
+
217
+ await ia . requestEmailToken ( ) ;
218
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 1 , undefined ) ;
219
+ requestEmailToken . mockClear ( ) ;
220
+ await ia . requestEmailToken ( ) ;
221
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 2 , undefined ) ;
222
+ requestEmailToken . mockClear ( ) ;
223
+ await ia . requestEmailToken ( ) ;
224
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 3 , undefined ) ;
225
+ requestEmailToken . mockClear ( ) ;
226
+ await ia . requestEmailToken ( ) ;
227
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 4 , undefined ) ;
228
+ requestEmailToken . mockClear ( ) ;
229
+ await ia . requestEmailToken ( ) ;
230
+ expect ( requestEmailToken ) . toHaveBeenLastCalledWith ( undefined , ia . getClientSecret ( ) , 5 , undefined ) ;
231
+ } ) ;
232
+
233
+ it ( "passes errors through" , async ( ) => {
234
+ const doRequest = jest . fn ( ) ;
235
+ const stateUpdated = jest . fn ( ) ;
236
+ const requestEmailToken = jest . fn ( ) ;
237
+ requestEmailToken . mockImplementation ( async ( ) => {
238
+ throw new Error ( "unspecific network error" ) ;
239
+ } ) ;
240
+
241
+ const ia = new InteractiveAuth ( {
242
+ matrixClient : new FakeClient ( ) ,
243
+ doRequest, stateUpdated, requestEmailToken,
244
+ } ) ;
245
+
246
+ expect ( async ( ) => await ia . requestEmailToken ( ) ) . rejects . toThrowError ( "unspecific network error" ) ;
247
+ } ) ;
248
+
249
+ it ( "only starts one request at a time" , async ( ) => {
250
+ const doRequest = jest . fn ( ) ;
251
+ const stateUpdated = jest . fn ( ) ;
252
+ const requestEmailToken = jest . fn ( ) ;
253
+ requestEmailToken . mockImplementation ( ( ) => sleep ( 500 , { sid : "" } ) ) ;
254
+
255
+ const ia = new InteractiveAuth ( {
256
+ matrixClient : new FakeClient ( ) ,
257
+ doRequest, stateUpdated, requestEmailToken,
258
+ } ) ;
259
+
260
+ await Promise . all ( [ ia . requestEmailToken ( ) , ia . requestEmailToken ( ) , ia . requestEmailToken ( ) ] ) ;
261
+ expect ( requestEmailToken ) . toHaveBeenCalledTimes ( 1 ) ;
262
+ } ) ;
263
+
264
+ it ( "stores result in email sid" , async ( ) => {
265
+ const doRequest = jest . fn ( ) ;
266
+ const stateUpdated = jest . fn ( ) ;
267
+ const requestEmailToken = jest . fn ( ) ;
268
+ const sid = randomString ( 24 ) ;
269
+ requestEmailToken . mockImplementation ( ( ) => sleep ( 500 , { sid } ) ) ;
270
+
271
+ const ia = new InteractiveAuth ( {
272
+ matrixClient : new FakeClient ( ) ,
273
+ doRequest, stateUpdated, requestEmailToken,
274
+ } ) ;
275
+
276
+ await ia . requestEmailToken ( ) ;
277
+ expect ( ia . getEmailSid ( ) ) . toEqual ( sid ) ;
278
+ } ) ;
279
+ } ) ;
175
280
} ) ;
0 commit comments