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

Commit 8089564

Browse files
authored
Merge pull request #2026 from akshay-ap/feat-#1969
feat(patient): add paging and sorting functionality
2 parents f3b3c7f + abcf92c commit 8089564

17 files changed

+778
-64
lines changed

src/__tests__/clients/db/PatientRepository.test.ts

+195
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { getTime, isAfter } from 'date-fns'
22
import shortid from 'shortid'
33

4+
import PageRequest, { UnpagedRequest } from '../../../clients/db/PageRequest'
45
import PatientRepository from '../../../clients/db/PatientRepository'
6+
import SortRequest from '../../../clients/db/SortRequest'
57
import { patients } from '../../../config/pouchdb'
68
import Patient from '../../../model/Patient'
79

@@ -224,4 +226,197 @@ describe('patient repository', () => {
224226
expect(allDocs.total_rows).toEqual(0)
225227
})
226228
})
229+
230+
describe('findAllPaged', () => {
231+
const patientsData = [
232+
{ _id: 'a', fullName: 'a', code: 'P-a', index: 'aP-a' },
233+
{ _id: 'b', fullName: 'b', code: 'P-b', index: 'bP-b' },
234+
{ _id: 'c', fullName: 'c', code: 'P-c', index: 'cP-c' },
235+
]
236+
237+
afterEach(async () => {
238+
await removeAllDocs()
239+
})
240+
241+
beforeEach(async () => {
242+
await PatientRepository.createIndex()
243+
patientsData.forEach((patientData) => patients.put(patientData))
244+
})
245+
246+
it('should find all patients in the database', async () => {
247+
const result = await PatientRepository.findAllPaged()
248+
249+
expect(result.hasNext).toEqual(false)
250+
expect(result.hasPrevious).toEqual(false)
251+
expect(result.content).toHaveLength(patientsData.length)
252+
})
253+
254+
it('should find all patients in the database with sort request and page request', async () => {
255+
const sortRequest: SortRequest = {
256+
sorts: [{ field: 'index', direction: 'asc' }],
257+
}
258+
const pageRequest: PageRequest = {
259+
number: 1,
260+
size: 1,
261+
direction: 'next',
262+
nextPageInfo: undefined,
263+
previousPageInfo: undefined,
264+
}
265+
266+
const result = await PatientRepository.findAllPaged(sortRequest, pageRequest)
267+
268+
expect(result.content).toHaveLength(1)
269+
expect(result.hasNext).toEqual(true)
270+
expect(result.hasPrevious).toEqual(false)
271+
expect(result.pageRequest?.nextPageInfo).toEqual({ index: 'bP-b' })
272+
})
273+
274+
it('page request less than number of records', async () => {
275+
const sortRequest: SortRequest = {
276+
sorts: [{ field: 'index', direction: 'asc' }],
277+
}
278+
279+
const pageRequest: PageRequest = {
280+
number: 1,
281+
size: 4,
282+
direction: 'next',
283+
nextPageInfo: undefined,
284+
previousPageInfo: undefined,
285+
}
286+
287+
const result = await PatientRepository.findAllPaged(sortRequest, pageRequest)
288+
289+
expect(result.content).toHaveLength(patientsData.length)
290+
expect(result.hasNext).toEqual(false)
291+
expect(result.hasPrevious).toEqual(false)
292+
expect(result.pageRequest?.nextPageInfo).toBe(undefined)
293+
expect(result.pageRequest?.previousPageInfo).toBe(undefined)
294+
})
295+
296+
it('go till last page', async () => {
297+
const sortRequest: SortRequest = {
298+
sorts: [{ field: 'index', direction: 'asc' }],
299+
}
300+
const pageRequest1: PageRequest = {
301+
number: 1,
302+
size: 1,
303+
direction: 'next',
304+
nextPageInfo: undefined,
305+
previousPageInfo: undefined,
306+
}
307+
308+
const result1 = await PatientRepository.findAllPaged(sortRequest, pageRequest1)
309+
310+
const pageRequest2: PageRequest = {
311+
number: 2,
312+
size: 1,
313+
direction: 'next',
314+
nextPageInfo: result1.pageRequest?.nextPageInfo,
315+
previousPageInfo: undefined,
316+
}
317+
const result2 = await PatientRepository.findAllPaged(sortRequest, pageRequest2)
318+
319+
expect(result2.hasPrevious).toBe(true)
320+
expect(result2.hasNext).toBe(true)
321+
322+
const pageRequest3: PageRequest = {
323+
number: 2,
324+
size: 1,
325+
direction: 'next',
326+
nextPageInfo: result2.pageRequest?.nextPageInfo,
327+
previousPageInfo: undefined,
328+
}
329+
const result3 = await PatientRepository.findAllPaged(sortRequest, pageRequest3)
330+
331+
expect(result3.content).toHaveLength(1)
332+
expect(result3.hasNext).toEqual(false)
333+
expect(result3.hasPrevious).toEqual(true)
334+
expect(result3.content.length).toEqual(1)
335+
expect(result3.pageRequest?.previousPageInfo).toEqual({ index: 'cP-c' })
336+
})
337+
338+
it('go to previous page', async () => {
339+
const sortRequest: SortRequest = {
340+
sorts: [{ field: 'index', direction: 'asc' }],
341+
}
342+
const pageRequest1: PageRequest = {
343+
number: 1,
344+
size: 1,
345+
direction: 'next',
346+
nextPageInfo: undefined,
347+
previousPageInfo: undefined,
348+
}
349+
350+
const result1 = await PatientRepository.findAllPaged(sortRequest, pageRequest1)
351+
352+
const pageRequest2: PageRequest = {
353+
number: 2,
354+
size: 1,
355+
direction: 'next',
356+
nextPageInfo: result1.pageRequest?.nextPageInfo,
357+
previousPageInfo: undefined,
358+
}
359+
const result2 = await PatientRepository.findAllPaged(sortRequest, pageRequest2)
360+
361+
expect(result2.hasPrevious).toBe(true)
362+
expect(result2.hasNext).toBe(true)
363+
364+
const pageRequest3: PageRequest = {
365+
number: 1,
366+
size: 1,
367+
direction: 'previous',
368+
nextPageInfo: undefined,
369+
previousPageInfo: result2.pageRequest?.previousPageInfo,
370+
}
371+
const result3 = await PatientRepository.findAllPaged(sortRequest, pageRequest3)
372+
373+
expect(result3.content).toHaveLength(1)
374+
expect(result3.hasNext).toEqual(true)
375+
expect(result3.hasPrevious).toEqual(false)
376+
expect(result3.content.length).toEqual(1)
377+
expect(result3.content[0].index).toEqual('aP-a')
378+
expect(result3.pageRequest?.nextPageInfo).toEqual({ index: 'bP-b' })
379+
})
380+
})
381+
382+
describe('searchPaged', () => {
383+
const patientsData = [
384+
{ _id: 'a', fullName: 'a', code: 'P-a', index: 'aP-a' },
385+
{ _id: 'b', fullName: 'b', code: 'P-b', index: 'bP-b' },
386+
{ _id: 'c', fullName: 'c', code: 'P-c', index: 'cP-c' },
387+
]
388+
389+
afterEach(async () => {
390+
await removeAllDocs()
391+
})
392+
393+
beforeEach(async () => {
394+
await PatientRepository.createIndex()
395+
patientsData.forEach((patientData) => patients.put(patientData))
396+
})
397+
398+
it('should search patient in the database', async () => {
399+
const result = await PatientRepository.searchPaged('a')
400+
401+
expect(result.content).toHaveLength(1)
402+
expect(result.hasNext).toEqual(false)
403+
expect(result.hasPrevious).toEqual(false)
404+
405+
expect(result.content.length).toEqual(1)
406+
})
407+
408+
it('should search patient in the database with sort request', async () => {
409+
const sortRequest: SortRequest = {
410+
sorts: [{ field: 'index', direction: 'asc' }],
411+
}
412+
413+
const result = await PatientRepository.searchPaged('a', UnpagedRequest, sortRequest)
414+
415+
expect(result.content).toHaveLength(1)
416+
expect(result.hasNext).toEqual(false)
417+
expect(result.hasPrevious).toEqual(false)
418+
419+
expect(result.content.length).toEqual(1)
420+
})
421+
})
227422
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import '../../__mocks__/matchMediaMock'
2+
import { Button, Select } from '@hospitalrun/components'
3+
import { mount } from 'enzyme'
4+
import React from 'react'
5+
6+
import PageComponent, { defaultPageSize } from '../../components/PageComponent'
7+
8+
describe('PageComponenet test', () => {
9+
it('should render PageComponent Component', () => {
10+
const wrapper = mount(
11+
<PageComponent
12+
hasNext={false}
13+
hasPrevious={false}
14+
pageNumber={1}
15+
setPreviousPageRequest={jest.fn()}
16+
setNextPageRequest={jest.fn()}
17+
onPageSizeChange={jest.fn()}
18+
/>,
19+
)
20+
const buttons = wrapper.find(Button)
21+
expect(buttons).toHaveLength(2)
22+
expect(buttons.at(0).prop('disabled')).toBeTruthy()
23+
expect(buttons.at(1).prop('disabled')).toBeTruthy()
24+
25+
const select = wrapper.find(Select)
26+
expect(select.prop('defaultValue')).toEqual(defaultPageSize.value?.toString())
27+
28+
const options = select.find('option')
29+
expect(options).toHaveLength(5)
30+
})
31+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { renderHook } from '@testing-library/react-hooks'
2+
3+
import useUpdateEffect from '../../hooks/useUpdateEffect'
4+
5+
describe('useUpdateEffect', () => {
6+
it('should call the function after udpate', () => {
7+
const mockFn = jest.fn()
8+
let someVal = 'someVal'
9+
const { rerender } = renderHook(() => useUpdateEffect(mockFn, [someVal]))
10+
expect(mockFn).not.toHaveBeenCalled()
11+
someVal = 'newVal'
12+
rerender()
13+
expect(mockFn).toHaveBeenCalledTimes(1)
14+
})
15+
})

src/__tests__/patients/edit/EditPatient.test.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ describe('Edit Patient', () => {
3838
address: 'address',
3939
code: 'P00001',
4040
dateOfBirth: subDays(new Date(), 2).toISOString(),
41+
index: 'givenName familyName suffixP00001',
4142
} as Patient
4243

4344
let history: any

0 commit comments

Comments
 (0)