Skip to content

Commit 6b77ebe

Browse files
committed
chore: add more test cases for findSingleRow
1 parent ac83792 commit 6b77ebe

File tree

1 file changed

+203
-55
lines changed

1 file changed

+203
-55
lines changed

packages/backend/src/models/tiles/pg/__tests__/table-row-functions.itest.ts

Lines changed: 203 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)