@@ -386,14 +386,39 @@ describe('table-row-functions', () => {
386386 describe ( 'getTableRows' , ( ) => {
387387 let dataArray : Record < string , string > [ ]
388388 let rowIds : string [ ]
389- const NUM_ROWS = 9
389+ const NUM_ROWS = 10
390390 beforeEach ( async ( ) => {
391391 // Add test rows for filtering tests
392392 dataArray = new Array ( NUM_ROWS ) . fill ( 0 ) . map ( ( ) =>
393393 generateMockTableRowData ( {
394394 columnIds : dummyColumnIds ,
395395 } ) ,
396396 )
397+ // column2 (iso strings)
398+ dataArray [ 0 ] [ dummyColumnIds [ 1 ] ] = '2025-01-01T00:00:00.000'
399+ dataArray [ 1 ] [ dummyColumnIds [ 1 ] ] = '2025-02-01T00:00:00.000'
400+ dataArray [ 2 ] [ dummyColumnIds [ 1 ] ] = '2025-03-01T00:00:00.000'
401+ dataArray [ 3 ] [ dummyColumnIds [ 1 ] ] = '2025-04-01'
402+ dataArray [ 4 ] [ dummyColumnIds [ 1 ] ] = '2025-05-01T00:00:00.000Z'
403+ dataArray [ 5 ] [ dummyColumnIds [ 1 ] ] = '2025-05-01T10:00:00.000Z'
404+ dataArray [ 6 ] [ dummyColumnIds [ 1 ] ] = '2025-05-03T00:00:00.000'
405+ dataArray [ 7 ] [ dummyColumnIds [ 1 ] ] = '2025-05-01T00:00:00.000+08:00'
406+ dataArray [ 8 ] [ dummyColumnIds [ 1 ] ] = '2025-05-01T00:00:00.000-08:00'
407+ dataArray [ 9 ] [ dummyColumnIds [ 1 ] ] = '2025-05-01T00:00:00.000'
408+
409+ // column3 (isEmpty, beginsWith)
410+ dataArray [ 0 ] [ dummyColumnIds [ 2 ] ] = 'even'
411+ dataArray [ 1 ] [ dummyColumnIds [ 2 ] ] = null
412+ dataArray [ 2 ] [ dummyColumnIds [ 2 ] ] = 'even'
413+ dataArray [ 3 ] [ dummyColumnIds [ 2 ] ] = ''
414+ dataArray [ 4 ] [ dummyColumnIds [ 2 ] ] = 'even'
415+ delete dataArray [ 5 ] [ dummyColumnIds [ 2 ] ]
416+ dataArray [ 6 ] [ dummyColumnIds [ 2 ] ] = 'even'
417+ dataArray [ 7 ] [ dummyColumnIds [ 2 ] ] = undefined
418+ dataArray [ 8 ] [ dummyColumnIds [ 2 ] ] = 'even'
419+ dataArray [ 9 ] [ dummyColumnIds [ 2 ] ] = null
420+
421+ // column4 (numeric operators)
397422 dataArray [ 0 ] [ dummyColumnIds [ 3 ] ] = '5'
398423 dataArray [ 1 ] [ dummyColumnIds [ 3 ] ] = '10'
399424 dataArray [ 2 ] [ dummyColumnIds [ 3 ] ] = '20'
@@ -403,6 +428,7 @@ describe('table-row-functions', () => {
403428 dataArray [ 6 ] [ dummyColumnIds [ 3 ] ] = 'abc'
404429 dataArray [ 7 ] [ dummyColumnIds [ 3 ] ] = 'def'
405430 dataArray [ 8 ] [ dummyColumnIds [ 3 ] ] = 'ghi'
431+ dataArray [ 9 ] [ dummyColumnIds [ 3 ] ] = '-9.99'
406432 rowIds = await createTableRows ( {
407433 tableId : dummyTable . id ,
408434 dataArray,
@@ -424,7 +450,7 @@ describe('table-row-functions', () => {
424450 expect ( Object . keys ( result . rows [ 0 ] . data ) ) . toEqual ( [ dummyColumnIds [ 0 ] ] )
425451 } )
426452
427- it ( 'should filter rows with equals operator' , async ( ) => {
453+ it ( 'should filter rows with equals operator (string) ' , async ( ) => {
428454 const result = await getTableRows ( {
429455 tableId : dummyTable . id ,
430456 filters : [
@@ -438,7 +464,8 @@ describe('table-row-functions', () => {
438464
439465 expect ( result . rows ) . toHaveLength ( 1 )
440466 expect ( result . rows [ 0 ] . rowId ) . toBe ( rowIds [ 0 ] )
441-
467+ } )
468+ it ( 'should filter rows with equals operator (numeric string)' , async ( ) => {
442469 const result2 = await getTableRows ( {
443470 tableId : dummyTable . id ,
444471 filters : [
@@ -454,7 +481,7 @@ describe('table-row-functions', () => {
454481 expect ( result2 . rows [ 0 ] . rowId ) . toBe ( rowIds [ 0 ] )
455482 } )
456483
457- it ( 'should filter rows with contains operator' , async ( ) => {
484+ it ( 'should filter rows with contains operator (string) ' , async ( ) => {
458485 const result = await getTableRows ( {
459486 tableId : dummyTable . id ,
460487 filters : [
@@ -470,25 +497,55 @@ describe('table-row-functions', () => {
470497 expect ( result . rows [ 0 ] . rowId ) . toBe ( rowIds [ 1 ] )
471498 } )
472499
473- it ( 'should filter rows with greaterThan operator' , async ( ) => {
500+ it ( 'should filter rows with contains operator (numeric string) ' , async ( ) => {
474501 const result = await getTableRows ( {
475502 tableId : dummyTable . id ,
476503 filters : [
477504 {
478505 columnId : dummyColumnIds [ 3 ] ,
479- operator : TableRowFilterOperator . GreaterThan ,
480- value : '20 ' ,
506+ operator : TableRowFilterOperator . Contains ,
507+ value : '4 ' ,
481508 } ,
482509 ] ,
483510 } )
484511
485- expect ( result . rows ) . toHaveLength ( 3 )
512+ expect ( result . rows ) . toHaveLength ( 2 )
486513 expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual ( [
487- rowIds [ 3 ] ,
488514 rowIds [ 4 ] ,
489515 rowIds [ 5 ] ,
490516 ] )
517+ } )
491518
519+ it . each ( [
520+ [ '20' , [ 3 , 4 , 5 ] ] ,
521+ [ '-20' , [ 0 , 1 , 2 , 3 , 4 , 5 , 9 ] ] ,
522+ [ '0' , [ 0 , 1 , 2 , 3 , 4 , 5 ] ] ,
523+ [ '10' , [ 2 , 3 , 4 , 5 ] ] ,
524+ [ '140' , [ ] ] ,
525+ [ '100' , [ 5 ] ] ,
526+ [ '-0.1' , [ 0 , 1 , 2 , 3 , 4 , 5 ] ] ,
527+ [ '-9.99' , [ 0 , 1 , 2 , 3 , 4 , 5 ] ] ,
528+ ] ) (
529+ 'should filter rows with greaterThan operator (numeric string)' ,
530+ async ( value : string , expectedRowIds : number [ ] ) => {
531+ const result = await getTableRows ( {
532+ tableId : dummyTable . id ,
533+ filters : [
534+ {
535+ columnId : dummyColumnIds [ 3 ] ,
536+ operator : TableRowFilterOperator . GreaterThan ,
537+ value,
538+ } ,
539+ ] ,
540+ } )
541+
542+ expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual (
543+ expectedRowIds . map ( ( i ) => rowIds [ i ] ) ,
544+ )
545+ } ,
546+ )
547+
548+ it ( 'should filter rows with greaterThan operator (string)' , async ( ) => {
492549 const result2 = await getTableRows ( {
493550 tableId : dummyTable . id ,
494551 filters : [
@@ -507,26 +564,37 @@ describe('table-row-functions', () => {
507564 ] )
508565 } )
509566
510- it ( 'should filter rows with greaterThanOrEquals operator' , async ( ) => {
511- const result = await getTableRows ( {
512- tableId : dummyTable . id ,
513- filters : [
514- {
515- columnId : dummyColumnIds [ 3 ] ,
516- operator : TableRowFilterOperator . GreaterThanOrEquals ,
517- value : '20' ,
518- } ,
519- ] ,
520- } )
567+ it . each ( [
568+ [ '20' , [ 2 , 3 , 4 , 5 ] ] ,
569+ [ '-20' , [ 0 , 1 , 2 , 3 , 4 , 5 , 9 ] ] ,
570+ [ '0' , [ 0 , 1 , 2 , 3 , 4 , 5 ] ] ,
571+ [ '10' , [ 1 , 2 , 3 , 4 , 5 ] ] ,
572+ [ '140' , [ 5 ] ] ,
573+ [ '100' , [ 5 ] ] ,
574+ [ '-0.1' , [ 0 , 1 , 2 , 3 , 4 , 5 ] ] ,
575+ [ '-9.99' , [ 0 , 1 , 2 , 3 , 4 , 5 , 9 ] ] ,
576+ ] ) (
577+ 'should filter rows with greaterThanOrEquals operator' ,
578+ async ( value : string , expectedRowIds : number [ ] ) => {
579+ const result = await getTableRows ( {
580+ tableId : dummyTable . id ,
581+ filters : [
582+ {
583+ columnId : dummyColumnIds [ 3 ] ,
584+ operator : TableRowFilterOperator . GreaterThanOrEquals ,
585+ value,
586+ } ,
587+ ] ,
588+ } )
521589
522- expect ( result . rows ) . toHaveLength ( 4 )
523- expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual ( [
524- rowIds [ 2 ] ,
525- rowIds [ 3 ] ,
526- rowIds [ 4 ] ,
527- rowIds [ 5 ] ,
528- ] )
590+ expect ( result . rows ) . toHaveLength ( expectedRowIds . length )
591+ expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual (
592+ expectedRowIds . map ( ( i ) => rowIds [ i ] ) ,
593+ )
594+ } ,
595+ )
529596
597+ it ( 'should filter rows with greaterThanOrEquals operator (string)' , async ( ) => {
530598 const result2 = await getTableRows ( {
531599 tableId : dummyTable . id ,
532600 filters : [
@@ -546,76 +614,156 @@ describe('table-row-functions', () => {
546614 ] )
547615 } )
548616
549- it ( 'should filter rows with lessThan operator' , async ( ) => {
550- const result = await getTableRows ( {
617+ it . each ( [
618+ [ '20' , [ 0 , 1 , 9 ] ] ,
619+ [ '-20' , [ ] ] ,
620+ [ '0' , [ 9 ] ] ,
621+ [ '10' , [ 0 , 9 ] ] ,
622+ [ '140' , [ 0 , 1 , 2 , 3 , 4 , 9 ] ] ,
623+ [ '100' , [ 0 , 1 , 2 , 3 , 4 , 9 ] ] ,
624+ [ '-0.1' , [ 9 ] ] ,
625+ [ '-9.99' , [ ] ] ,
626+ ] ) (
627+ 'should filter rows with lessThan operator' ,
628+ async ( value : string , expectedRowIds : number [ ] ) => {
629+ const result = await getTableRows ( {
630+ tableId : dummyTable . id ,
631+ filters : [
632+ {
633+ columnId : dummyColumnIds [ 3 ] ,
634+ operator : TableRowFilterOperator . LessThan ,
635+ value,
636+ } ,
637+ ] ,
638+ } )
639+
640+ expect ( result . rows ) . toHaveLength ( expectedRowIds . length )
641+ expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual (
642+ expectedRowIds . map ( ( i ) => rowIds [ i ] ) ,
643+ )
644+ } ,
645+ )
646+
647+ it ( 'should filter rows with lessThan operator (string)' , async ( ) => {
648+ const result2 = await getTableRows ( {
551649 tableId : dummyTable . id ,
552650 filters : [
553651 {
554652 columnId : dummyColumnIds [ 3 ] ,
555653 operator : TableRowFilterOperator . LessThan ,
556- value : '30 ' ,
654+ value : 'aaa ' ,
557655 } ,
558656 ] ,
559657 } )
560658
561- expect ( result . rows ) . toHaveLength ( 3 )
562- expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual ( [
659+ expect ( result2 . rows ) . toHaveLength ( 7 )
660+ expect ( result2 . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual ( [
563661 rowIds [ 0 ] ,
564662 rowIds [ 1 ] ,
565663 rowIds [ 2 ] ,
664+ rowIds [ 3 ] ,
665+ rowIds [ 4 ] ,
666+ rowIds [ 5 ] ,
667+ rowIds [ 9 ] ,
566668 ] )
669+ } )
567670
671+ it . each ( [
672+ [ '20' , [ 0 , 1 , 2 , 9 ] ] ,
673+ [ '-20' , [ ] ] ,
674+ [ '0' , [ 9 ] ] ,
675+ [ '10' , [ 0 , 1 , 9 ] ] ,
676+ [ '140' , [ 0 , 1 , 2 , 3 , 4 , 5 , 9 ] ] ,
677+ [ '100' , [ 0 , 1 , 2 , 3 , 4 , 9 ] ] ,
678+ [ '-0.1' , [ 9 ] ] ,
679+ [ '-9.99' , [ 9 ] ] ,
680+ ] ) (
681+ 'should filter rows with lessThanOrEquals operator' ,
682+ async ( value : string , expectedRowIds : number [ ] ) => {
683+ const result = await getTableRows ( {
684+ tableId : dummyTable . id ,
685+ filters : [
686+ {
687+ columnId : dummyColumnIds [ 3 ] ,
688+ operator : TableRowFilterOperator . LessThanOrEquals ,
689+ value,
690+ } ,
691+ ] ,
692+ } )
693+
694+ expect ( result . rows ) . toHaveLength ( expectedRowIds . length )
695+ expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual (
696+ expectedRowIds . map ( ( i ) => rowIds [ i ] ) ,
697+ )
698+ } ,
699+ )
700+
701+ it ( 'should filter rows with lessThanOrEquals operator (string)' , async ( ) => {
568702 const result2 = await getTableRows ( {
569703 tableId : dummyTable . id ,
570704 filters : [
571705 {
572706 columnId : dummyColumnIds [ 3 ] ,
573- operator : TableRowFilterOperator . LessThan ,
574- value : 'aaa ' ,
707+ operator : TableRowFilterOperator . LessThanOrEquals ,
708+ value : 'abc ' ,
575709 } ,
576710 ] ,
577711 } )
578712
579- expect ( result2 . rows ) . toHaveLength ( 6 )
580- expect ( result2 . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual (
581- rowIds . slice ( 0 , - 3 ) ,
582- )
713+ expect ( result2 . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual ( [
714+ rowIds [ 0 ] ,
715+ rowIds [ 1 ] ,
716+ rowIds [ 2 ] ,
717+ rowIds [ 3 ] ,
718+ rowIds [ 4 ] ,
719+ rowIds [ 5 ] ,
720+ rowIds [ 6 ] ,
721+ rowIds [ 9 ] ,
722+ ] )
583723 } )
584724
585- it ( 'should filter rows with lessThanOrEquals operator' , async ( ) => {
725+ it ( 'should filter rows with isEmpty operator (nullish, undefined, empty string) ' , async ( ) => {
586726 const result = await getTableRows ( {
587727 tableId : dummyTable . id ,
588728 filters : [
589729 {
590- columnId : dummyColumnIds [ 3 ] ,
591- operator : TableRowFilterOperator . LessThanOrEquals ,
592- value : '20 ' ,
730+ columnId : dummyColumnIds [ 2 ] ,
731+ operator : TableRowFilterOperator . IsEmpty ,
732+ value : '' ,
593733 } ,
594734 ] ,
595735 } )
596736
597- expect ( result . rows ) . toHaveLength ( 3 )
737+ expect ( result . rows ) . toHaveLength ( 5 )
598738 expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual ( [
599- rowIds [ 0 ] ,
600739 rowIds [ 1 ] ,
601- rowIds [ 2 ] ,
740+ rowIds [ 3 ] ,
741+ rowIds [ 5 ] ,
742+ rowIds [ 7 ] ,
743+ rowIds [ 9 ] ,
602744 ] )
745+ } )
603746
604- const result2 = await getTableRows ( {
747+ it ( 'should filter rows with beginsWith operator (string)' , async ( ) => {
748+ const result = await getTableRows ( {
605749 tableId : dummyTable . id ,
606750 filters : [
607751 {
608- columnId : dummyColumnIds [ 3 ] ,
609- operator : TableRowFilterOperator . LessThanOrEquals ,
610- value : 'abc ' ,
752+ columnId : dummyColumnIds [ 2 ] ,
753+ operator : TableRowFilterOperator . BeginsWith ,
754+ value : 'ev ' ,
611755 } ,
612756 ] ,
613757 } )
614758
615- expect ( result2 . rows ) . toHaveLength ( 7 )
616- expect ( result2 . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual (
617- rowIds . slice ( 0 , - 2 ) ,
618- )
759+ expect ( result . rows ) . toHaveLength ( 5 )
760+ expect ( result . rows . map ( ( r ) => r . rowId ) . sort ( ) ) . toEqual ( [
761+ rowIds [ 0 ] ,
762+ rowIds [ 2 ] ,
763+ rowIds [ 4 ] ,
764+ rowIds [ 6 ] ,
765+ rowIds [ 8 ] ,
766+ ] )
619767 } )
620768
621769 it ( 'should return rows with pagination using scanLimit and cursor' , async ( ) => {
@@ -641,11 +789,11 @@ describe('table-row-functions', () => {
641789 // Third page
642790 const thirdPage = await getTableRows ( {
643791 tableId : dummyTable . id ,
644- scanLimit : 4 ,
792+ scanLimit : 999 ,
645793 stringifiedCursor : secondPage . stringifiedCursor ,
646794 } )
647795
648- expect ( thirdPage . rows ) . toHaveLength ( 1 )
796+ expect ( thirdPage . rows ) . toHaveLength ( NUM_ROWS - 8 )
649797 expect ( thirdPage . stringifiedCursor ) . toBeNull ( ) // No more pages
650798 } )
651799
0 commit comments