fix(db-postgres): relationship query pagination (#5802)

This commit is contained in:
Dan Ribbens
2024-04-11 15:37:19 -04:00
committed by GitHub
parent c0ba6cc19a
commit 65690a675c
2 changed files with 162 additions and 20 deletions

View File

@@ -1191,40 +1191,182 @@ describe('collections-rest', () => {
expect(result.docs).toEqual([post1])
})
describe('limit', () => {
describe('pagination', () => {
let relatedDoc
beforeEach(async () => {
await mapAsync([...Array(50)], async (_, i) =>
createPost({ number: i, title: 'limit-test' }),
)
relatedDoc = await payload.create({
collection: relationSlug,
data: {
name: 'test',
},
})
await mapAsync([...Array(10)], async (_, i) => {
await createPost({
number: i,
relationField: relatedDoc.id as string,
title: 'paginate-test',
})
})
})
it('should query a limited set of docs', async () => {
const { result, status } = await client.find<Post>({
limit: 15,
it('should paginate with where query', async () => {
const { result: page1 } = await client.find({
limit: 4,
query: {
title: {
equals: 'limit-test',
equals: 'paginate-test',
},
},
})
expect(status).toEqual(200)
expect(result.docs).toHaveLength(15)
})
it('should query all docs when limit=0', async () => {
const { result, status } = await client.find<Post>({
limit: 0,
const { result: page2 } = await client.find({
limit: 4,
page: 2,
query: {
title: {
equals: 'limit-test',
equals: 'paginate-test',
},
},
})
expect(status).toEqual(200)
expect(result.docs).toHaveLength(50)
expect(result.totalPages).toEqual(1)
const { result: page3 } = await client.find({
limit: 4,
page: 3,
query: {
title: {
equals: 'paginate-test',
},
},
})
expect(page1.hasNextPage).toStrictEqual(true)
expect(page1.hasPrevPage).toStrictEqual(false)
expect(page1.limit).toStrictEqual(4)
expect(page1.nextPage).toStrictEqual(2)
expect(page1.page).toStrictEqual(1)
expect(page1.pagingCounter).toStrictEqual(1)
expect(page1.prevPage).toStrictEqual(null)
expect(page1.totalDocs).toStrictEqual(10)
expect(page1.totalPages).toStrictEqual(3)
expect(page2.hasNextPage).toStrictEqual(true)
expect(page2.hasPrevPage).toStrictEqual(true)
expect(page2.limit).toStrictEqual(4)
expect(page2.nextPage).toStrictEqual(3)
expect(page2.page).toStrictEqual(2)
expect(page2.pagingCounter).toStrictEqual(5)
expect(page2.prevPage).toStrictEqual(1)
expect(page2.totalDocs).toStrictEqual(10)
expect(page2.totalPages).toStrictEqual(3)
expect(page3.hasNextPage).toStrictEqual(false)
expect(page3.hasPrevPage).toStrictEqual(true)
expect(page3.limit).toStrictEqual(4)
expect(page3.nextPage).toStrictEqual(null)
expect(page3.page).toStrictEqual(3)
expect(page3.pagingCounter).toStrictEqual(9)
expect(page3.prevPage).toStrictEqual(2)
expect(page3.totalDocs).toStrictEqual(10)
expect(page3.totalPages).toStrictEqual(3)
})
it('should paginate with where query on relationships', async () => {
const { result: page1 } = await client.find({
limit: 4,
query: {
relationField: {
equals: relatedDoc.id,
},
},
})
const { result: page2 } = await client.find({
limit: 4,
page: 2,
query: {
relationField: {
equals: relatedDoc.id,
},
},
})
const { result: page3 } = await client.find({
limit: 4,
page: 3,
query: {
relationField: {
equals: relatedDoc.id,
},
},
})
expect(page1.hasNextPage).toStrictEqual(true)
expect(page1.hasPrevPage).toStrictEqual(false)
expect(page1.limit).toStrictEqual(4)
expect(page1.nextPage).toStrictEqual(2)
expect(page1.page).toStrictEqual(1)
expect(page1.pagingCounter).toStrictEqual(1)
expect(page1.prevPage).toStrictEqual(null)
expect(page1.totalDocs).toStrictEqual(10)
expect(page1.totalPages).toStrictEqual(3)
expect(page2.hasNextPage).toStrictEqual(true)
expect(page2.hasPrevPage).toStrictEqual(true)
expect(page2.limit).toStrictEqual(4)
expect(page2.nextPage).toStrictEqual(3)
expect(page2.page).toStrictEqual(2)
expect(page2.pagingCounter).toStrictEqual(5)
expect(page2.prevPage).toStrictEqual(1)
expect(page2.totalDocs).toStrictEqual(10)
expect(page2.totalPages).toStrictEqual(3)
expect(page3.hasNextPage).toStrictEqual(false)
expect(page3.hasPrevPage).toStrictEqual(true)
expect(page3.limit).toStrictEqual(4)
expect(page3.nextPage).toStrictEqual(null)
expect(page3.page).toStrictEqual(3)
expect(page3.pagingCounter).toStrictEqual(9)
expect(page3.prevPage).toStrictEqual(2)
expect(page3.totalDocs).toStrictEqual(10)
expect(page3.totalPages).toStrictEqual(3)
})
describe('limit', () => {
beforeEach(async () => {
await mapAsync([...Array(50)], async (_, i) =>
createPost({ number: i, title: 'limit-test' }),
)
})
it('should query a limited set of docs', async () => {
const { result, status } = await client.find<Post>({
limit: 15,
query: {
title: {
equals: 'limit-test',
},
},
})
expect(status).toStrictEqual(200)
expect(result.docs).toHaveLength(15)
})
it('should query all docs when limit=0', async () => {
const { result, status } = await client.find<Post>({
limit: 0,
query: {
title: {
equals: 'limit-test',
},
},
})
expect(status).toStrictEqual(200)
expect(result.docs).toHaveLength(50)
expect(result.totalPages).toStrictEqual(1)
})
})
})