@@ -261,9 +261,14 @@ describe('DataConnectApiClient CRUD helpers', () => {
261261    } , 
262262    notes : undefined , 
263263    releaseYear : undefined , 
264-     extras : [ 1 ,  undefined ,   'hello' ,   undefined ,  {  a : 1 ,  b : undefined  } ] 
264+     extras : [ 1 ,  'hello' ,  {  a : 1 ,  b : undefined  } ] 
265265  } ; 
266266
267+   const  dataWithSparseArray  =  { 
268+     genre : 'Action' , 
269+     extras : [ 1 ,  undefined ,  'hello' ,  undefined ,  {  a : 1 ,  b : undefined  } ] 
270+   } 
271+ 
267272  const  tableNames  =  [ 'movie' ,  'Movie' ,  'MOVIE' ,  'mOvIE' ,  'toybox' ,  'toyBox' ,  'toyBOX' ,  'ToyBox' ,  'TOYBOX' ] ; 
268273  const  formatedTableNames  =  [ 'movie' ,  'movie' ,  'mOVIE' ,  'mOvIE' ,  'toybox' ,  'toyBox' ,  'toyBOX' ,  'toyBox' ,  'tOYBOX' ] ; 
269274
@@ -343,7 +348,7 @@ describe('DataConnectApiClient CRUD helpers', () => {
343348       title: "Die Hard", 
344349       ratings: null, 
345350       director: {}, 
346-        extras: [1, null,  "hello", null , { a: 1 }] 
351+        extras: [1, "hello", { a: 1 }] 
347352       }) 
348353      }` ; 
349354      await  apiClient . insert ( tableName ,  dataWithUndefined ) ; 
@@ -369,6 +374,16 @@ describe('DataConnectApiClient CRUD helpers', () => {
369374      await  expect ( apiClientQueryError . insert ( tableName ,  {  data : 1  } ) ) 
370375        . to . be . rejectedWith ( FirebaseDataConnectError ,  `${ serverErrorString } ${ additionalErrorMessageForBulkImport }  ) ; 
371376    } ) ; 
377+ 
378+     [ 
379+       {  a : [ null ]  } ,  {  a : [ undefined ]  } ,  {  a : [ 1 ,  null ,  2 ]  } ,  {  a : [ 1 ,  undefined ,  2 ]  } , 
380+       {  a : [ 'a' ,  null ,  'b' ,  undefined ,  'd' ]  } ,  dataWithSparseArray 
381+     ] . forEach ( ( data )  =>  { 
382+       it ( 'should throw FirebaseDataConnectError for arrays with null or undefined elements' ,  async  ( )  =>  { 
383+         await  expect ( apiClient . insert ( tableName ,  data ) ) 
384+           . to . be . rejectedWith ( FirebaseDataConnectError ,  / A r r a y   e l e m e n t s   c a n n o t   c o n t a i n   ` n u l l `   o r   ` u n d e f i n e d `   v a l u e s ./ ) ; 
385+       } ) ; 
386+     } ) ; 
372387  } ) ; 
373388
374389  // --- INSERT MANY TESTS --- 
@@ -417,14 +432,14 @@ describe('DataConnectApiClient CRUD helpers', () => {
417432       title: "Die Hard", 
418433       ratings: null, 
419434       director: {}, 
420-        extras: [1, null,  "hello", null , { a: 1 }] 
435+        extras: [1, "hello", { a: 1 }] 
421436      }, 
422437      { 
423438       genre: "Action", 
424439       title: "Die Hard", 
425440       ratings: null, 
426441       director: {}, 
427-        extras: [1, null,  "hello", null , { a: 1 }] 
442+        extras: [1, "hello", { a: 1 }] 
428443      }]) 
429444      }` ; 
430445      await  apiClient . insertMany ( tableName ,  dataArray ) ; 
@@ -455,6 +470,16 @@ describe('DataConnectApiClient CRUD helpers', () => {
455470      await  expect ( apiClientQueryError . insertMany ( tableName ,  [ {  data : 1  } ] ) ) 
456471        . to . be . rejectedWith ( FirebaseDataConnectError ,  `${ serverErrorString } ${ additionalErrorMessageForBulkImport }  ) ; 
457472    } ) ; 
473+ 
474+     [ 
475+       [ null ] ,  [ undefined ] ,  [ 1 ,  null ,  2 ] ,  [ 1 ,  undefined ,  2 ] , 
476+       [ 'a' ,  null ,  'b' ,  undefined ,  'd' ] ,  [ dataWithSparseArray ] 
477+     ] . forEach ( ( data )  =>  { 
478+       it ( 'should throw FirebaseDataConnectError for arrays with null or undefined elements' ,  async  ( )  =>  { 
479+         await  expect ( apiClient . insertMany ( tableName ,  data ) ) 
480+           . to . be . rejectedWith ( FirebaseDataConnectError ,  / A r r a y   e l e m e n t s   c a n n o t   c o n t a i n   ` n u l l `   o r   ` u n d e f i n e d `   v a l u e s ./ ) ; 
481+       } ) ; 
482+     } ) ; 
458483  } ) ; 
459484
460485  // --- UPSERT TESTS --- 
@@ -476,10 +501,10 @@ describe('DataConnectApiClient CRUD helpers', () => {
476501    } ) ; 
477502
478503    it ( 'should call executeGraphql with the correct mutation for complex data' ,  async  ( )  =>  { 
479-       const  complexData  =  {  id : 'key2' ,  active : false ,  items : [ 1 ,  null ] ,  detail : {  status : 'done/\\'  }  } ; 
504+       const  complexData  =  {  id : 'key2' ,  active : false ,  items : [ 1 ,  2 ] ,  detail : {  status : 'done/\\'  }  } ; 
480505      const  expectedMutation  =  ` 
481506      mutation { ${ formatedTableName }  
482-       { id: "key2", active: false, items: [1, null ], detail: { status: "done/\\\\" } }) }` ; 
507+       { id: "key2", active: false, items: [1, 2 ], detail: { status: "done/\\\\" } }) }` ; 
483508      await  apiClient . upsert ( tableName ,  complexData ) ; 
484509      expect ( executeGraphqlStub ) . to . have . been . calledOnceWithExactly ( normalizeGraphQLString ( expectedMutation ) ) ; 
485510    } ) ; 
@@ -492,7 +517,7 @@ describe('DataConnectApiClient CRUD helpers', () => {
492517       title: "Die Hard", 
493518       ratings: null, 
494519       director: {}, 
495-        extras: [1, null,  "hello", null , { a: 1 }] 
520+        extras: [1, "hello", { a: 1 }] 
496521       }) 
497522      }` ; 
498523      await  apiClient . upsert ( tableName ,  dataWithUndefined ) ; 
@@ -518,6 +543,16 @@ describe('DataConnectApiClient CRUD helpers', () => {
518543      await  expect ( apiClientQueryError . upsert ( tableName ,  {  data : 1  } ) ) 
519544        . to . be . rejectedWith ( FirebaseDataConnectError ,  `${ serverErrorString } ${ additionalErrorMessageForBulkImport }  ) ; 
520545    } ) ; 
546+ 
547+     [ 
548+       {  a : [ null ]  } ,  {  a : [ undefined ]  } ,  {  a : [ 1 ,  null ,  2 ]  } ,  {  a : [ 1 ,  undefined ,  2 ]  } , 
549+       {  a : [ 'a' ,  null ,  'b' ,  undefined ,  'd' ]  } ,  dataWithSparseArray 
550+     ] . forEach ( ( data )  =>  { 
551+       it ( 'should throw FirebaseDataConnectError for arrays with null or undefined elements' ,  async  ( )  =>  { 
552+         await  expect ( apiClient . upsert ( tableName ,  data ) ) 
553+           . to . be . rejectedWith ( FirebaseDataConnectError ,  / A r r a y   e l e m e n t s   c a n n o t   c o n t a i n   ` n u l l `   o r   ` u n d e f i n e d `   v a l u e s ./ ) ; 
554+       } ) ; 
555+     } ) ; 
521556  } ) ; 
522557
523558  // --- UPSERT MANY TESTS --- 
@@ -542,11 +577,11 @@ describe('DataConnectApiClient CRUD helpers', () => {
542577    it ( 'should call executeGraphql with the correct mutation for complex data array' ,  async  ( )  =>  { 
543578      const  complexDataArray  =  [ 
544579        {  id : 'x' ,  active : true ,  info : {  nested : 'n1/\\"x'  }  } , 
545-         {  id : 'y' ,  scores : [ null ,  2 ]  } 
580+         {  id : 'y' ,  scores : [ 1 ,  2 ]  } 
546581      ] ; 
547582      const  expectedMutation  =  ` 
548583      mutation { ${ formatedTableName }  
549-       [{ id: "x", active: true, info: { nested: "n1/\\\\\\"x" } }, { id: "y", scores: [null , 2] }]) }` ; 
584+       [{ id: "x", active: true, info: { nested: "n1/\\\\\\"x" } }, { id: "y", scores: [1 , 2] }]) }` ; 
550585      await  apiClient . upsertMany ( tableName ,  complexDataArray ) ; 
551586      expect ( executeGraphqlStub ) . to . have . been . calledOnceWithExactly ( normalizeGraphQLString ( expectedMutation ) ) ; 
552587    } ) ; 
@@ -563,14 +598,14 @@ describe('DataConnectApiClient CRUD helpers', () => {
563598       title: "Die Hard", 
564599       ratings: null, 
565600       director: {}, 
566-        extras: [1, null,  "hello", null , { a: 1 }] 
601+        extras: [1, "hello", { a: 1 }] 
567602      }, 
568603      { 
569604       genre: "Action", 
570605       title: "Die Hard", 
571606       ratings: null, 
572607       director: {}, 
573-        extras: [1, null,  "hello", null , { a: 1 }] 
608+        extras: [1, "hello", { a: 1 }] 
574609      }]) 
575610      }` ; 
576611      await  apiClient . upsertMany ( tableName ,  dataArray ) ; 
@@ -601,5 +636,15 @@ describe('DataConnectApiClient CRUD helpers', () => {
601636      await  expect ( apiClientQueryError . upsertMany ( tableName ,  [ {  data : 1  } ] ) ) 
602637        . to . be . rejectedWith ( FirebaseDataConnectError ,  `${ serverErrorString } ${ additionalErrorMessageForBulkImport }  ) ; 
603638    } ) ; 
639+ 
640+     [ 
641+       [ null ] ,  [ undefined ] ,  [ 1 ,  null ,  2 ] ,  [ 1 ,  undefined ,  2 ] , 
642+       [ 'a' ,  null ,  'b' ,  undefined ,  'd' ] ,  [ dataWithSparseArray ] 
643+     ] . forEach ( ( data )  =>  { 
644+       it ( 'should throw FirebaseDataConnectError for arrays with null or undefined elements' ,  async  ( )  =>  { 
645+         await  expect ( apiClient . upsertMany ( tableName ,  data ) ) 
646+           . to . be . rejectedWith ( FirebaseDataConnectError ,  / A r r a y   e l e m e n t s   c a n n o t   c o n t a i n   ` n u l l `   o r   ` u n d e f i n e d `   v a l u e s ./ ) ; 
647+       } ) ; 
648+     } ) ; 
604649  } ) ; 
605650} ) ; 
0 commit comments