diff --git a/pom.xml b/pom.xml index ffd2470e1..2005cf8d8 100755 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ opensrp-server-web war - 2.9.0-SNAPSHOT + 2.9.1-SNAPSHOT opensrp-server-web OpenSRP Server Web Application https://github.com/OpenSRP/opensrp-server-web @@ -24,7 +24,7 @@ 3.8.0 always 1.5.1 - 2.13.0-SNAPSHOT + 2.13.1-SNAPSHOT 2.4.0-SNAPSHOT 2.0.1-SNAPSHOT 2.0.5 diff --git a/src/main/java/org/opensrp/web/Constants.java b/src/main/java/org/opensrp/web/Constants.java index 1add577b3..eebbc7e32 100644 --- a/src/main/java/org/opensrp/web/Constants.java +++ b/src/main/java/org/opensrp/web/Constants.java @@ -20,16 +20,21 @@ public interface Constants { String DEFAULT_EXCEPTION_HANDLER_MESSAGE = "The server encountered an error processing the request." ; public static final String RETURN_COUNT= "return_count"; + public static final String TOTAL_RECORDS = "total_records"; public static final String PAGE_NUMBER = "pageNumber"; public static final String PAGE_SIZE = "pageSize"; + public static final String SERVER_VERSION = "serverVersion"; + public static final String ORDER_BY_TYPE = "orderByType"; public static final String ORDER_BY_FIELD_NAME = "orderByFieldName"; + public static final String DATETIME_IN_UTC_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; + String LOCATIONS = "locations"; String NULL = "null"; diff --git a/src/main/java/org/opensrp/web/rest/OrganizationResource.java b/src/main/java/org/opensrp/web/rest/OrganizationResource.java index de1942989..886bfe2bb 100644 --- a/src/main/java/org/opensrp/web/rest/OrganizationResource.java +++ b/src/main/java/org/opensrp/web/rest/OrganizationResource.java @@ -44,11 +44,12 @@ import java.util.Set; import java.util.stream.Collectors; -import static org.opensrp.web.Constants.ORDER_BY_FIELD_NAME; -import static org.opensrp.web.Constants.ORDER_BY_TYPE; import static org.opensrp.web.Constants.PAGE_NUMBER; import static org.opensrp.web.Constants.PAGE_SIZE; +import static org.opensrp.web.Constants.ORDER_BY_TYPE; import static org.opensrp.web.Constants.TOTAL_RECORDS; +import static org.opensrp.web.Constants.ORDER_BY_FIELD_NAME; +import static org.opensrp.web.Constants.SERVER_VERSION; /** * @author Samuel Githengi created on 09/10/19 @@ -116,10 +117,17 @@ public List getAllOrganizations(@RequestParam(value = "location_id @RequestParam(value = PAGE_NUMBER, required = false) Integer pageNumber, @RequestParam(value = PAGE_SIZE, required = false) Integer pageSize, @RequestParam(value = ORDER_BY_TYPE, required = false) String orderByType, - @RequestParam(value = ORDER_BY_FIELD_NAME, required = false) String orderByFieldName + @RequestParam(value = ORDER_BY_FIELD_NAME, required = false) String orderByFieldName, + @RequestParam(value = SERVER_VERSION, required = false) String serverVersionParam ) { + + Long serverVersion = null; + if (serverVersionParam != null) { + serverVersion = Long.parseLong(serverVersionParam); + } + OrganizationSearchBean organizationSearchBean = createOrganizationSearchBeanForPagination(pageNumber, pageSize, - orderByType, orderByFieldName); + orderByType, orderByFieldName, serverVersion); if (StringUtils.isNotBlank(locationID)) { return organizationService.selectOrganizationsEncompassLocations(locationID); @@ -296,12 +304,14 @@ public ResponseEntity> getOrgPractitioners(@PathVariable("ide /** * This API queries list of team assignment from a practitioner identifer + * * @param practitionerIdentifier * @return List of Organization */ @GetMapping(value = "/by-practitioner/{practitioner-identifier}", produces = { MediaType.APPLICATION_JSON_VALUE }) - public List getTeamsByPractitionerIdentifier(@PathVariable("practitioner-identifier") String practitionerIdentifier) { - return organizationService.getOrganizationsByPractitionerIdentifier(practitionerIdentifier); + public List getTeamsByPractitionerIdentifier( + @PathVariable("practitioner-identifier") String practitionerIdentifier) { + return organizationService.getOrganizationsByPractitionerIdentifier(practitionerIdentifier); } @RequestMapping(value = "/assignedLocationsAndPlans", method = RequestMethod.GET, produces = { @@ -341,7 +351,7 @@ public ResponseEntity searchOrganization(OrganizationSearchBean organiza } private OrganizationSearchBean createOrganizationSearchBeanForPagination(Integer pageNumber, Integer pageSize, - String orderByType, String orderByFieldName) { + String orderByType, String orderByFieldName, Long serverVersion) { OrganizationSearchBean organizationSearchBean = new OrganizationSearchBean(); OrganizationSearchBean.OrderByType orderByTypeEnum = orderByType != null ? OrganizationSearchBean.OrderByType.valueOf(orderByType) : @@ -353,6 +363,7 @@ private OrganizationSearchBean createOrganizationSearchBeanForPagination(Integer organizationSearchBean.setPageSize(pageSize); organizationSearchBean.setOrderByFieldName(fieldName); organizationSearchBean.setOrderByType(orderByTypeEnum); + organizationSearchBean.setServerVersion(serverVersion); return organizationSearchBean; } diff --git a/src/main/java/org/opensrp/web/rest/PractitionerResource.java b/src/main/java/org/opensrp/web/rest/PractitionerResource.java index 7bc3c8d4f..ca2a00e1a 100644 --- a/src/main/java/org/opensrp/web/rest/PractitionerResource.java +++ b/src/main/java/org/opensrp/web/rest/PractitionerResource.java @@ -8,13 +8,11 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.joda.time.DateTime; -import org.joda.time.LocalDate; import org.opensrp.search.BaseSearchBean; import org.opensrp.search.PractitionerSearchBean; import org.opensrp.service.PractitionerService; -import org.opensrp.util.DateTypeConverter; import org.smartregister.domain.Practitioner; -import org.smartregister.utils.TaskDateTimeTypeConverter; +import org.smartregister.utils.DateTimeTypeConverter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -26,181 +24,194 @@ import java.lang.reflect.Type; import java.util.HashSet; -import java.util.List; import java.util.Set; -import static org.opensrp.web.Constants.ORDER_BY_FIELD_NAME; -import static org.opensrp.web.Constants.ORDER_BY_TYPE; +import static org.opensrp.web.Constants.DATETIME_IN_UTC_FORMAT_STRING; import static org.opensrp.web.Constants.PAGE_NUMBER; import static org.opensrp.web.Constants.PAGE_SIZE; +import static org.opensrp.web.Constants.ORDER_BY_TYPE; +import static org.opensrp.web.Constants.ORDER_BY_FIELD_NAME; +import static org.opensrp.web.Constants.SERVER_VERSION; @Controller @RequestMapping(value = "/rest/practitioner") public class PractitionerResource { - private static Logger logger = LogManager.getLogger(PractitionerResource.class.toString()); - - public static Gson gson = new GsonBuilder().registerTypeAdapter(DateTime.class, new TaskDateTimeTypeConverter()) - .registerTypeAdapter(LocalDate.class, new DateTypeConverter()).create(); - - private PractitionerService practitionerService; - - public static final String IDENTIFIER = "identifier"; - - public static final String USER_ID = "userId"; - - public static final String GET_PRACTITIONER_BY_USER_URL = "/user/{userId}"; - - @Autowired - public void setPractitionerService(PractitionerService practitionerService) { - this.practitionerService = practitionerService; - } - - @RequestMapping(value = "/{identifier}", method = RequestMethod.GET, produces = { - MediaType.APPLICATION_JSON_VALUE }) - public ResponseEntity getPractitionerByUniqueId(@PathVariable(IDENTIFIER) String identifier) { - if (StringUtils.isBlank(identifier)) { - return new ResponseEntity<>(gson.toJson("Practitioner Id is required"), RestUtils.getJSONUTF8Headers(), - HttpStatus.BAD_REQUEST); - } - return new ResponseEntity<>(gson.toJson( - practitionerService.getPractitioner(identifier)), - RestUtils.getJSONUTF8Headers(), HttpStatus.OK); - } - - @RequestMapping(method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE }) - public ResponseEntity getPractitioners(@RequestParam(value = PAGE_NUMBER, required = false) Integer pageNumber, - @RequestParam(value = PAGE_SIZE, required = false) Integer pageSize, - @RequestParam(value = ORDER_BY_TYPE, required = false) String orderByType, - @RequestParam(value = ORDER_BY_FIELD_NAME, required = false) String orderByFieldName) { - - PractitionerSearchBean practitionerSearchBean = createPractitionerSearchBean(pageNumber, pageSize, orderByType, - orderByFieldName); - return new ResponseEntity<>(gson.toJson( - practitionerService.getAllPractitioners(practitionerSearchBean)), - RestUtils.getJSONUTF8Headers(), HttpStatus.OK); - } - - /** - * Gets a practitioner using the user id - * - * @param userId {@link String}, User id from Keycloak - * @return practitioner {@link Practitioner} - */ - @RequestMapping(value = GET_PRACTITIONER_BY_USER_URL, method = RequestMethod.GET, produces = { - MediaType.APPLICATION_JSON_VALUE }) - public ResponseEntity getPractitionerByUser(@PathVariable(value = USER_ID) String userId) { - if (StringUtils.isNotBlank(userId)) { - return new ResponseEntity<>(gson.toJson(practitionerService.getPractitionerByUserId(userId)), - RestUtils.getJSONUTF8Headers(), HttpStatus.OK); - } else { - return new ResponseEntity<>(gson.toJson("The User Id is required"), - RestUtils.getJSONUTF8Headers(), HttpStatus.BAD_REQUEST); - } - } - - @RequestMapping(method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE, - MediaType.TEXT_PLAIN_VALUE }) - public ResponseEntity create(@RequestBody String entity) { - return savePractitioner(entity); - } - - private ResponseEntity savePractitioner(@RequestBody String payload) { - try { - Practitioner practitioner = gson.fromJson(payload, Practitioner.class); - practitionerService.addOrUpdatePractitioner(practitioner); - return new ResponseEntity<>(HttpStatus.CREATED); - } - catch (JsonSyntaxException e) { - logger.error("The request doesn't contain a valid practitioner representation", e); - return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - } - catch (IllegalArgumentException e) { - logger.error(e.getMessage(), e); - return new ResponseEntity(e.getMessage(), HttpStatus.BAD_REQUEST); - } - } - - @RequestMapping(method = RequestMethod.PUT, consumes = { MediaType.APPLICATION_JSON_VALUE, - MediaType.TEXT_PLAIN_VALUE }) - public ResponseEntity update(@RequestBody String entity) { - return savePractitioner(entity); - } - - @RequestMapping(value = "/delete/{identifier}", method = RequestMethod.DELETE, produces = { - MediaType.APPLICATION_JSON_VALUE }) - public ResponseEntity delete(@PathVariable("identifier") String identifier) { - try { - practitionerService.deletePractitioner(identifier); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - catch (IllegalArgumentException e) { - logger.error(e.getMessage(), e); - return new ResponseEntity(e.getMessage(), HttpStatus.BAD_REQUEST); - } - } - - @GetMapping(value = "/report-to", produces = { MediaType.APPLICATION_JSON_VALUE }) - public List getPractitionersByPractitionerRoleIdentifierAndCode( - @RequestParam(value = "practitionerIdentifier") String practitionerIdentifier, - @RequestParam(value = "code") String code) { - - return practitionerService.getAssignedPractitionersByIdentifierAndCode(practitionerIdentifier, code); - } - - private PractitionerSearchBean createPractitionerSearchBean(Integer pageNumber, Integer pageSize, String orderByType, - String orderByFieldName) { - - BaseSearchBean.OrderByType orderByTypeEnum; - BaseSearchBean.FieldName fieldName; - orderByTypeEnum = - orderByType != null ? BaseSearchBean.OrderByType.valueOf(orderByType) : BaseSearchBean.OrderByType.DESC; - fieldName = - orderByFieldName != null ? BaseSearchBean.FieldName.valueOf(orderByFieldName) : BaseSearchBean.FieldName.id; - - return PractitionerSearchBean.builder() - .pageNumber(pageNumber) - .pageSize(pageSize) - .orderByType(orderByTypeEnum) - .orderByFieldName(fieldName) - .build(); - - } - - @RequestMapping(value = "/add", method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE, - MediaType.TEXT_PLAIN_VALUE }) - public ResponseEntity saveMultiplePractitioners(@RequestBody String payload) { - try { - Set unprocessedIds = new HashSet<>(); - Type listType = new TypeToken>() {}.getType(); - List practitioners = gson.fromJson(payload, listType); - - for (Practitioner practitioner: practitioners){ - try { - practitionerService.addOrUpdatePractitioner(practitioner); - } catch (Exception exception){ - logger.error(exception.getMessage(), exception); - unprocessedIds.add(practitioner.getIdentifier()); - } - } - - if (unprocessedIds.isEmpty()) - return new ResponseEntity<>("All Practitioners processed", HttpStatus.CREATED); - else - return new ResponseEntity<>("Practitioners Ids not processed: " + String.join(",", unprocessedIds), - HttpStatus.CREATED); - - } catch (JsonSyntaxException e) { - logger.error("The request doesnt contain a valid practitioner representation",e); - return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - } - } - - @GetMapping(value = "/count") + private static Logger logger = LogManager.getLogger(PractitionerResource.class.toString()); + + public static Gson gson = new GsonBuilder().setDateFormat(DATETIME_IN_UTC_FORMAT_STRING) + .registerTypeAdapter(DateTime.class, new DateTimeTypeConverter()).create(); + + private PractitionerService practitionerService; + + public static final String IDENTIFIER = "identifier"; + + public static final String USER_ID = "userId"; + + public static final String GET_PRACTITIONER_BY_USER_URL = "/user/{userId}"; + + @Autowired + public void setPractitionerService(PractitionerService practitionerService) { + this.practitionerService = practitionerService; + } + + @RequestMapping(value = "/{identifier}", method = RequestMethod.GET, produces = { + MediaType.APPLICATION_JSON_VALUE }) + public ResponseEntity getPractitionerByUniqueId(@PathVariable(IDENTIFIER) String identifier) { + if (StringUtils.isBlank(identifier)) { + return new ResponseEntity<>(gson.toJson("Practitioner Id is required"), RestUtils.getJSONUTF8Headers(), + HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(gson.toJson( + practitionerService.getPractitioner(identifier)), + RestUtils.getJSONUTF8Headers(), HttpStatus.OK); + } + + @RequestMapping(method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE }) + public ResponseEntity getPractitioners(@RequestParam(value = PAGE_NUMBER, required = false) Integer pageNumber, + @RequestParam(value = PAGE_SIZE, required = false) Integer pageSize, + @RequestParam(value = ORDER_BY_TYPE, required = false) String orderByType, + @RequestParam(value = ORDER_BY_FIELD_NAME, required = false) String orderByFieldName, + @RequestParam(value = SERVER_VERSION, required = false) String serverVersionParam) { + + Long serverVersion = null; + if (serverVersionParam != null) { + serverVersion = Long.parseLong(serverVersionParam); + } + + PractitionerSearchBean practitionerSearchBean = createPractitionerSearchBean(pageNumber, pageSize, orderByType, + orderByFieldName, serverVersion); + return new ResponseEntity<>(gson.toJson( + practitionerService.getAllPractitioners(practitionerSearchBean)), + RestUtils.getJSONUTF8Headers(), HttpStatus.OK); + } + + /** + * Gets a practitioner using the user id + * + * @param userId {@link String}, User id from Keycloak + * @return practitioner {@link Practitioner} + */ + @RequestMapping(value = GET_PRACTITIONER_BY_USER_URL, method = RequestMethod.GET, produces = { + MediaType.APPLICATION_JSON_VALUE }) + public ResponseEntity getPractitionerByUser(@PathVariable(value = USER_ID) String userId) { + if (StringUtils.isNotBlank(userId)) { + return new ResponseEntity<>(gson.toJson(practitionerService.getPractitionerByUserId(userId)), + RestUtils.getJSONUTF8Headers(), HttpStatus.OK); + } else { + return new ResponseEntity<>(gson.toJson("The User Id is required"), + RestUtils.getJSONUTF8Headers(), HttpStatus.BAD_REQUEST); + } + } + + @RequestMapping(method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE, + MediaType.TEXT_PLAIN_VALUE }) + public ResponseEntity create(@RequestBody String entity) { + return savePractitioner(entity); + } + + private ResponseEntity savePractitioner(@RequestBody String payload) { + try { + Practitioner practitioner = gson.fromJson(payload, Practitioner.class); + practitionerService.addOrUpdatePractitioner(practitioner); + return new ResponseEntity<>(HttpStatus.CREATED); + } + catch (JsonSyntaxException e) { + logger.error("The request doesn't contain a valid practitioner representation", e); + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + catch (IllegalArgumentException e) { + logger.error(e.getMessage(), e); + return new ResponseEntity(e.getMessage(), HttpStatus.BAD_REQUEST); + } + } + + @RequestMapping(method = RequestMethod.PUT, consumes = { MediaType.APPLICATION_JSON_VALUE, + MediaType.TEXT_PLAIN_VALUE }) + public ResponseEntity update(@RequestBody String entity) { + return savePractitioner(entity); + } + + @RequestMapping(value = "/delete/{identifier}", method = RequestMethod.DELETE, produces = { + MediaType.APPLICATION_JSON_VALUE }) + public ResponseEntity delete(@PathVariable("identifier") String identifier) { + try { + practitionerService.deletePractitioner(identifier); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + catch (IllegalArgumentException e) { + logger.error(e.getMessage(), e); + return new ResponseEntity(e.getMessage(), HttpStatus.BAD_REQUEST); + } + } + + @GetMapping(value = "/report-to", produces = { MediaType.APPLICATION_JSON_VALUE }) + public List getPractitionersByPractitionerRoleIdentifierAndCode( + @RequestParam(value = "practitionerIdentifier") String practitionerIdentifier, + @RequestParam(value = "code") String code) { + + return practitionerService.getAssignedPractitionersByIdentifierAndCode(practitionerIdentifier, code); + } + + private PractitionerSearchBean createPractitionerSearchBean(Integer pageNumber, Integer pageSize, String orderByType, + String orderByFieldName, Long serverVersion) { + + BaseSearchBean.OrderByType orderByTypeEnum; + BaseSearchBean.FieldName fieldName; + orderByTypeEnum = + orderByType != null ? BaseSearchBean.OrderByType.valueOf(orderByType) : BaseSearchBean.OrderByType.DESC; + fieldName = + orderByFieldName != null ? BaseSearchBean.FieldName.valueOf(orderByFieldName) : BaseSearchBean.FieldName.id; + + return PractitionerSearchBean.builder() + .pageNumber(pageNumber) + .pageSize(pageSize) + .orderByType(orderByTypeEnum) + .orderByFieldName(fieldName) + .serverVersion(serverVersion) + .build(); + + } + + @RequestMapping(value = "/add", method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE, + MediaType.TEXT_PLAIN_VALUE }) + public ResponseEntity saveMultiplePractitioners(@RequestBody String payload) { + try { + Set unprocessedIds = new HashSet<>(); + Type listType = new TypeToken>() { + + }.getType(); + List practitioners = gson.fromJson(payload, listType); + + for (Practitioner practitioner : practitioners) { + try { + practitionerService.addOrUpdatePractitioner(practitioner); + } + catch (Exception exception) { + logger.error(exception.getMessage(), exception); + unprocessedIds.add(practitioner.getIdentifier()); + } + } + + if (unprocessedIds.isEmpty()) + return new ResponseEntity<>("All Practitioners processed", HttpStatus.CREATED); + else + return new ResponseEntity<>("Practitioners Ids not processed: " + String.join(",", unprocessedIds), + HttpStatus.CREATED); + + } + catch (JsonSyntaxException e) { + logger.error("The request doesnt contain a valid practitioner representation", e); + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + } + + @GetMapping(value = "/count") public ResponseEntity getAllPractitionersCount() { try { return new ResponseEntity<>(practitionerService.countAllPractitioners(), HttpStatus.OK); - } catch (Exception exception) { + } + catch (Exception exception) { logger.error("Error getting practitioners count", exception); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } diff --git a/src/test/java/org/opensrp/web/rest/OrganizationResourceTest.java b/src/test/java/org/opensrp/web/rest/OrganizationResourceTest.java index 92b301d6c..87c33e398 100644 --- a/src/test/java/org/opensrp/web/rest/OrganizationResourceTest.java +++ b/src/test/java/org/opensrp/web/rest/OrganizationResourceTest.java @@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.joda.JodaModule; import org.apache.commons.lang3.tuple.ImmutablePair; import org.joda.time.DateTime; import org.junit.Before; @@ -93,49 +95,49 @@ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(loader = TestWebContextLoader.class, locations = { "classpath:test-webmvc-config.xml", }) public class OrganizationResourceTest { - + @Rule public MockitoRule rule = MockitoJUnit.rule(); - + @Autowired protected WebApplicationContext webApplicationContext; - + private MockMvc mockMvc; - + @Mock private OrganizationService organizationService; - + @Mock private PractitionerService practitionerService; - + @Mock private PhysicalLocationService locationService; - + @Mock private PlanService planService; - + @Mock private KeycloakPrincipal keycloakPrincipal; - + @Mock private RefreshableKeycloakSecurityContext securityContext; - + @Mock private AccessToken token; - + @Captor private ArgumentCaptor organizationArgumentCaptor; - + private OrganizationResource organizationResource; - + private String BASE_URL = "/rest/organization/"; - - private String organizationJSON = "{\"identifier\":\"801874c0-d963-11e9-8a34-2a2ae2dbcce4\",\"active\":true,\"name\":\"B Team\",\"partOf\":1123,\"type\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/organization-type\",\"code\":\"team\",\"display\":\"Team\"}]}}"; - + + private String organizationJSON = "{\"identifier\":\"801874c0-d963-11e9-8a34-2a2ae2dbcce4\",\"active\":true,\"name\":\"B Team\",\"partOf\":1123,\"type\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/organization-type\",\"code\":\"team\",\"display\":\"Team\"}]},\"dateCreated\":\"2021-12-20T13:16:02.457Z\",\"dateEdited\":\"2021-12-20T13:16:02.457Z\",\"serverVersion\":1}"; + private ObjectMapper objectMapper; - + private String MESSAGE = "The server encountered an error processing the request."; - + @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -147,8 +149,10 @@ public void setUp() { organizationResource.setLocationService(locationService); organizationResource.setPlanService(planService); objectMapper = new ObjectMapper(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.registerModule(new JodaModule()); } - + @Test public void testGetAllOrganizations() throws Exception { List expected = Collections.singletonList(getOrganization()); @@ -157,9 +161,9 @@ public void testGetAllOrganizations() throws Exception { verify(organizationService).getAllOrganizations(any(OrganizationSearchBean.class)); verifyNoMoreInteractions(organizationService); assertEquals("[" + organizationJSON + "]", result.getResponse().getContentAsString()); - + } - + @Test public void testGetAllOrganizationsUnderLocation() throws Exception { List expected = Collections.singletonList(getOrganization()); @@ -167,9 +171,9 @@ public void testGetAllOrganizationsUnderLocation() throws Exception { mockMvc.perform(get(BASE_URL).param("location_id", "12345")).andExpect(status().isOk()).andReturn(); verify(organizationService).selectOrganizationsEncompassLocations("12345"); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testGetOrganizationByIdentifier() throws Exception { Organization expected = getOrganization(); @@ -179,21 +183,21 @@ public void testGetOrganizationByIdentifier() throws Exception { verify(organizationService).getOrganization(expected.getIdentifier()); verifyNoMoreInteractions(organizationService); assertEquals(organizationJSON, result.getResponse().getContentAsString()); - + } - + @Test public void testCreateOrganization() throws Exception { - + mockMvc.perform(post(BASE_URL).contentType(MediaType.APPLICATION_JSON).content(organizationJSON.getBytes())) .andExpect(status().isCreated()); verify(organizationService).addOrganization(organizationArgumentCaptor.capture()); assertEquals(organizationJSON, objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL) .writeValueAsString(organizationArgumentCaptor.getValue())); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testCreateOrganizationWithoutIdentifier() throws Exception { doThrow(IllegalArgumentException.class).when(organizationService).addOrganization(any(Organization.class)); @@ -201,9 +205,9 @@ public void testCreateOrganizationWithoutIdentifier() throws Exception { .andExpect(status().isBadRequest()); verify(organizationService).addOrganization(organizationArgumentCaptor.capture()); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testCreateOrganizationWithError() throws Exception { doThrow(RuntimeException.class).when(organizationService).addOrganization(any(Organization.class)); @@ -211,12 +215,12 @@ public void testCreateOrganizationWithError() throws Exception { .andExpect(status().isInternalServerError()); verify(organizationService).addOrganization(organizationArgumentCaptor.capture()); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testUpdateOrganization() throws Exception { - + mockMvc.perform(put(BASE_URL + "/{identifier}", getOrganization().getIdentifier()) .contentType(MediaType.APPLICATION_JSON).content(organizationJSON.getBytes())) .andExpect(status().isCreated()); @@ -224,9 +228,9 @@ public void testUpdateOrganization() throws Exception { assertEquals(organizationJSON, objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL) .writeValueAsString(organizationArgumentCaptor.getValue())); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testUpdateOrganizationWithoutIdentifier() throws Exception { doThrow(new IllegalArgumentException()).when(organizationService).updateOrganization(any(Organization.class)); @@ -235,9 +239,9 @@ public void testUpdateOrganizationWithoutIdentifier() throws Exception { .andExpect(status().isBadRequest()); verify(organizationService).updateOrganization(organizationArgumentCaptor.capture()); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testUpdateOrganizationWithError() throws Exception { doThrow(new RuntimeException()).when(organizationService).updateOrganization(any(Organization.class)); @@ -246,9 +250,9 @@ public void testUpdateOrganizationWithError() throws Exception { .andExpect(status().isInternalServerError()); verify(organizationService).updateOrganization(organizationArgumentCaptor.capture()); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testAssignLocationAndPlan() throws Exception { mockMvc.perform(post(BASE_URL + "/assignLocationsAndPlans").contentType(MediaType.APPLICATION_JSON) @@ -257,9 +261,9 @@ public void testAssignLocationAndPlan() throws Exception { verify(organizationService).assignLocationAndPlan(bean.getOrganization(), bean.getJurisdiction(), bean.getPlan(), bean.getFromDate(), bean.getToDate()); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testAssignLocationAndPlanWithMissingParams() throws Exception { doThrow(new IllegalArgumentException()).when(organizationService).assignLocationAndPlan(null, null, null, null, @@ -271,9 +275,9 @@ public void testAssignLocationAndPlanWithMissingParams() throws Exception { verify(organizationService).assignLocationAndPlan(bean.getOrganization(), bean.getJurisdiction(), bean.getPlan(), bean.getFromDate(), bean.getToDate()); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testAssignLocationAndPlanWithInternalError() throws Exception { doThrow(new RuntimeException()).when(organizationService).assignLocationAndPlan(null, null, null, null, null); @@ -284,48 +288,49 @@ public void testAssignLocationAndPlanWithInternalError() throws Exception { verify(organizationService).assignLocationAndPlan(bean.getOrganization(), bean.getJurisdiction(), bean.getPlan(), bean.getFromDate(), bean.getToDate()); verifyNoMoreInteractions(organizationService); - + } - + @Test public void testGetAssignedLocationAndPlan() throws Exception { + objectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); String identifier = UUID.randomUUID().toString(); List expected = getOrganizationLocationsAssigned(true); when(organizationService.findAssignedLocationsAndPlans(identifier, true, null, null, null, null)) .thenReturn(expected); MvcResult result = mockMvc.perform(get(BASE_URL + "/assignedLocationsAndPlans/{identifier}", identifier)) .andExpect(status().isOk()).andReturn(); - + verify(organizationService).findAssignedLocationsAndPlans(identifier, true, null, null, null, null); verifyNoMoreInteractions(organizationService); assertEquals(objectMapper.writeValueAsString(expected), result.getResponse().getContentAsString()); - + } - + @Test public void testGetAssignedLocationAndPlanWithMissingParams() throws Exception { String identifier = UUID.randomUUID().toString(); doThrow(new IllegalArgumentException()).when(organizationService).findAssignedLocationsAndPlans(identifier, true, null, null, null, null); - + MvcResult result = mockMvc.perform(get(BASE_URL + "/assignedLocationsAndPlans/{identifier}", identifier)) .andExpect(status().isBadRequest()).andReturn(); - + verify(organizationService).findAssignedLocationsAndPlans(identifier, true, null, null, null, null); verifyNoMoreInteractions(organizationService); assertEquals("", result.getResponse().getContentAsString()); - + } - + @Test public void testGetAssignedLocationAndPlanWithInternalError() throws Exception { String identifier = UUID.randomUUID().toString(); doThrow(new RuntimeException()).when(organizationService).findAssignedLocationsAndPlans(identifier, true, null, null, null, null); - + MvcResult result = mockMvc.perform(get(BASE_URL + "/assignedLocationsAndPlans/{identifier}", identifier)) .andExpect(status().isInternalServerError()).andReturn(); - + verify(organizationService).findAssignedLocationsAndPlans(identifier, true, null, null, null, null); verifyNoMoreInteractions(organizationService); String responseString = result.getResponse().getContentAsString(); @@ -334,24 +339,25 @@ public void testGetAssignedLocationAndPlanWithInternalError() throws Exception { } JsonNode actualObj = objectMapper.readTree(responseString); assertEquals(actualObj.get("message").asText(), MESSAGE); - + } - + @Test public void testGetAssignedLocationsAndPlansByPlanId() throws Exception { + objectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); String identifier = UUID.randomUUID().toString(); List expected = getOrganizationLocationsAssigned(true); when(organizationService.findAssignedLocationsAndPlansByPlanIdentifier(identifier, null, null, null, null)) .thenReturn(expected); MvcResult result = mockMvc.perform(get(BASE_URL + "/assignedLocationsAndPlans?plan=" + identifier)) .andExpect(status().isOk()).andReturn(); - + verify(organizationService).findAssignedLocationsAndPlansByPlanIdentifier(identifier, null, null, null, null); verifyNoMoreInteractions(organizationService); assertEquals(objectMapper.writeValueAsString(expected), result.getResponse().getContentAsString()); - + } - + @Test public void testGetOrgPractitioners() throws Exception { String identifier = UUID.randomUUID().toString(); @@ -360,7 +366,7 @@ public void testGetOrgPractitioners() throws Exception { when(practitionerService.getPractitionersByOrgIdentifier(any(String.class))).thenReturn(expected); MvcResult result = mockMvc.perform(get(BASE_URL + "/practitioner/{identifier}", identifier)) .andExpect(status().isOk()).andReturn(); - + String responseString = result.getResponse().getContentAsString(); if (responseString.isEmpty()) { fail("Test case failed"); @@ -370,15 +376,15 @@ public void testGetOrgPractitioners() throws Exception { assertEquals(actualObj.get(0).get("active").asBoolean(), expected.get(0).getActive()); assertEquals(actualObj.size(), expected.size()); } - + @Test public void testGetOrgPractitionersWithInternalError() throws Exception { String identifier = UUID.randomUUID().toString(); doThrow(new RuntimeException()).when(practitionerService).getPractitionersByOrgIdentifier(any(String.class)); - + MvcResult result = mockMvc.perform(get(BASE_URL + "/practitioner/{identifier}", identifier)) .andExpect(status().isInternalServerError()).andReturn(); - + verify(practitionerService).getPractitionersByOrgIdentifier(identifier); verifyNoMoreInteractions(practitionerService); String responseString = result.getResponse().getContentAsString(); @@ -388,7 +394,7 @@ public void testGetOrgPractitionersWithInternalError() throws Exception { JsonNode actualObj = objectMapper.readTree(responseString); assertEquals(actualObj.get("message").asText(), MESSAGE); } - + @Test public void testgetUserAssignedLocationsAndPlansWithoutPlansShouldReturnUserAssignment() throws Exception { Pair authenticatedUser = TestData.getAuthentication(token, keycloakPrincipal, securityContext); @@ -404,7 +410,7 @@ public void testgetUserAssignedLocationsAndPlansWithoutPlansShouldReturnUserAssi location2.setProperties(new LocationProperty()); location2.getProperties().setName("OA1"); location2.getProperties().setParentId(location.getId()); - + PhysicalLocation location3 = new PhysicalLocation(); location3.setId(UUID.randomUUID().toString()); location3.setProperties(new LocationProperty()); @@ -412,16 +418,16 @@ public void testgetUserAssignedLocationsAndPlansWithoutPlansShouldReturnUserAssi location3.getProperties().setParentId(location.getId()); when(locationService.findLocationByIdsWithChildren(eq(false), any(), eq(Integer.MAX_VALUE))) .thenReturn(Arrays.asList(location, location2, location3)); - + Authentication authentication = authenticatedUser.getSecond(); MvcResult result = mockMvc .perform(get(BASE_URL + "/user-assignment") .with(SecurityMockMvcRequestPostProcessors.authentication(authentication))) .andExpect(status().isOk()).andReturn(); - + UserAssignmentBean userAssignment = objectMapper.readValue(result.getResponse().getContentAsString(), UserAssignmentBean.class); - + assertEquals(new HashSet<>(ids), userAssignment.getOrganizationIds()); assertEquals(2, userAssignment.getJurisdictions().size()); assertEquals(0, userAssignment.getPlans().size()); @@ -432,23 +438,23 @@ public void testgetUserAssignedLocationsAndPlansWithoutPlansShouldReturnUserAssi assertFalse(userAssignment.getPlans().contains(assignment.getPlanId())); } verifyNoInteractions(planService); - + } - + @Test public void testGetUserAssignedLocationsAndPlansWithPlansShouldReturnActivePlansOnly() throws Exception { Pair authenticatedUser = TestData.getAuthentication(token, keycloakPrincipal, securityContext); List ids = Arrays.asList(123l, 124l); - + when(practitionerService.getOrganizationsByUserId(authenticatedUser.getFirst().getBaseEntityId())) .thenReturn(new ImmutablePair<>(getPractioner(), ids)); List assignments = getOrganizationLocationsAssigned(true); when(organizationService.findAssignedLocationsAndPlans(ids)).thenReturn(assignments); - + List planIds = assignments.stream().map(a -> a.getPlanId()).collect(Collectors.toList()); List plans = getPlans(assignments); when(planService.getPlansByIdsReturnOptionalFields(any(), any(), eq(false))).thenReturn(plans); - + PhysicalLocation location = LocationResourceTest.createStructure(); location.getProperties().setName("Vilage123"); PhysicalLocation location2 = new PhysicalLocation(); @@ -456,7 +462,7 @@ public void testGetUserAssignedLocationsAndPlansWithPlansShouldReturnActivePlans location2.setProperties(new LocationProperty()); location2.getProperties().setName("OA1"); location2.getProperties().setParentId(location.getId()); - + PhysicalLocation location3 = new PhysicalLocation(); location3.setId(UUID.randomUUID().toString()); location3.setProperties(new LocationProperty()); @@ -464,16 +470,16 @@ public void testGetUserAssignedLocationsAndPlansWithPlansShouldReturnActivePlans location3.getProperties().setParentId(location.getId()); when(locationService.findLocationByIdsWithChildren(eq(false), any(), eq(Integer.MAX_VALUE))) .thenReturn(Arrays.asList(location, location2, location3)); - + Authentication authentication = authenticatedUser.getSecond(); MvcResult result = mockMvc .perform(get(BASE_URL + "/user-assignment") .with(SecurityMockMvcRequestPostProcessors.authentication(authentication))) .andExpect(status().isOk()).andReturn(); - + UserAssignmentBean userAssignment = objectMapper.readValue(result.getResponse().getContentAsString(), UserAssignmentBean.class); - + assertEquals(new HashSet<>(ids), userAssignment.getOrganizationIds()); assertEquals(2, userAssignment.getJurisdictions().size()); @@ -488,17 +494,17 @@ public void testGetUserAssignedLocationsAndPlansWithPlansShouldReturnActivePlans assertTrue(userAssignment.getPlans().containsAll(activePlans)); Set inActivePlans = new HashSet<>(planIds); inActivePlans.removeAll(activePlans); - + verify(planService).getPlansByIdsReturnOptionalFields(ArgumentMatchers.argThat(arg -> arg.containsAll(planIds)), eq(Arrays.asList(UserController.JURISDICTION, UserController.STATUS, UserController.EFFECTIVE_PERIOD)), eq(false)); - + } - + private Organization getOrganization() throws Exception { return objectMapper.readValue(organizationJSON, Organization.class); } - + private OrganizationAssigmentBean[] getOrganizationAssignment() { List organizationAssigmentBeans = new ArrayList<>(); Random random = new Random(); @@ -511,14 +517,14 @@ private OrganizationAssigmentBean[] getOrganizationAssignment() { bean.setFromDate(new Date()); if (random.nextBoolean()) bean.setToDate(new Date()); - + } return organizationAssigmentBeans.toArray(new OrganizationAssigmentBean[] {}); - + } - + private List getOrganizationLocationsAssigned(boolean includePlans) { - List organizationAssigmentBeans = new ArrayList<>(); + List organizationAssignmentBeans = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 5; i++) { AssignedLocations bean = new AssignedLocations(); @@ -531,21 +537,21 @@ private List getOrganizationLocationsAssigned(boolean include bean.setFromDate(new Date()); if (random.nextBoolean()) bean.setToDate(new Date()); - organizationAssigmentBeans.add(bean); - + organizationAssignmentBeans.add(bean); + } - return organizationAssigmentBeans; - + return organizationAssignmentBeans; + } - + private Practitioner getPractioner() { Practitioner practitioner = new Practitioner(); practitioner.setIdentifier("ID-123"); practitioner.setActive(Boolean.TRUE); return practitioner; - + } - + private List getPlans(List assignedLocations) { Random random = new Random(); return assignedLocations.stream().map(al -> { @@ -556,9 +562,9 @@ private List getPlans(List assignedLocations) plan.setStatus(random.nextBoolean() ? PlanStatus.ACTIVE : PlanStatus.COMPLETED); return plan; }).collect(Collectors.toList()); - + } - + @Test public void testGetSearchOrganizationWithParams() throws Exception { List expected = new ArrayList<>(); @@ -569,26 +575,26 @@ public void testGetSearchOrganizationWithParams() throws Exception { .perform(get(BASE_URL + "search/").param("name", "C Team").param("orderByFieldName", "id") .param("pageNumber", "1").param("pageSize", "10").param("orderByType", "ASC")) .andExpect(status().isOk()).andReturn(); - + verify(organizationService).getSearchOrganizations((OrganizationSearchBean) any()); verify(organizationService).findOrganizationCount((OrganizationSearchBean) any()); verifyNoMoreInteractions(organizationService); assertEquals(objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).writeValueAsString(expected), result.getResponse().getContentAsString()); } - + private Organization createSearchOrganization() throws JsonMappingException, JsonProcessingException { String searchResponseJson = "{\"id\":3,\"identifier\":\"801874c0-d963-11e9-8a34-2a2ae2dbcce5\",\"active\":false,\"name\":\"C Team\",\"partOf\":2,\"memberCount\":2}"; - + Organization searchOrganization = objectMapper.readValue(searchResponseJson, Organization.class); - + return searchOrganization; } @Test public void testCreateOrganizationInBatch() throws Exception { - String organizations = "["+ organizationJSON+"]"; + String organizations = "[" + organizationJSON + "]"; mockMvc.perform(post(BASE_URL + "/add").contentType(MediaType.APPLICATION_JSON).content(organizations)) .andExpect(status().isCreated()); verify(organizationService).addOrUpdateOrganization(organizationArgumentCaptor.capture()); diff --git a/src/test/java/org/opensrp/web/rest/PractitionerResourceTest.java b/src/test/java/org/opensrp/web/rest/PractitionerResourceTest.java index b73279ed2..39ac78b27 100755 --- a/src/test/java/org/opensrp/web/rest/PractitionerResourceTest.java +++ b/src/test/java/org/opensrp/web/rest/PractitionerResourceTest.java @@ -1,14 +1,17 @@ package org.opensrp.web.rest; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; +import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.opensrp.search.PractitionerSearchBean; import org.opensrp.service.PractitionerService; import org.smartregister.domain.Practitioner; +import org.smartregister.utils.DateTimeTypeConverter; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.web.server.MvcResult; @@ -46,6 +49,9 @@ public class PractitionerResourceTest extends BaseResourceTest { private final String practitionerJson = "{\"identifier\":\"practitoner-1-identifier\",\"active\":true,\"name\":\"Practitioner\",\"userId\":\"user1\",\"username\":\"Practioner1\"}"; + private final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HHmm.ss.SSSZ") + .registerTypeAdapter(DateTime.class, new DateTimeTypeConverter()).create(); + @Before public void setUp() { practitionerService = mock(PractitionerService.class); @@ -54,32 +60,31 @@ public void setUp() { } @Test - public void testGetPractitionersSHouldReturnAllPractitioners() throws Exception { - List expectedPractitoiners = new ArrayList<>(); + public void testGetPractitionersShouldReturnAllPractitioners() throws Exception { + List expectedPractitioners = new ArrayList<>(); Practitioner expectedPractitioner = initTestPractitioner1(); - expectedPractitoiners.add(expectedPractitioner); + expectedPractitioners.add(expectedPractitioner); expectedPractitioner = initTestPractitioner2(); - expectedPractitoiners.add(expectedPractitioner); + expectedPractitioners.add(expectedPractitioner); - doReturn(expectedPractitoiners).when(practitionerService).getAllPractitioners(any(PractitionerSearchBean.class)); + doReturn(expectedPractitioners).when(practitionerService).getAllPractitioners(any(PractitionerSearchBean.class)); String actualPractitionersString = getResponseAsString(BASE_URL, null, MockMvcResultMatchers.status().isOk()); - List actualPractitioners = new Gson() - .fromJson(actualPractitionersString, new TypeToken>() { + List actualPractitioners = gson.fromJson(actualPractitionersString, new TypeToken>() { }.getType()); - assertListsAreSameIgnoringOrder(actualPractitioners, expectedPractitoiners); + assertListsAreSameIgnoringOrder(actualPractitioners, expectedPractitioners); } @Test - public void testGetPractitionerByUniqueIdShouldReturnCorrectPractititoner() throws Exception { - List expectedPractitoiners = new ArrayList<>(); + public void testGetPractitionerByUniqueIdShouldReturnCorrectPractitioner() throws Exception { + List expectedPractitioners = new ArrayList<>(); Practitioner expectedPractitioner = initTestPractitioner1(); - expectedPractitoiners.add(expectedPractitioner); + expectedPractitioners.add(expectedPractitioner); List practitionerIdList = new ArrayList<>(); practitionerIdList.add(expectedPractitioner.getIdentifier()); @@ -88,7 +93,7 @@ public void testGetPractitionerByUniqueIdShouldReturnCorrectPractititoner() thro String actualPractitionersString = getResponseAsString(BASE_URL + "practitoner-1-identifier", null, MockMvcResultMatchers.status().isOk()); - Practitioner actualPractitioner = new Gson().fromJson(actualPractitionersString, new TypeToken() { + Practitioner actualPractitioner = gson.fromJson(actualPractitionersString, new TypeToken() { }.getType()); @@ -98,6 +103,9 @@ public void testGetPractitionerByUniqueIdShouldReturnCorrectPractititoner() thro assertEquals(actualPractitioner.getName(), expectedPractitioner.getName()); assertEquals(actualPractitioner.getUsername(), expectedPractitioner.getUsername()); assertEquals(actualPractitioner.getActive(), expectedPractitioner.getActive()); + assertEquals(actualPractitioner.getDateCreated(), expectedPractitioner.getDateCreated()); + assertEquals(actualPractitioner.getDateEdited(), expectedPractitioner.getDateEdited()); + assertEquals(actualPractitioner.getServerVersion(), expectedPractitioner.getServerVersion()); } @@ -110,7 +118,7 @@ public void testGetPractitionerByUniqueIdSWithBlankIdentifierShouldReturnAnError assertEquals("Practitioner Id is required", actualPractitioner); } @Test - public void testGetPractitionerByUserIdShouldReturnCorrectPractititoner() throws Exception { + public void testGetPractitionerByUserIdShouldReturnCorrectPractitioner() throws Exception { List expectedPractitioners = new ArrayList<>(); Practitioner expectedPractitioner = initTestPractitioner1(); @@ -123,7 +131,7 @@ public void testGetPractitionerByUserIdShouldReturnCorrectPractititoner() throws String actualPractitionersString = getResponseAsString(BASE_URL + "/user/" + "user1", null, MockMvcResultMatchers.status().isOk()); - Practitioner actualPractitioner = new Gson().fromJson(actualPractitionersString, new TypeToken() { + Practitioner actualPractitioner = gson.fromJson(actualPractitionersString, new TypeToken() { }.getType()); @@ -133,6 +141,9 @@ public void testGetPractitionerByUserIdShouldReturnCorrectPractititoner() throws assertEquals(actualPractitioner.getName(), expectedPractitioner.getName()); assertEquals(actualPractitioner.getUsername(), expectedPractitioner.getUsername()); assertEquals(actualPractitioner.getActive(), expectedPractitioner.getActive()); + assertEquals(actualPractitioner.getDateCreated(), expectedPractitioner.getDateCreated()); + assertEquals(actualPractitioner.getDateEdited(), expectedPractitioner.getDateEdited()); + assertEquals(actualPractitioner.getServerVersion(), expectedPractitioner.getServerVersion()); } @Test @@ -161,7 +172,7 @@ public void testCreateShouldCreateNewPractitionerResource() throws Exception { public void testUpdateShouldUpdateExistingPractitionerResource() throws Exception { Practitioner expectedPractitioner = initTestPractitioner1(); - String practitionerJson = new Gson().toJson(expectedPractitioner, new TypeToken() { + String practitionerJson = gson.toJson(expectedPractitioner, new TypeToken() { }.getType()); putRequestWithJsonContent(BASE_URL, practitionerJson, MockMvcResultMatchers.status().isCreated()); @@ -227,8 +238,7 @@ public void testGetPractitionersByPractitionerRoleIdentifierAndCode() throws Exc String actualPractitionersString = getResponseAsString( BASE_URL + "/report-to?practitionerIdentifier=test&code=testCode", null, MockMvcResultMatchers.status().isOk()); - List actualPractitioners = new Gson() - .fromJson(actualPractitionersString, new TypeToken>() { + List actualPractitioners = gson.fromJson(actualPractitionersString, new TypeToken>() { }.getType()); @@ -238,6 +248,10 @@ public void testGetPractitionersByPractitionerRoleIdentifierAndCode() throws Exc assertEquals(actualPractitioners.get(0).getName(), expectedPractitioner.getName()); assertEquals(actualPractitioners.get(0).getUsername(), expectedPractitioner.getUsername()); assertEquals(actualPractitioners.get(0).getActive(), expectedPractitioner.getActive()); + assertEquals(actualPractitioners.get(0).getDateCreated(), expectedPractitioner.getDateCreated()); + assertEquals(actualPractitioners.get(0).getDateEdited(), expectedPractitioner.getDateEdited()); + assertEquals(actualPractitioners.get(0).getServerVersion(), expectedPractitioner.getServerVersion()); + } @Override @@ -275,7 +289,7 @@ public void testBatchSaveWithJsonSyntaxException() throws Exception { } @Test - public void testCountAllPractitioners() throws Exception { + public void testCountAllPractitioners() throws Exception { doReturn(2L).when(practitionerService).countAllPractitioners(); MvcResult mvcResult = this.mockMvc.perform(get(BASE_URL + "count").accept(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status().isOk()).andReturn(); @@ -296,22 +310,30 @@ public void testCountAllPractitionersWithException() throws Exception { } private Practitioner initTestPractitioner1() { + DateTime dateCreated = DateTime.now(); Practitioner practitioner = new Practitioner(); practitioner.setIdentifier("practitoner-1-identifier"); practitioner.setActive(true); practitioner.setName("Practitioner"); practitioner.setUsername("Practioner1"); practitioner.setUserId("user1"); + practitioner.setDateCreated(dateCreated); + practitioner.setDateEdited(dateCreated); + practitioner.setServerVersion(1); return practitioner; } private Practitioner initTestPractitioner2() { + DateTime dateCreated = DateTime.now(); Practitioner practitioner = new Practitioner(); practitioner.setIdentifier("practitoner-2-identifier"); practitioner.setActive(false); practitioner.setName("Second Practitioner"); practitioner.setUsername("Practioner2"); practitioner.setUserId("user2"); + practitioner.setDateCreated(dateCreated); + practitioner.setDateEdited(dateCreated); + practitioner.setServerVersion(2); return practitioner; }