@@ -1004,3 +1004,161 @@ it('consumes cancellation tokens correctly', async () => {
10041004 // eslint-disable-next-line no-underscore-dangle
10051005 expect ( underTest . _cancelTokens . length ) . toEqual ( 0 ) ;
10061006} ) ;
1007+
1008+ it ( 'handles multiple initializers with fallback when first initializer fails and second succeeds' , async ( ) => {
1009+ const mockInitializer1Error = {
1010+ name : 'Error' ,
1011+ message : 'First initializer failed' ,
1012+ } ;
1013+ const mockInitializer1 : DataSource = {
1014+ start : jest
1015+ . fn ( )
1016+ . mockImplementation (
1017+ (
1018+ _dataCallback : ( basis : boolean , data : any ) => void ,
1019+ _statusCallback : ( status : DataSourceState , err ?: any ) => void ,
1020+ ) => {
1021+ _statusCallback ( DataSourceState . Initializing ) ;
1022+ _statusCallback ( DataSourceState . Closed , mockInitializer1Error ) ;
1023+ } ,
1024+ ) ,
1025+ stop : jest . fn ( ) ,
1026+ } ;
1027+
1028+ const mockInitializer2Data = { key : 'init2' } ;
1029+ const mockInitializer2 : DataSource = {
1030+ start : jest
1031+ . fn ( )
1032+ . mockImplementation (
1033+ (
1034+ _dataCallback : ( basis : boolean , data : any ) => void ,
1035+ _statusCallback : ( status : DataSourceState , err ?: any ) => void ,
1036+ ) => {
1037+ _statusCallback ( DataSourceState . Initializing ) ;
1038+ _statusCallback ( DataSourceState . Valid ) ;
1039+ _dataCallback ( true , mockInitializer2Data ) ;
1040+ _statusCallback ( DataSourceState . Closed ) ;
1041+ } ,
1042+ ) ,
1043+ stop : jest . fn ( ) ,
1044+ } ;
1045+
1046+ const mockSynchronizer1Data = { key : 'sync1' } ;
1047+ const mockSynchronizer1 = {
1048+ start : jest
1049+ . fn ( )
1050+ . mockImplementation (
1051+ (
1052+ _dataCallback : ( basis : boolean , data : any ) => void ,
1053+ _statusCallback : ( status : DataSourceState , err ?: any ) => void ,
1054+ ) => {
1055+ _statusCallback ( DataSourceState . Initializing ) ;
1056+ _statusCallback ( DataSourceState . Valid ) ;
1057+ _dataCallback ( false , mockSynchronizer1Data ) ;
1058+ } ,
1059+ ) ,
1060+ stop : jest . fn ( ) ,
1061+ } ;
1062+
1063+ const underTest = new CompositeDataSource (
1064+ [ makeDataSourceFactory ( mockInitializer1 ) , makeDataSourceFactory ( mockInitializer2 ) ] ,
1065+ [ makeDataSourceFactory ( mockSynchronizer1 ) ] ,
1066+ [ ] ,
1067+ undefined ,
1068+ makeTestTransitionConditions ( ) ,
1069+ makeZeroBackoff ( ) ,
1070+ ) ;
1071+
1072+ let dataCallback ;
1073+ const statusCallback = jest . fn ( ) ;
1074+ await new Promise < void > ( ( resolve ) => {
1075+ dataCallback = jest . fn ( ( _ : boolean , data : any ) => {
1076+ if ( data === mockSynchronizer1Data ) {
1077+ resolve ( ) ;
1078+ }
1079+ } ) ;
1080+
1081+ underTest . start ( dataCallback , statusCallback ) ;
1082+ } ) ;
1083+
1084+ expect ( mockInitializer1 . start ) . toHaveBeenCalledTimes ( 1 ) ;
1085+ expect ( mockInitializer2 . start ) . toHaveBeenCalledTimes ( 1 ) ;
1086+ expect ( mockSynchronizer1 . start ) . toHaveBeenCalledTimes ( 1 ) ;
1087+ expect ( statusCallback ) . toHaveBeenCalledTimes ( 5 ) ;
1088+ expect ( statusCallback ) . toHaveBeenNthCalledWith ( 1 , DataSourceState . Initializing , undefined ) ;
1089+ expect ( statusCallback ) . toHaveBeenNthCalledWith (
1090+ 2 ,
1091+ DataSourceState . Interrupted ,
1092+ mockInitializer1Error ,
1093+ ) ;
1094+ expect ( statusCallback ) . toHaveBeenNthCalledWith ( 3 , DataSourceState . Valid , undefined ) ;
1095+ expect ( statusCallback ) . toHaveBeenNthCalledWith ( 4 , DataSourceState . Interrupted , undefined ) ;
1096+ expect ( statusCallback ) . toHaveBeenNthCalledWith ( 5 , DataSourceState . Valid , undefined ) ;
1097+ } ) ;
1098+
1099+ it ( 'does not run second initializer when first initializer succeeds' , async ( ) => {
1100+ const mockInitializer1Data = { key : 'init1' } ;
1101+ const mockInitializer1 : DataSource = {
1102+ start : jest
1103+ . fn ( )
1104+ . mockImplementation (
1105+ (
1106+ _dataCallback : ( basis : boolean , data : any ) => void ,
1107+ _statusCallback : ( status : DataSourceState , err ?: any ) => void ,
1108+ ) => {
1109+ _statusCallback ( DataSourceState . Initializing ) ;
1110+ _statusCallback ( DataSourceState . Valid ) ;
1111+ _dataCallback ( true , mockInitializer1Data ) ;
1112+ _statusCallback ( DataSourceState . Closed ) ;
1113+ } ,
1114+ ) ,
1115+ stop : jest . fn ( ) ,
1116+ } ;
1117+
1118+ const mockInitializer2 : DataSource = {
1119+ start : jest . fn ( ) ,
1120+ stop : jest . fn ( ) ,
1121+ } ;
1122+
1123+ const mockSynchronizer1Data = { key : 'sync1' } ;
1124+ const mockSynchronizer1 = {
1125+ start : jest
1126+ . fn ( )
1127+ . mockImplementation (
1128+ (
1129+ _dataCallback : ( basis : boolean , data : any ) => void ,
1130+ _statusCallback : ( status : DataSourceState , err ?: any ) => void ,
1131+ ) => {
1132+ _statusCallback ( DataSourceState . Initializing ) ;
1133+ _statusCallback ( DataSourceState . Valid ) ;
1134+ _dataCallback ( false , mockSynchronizer1Data ) ;
1135+ } ,
1136+ ) ,
1137+ stop : jest . fn ( ) ,
1138+ } ;
1139+
1140+ const underTest = new CompositeDataSource (
1141+ [ makeDataSourceFactory ( mockInitializer1 ) , makeDataSourceFactory ( mockInitializer2 ) ] ,
1142+ [ makeDataSourceFactory ( mockSynchronizer1 ) ] ,
1143+ [ ] ,
1144+ undefined ,
1145+ makeTestTransitionConditions ( ) ,
1146+ makeZeroBackoff ( ) ,
1147+ ) ;
1148+
1149+ let dataCallback ;
1150+ const statusCallback = jest . fn ( ) ;
1151+ await new Promise < void > ( ( resolve ) => {
1152+ dataCallback = jest . fn ( ( _ : boolean , data : any ) => {
1153+ if ( data === mockSynchronizer1Data ) {
1154+ resolve ( ) ;
1155+ }
1156+ } ) ;
1157+
1158+ underTest . start ( dataCallback , statusCallback ) ;
1159+ } ) ;
1160+
1161+ expect ( mockInitializer1 . start ) . toHaveBeenCalledTimes ( 1 ) ;
1162+ expect ( mockInitializer2 . start ) . toHaveBeenCalledTimes ( 0 ) ;
1163+ expect ( mockSynchronizer1 . start ) . toHaveBeenCalledTimes ( 1 ) ;
1164+ } ) ;
0 commit comments