Skip to content
This repository has been archived by the owner on Jan 9, 2023. It is now read-only.

Commit

Permalink
refactor(patientrepository): changes for findAllPaged
Browse files Browse the repository at this point in the history
'direction' field is now optional. 'nextPageInfo' and 'previousPageInfo' in Page can be undefined.
Add tests.

feat #1969
  • Loading branch information
akshay-ap committed May 12, 2020
1 parent 570947f commit 71ac1ca
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 8 deletions.
108 changes: 107 additions & 1 deletion src/__tests__/clients/db/PatientRepository.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,9 +267,115 @@ describe('patient repository', () => {
expect(result.content).toHaveLength(1)
expect(result.hasNext).toEqual(true)
expect(result.hasPrevious).toEqual(false)
expect(result.content.length).toEqual(1)
expect(result.pageRequest?.nextPageInfo).toEqual({ index: 'bP-b' })
})

it('page request less than number of records', async () => {
const sortRequest: SortRequest = {
sorts: [{ field: 'index', direction: 'asc' }],
}

const pageRequest: PageRequest = {
number: 1,
size: 4,
direction: 'next',
nextPageInfo: undefined,
previousPageInfo: undefined,
}

const result = await PatientRepository.findAllPaged(sortRequest, pageRequest)

expect(result.content).toHaveLength(patientsData.length)
expect(result.hasNext).toEqual(false)
expect(result.hasPrevious).toEqual(false)
expect(result.pageRequest?.nextPageInfo).toBe(undefined)
expect(result.pageRequest?.previousPageInfo).toBe(undefined)
})

it('go till last page', async () => {
const sortRequest: SortRequest = {
sorts: [{ field: 'index', direction: 'asc' }],
}
const pageRequest1: PageRequest = {
number: 1,
size: 1,
direction: 'next',
nextPageInfo: undefined,
previousPageInfo: undefined,
}

const result1 = await PatientRepository.findAllPaged(sortRequest, pageRequest1)

const pageRequest2: PageRequest = {
number: 2,
size: 1,
direction: 'next',
nextPageInfo: result1.pageRequest?.nextPageInfo,
previousPageInfo: undefined,
}
const result2 = await PatientRepository.findAllPaged(sortRequest, pageRequest2)

expect(result2.hasPrevious).toBe(true)
expect(result2.hasNext).toBe(true)

const pageRequest3: PageRequest = {
number: 2,
size: 1,
direction: 'next',
nextPageInfo: result2.pageRequest?.nextPageInfo,
previousPageInfo: undefined,
}
const result3 = await PatientRepository.findAllPaged(sortRequest, pageRequest3)

expect(result3.content).toHaveLength(1)
expect(result3.hasNext).toEqual(false)
expect(result3.hasPrevious).toEqual(true)
expect(result3.content.length).toEqual(1)
expect(result3.pageRequest?.previousPageInfo).toEqual({ index: 'cP-c' })
})

it('go to previous page', async () => {
const sortRequest: SortRequest = {
sorts: [{ field: 'index', direction: 'asc' }],
}
const pageRequest1: PageRequest = {
number: 1,
size: 1,
direction: 'next',
nextPageInfo: undefined,
previousPageInfo: undefined,
}

const result1 = await PatientRepository.findAllPaged(sortRequest, pageRequest1)

const pageRequest2: PageRequest = {
number: 2,
size: 1,
direction: 'next',
nextPageInfo: result1.pageRequest?.nextPageInfo,
previousPageInfo: undefined,
}
const result2 = await PatientRepository.findAllPaged(sortRequest, pageRequest2)

expect(result2.hasPrevious).toBe(true)
expect(result2.hasNext).toBe(true)

const pageRequest3: PageRequest = {
number: 1,
size: 1,
direction: 'previous',
nextPageInfo: undefined,
previousPageInfo: result2.pageRequest?.previousPageInfo,
}
const result3 = await PatientRepository.findAllPaged(sortRequest, pageRequest3)

expect(result3.content).toHaveLength(1)
expect(result3.hasNext).toEqual(true)
expect(result3.hasPrevious).toEqual(false)
expect(result3.content.length).toEqual(1)
expect(result3.content[0].index).toEqual('aP-a')
expect(result3.pageRequest?.nextPageInfo).toEqual({ index: 'bP-b' })
})
})

describe('searchPaged', () => {
Expand Down
3 changes: 1 addition & 2 deletions src/clients/db/PageRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ export default interface PageRequest {
size: number | undefined
nextPageInfo: { [key: string]: string | null } | undefined
previousPageInfo: { [key: string]: string | null } | undefined
direction: 'previous' | 'next' | null
direction?: 'previous' | 'next'
}
export const UnpagedRequest: PageRequest = {
number: undefined,
size: undefined,
nextPageInfo: undefined,
direction: null,
previousPageInfo: undefined,
}
14 changes: 9 additions & 5 deletions src/clients/db/Repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export default class Repository<T extends AbstractDBModel> {
sort: sort.sorts.length > 0 ? sort.sorts.map((s) => ({ [s.field]: s.direction })) : undefined,
limit: pageRequest.size ? pageRequest.size + 1 : undefined,
})

const mappedResult = result.docs.map(mapDocument)
if (pageRequest.direction === 'previous') {
mappedResult.reverse()
Expand All @@ -90,19 +91,22 @@ export default class Repository<T extends AbstractDBModel> {
previousPageInfo[s.field] = mappedResult[0][s.field]
})

const hasNext: boolean =
pageRequest.size !== undefined && mappedResult.length === pageRequest.size + 1
const hasPrevious: boolean = pageRequest.number !== undefined && pageRequest.number > 1

const pagedResult: Page<T> = {
content:
pageRequest.size !== undefined && mappedResult.length === pageRequest.size + 1
? mappedResult.slice(0, mappedResult.length - 1)
: mappedResult,
hasNext: pageRequest.size !== undefined && mappedResult.length === pageRequest.size + 1,
hasPrevious: pageRequest.number !== undefined && pageRequest.number > 1,
hasNext,
hasPrevious,
pageRequest: {
size: pageRequest.size,
number: pageRequest.number,
nextPageInfo,
previousPageInfo,
direction: null,
nextPageInfo: hasNext ? nextPageInfo : undefined,
previousPageInfo: hasPrevious ? previousPageInfo : undefined,
},
}
return pagedResult
Expand Down

0 comments on commit 71ac1ca

Please # to comment.