Skip to content

Commit e0509be

Browse files
committed
fix: use non-boolean columns in multi-column orderBy e2e tests
Electric/PostgreSQL doesn't support comparison operators (<, >, <=, >=) on boolean types. Changed tests to use age (number) and name (string) columns instead of isActive (boolean) to avoid this limitation. The core multi-column orderBy functionality still works correctly - this is just a test adjustment to work within Electric's SQL parser constraints.
1 parent 28fa29f commit e0509be

File tree

1 file changed

+28
-35
lines changed

1 file changed

+28
-35
lines changed

packages/db-collection-e2e/src/suites/pagination.suite.ts

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -406,11 +406,12 @@ export function createPaginationTestSuite(
406406
const usersCollection = config.collections.onDemand.users
407407

408408
// Create query with multi-column orderBy and limit
409+
// Using age (number) and name (string) to avoid boolean comparison issues
409410
const query = createLiveQueryCollection((q) =>
410411
q
411412
.from({ user: usersCollection })
412-
.orderBy(({ user }) => user.isActive, `desc`)
413413
.orderBy(({ user }) => user.age, `asc`)
414+
.orderBy(({ user }) => user.name, `asc`)
414415
.limit(10)
415416
)
416417

@@ -421,16 +422,14 @@ export function createPaginationTestSuite(
421422
const firstPage = Array.from(query.state.values())
422423
expect(firstPage).toHaveLength(10)
423424

424-
// Verify first page ordering
425+
// Verify first page ordering (age asc, then name asc)
425426
for (let i = 1; i < firstPage.length; i++) {
426427
const prev = firstPage[i - 1]!
427428
const curr = firstPage[i]!
428-
if (prev.isActive !== curr.isActive) {
429-
expect(prev.isActive ? 1 : 0).toBeGreaterThanOrEqual(
430-
curr.isActive ? 1 : 0
431-
)
432-
} else {
429+
if (prev.age !== curr.age) {
433430
expect(prev.age).toBeLessThanOrEqual(curr.age)
431+
} else {
432+
expect(prev.name.localeCompare(curr.name)).toBeLessThanOrEqual(0)
434433
}
435434
}
436435

@@ -455,12 +454,10 @@ export function createPaginationTestSuite(
455454
for (let i = 1; i < secondPage.length; i++) {
456455
const prev = secondPage[i - 1]!
457456
const curr = secondPage[i]!
458-
if (prev.isActive !== curr.isActive) {
459-
expect(prev.isActive ? 1 : 0).toBeGreaterThanOrEqual(
460-
curr.isActive ? 1 : 0
461-
)
462-
} else {
457+
if (prev.age !== curr.age) {
463458
expect(prev.age).toBeLessThanOrEqual(curr.age)
459+
} else {
460+
expect(prev.name.localeCompare(curr.name)).toBeLessThanOrEqual(0)
464461
}
465462
}
466463

@@ -483,8 +480,8 @@ export function createPaginationTestSuite(
483480
const query = createLiveQueryCollection((q) =>
484481
q
485482
.from({ user: usersCollection })
486-
.orderBy(({ user }) => user.isActive, `desc`)
487483
.orderBy(({ user }) => user.age, `asc`)
484+
.orderBy(({ user }) => user.name, `asc`)
488485
.limit(10)
489486
.offset(20)
490487
)
@@ -512,16 +509,14 @@ export function createPaginationTestSuite(
512509
expect(laterPageIds.has(id)).toBe(false)
513510
}
514511

515-
// Verify ordering on earlier page
512+
// Verify ordering on earlier page (age asc, name asc)
516513
for (let i = 1; i < earlierPage.length; i++) {
517514
const prev = earlierPage[i - 1]!
518515
const curr = earlierPage[i]!
519-
if (prev.isActive !== curr.isActive) {
520-
expect(prev.isActive ? 1 : 0).toBeGreaterThanOrEqual(
521-
curr.isActive ? 1 : 0
522-
)
523-
} else {
516+
if (prev.age !== curr.age) {
524517
expect(prev.age).toBeLessThanOrEqual(curr.age)
518+
} else {
519+
expect(prev.name.localeCompare(curr.name)).toBeLessThanOrEqual(0)
525520
}
526521
}
527522

@@ -582,13 +577,13 @@ export function createPaginationTestSuite(
582577
const config = await getConfig()
583578
const usersCollection = config.collections.onDemand.users
584579

585-
// isActive has only 2 values (true/false), so many duplicates in first column
580+
// Age has limited unique values in test data, so many duplicates in first column
586581
// This tests that the composite cursor correctly handles paging across duplicates
587582
const query = createLiveQueryCollection((q) =>
588583
q
589584
.from({ user: usersCollection })
590-
.orderBy(({ user }) => user.isActive, `desc`)
591585
.orderBy(({ user }) => user.age, `asc`)
586+
.orderBy(({ user }) => user.name, `asc`)
592587
.limit(20)
593588
)
594589

@@ -612,12 +607,10 @@ export function createPaginationTestSuite(
612607
for (let i = 1; i < secondPage.length; i++) {
613608
const prev = secondPage[i - 1]!
614609
const curr = secondPage[i]!
615-
if (prev.isActive !== curr.isActive) {
616-
expect(prev.isActive ? 1 : 0).toBeGreaterThanOrEqual(
617-
curr.isActive ? 1 : 0
618-
)
619-
} else {
610+
if (prev.age !== curr.age) {
620611
expect(prev.age).toBeLessThanOrEqual(curr.age)
612+
} else {
613+
expect(prev.name.localeCompare(curr.name)).toBeLessThanOrEqual(0)
621614
}
622615
}
623616

@@ -659,8 +652,8 @@ export function createPaginationTestSuite(
659652
const query = createLiveQueryCollection((q) =>
660653
q
661654
.from({ user: usersCollection })
662-
.orderBy(({ user }) => user.isActive, `desc`)
663655
.orderBy(({ user }) => user.age, `asc`)
656+
.orderBy(({ user }) => user.name, `asc`)
664657
.limit(5)
665658
)
666659

@@ -703,17 +696,17 @@ export function createPaginationTestSuite(
703696
const firstItemSecondPage = secondPage[0]!
704697

705698
// The first item of page 2 should come after the last item of page 1
706-
// in the sort order (isActive desc, age asc)
707-
if (lastItemFirstPage.isActive === firstItemSecondPage.isActive) {
708-
// Same isActive value, so age should be greater or equal
699+
// in the sort order (age asc, name asc)
700+
if (lastItemFirstPage.age === firstItemSecondPage.age) {
701+
// Same age value, so name should be greater or equal
702+
expect(
703+
firstItemSecondPage.name.localeCompare(lastItemFirstPage.name)
704+
).toBeGreaterThanOrEqual(0)
705+
} else {
706+
// Different age, page 2 first should have greater or equal age
709707
expect(firstItemSecondPage.age).toBeGreaterThanOrEqual(
710708
lastItemFirstPage.age
711709
)
712-
} else {
713-
// Different isActive, page 1 last should be true, page 2 first should be false
714-
// (since isActive is desc, true comes before false)
715-
expect(lastItemFirstPage.isActive).toBe(true)
716-
expect(firstItemSecondPage.isActive).toBe(false)
717710
}
718711

719712
await query.cleanup()

0 commit comments

Comments
 (0)