From 71ac1ca96aeeb2b5ee2807179b5afe0899395ab5 Mon Sep 17 00:00:00 2001 From: Akshay Patel Date: Tue, 12 May 2020 19:48:47 +0530 Subject: [PATCH] refactor(patientrepository): changes for findAllPaged 'direction' field is now optional. 'nextPageInfo' and 'previousPageInfo' in Page can be undefined. Add tests. feat #1969 --- .../clients/db/PatientRepository.test.ts | 108 +++++++++++++++++- src/clients/db/PageRequest.ts | 3 +- src/clients/db/Repository.ts | 14 ++- 3 files changed, 117 insertions(+), 8 deletions(-) diff --git a/src/__tests__/clients/db/PatientRepository.test.ts b/src/__tests__/clients/db/PatientRepository.test.ts index 70f7b8728d..875b8549fe 100644 --- a/src/__tests__/clients/db/PatientRepository.test.ts +++ b/src/__tests__/clients/db/PatientRepository.test.ts @@ -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', () => { diff --git a/src/clients/db/PageRequest.ts b/src/clients/db/PageRequest.ts index 3f2a0c9cd8..198f5da99e 100644 --- a/src/clients/db/PageRequest.ts +++ b/src/clients/db/PageRequest.ts @@ -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, } diff --git a/src/clients/db/Repository.ts b/src/clients/db/Repository.ts index db5924cbbc..6ab08df33d 100644 --- a/src/clients/db/Repository.ts +++ b/src/clients/db/Repository.ts @@ -73,6 +73,7 @@ export default class Repository { 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() @@ -90,19 +91,22 @@ export default class Repository { 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 = { 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