1
1
import React from 'react' ;
2
2
import Video , { PreflightTestReport } from 'twilio-video' ;
3
- import { AudioInputTest , AudioOutputTest , VideoInputTest } from '@twilio/rtc-diagnostics' ;
3
+ import { AudioInputTest , AudioOutputTest , VideoInputTest , MediaConnectionBitrateTest } from '@twilio/rtc-diagnostics' ;
4
4
import {
5
5
ActivePane ,
6
6
useAppStateContext ,
@@ -11,9 +11,16 @@ import {
11
11
} from './AppStateProvider' ;
12
12
import { renderHook , act } from '@testing-library/react-hooks' ;
13
13
14
+ const mockStartBitrateTest = jest . fn ( ) ;
14
15
const mockStartPreflightTest = jest . fn ( ) ;
15
16
const mockGetTwilioStatus = jest . fn ( ) ;
16
17
18
+ jest . mock ( './useBitrateTest/useBitrateTest' , ( ) =>
19
+ jest . fn ( ( ) => ( {
20
+ startBitrateTest : mockStartBitrateTest ,
21
+ } ) )
22
+ ) ;
23
+
17
24
jest . mock ( './usePreflightTest/usePreflightTest' , ( ) =>
18
25
jest . fn ( ( ) => ( {
19
26
startPreflightTest : mockStartPreflightTest ,
@@ -34,36 +41,71 @@ describe('the useAppStateContext hook', () => {
34
41
} ) ;
35
42
36
43
describe ( 'the isDownButtonDisabled function' , ( ) => {
37
- const mockError = Error ( ) ;
38
- it ( 'should return true if preflightTest fails or if Twilio services are down' , ( ) => {
39
- expect ( isDownButtonDisabled ( false , 'partial_outage' , ActivePane . Connectivity , mockError ) ) . toBe ( true ) ;
44
+ it ( 'should return true if preflightTest fails' , ( ) => {
45
+ const mockCurrentState = {
46
+ ...initialState ,
47
+ activePane : ActivePane . Connectivity ,
48
+ preflightTestInProgress : false ,
49
+ preflightTest : { ...initialState . preflightTest , error : Error ( ) } ,
50
+ bitrateTestInProgress : false ,
51
+ } ;
52
+ expect ( isDownButtonDisabled ( mockCurrentState ) ) . toBe ( true ) ;
40
53
} ) ;
41
54
42
- it ( 'should return true when preflight test is in progress' , ( ) => {
43
- expect ( isDownButtonDisabled ( true , 'operational' , ActivePane . Connectivity , null ) ) . toBe ( true ) ;
55
+ it ( 'should return true when preflight test and/or bitrate test is in progress' , ( ) => {
56
+ const mockCurrentState = {
57
+ ...initialState ,
58
+ activePane : ActivePane . Connectivity ,
59
+ preflightTestInProgress : true ,
60
+ bitrateTestInProgress : false ,
61
+ } ;
62
+
63
+ expect ( isDownButtonDisabled ( mockCurrentState ) ) . toBe ( true ) ;
44
64
} ) ;
45
65
46
66
it ( 'should return true if the active pane is the last pane' , ( ) => {
47
- expect ( isDownButtonDisabled ( false , 'operational' , ActivePane . Results , null ) ) . toBe ( true ) ;
67
+ const mockCurrentState = {
68
+ ...initialState ,
69
+ activePane : ActivePane . Results ,
70
+ } ;
71
+ expect ( isDownButtonDisabled ( mockCurrentState ) ) . toBe ( true ) ;
48
72
} ) ;
49
73
50
74
it ( 'should return true when active pane is DeviceCheck' , ( ) => {
51
- expect ( isDownButtonDisabled ( false , 'operational' , ActivePane . DeviceCheck , null ) ) . toBe ( true ) ;
75
+ const mockCurrentState = {
76
+ ...initialState ,
77
+ activePane : ActivePane . DeviceCheck ,
78
+ } ;
79
+ expect ( isDownButtonDisabled ( mockCurrentState ) ) . toBe ( true ) ;
52
80
} ) ;
53
81
54
82
it ( 'should return true when active pane is DeviceError' , ( ) => {
55
- expect ( isDownButtonDisabled ( false , 'operational' , ActivePane . DeviceError , null ) ) . toBe ( true ) ;
83
+ const mockCurrentState = {
84
+ ...initialState ,
85
+ activePane : ActivePane . DeviceError ,
86
+ } ;
87
+ expect ( isDownButtonDisabled ( mockCurrentState ) ) . toBe ( true ) ;
56
88
} ) ;
57
89
58
90
it ( 'should return true when active pane is BrowserCheck and the browser is unsupported' , ( ) => {
91
+ const mockCurrentState = {
92
+ ...initialState ,
93
+ activePane : ActivePane . BrowserTest ,
94
+ } ;
59
95
// @ts -ignore
60
96
Video . isSupported = false ;
61
97
62
- expect ( isDownButtonDisabled ( false , 'operational' , ActivePane . BrowserTest , null ) ) . toBe ( true ) ;
98
+ expect ( isDownButtonDisabled ( mockCurrentState ) ) . toBe ( true ) ;
63
99
} ) ;
64
100
65
- it ( 'should return false if preflightTest completes and active pane is not in Device setup' , ( ) => {
66
- expect ( isDownButtonDisabled ( false , 'operational' , ActivePane . CameraTest , null ) ) . toBe ( false ) ;
101
+ it ( 'should return false if preflightTest and bitrateTest complete and active pane is not DeviceCheck or DeviceError' , ( ) => {
102
+ const mockCurrentState = {
103
+ ...initialState ,
104
+ activePane : ActivePane . CameraTest ,
105
+ preflightTestInProgress : false ,
106
+ bitrateTestInProgress : false ,
107
+ } ;
108
+ expect ( isDownButtonDisabled ( mockCurrentState ) ) . toBe ( false ) ;
67
109
} ) ;
68
110
} ) ;
69
111
@@ -304,6 +346,46 @@ describe('the appState reducer', () => {
304
346
expect ( newState . preflightTestInProgress ) . toBe ( false ) ;
305
347
} ) ;
306
348
} ) ;
349
+
350
+ describe ( 'the "set-bitrate" action type' , ( ) => {
351
+ it ( 'should set the bitrate for the bitrate test' , ( ) => {
352
+ const newState = appStateReducer ( initialState , { type : 'set-bitrate' , bitrate : 100 } ) ;
353
+ expect ( newState . bitrateTest . bitrate ) . toBe ( 100 ) ;
354
+ } ) ;
355
+ } ) ;
356
+
357
+ describe ( 'the "set-bitrate-test-error" action type' , ( ) => {
358
+ it ( 'should save the error if an error is thrown during bitrate test' , ( ) => {
359
+ const mockError = Error ( ) ;
360
+ const newState = appStateReducer ( initialState , { type : 'set-bitrate-test-error' , error : mockError } ) ;
361
+ expect ( newState . bitrateTest . error ) . toBe ( mockError ) ;
362
+ } ) ;
363
+ } ) ;
364
+
365
+ describe ( 'the "set-bitrate-test-report" action type' , ( ) => {
366
+ it ( 'should save the report from the bitrate test' , ( ) => {
367
+ const mockReport = { } as MediaConnectionBitrateTest . Report ;
368
+
369
+ const newState = appStateReducer ( initialState , { type : 'set-bitrate-test-report' , report : mockReport } ) ;
370
+ expect ( newState . bitrateTest . report ) . toBe ( mockReport ) ;
371
+ } ) ;
372
+ } ) ;
373
+
374
+ describe ( 'the "bitrate-test-started" action type' , ( ) => {
375
+ it ( 'should set bitrateTestInProgress to true and bitrateTestFinished to false' , ( ) => {
376
+ const newState = appStateReducer ( initialState , { type : 'bitrate-test-started' } ) ;
377
+ expect ( newState . bitrateTestInProgress ) . toBe ( true ) ;
378
+ expect ( newState . bitrateTestFinished ) . toBe ( false ) ;
379
+ } ) ;
380
+ } ) ;
381
+
382
+ describe ( 'the "bitrate-test-finished" action type' , ( ) => {
383
+ it ( 'should set bitrateTestInProgress to false and bitrateTestFinished to true' , ( ) => {
384
+ const newState = appStateReducer ( initialState , { type : 'bitrate-test-finished' } ) ;
385
+ expect ( newState . bitrateTestFinished ) . toBe ( true ) ;
386
+ expect ( newState . bitrateTestInProgress ) . toBe ( false ) ;
387
+ } ) ;
388
+ } ) ;
307
389
} ) ;
308
390
309
391
describe ( 'the AppStateProvider component' , ( ) => {
@@ -336,6 +418,13 @@ describe('the AppStateProvider component', () => {
336
418
"audioGranted": false,
337
419
"audioInputTestReport": null,
338
420
"audioOutputTestReport": null,
421
+ "bitrateTest": Object {
422
+ "bitrate": null,
423
+ "error": null,
424
+ "report": null,
425
+ },
426
+ "bitrateTestFinished": false,
427
+ "bitrateTestInProgress": false,
339
428
"deviceError": null,
340
429
"downButtonDisabled": false,
341
430
"preflightTest": Object {
0 commit comments