From 0828b6775439f6ef851170b0cbb6411f140fe7a0 Mon Sep 17 00:00:00 2001 From: jayasanka-sack <33048395+jayasanka-sack@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:33:37 -0700 Subject: [PATCH] Convert the response to a simple object --- .../module/emrapi/db/HibernateVisitDAO.java | 19 ++- .../emrapi/visit/VisitWithDiagnoses.java | 2 + .../module/emrapi/db/VisitDAOTest.java | 16 +- .../web/controller/VisitController.java | 23 ++- .../web/controller/VisitControllerTest.java | 139 +++++++++++------- 5 files changed, 129 insertions(+), 70 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/emrapi/db/HibernateVisitDAO.java b/api/src/main/java/org/openmrs/module/emrapi/db/HibernateVisitDAO.java index 150ecdf3..c343b6e3 100644 --- a/api/src/main/java/org/openmrs/module/emrapi/db/HibernateVisitDAO.java +++ b/api/src/main/java/org/openmrs/module/emrapi/db/HibernateVisitDAO.java @@ -1,5 +1,6 @@ package org.openmrs.module.emrapi.db; +import org.hibernate.Query; import org.hibernate.SessionFactory; import org.openmrs.Diagnosis; import org.openmrs.Patient; @@ -25,20 +26,22 @@ public class HibernateVisitDAO implements VisitDAO { public List getVisitsByPatientId(Patient patient, int startIndex, int limit) { String visitNoteEncounterTypeUuid = "d7151f82-c1f3-4152-a605-2f9ea7414a79"; - - + String hqlVisit="SELECT DISTINCT v FROM Visit v " + "JOIN FETCH v.encounters enc " + "JOIN enc.encounterType et " + "WHERE v.patient.id = :patientId " + "AND et.uuid = :encounterTypeUuid " + - "ORDER BY v.startDatetime DESC "+ - "LIMIT :startIndex, :limit"; + "ORDER BY v.startDatetime DESC"; + + Query visitQuery = sessionFactory.getCurrentSession().createQuery(hqlVisit); + + visitQuery.setParameter("patientId", patient.getId()); + visitQuery.setParameter("encounterTypeUuid", visitNoteEncounterTypeUuid); + visitQuery.setFirstResult(startIndex); + visitQuery.setMaxResults(limit); - List visits = sessionFactory.getCurrentSession() - .createQuery(hqlVisit) - .setParameter("patientId", patient.getId()) - .setParameter("encounterTypeUuid", visitNoteEncounterTypeUuid).list(); + List visits = visitQuery.list(); String hqlDiagnosis = "SELECT DISTINCT diag FROM Diagnosis diag " + "JOIN diag.encounter e " + diff --git a/api/src/main/java/org/openmrs/module/emrapi/visit/VisitWithDiagnoses.java b/api/src/main/java/org/openmrs/module/emrapi/visit/VisitWithDiagnoses.java index 03d68058..188fac7c 100644 --- a/api/src/main/java/org/openmrs/module/emrapi/visit/VisitWithDiagnoses.java +++ b/api/src/main/java/org/openmrs/module/emrapi/visit/VisitWithDiagnoses.java @@ -22,9 +22,11 @@ public VisitWithDiagnoses(Visit visit, Set diagnoses) { this.setStartDatetime(visit.getStartDatetime()); this.setStopDatetime(visit.getStopDatetime()); this.setEncounters(visit.getEncounters()); + this.uuid = visit.getUuid(); this.diagnoses = diagnoses; } + private String uuid; private Set diagnoses; diff --git a/api/src/test/java/org/openmrs/module/emrapi/db/VisitDAOTest.java b/api/src/test/java/org/openmrs/module/emrapi/db/VisitDAOTest.java index 382639e8..b4d917df 100644 --- a/api/src/test/java/org/openmrs/module/emrapi/db/VisitDAOTest.java +++ b/api/src/test/java/org/openmrs/module/emrapi/db/VisitDAOTest.java @@ -22,7 +22,6 @@ public class VisitDAOTest extends EmrApiContextSensitiveTest { @Before public void setup() { -// executeDataSet("baseMetaData.xml"); executeDataSet("pastVisitSetup.xml"); } @@ -33,7 +32,7 @@ public void shouldFetchVisitsByPatientId() { Patient patient = new Patient(); patient.setPatientId(109); - List visits = visitDAO.getVisitsByPatientId(patient); + List visits = visitDAO.getVisitsByPatientId(patient,0,10); assertNotNull(visits); assert visits.size() == 2; @@ -63,5 +62,18 @@ public void shouldFetchVisitsByPatientId() { assert encounter.getEncounterType().getUuid().equals(visitNoteEncounterTypeUuid); } } + + @Test + public void shouldFetchVisitsByPatientIdWithPagination() { + Patient patient = new Patient(); + patient.setPatientId(109); + + List visits = visitDAO.getVisitsByPatientId(patient,0,1); + assertNotNull(visits); + assert visits.size() == 1; + + VisitWithDiagnoses mostRecentVisit = visits.get(0); + assert mostRecentVisit.getId() == 1015; + } } diff --git a/omod/src/main/java/org/openmrs/module/emrapi/web/controller/VisitController.java b/omod/src/main/java/org/openmrs/module/emrapi/web/controller/VisitController.java index 09008342..c3f1a04c 100644 --- a/omod/src/main/java/org/openmrs/module/emrapi/web/controller/VisitController.java +++ b/omod/src/main/java/org/openmrs/module/emrapi/web/controller/VisitController.java @@ -1,8 +1,11 @@ package org.openmrs.module.emrapi.web.controller; import org.hibernate.ObjectNotFoundException; +import org.openmrs.Diagnosis; import org.openmrs.module.emrapi.visit.VisitWithDiagnoses; import org.openmrs.module.emrapi.visit.VisitWithDiagnosesService; +import org.openmrs.module.webservices.rest.SimpleObject; +import org.openmrs.module.webservices.rest.web.ConversionUtil; import org.openmrs.module.webservices.rest.web.RequestContext; import org.openmrs.module.webservices.rest.web.RestUtil; import org.openmrs.module.webservices.rest.web.representation.Representation; @@ -17,6 +20,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; import java.util.List; @Controller @@ -32,13 +36,20 @@ public ResponseEntity getVisitsByPatientId( @PathVariable String patientUuid) { RequestContext context = RestUtil.getRequestContext(request, response, Representation.DEFAULT); List visits; - try { - visits = visitWithDiagnosesService.getVisitsByPatientId(patientUuid, context.getStartIndex(), context.getLimit()); - } - catch (ObjectNotFoundException e) { - return ResponseEntity.badRequest().body(e.getMessage()); + visits = visitWithDiagnosesService.getVisitsByPatientId(patientUuid, context.getStartIndex(), context.getLimit()); + + List convertedVisits = new ArrayList<>(); + + for (VisitWithDiagnoses visit : visits) { + SimpleObject visitObject = (SimpleObject) ConversionUtil.convertToRepresentation(visit, context.getRepresentation()); + List convertedDiagnoses = new ArrayList<>(); + for (Diagnosis diagnosis : visit.getDiagnoses()) { + convertedDiagnoses.add((SimpleObject) ConversionUtil.convertToRepresentation(diagnosis, context.getRepresentation())); + } + visitObject.put("diagnoses", convertedDiagnoses); + convertedVisits.add(visitObject); } - return new ResponseEntity<>(new NeedsPaging<>(visits, context), HttpStatus.OK); + return new ResponseEntity<>(new NeedsPaging<>(convertedVisits, context), HttpStatus.OK); } } diff --git a/omod/src/test/java/org/openmrs/module/emrapi/web/controller/VisitControllerTest.java b/omod/src/test/java/org/openmrs/module/emrapi/web/controller/VisitControllerTest.java index eef6ab07..546a0917 100644 --- a/omod/src/test/java/org/openmrs/module/emrapi/web/controller/VisitControllerTest.java +++ b/omod/src/test/java/org/openmrs/module/emrapi/web/controller/VisitControllerTest.java @@ -1,88 +1,119 @@ package org.openmrs.module.emrapi.web.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Before; import org.junit.Test; -import org.openmrs.Diagnosis; -import org.openmrs.Encounter; -import org.openmrs.api.PatientService; -import org.openmrs.module.emrapi.visit.VisitWithDiagnoses; -import org.openmrs.module.emrapi.visit.VisitWithDiagnosesService; +import org.junit.runner.RunWith; import org.openmrs.web.test.BaseModuleWebContextSensitiveTest; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; import java.util.List; -import java.util.Set; +import java.util.Map; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration public class VisitControllerTest extends BaseModuleWebContextSensitiveTest { - - @Autowired - VisitController visitController; - - @Autowired - VisitWithDiagnosesService customVisitService; - + @Autowired - PatientService patientService; - - + private WebApplicationContext webApplicationContext; + + private MockMvc mockMvc; + @Before public void setUp() throws Exception { executeDataSet("baseMetaData.xml"); executeDataSet("pastVisitSetup.xml"); + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); + } @Test - public void shouldGetVisitsByPatientId() { + public void shouldGetVisitsByPatientId() throws Exception { String visitNoteEncounterTypeUuid = "d7151f82-c1f3-4152-a605-2f9ea7414a79"; String patientUuid = "8604d42e-3ca8-11e3-bf2b-0d0c09861e97"; - - ResponseEntity> visitsResponse = (ResponseEntity>) - visitController.getVisitsByPatientId(patientUuid); - assertNotNull(visitsResponse); - - List visits = visitsResponse.getBody(); - - assertNotNull(visits); + String firstVisitUuid = "1esd5218-6b78-11e0-93c3-18a905e044dc"; + String secondVisitUuid = "1c72e1ac-9b18-11e0-93c3-18a905e044dc"; + + // extract the response from the mockMvc + + MvcResult response = mockMvc.perform(get("/rest/v1/emrapi/patient/" + patientUuid + "/visit") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + + String jsonResponse = response.getResponse().getContentAsString(); + ObjectMapper objectMapper = new ObjectMapper(); + Map result = objectMapper.readValue(jsonResponse, Map.class); + + assertNotNull(result); + assert result.get("totalCount").equals(2); + + List> visits = (List>) result.get("pageOfResults"); assert visits.size() == 2; - - VisitWithDiagnoses firstVisit = visits.get(1); - Set firstVisitEncounters = firstVisit.getEncounters(); - Set firstVisitDiagnoses = firstVisit.getDiagnoses(); - - assert firstVisit.getId() == 1014; - assertEquals(firstVisit.getPatient().getUuid(), patientUuid); + + // extract the first visit and check its properties + Map firstVisit = visits.get(1); + List> firstVisitEncounters = (List>) firstVisit.get("encounters"); + List> firstVisitDiagnoses = (List>) firstVisit.get("diagnoses"); + + assert firstVisit.get("uuid").equals(firstVisitUuid); assert firstVisitEncounters.size() == 2; assert firstVisitDiagnoses.size() == 3; - - for (Encounter encounter : firstVisitEncounters) { - assert encounter.getEncounterType().getUuid().equals(visitNoteEncounterTypeUuid); + + for (Map encounter : firstVisitEncounters) { + assert ((String) encounter.get("display")).startsWith("Visit Note"); } - - VisitWithDiagnoses secondVisit = visits.get(0); - Set secondVisitEncounters = secondVisit.getEncounters(); - Set secondVisitDiagnoses = secondVisit.getDiagnoses(); - - assert secondVisit.getId() == 1015; - assertEquals(secondVisit.getPatient().getUuid(), patientUuid); + + // extract the second visit and check its properties + Map secondVisit = visits.get(0); + List> secondVisitEncounters = (List>) secondVisit.get("encounters"); + List> secondVisitDiagnoses = (List>) secondVisit.get("diagnoses"); + + assert secondVisit.get("uuid").equals(secondVisitUuid); assert secondVisitEncounters.size() == 1; assert secondVisitDiagnoses.size() == 2; - - for (Encounter encounter : secondVisitEncounters) { - assert encounter.getEncounterType().getUuid().equals(visitNoteEncounterTypeUuid); + + for (Map encounter : secondVisitEncounters) { + assert ((String) encounter.get("display")).startsWith("Visit Note"); } - } - + @Test - public void shouldThrowExceptionWhenPatientUuidIsInvalid() { - String invalidPatientUuid = "invalid-uuid"; - ResponseEntity visitsResponse = visitController.getVisitsByPatientId(invalidPatientUuid); - assertNotNull(visitsResponse); - assert visitsResponse.getStatusCode().is4xxClientError(); + public void shouldGetVisitsByPatientIdWithPagination() throws Exception { + + String patientUuid = "8604d42e-3ca8-11e3-bf2b-0d0c09861e97"; + String mostRecentVisitUuid = "1c72e1ac-9b18-11e0-93c3-18a905e044dc"; + + MvcResult response = mockMvc.perform(get("/rest/v1/emrapi/patient/" + patientUuid + "/visit") + .param("startIndex", "0") + .param("limit", "1") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + + String jsonResponse = response.getResponse().getContentAsString(); + ObjectMapper objectMapper = new ObjectMapper(); + Map result = objectMapper.readValue(jsonResponse, Map.class); + + assertNotNull(result); + assert result.get("totalCount").equals(1); + + List> visits = (List>) result.get("pageOfResults"); + assert visits.size() == 1; + + Map recentVisit = visits.get(0); + assert recentVisit.get("uuid").equals(mostRecentVisitUuid); } }