diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java index ff75a77b1..494558b8e 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/Constants.java @@ -22,6 +22,12 @@ public final class Constants { public static final String TEST_ORDER_TYPE_UUID = "52a447d3-a64a-11e3-9aeb-50e549534c5e"; + public static final String IMAGING_ORDER_TYPE_UUID = "8d2aff07-55e6-4a4a-8878-72b9eb36a3b8"; + + public static final String PROCEDURE_ORDER_TYPE_UUID = "67a92e56-0f88-11ea-8d71-362b9e155667"; + + public static final String SUPPLY_REQUEST_ORDER_TYPE_UUID = "67a92bd6-0f88-11ea-8d71-362b9e155667"; + public static final String DRUG_ORDER_TYPE_UUID = "131168f4-15f5-102d-96e4-000c29c2a5d7"; private Constants() { diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java index 4aed10963..eecf734ef 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/FhirResource.java @@ -33,6 +33,10 @@ public enum FhirResource { SERVICEREQUEST("direct:fhir-handler-servicerequest", "direct:fhir-servicerequest", "orders", "test_order"), + PROCEDURE("direct:fhir-handler-procedure", "direct:fhir-procedure", "orders"), + + SUPPLYREQUEST("direct:fhir-handler-supplyrequest", "direct:fhir-supplyrequest", "orders"), + TASK("direct:fhir-handler-task", "direct:fhir-task", "fhir_task"); private final String[] tables; diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java new file mode 100644 index 000000000..26de936b2 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouter.java @@ -0,0 +1,103 @@ +package org.openmrs.eip.fhir.routes.resources; + +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; +import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; + +import java.util.Date; + +import org.apache.camel.LoggingLevel; +import org.apache.camel.component.http.HttpComponent; +import org.apache.camel.model.dataformat.JsonLibrary; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Coding; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.fhir.routes.resources.dto.Order; +import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import lombok.Setter; + +@Setter +@Component +public class ProcedureRouter extends BaseFhirResourceRouter { + + @Value("${openmrs.baseUrl}") + private String openmrsBaseUrl; + + @Autowired + private OpenmrsRestConfiguration openmrsRestConfiguration; + + ProcedureRouter() { + super(FhirResource.PROCEDURE); + } + + @Override + public void configure() throws Exception { + getCamelContext().getComponent("http", HttpComponent.class) + .setHttpClientConfigurer(openmrsRestConfiguration.createHttpClientConfigurer()); + + from(FhirResource.PROCEDURE.incomingUrl()).routeId("fhir-procedure-router").filter(isSupportedTable()).toD( + "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .filter(simple("${body[0]['uuid']} == '" + PROCEDURE_ORDER_TYPE_UUID + "'")) + .log(LoggingLevel.INFO, "Processing ProcedureRouter ${exchangeProperty.event.tableName}") + .toD( + "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) + .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) + .to(FhirResource.PROCEDURE.outgoingUrl()).when(simple("${body[0]['order_action']} == 'DISCONTINUE'")) + .toD( + "sql:SELECT uuid FROM orders WHERE order_id = ${body[0]['previous_order_id']}?dataSource=#openmrsDataSource") + .setHeader("CamelHttpMethod", constant("GET")).toD(openmrsBaseUrl + "/ws/rest/v1/order/${body[0]['uuid']}") + .unmarshal().json(JsonLibrary.Jackson, Order.class).process(exchange -> { + Order order = exchange.getIn().getBody(Order.class); + exchange.getMessage().setBody(mapOrderToServiceRequest(order)); + }).setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).to(FhirResource.PROCEDURE.outgoingUrl()).otherwise() + .setHeader("CamelHttpMethod", constant("GET")) + .toD(openmrsBaseUrl + "/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() + .json(JsonLibrary.Jackson, Order.class).process(exchange -> { + Order order = exchange.getIn().getBody(Order.class); + exchange.getMessage().setBody(mapOrderToServiceRequest(order)); + }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) + .to(FhirResource.PROCEDURE.outgoingUrl()).endChoice().end(); + } + + private ServiceRequest mapOrderToServiceRequest(Order order) { + ServiceRequest serviceRequest = new ServiceRequest(); + serviceRequest.setStatus(determineServiceRequestStatus(order)); + serviceRequest.setIntent(ServiceRequest.ServiceRequestIntent.ORDER); + serviceRequest.setCode(new CodeableConcept( + new Coding().setCode(order.getConcept().getUuid()).setDisplay(order.getConcept().getDisplay())) + .setText(order.getConcept().getDisplay())); + serviceRequest.setSubject(new Reference().setReference("Patient/" + order.getPatient().getUuid()).setType("Patient") + .setDisplay(order.getPatient().getDisplay())); + serviceRequest.setEncounter( + new Reference().setReference("Encounter/" + order.getEncounter().getUuid()).setType("Encounter")); + serviceRequest.setRequester(new Reference().setReference("Practitioner/" + order.getOrderer().getUuid()) + .setType("Practitioner").setDisplay(order.getOrderer().getDisplay())); + + return serviceRequest; + } + + private ServiceRequest.ServiceRequestStatus determineServiceRequestStatus(Order order) { + Date currentDate = new Date(); + boolean isCompeted = order.isActivated() + && ((order.getDateStopped() != null && currentDate.after(order.getDateStopped())) + || (order.getAutoExpireDate() != null && currentDate.after(order.getAutoExpireDate()))); + boolean isDiscontinued = order.isActivated() && order.getAction().equals("DISCONTINUE"); + + if ((isCompeted && isDiscontinued)) { + return ServiceRequest.ServiceRequestStatus.UNKNOWN; + } else if (isDiscontinued) { + return ServiceRequest.ServiceRequestStatus.REVOKED; + } else if (isCompeted) { + return ServiceRequest.ServiceRequestStatus.COMPLETED; + } else { + return ServiceRequest.ServiceRequestStatus.ACTIVE; + } + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ServiceRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ServiceRequestRouter.java index 488b282e4..61af0a4a4 100644 --- a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ServiceRequestRouter.java +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/ServiceRequestRouter.java @@ -1,6 +1,7 @@ package org.openmrs.eip.fhir.routes.resources; import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.IMAGING_ORDER_TYPE_UUID; import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; import static org.openmrs.eip.fhir.Constants.TEST_ORDER_TYPE_UUID; @@ -19,7 +20,8 @@ public class ServiceRequestRouter extends BaseFhirResourceRouter { public void configure() throws Exception { from(FhirResource.SERVICEREQUEST.incomingUrl()).routeId("fhir-servicerequest-router").filter(isSupportedTable()).toD( "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") - .filter(simple("${body[0]['uuid']} == '" + TEST_ORDER_TYPE_UUID + "'")) + .filter(simple("${body[0]['uuid']} == '" + TEST_ORDER_TYPE_UUID + "' || ${body[0]['uuid']} == '" + + IMAGING_ORDER_TYPE_UUID + "'")) .log(LoggingLevel.INFO, "Processing ${exchangeProperty.event.tableName} message") .toD( "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java new file mode 100644 index 000000000..4a8aabb9a --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouter.java @@ -0,0 +1,104 @@ +package org.openmrs.eip.fhir.routes.resources; + +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.PROP_EVENT_OPERATION; +import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; + +import java.util.Collections; +import java.util.Date; + +import org.apache.camel.LoggingLevel; +import org.apache.camel.component.http.HttpComponent; +import org.apache.camel.model.dataformat.JsonLibrary; +import org.hl7.fhir.r4.model.Quantity; +import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.hl7.fhir.r4.model.SupplyRequest; +import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.fhir.routes.resources.dto.Order; +import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import lombok.Setter; + +@Setter +@Component +public class SupplyRequestRouter extends BaseFhirResourceRouter { + + @Value("${openmrs.baseUrl}") + private String openmrsBaseUrl; + + @Autowired + private OpenmrsRestConfiguration openmrsRestConfiguration; + + SupplyRequestRouter() { + super(FhirResource.SUPPLYREQUEST); + } + + @Override + public void configure() throws Exception { + getCamelContext().getComponent("http", HttpComponent.class) + .setHttpClientConfigurer(openmrsRestConfiguration.createHttpClientConfigurer()); + + from(FhirResource.SUPPLYREQUEST.incomingUrl()).routeId("fhir-supplyrequest-router").filter(isSupportedTable()).toD( + "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .filter(simple("${body[0]['uuid']} == '" + SUPPLY_REQUEST_ORDER_TYPE_UUID + "'")) + .log(LoggingLevel.INFO, "Processing SupplyRequestRouter ${exchangeProperty.event.tableName}") + .toD( + "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .choice().when(simple("${exchangeProperty.event.operation} == 'd' || ${body[0]['voided']} == 1")) + .setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).setBody(simple("${exchangeProperty.event.identifier}")) + .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).when(simple("${body[0]['order_action']} == 'DISCONTINUE'")) + .toD( + "sql:SELECT uuid FROM orders WHERE order_id = ${body[0]['previous_order_id']}?dataSource=#openmrsDataSource") + .setHeader("CamelHttpMethod", constant("GET")).toD(openmrsBaseUrl + "/ws/rest/v1/order/${body[0]['uuid']}") + .unmarshal().json(JsonLibrary.Jackson, Order.class).process(exchange -> { + Order order = exchange.getIn().getBody(Order.class); + exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); + }).setHeader(HEADER_FHIR_EVENT_TYPE, constant("d")).to(FhirResource.SUPPLYREQUEST.outgoingUrl()).otherwise() + .setHeader("CamelHttpMethod", constant("GET")) + .toD(openmrsBaseUrl + "/ws/rest/v1/order/${exchangeProperty.event.identifier}").unmarshal() + .json(JsonLibrary.Jackson, Order.class).process(exchange -> { + Order order = exchange.getIn().getBody(Order.class); + exchange.getMessage().setBody(mapOrderToSupplyRequest(order)); + }).setHeader(HEADER_FHIR_EVENT_TYPE, simple("${exchangeProperty." + PROP_EVENT_OPERATION + "}")) + .to(FhirResource.SUPPLYREQUEST.outgoingUrl()).endChoice().end(); + } + + private SupplyRequest mapOrderToSupplyRequest(Order order) { + SupplyRequest supplyRequest = new SupplyRequest(); + supplyRequest.setId(order.getUuid()); + supplyRequest.setItem(new Reference().setReference("MedicalSupply/" + order.getConcept().getUuid()) + .setDisplay(order.getConcept().getDisplay())); + supplyRequest.setReasonReference(Collections.singletonList( + new Reference().setType("Encounter").setReference("Encounter/" + order.getEncounter().getUuid()))); + supplyRequest.setQuantity(new Quantity().setValue(order.getQuantity()).setCode(order.getQuantityUnits().getUuid())); + supplyRequest.setRequester( + new Reference().setReference(order.getOrderer().getUuid()).setDisplay(order.getOrderer().getDisplay())); + supplyRequest.setDeliverTo(new Reference().setReference("Patient/" + order.getPatient().getUuid()) + .setDisplay(order.getPatient().getDisplay())); + supplyRequest.setStatus(determineSupplyRequestStatus(order)); + + return supplyRequest; + } + + private SupplyRequest.SupplyRequestStatus determineSupplyRequestStatus(Order order) { + Date currentDate = new Date(); + boolean isCompeted = order.isActivated() + && ((order.getDateStopped() != null && currentDate.after(order.getDateStopped())) + || (order.getAutoExpireDate() != null && currentDate.after(order.getAutoExpireDate()))); + boolean isDiscontinued = order.isActivated() && order.getAction().equals("DISCONTINUE"); + + if ((isCompeted && isDiscontinued)) { + return SupplyRequest.SupplyRequestStatus.UNKNOWN; + } else if (isDiscontinued) { + return SupplyRequest.SupplyRequestStatus.CANCELLED; + } else if (isCompeted) { + return SupplyRequest.SupplyRequestStatus.COMPLETED; + } else { + return SupplyRequest.SupplyRequestStatus.ACTIVE; + } + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Concept.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Concept.java new file mode 100644 index 000000000..6fd191415 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Concept.java @@ -0,0 +1,18 @@ +package org.openmrs.eip.fhir.routes.resources.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class Concept { + + public String uuid; + + public String display; +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Encounter.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Encounter.java new file mode 100644 index 000000000..e1295cdcf --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Encounter.java @@ -0,0 +1,19 @@ +package org.openmrs.eip.fhir.routes.resources.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class Encounter { + + public String uuid; + + public String display; + +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java new file mode 100644 index 000000000..3aa3bf890 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Order.java @@ -0,0 +1,95 @@ +package org.openmrs.eip.fhir.routes.resources.dto; + +import java.sql.Timestamp; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class Order { + + public String uuid; + + public String orderNumber; + + public String accessionNumber; + + public Patient patient; + + public Concept concept; + + public String action; + + public Object previousOrder; + + public Date dateActivated; + + public Object scheduledDate; + + public Date dateStopped; + + public Date autoExpireDate; + + public Encounter encounter; + + public Orderer orderer; + + public Object orderReason; + + public Object orderReasonNonCoded; + + public String urgency; + + public Object instructions; + + public Object commentToFulfiller; + + public String display; + + public String type; + + public String resourceVersion; + + public float quantity; + + public QuantityUnits quantityUnits; + + public boolean isActivated() { + return this.isActivated(new Date()); + } + + public boolean isActivated(Date checkDate) { + if (this.dateActivated == null) { + return false; + } else { + if (checkDate == null) { + checkDate = new Date(); + } + + return compare(this.dateActivated, checkDate) <= 0; + } + } + + public static int compare(Date d1, Date d2) { + if (d1 instanceof Timestamp && d2 instanceof Timestamp) { + return d1.compareTo(d2); + } else { + if (d1 instanceof Timestamp) { + d1 = new Date(d1.getTime()); + } + + if (d2 instanceof Timestamp) { + d2 = new Date(d2.getTime()); + } + + return d1.compareTo(d2); + } + } +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Orderer.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Orderer.java new file mode 100644 index 000000000..e206fd231 --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Orderer.java @@ -0,0 +1,18 @@ +package org.openmrs.eip.fhir.routes.resources.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class Orderer { + + public String uuid; + + public String display; +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Patient.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Patient.java new file mode 100644 index 000000000..154fd3a1f --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/Patient.java @@ -0,0 +1,18 @@ +package org.openmrs.eip.fhir.routes.resources.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class Patient { + + public String uuid; + + public String display; +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/QuantityUnits.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/QuantityUnits.java new file mode 100644 index 000000000..5b4a996fd --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/routes/resources/dto/QuantityUnits.java @@ -0,0 +1,18 @@ +package org.openmrs.eip.fhir.routes.resources.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class QuantityUnits { + + public String uuid; + + public String display; +} diff --git a/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java new file mode 100644 index 000000000..0c55de6ba --- /dev/null +++ b/camel-openmrs-fhir/src/main/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfiguration.java @@ -0,0 +1,56 @@ +package org.openmrs.eip.fhir.spring; + +import static java.util.Base64.getEncoder; + +import java.util.Collections; + +import org.apache.camel.component.http.HttpClientConfigurer; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.message.BasicHeader; +import org.openmrs.eip.fhir.security.TokenCache; +import org.openmrs.eip.fhir.security.TokenInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("org.openmrs.eip.fhir") +public class OpenmrsRestConfiguration { + + @Value("${openmrs.baseUrl}") + private String baseUrl; + + @Value("${openmrs.username}") + private String openmrsUsername; + + @Value("${openmrs.password}") + private String openmrsPassword; + + @Value("${oauth.enabled:false}") + private boolean isOauthEnabled; + + public boolean isOauthEnabled() { + return isOauthEnabled; + } + + @Autowired + private TokenCache tokenCache; + + public HttpClientConfigurer createHttpClientConfigurer() { + return clientBuilder -> { + if (isOauthEnabled) { + TokenInfo tokenInfo = tokenCache.getTokenInfo(); + Header header = new BasicHeader("Authorization", "Bearer " + tokenInfo.getAccessToken()); + clientBuilder.setDefaultHeaders(Collections.singleton(header)); + } else if (openmrsUsername != null && openmrsPassword != null) { + String auth = openmrsUsername + ":" + openmrsPassword; + String base64Auth = getEncoder().encodeToString(auth.getBytes()); + Header header = new BasicHeader("Authorization", "Basic " + base64Auth); + clientBuilder.setDefaultHeaders(Collections.singleton(header)); + } else { + throw new IllegalStateException("Authentication credentials are not provided"); + } + }; + } +} diff --git a/camel-openmrs-fhir/src/main/resources/application.properties b/camel-openmrs-fhir/src/main/resources/application.properties new file mode 100644 index 000000000..34807023f --- /dev/null +++ b/camel-openmrs-fhir/src/main/resources/application.properties @@ -0,0 +1,5 @@ +# *********************** OpenMRS EIP Configuration ******************************************************************** +openmrs.baseUrl=${openmrs.baseUrl} +openmrs.username=${eip.fhir.username} +openmrs.password=${eip.fhir.password} +# ---------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java new file mode 100644 index 000000000..3cbd4d314 --- /dev/null +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/ProcedureRouterTest.java @@ -0,0 +1,163 @@ +package org.openmrs.eip.fhir.routes.resources; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.notNullValue; +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.PROCEDURE_ORDER_TYPE_UUID; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.camel.Endpoint; +import org.apache.camel.Message; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.AdviceWith; +import org.apache.camel.builder.AdviceWithRouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringTestSupport; +import org.apache.camel.test.spring.junit5.UseAdviceWith; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; +import org.openmrs.eip.mysql.watcher.Event; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.StaticApplicationContext; + +@UseAdviceWith +class ProcedureRouterTest extends CamelSpringTestSupport { + + private static final String PROCEDURE_ORDER_RESPONSE = "{\"uuid\":\"c585bffc-df49-4e57-8a90-6c1d5edb4ffd\",\"orderNumber\":\"ORD-2\",\"accessionNumber\":\"wefewf43r\",\"patient\":{\"uuid\":\"8b562184-bf0f-4ece-8852-780ee315f98e\",\"display\":\"H-3000000 - Siddharth Vaish\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/patient\\/8b562184-bf0f-4ece-8852-780ee315f98e\",\"resourceAlias\":\"patient\"}]},\"concept\":{\"uuid\":\"5a4c17ce-8305-4ea4-baca-0db107ae5ec2\",\"display\":\"Cystoscopie\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/5a4c17ce-8305-4ea4-baca-0db107ae5ec2\",\"resourceAlias\":\"concept\"}]},\"action\":\"NEW\",\"careSetting\":{\"uuid\":\"6f0c9a92-6f24-11e3-af88-005056821db0\",\"display\":\"Outpatient\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/caresetting\\/6f0c9a92-6f24-11e3-af88-005056821db0\",\"resourceAlias\":\"caresetting\"}]},\"previousOrder\":null,\"dateActivated\":\"2025-01-08T09:11:53.000+0000\",\"scheduledDate\":null,\"dateStopped\":null,\"autoExpireDate\":null,\"encounter\":{\"uuid\":\"5a286408-167e-4883-aed8-61fb0b0e65ee\",\"display\":\"Orders 01\\/08\\/2025\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/encounter\\/5a286408-167e-4883-aed8-61fb0b0e65ee\",\"resourceAlias\":\"encounter\"}]},\"orderer\":{\"uuid\":\"adbc0d21-c77b-426e-929d-76ff08f9f250\",\"display\":\"admin - Super User\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/provider\\/adbc0d21-c77b-426e-929d-76ff08f9f250\",\"resourceAlias\":\"provider\"}]},\"orderReason\":null,\"orderReasonNonCoded\":null,\"orderType\":{\"uuid\":\"67a92e56-0f88-11ea-8d71-362b9e155667\",\"display\":\"Procedure\",\"name\":\"Procedure\",\"javaClassName\":\"org.openmrs.Order\",\"retired\":false,\"description\":\"An order for Procedure exams\",\"conceptClasses\":[{\"uuid\":\"8d490bf4-c2cc-11de-8d13-0010c6dffd0f\",\"display\":\"Procedure\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/conceptclass\\/8d490bf4-c2cc-11de-8d13-0010c6dffd0f\",\"resourceAlias\":\"conceptclass\"}]}],\"parent\":null,\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92e56-0f88-11ea-8d71-362b9e155667\",\"resourceAlias\":\"ordertype\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92e56-0f88-11ea-8d71-362b9e155667?v=full\",\"resourceAlias\":\"ordertype\"}],\"resourceVersion\":\"1.10\"},\"urgency\":\"ROUTINE\",\"instructions\":null,\"commentToFulfiller\":null,\"display\":\"Cystoscopie\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/c585bffc-df49-4e57-8a90-6c1d5edb4ffd\",\"resourceAlias\":\"order\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/c585bffc-df49-4e57-8a90-6c1d5edb4ffd?v=full\",\"resourceAlias\":\"order\"}],\"type\":\"order\",\"resourceVersion\":\"1.10\"}"; + + @Override + protected AbstractApplicationContext createApplicationContext() { + return new StaticApplicationContext(); + } + + @Override + protected RoutesBuilder createRouteBuilder() { + ProcedureRouter procedureRouter = new ProcedureRouter(); + procedureRouter.setOpenmrsRestConfiguration(new OpenmrsRestConfiguration()); + procedureRouter.setOpenmrsBaseUrl("http://openmrs:8080/openmrs"); + procedureRouter.from(FhirResource.PROCEDURE.outgoingUrl()).to("mock:result"); + return procedureRouter; + } + + @Override + public boolean isUseDebugger() { + return true; + } + + @BeforeEach + void setup() throws Exception { + AdviceWith.adviceWith("fhir-procedure-router", context, new AdviceWithRouteBuilder() { + + @Override + public void configure() throws Exception { + context.getPropertiesComponent().setLocation("classpath:application-test.properties"); + weaveByToUri("http:*").replace().to("mock:http"); + weaveByToUri( + "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .replace().to("mock:sql-order-type"); + weaveByToUri( + "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .replace().to("mock:sql-orders"); + } + }); + + Endpoint defaultEndpoint = context.getEndpoint(FhirResource.PROCEDURE.incomingUrl()); + template.setDefaultEndpoint(defaultEndpoint); + } + + @Test + void shouldHandleProcedureOrderEntry() throws InterruptedException { + // Arrange + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(1); + result.setResultWaitTime(100); + + MockEndpoint http = getMockEndpoint("mock:http"); + http.expectedMessageCount(1); + http.whenAnyExchangeReceived((exchange) -> { + Message httpOutput = exchange.getMessage(); + httpOutput.setBody(PROCEDURE_ORDER_RESPONSE); + }); + + MockEndpoint sqlOrderType = getMockEndpoint("mock:sql-order-type"); + sqlOrderType.expectedMessageCount(1); + sqlOrderType.whenAnyExchangeReceived((exchange) -> { + Message sqlOutput = exchange.getMessage(); + Map map = new HashMap<>(); + map.put("uuid", PROCEDURE_ORDER_TYPE_UUID); + sqlOutput.setBody(Collections.singletonList(map)); + }); + + MockEndpoint sqlOrders = getMockEndpoint("mock:sql-orders"); + sqlOrders.expectedMessageCount(1); + sqlOrders.whenAnyExchangeReceived((exchange) -> { + Message sqlOutput = exchange.getMessage(); + Map output = new HashMap<>(); + output.put("voided", String.valueOf(0)); + output.put("order_action", "NEW"); + output.put("previous_order_id", String.valueOf(1)); + sqlOutput.setBody(Collections.singletonList(output)); + }); + + // Act + template.send((exchange) -> { + Event event = new Event(); + event.setTableName("orders"); + event.setOperation("c"); + event.setIdentifier(UUID.randomUUID().toString()); + exchange.setProperty("event", event); + Message in = exchange.getIn(); + in.setBody(""); + }); + + // Assert + result.assertIsSatisfied(); + + // Verify we got a service request object + Message message = result.getExchanges().get(0).getMessage(); + assertThat(message.getHeader(HEADER_FHIR_EVENT_TYPE), equalTo("c")); + + Object messageBody = message.getBody(); + assertThat(messageBody, notNullValue()); + assertThat(messageBody, instanceOf(ServiceRequest.class)); + + http.assertIsSatisfied(); + sqlOrderType.assertIsSatisfied(); + sqlOrders.assertIsSatisfied(); + } + + @Test + void shouldSkipUnknownEntry() throws InterruptedException { + // Arrange + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(0); + result.setResultWaitTime(100); + + MockEndpoint fhir = getMockEndpoint("mock:fhir"); + fhir.expectedMessageCount(0); + + // Act + template.send((exchange) -> { + Event event = new Event(); + event.setTableName("unknown_table"); + event.setOperation("c"); + event.setIdentifier(UUID.randomUUID().toString()); + exchange.setProperty("event", event); + Message in = exchange.getIn(); + in.setBody(""); + }); + + // Assert + result.assertIsSatisfied(); + fhir.assertIsSatisfied(); + } +} diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java new file mode 100644 index 000000000..84488f169 --- /dev/null +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/routes/resources/SupplyRequestRouterTest.java @@ -0,0 +1,166 @@ +package org.openmrs.eip.fhir.routes.resources; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.notNullValue; +import static org.openmrs.eip.fhir.Constants.HEADER_FHIR_EVENT_TYPE; +import static org.openmrs.eip.fhir.Constants.SUPPLY_REQUEST_ORDER_TYPE_UUID; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.camel.Endpoint; +import org.apache.camel.Message; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.AdviceWith; +import org.apache.camel.builder.AdviceWithRouteBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringTestSupport; +import org.apache.camel.test.spring.junit5.UseAdviceWith; +import org.hl7.fhir.r4.model.ServiceRequest; +import org.hl7.fhir.r4.model.SupplyRequest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.openmrs.eip.fhir.FhirResource; +import org.openmrs.eip.fhir.spring.OpenmrsRestConfiguration; +import org.openmrs.eip.mysql.watcher.Event; +import org.springframework.context.support.AbstractApplicationContext; +import org.springframework.context.support.StaticApplicationContext; + +@UseAdviceWith +class SupplyRequestRouterTest extends CamelSpringTestSupport { + + private static final String MEDICAL_SUPPLY_ORDER_RESPONSE = "{\"uuid\":\"dd36be07-f4fe-46a4-b994-fb7eaf0bb473\",\"orderNumber\":\"ORD-1\",\"accessionNumber\":\"test_abc_medical_supply\",\"patient\":{\"uuid\":\"8b562184-bf0f-4ece-8852-780ee315f98e\",\"display\":\"H-3000000 - Siddharth Vaish\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/patient\\/8b562184-bf0f-4ece-8852-780ee315f98e\",\"resourceAlias\":\"patient\"}]},\"concept\":{\"uuid\":\"a1937e67-6e4e-4296-8a4c-255cd38fd1dc\",\"display\":\"Abaisse langue\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/a1937e67-6e4e-4296-8a4c-255cd38fd1dc\",\"resourceAlias\":\"concept\"}]},\"action\":\"NEW\",\"careSetting\":{\"uuid\":\"6f0c9a92-6f24-11e3-af88-005056821db0\",\"display\":\"Outpatient\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/caresetting\\/6f0c9a92-6f24-11e3-af88-005056821db0\",\"resourceAlias\":\"caresetting\"}]},\"previousOrder\":null,\"dateActivated\":\"2025-01-08T08:44:03.000+0000\",\"scheduledDate\":null,\"dateStopped\":null,\"autoExpireDate\":null,\"encounter\":{\"uuid\":\"5a286408-167e-4883-aed8-61fb0b0e65ee\",\"display\":\"Orders 01\\/08\\/2025\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/encounter\\/5a286408-167e-4883-aed8-61fb0b0e65ee\",\"resourceAlias\":\"encounter\"}]},\"orderer\":{\"uuid\":\"adbc0d21-c77b-426e-929d-76ff08f9f250\",\"display\":\"admin - Super User\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/provider\\/adbc0d21-c77b-426e-929d-76ff08f9f250\",\"resourceAlias\":\"provider\"}]},\"orderReason\":null,\"orderReasonNonCoded\":null,\"orderType\":{\"uuid\":\"67a92bd6-0f88-11ea-8d71-362b9e155667\",\"display\":\"Medical Supply Order\",\"name\":\"Medical Supply Order\",\"javaClassName\":\"org.openmrs.module.orderexpansion.api.model.MedicalSupplyOrder\",\"retired\":false,\"description\":\"An order for Medical supplies\",\"conceptClasses\":[{\"uuid\":\"bfaba740-4c32-43c9-b64c-3e2c0c08cdf0\",\"display\":\"Material\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/conceptclass\\/bfaba740-4c32-43c9-b64c-3e2c0c08cdf0\",\"resourceAlias\":\"conceptclass\"}]}],\"parent\":null,\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92bd6-0f88-11ea-8d71-362b9e155667\",\"resourceAlias\":\"ordertype\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/ordertype\\/67a92bd6-0f88-11ea-8d71-362b9e155667?v=full\",\"resourceAlias\":\"ordertype\"}],\"resourceVersion\":\"1.10\"},\"urgency\":\"ROUTINE\",\"instructions\":null,\"commentToFulfiller\":null,\"display\":\"Abaisse langue\",\"quantity\":10,\"medicalSuppliesInventoryId\":null,\"brandName\":null,\"quantityUnits\":{\"uuid\":\"162396AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"display\":\"Box\",\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/concept\\/162396AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\",\"resourceAlias\":\"concept\"}]},\"links\":[{\"rel\":\"self\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/dd36be07-f4fe-46a4-b994-fb7eaf0bb473\",\"resourceAlias\":\"order\"},{\"rel\":\"full\",\"uri\":\"http:\\/\\/localhost\\/openmrs\\/ws\\/rest\\/v1\\/order\\/dd36be07-f4fe-46a4-b994-fb7eaf0bb473?v=full\",\"resourceAlias\":\"order\"}],\"type\":\"medicalsupplyorder\",\"resourceVersion\":\"1.10\"}"; + + @Override + protected AbstractApplicationContext createApplicationContext() { + return new StaticApplicationContext(); + } + + @Override + protected RoutesBuilder createRouteBuilder() { + SupplyRequestRouter supplyRequestRouter = new SupplyRequestRouter(); + supplyRequestRouter.setOpenmrsRestConfiguration(new OpenmrsRestConfiguration()); + supplyRequestRouter.setOpenmrsBaseUrl("http://openmrs:8080/openmrs"); + supplyRequestRouter.from(FhirResource.SUPPLYREQUEST.outgoingUrl()).to("mock:result"); + return supplyRequestRouter; + } + + @Override + public boolean isUseDebugger() { + return true; + } + + @BeforeEach + void setup() throws Exception { + AdviceWith.adviceWith("fhir-supplyrequest-router", context, new AdviceWithRouteBuilder() { + + @Override + public void configure() throws Exception { + context.getPropertiesComponent().setLocation("classpath:application-test.properties"); + weaveByToUri("http:*").replace().to("mock:http"); + weaveByToUri( + "sql:SELECT ot.uuid as uuid from order_type ot join orders o on o.order_type_id = ot.order_type_id where o.uuid ='${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .replace().to("mock:sql-order-type"); + weaveByToUri( + "sql:SELECT voided, order_action, previous_order_id FROM orders WHERE uuid = '${exchangeProperty.event.identifier}'?dataSource=#openmrsDataSource") + .replace().to("mock:sql-orders"); + } + }); + + Endpoint defaultEndpoint = context.getEndpoint(FhirResource.SUPPLYREQUEST.incomingUrl()); + template.setDefaultEndpoint(defaultEndpoint); + } + + @Test + void shouldHandleSupplyRequestOrderEntry() throws InterruptedException { + // Arrange + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(1); + result.setResultWaitTime(100); + + MockEndpoint http = getMockEndpoint("mock:http"); + http.expectedMessageCount(1); + http.whenAnyExchangeReceived((exchange) -> { + Message httpOutput = exchange.getMessage(); + httpOutput.setBody(MEDICAL_SUPPLY_ORDER_RESPONSE); + }); + + MockEndpoint sqlOrderType = getMockEndpoint("mock:sql-order-type"); + sqlOrderType.expectedMessageCount(1); + sqlOrderType.whenAnyExchangeReceived((exchange) -> { + Message sqlOutput = exchange.getMessage(); + Map map = new HashMap<>(); + map.put("uuid", SUPPLY_REQUEST_ORDER_TYPE_UUID); + sqlOutput.setBody(Collections.singletonList(map)); + }); + + MockEndpoint sqlOrders = getMockEndpoint("mock:sql-orders"); + sqlOrders.expectedMessageCount(1); + sqlOrders.whenAnyExchangeReceived((exchange) -> { + Message sqlOutput = exchange.getMessage(); + Map output = new HashMap<>(); + output.put("voided", String.valueOf(0)); + output.put("order_action", "NEW"); + output.put("previous_order_id", String.valueOf(1)); + sqlOutput.setBody(Collections.singletonList(output)); + }); + + // Act + template.send((exchange) -> { + Event event = new Event(); + event.setTableName("orders"); + event.setOperation("c"); + event.setIdentifier(UUID.randomUUID().toString()); + exchange.setProperty("event", event); + Message in = exchange.getIn(); + in.setBody(""); + }); + + // Assert + result.assertIsSatisfied(); + + // Verify we got a supply request object + Message message = result.getExchanges().get(0).getMessage(); + assertThat(message.getHeader(HEADER_FHIR_EVENT_TYPE), equalTo("c")); + + Object messageBody = message.getBody(); + assertThat(messageBody, notNullValue()); + assertThat(messageBody, instanceOf(SupplyRequest.class)); + + http.assertIsSatisfied(); + sqlOrderType.assertIsSatisfied(); + sqlOrders.assertIsSatisfied(); + } + + @Test + void shouldSkipUnknownEntry() throws InterruptedException { + // Arrange + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(0); + result.setResultWaitTime(100); + + MockEndpoint fhir = getMockEndpoint("mock:fhir"); + fhir.expectedMessageCount(0); + + // Act + template.send((exchange) -> { + Event event = new Event(); + event.setTableName("unknown_table"); + event.setOperation("c"); + event.setIdentifier(UUID.randomUUID().toString()); + exchange.setProperty("event", event); + Message in = exchange.getIn(); + in.setBody(""); + }); + + // Assert + result.assertIsSatisfied(); + fhir.assertIsSatisfied(); + } +} diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java index cd7abd446..be7798f67 100644 --- a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsFhirConfigurationTest.java @@ -29,7 +29,8 @@ @ContextConfiguration(classes = OpenmrsFhirConfiguration.class) @TestPropertySource(properties = { "eip.fhir.resources=Encounter", "openmrs.eip.log.level=DEBUG", "eip.fhir.serverUrl=http://localhost:8080/openmrs/ws/fhir2/R4", "eip.fhir.username=admin", - "eip.fhir.password=password" }) + "eip.fhir.password=password", "openmrs.baseUrl=http://localhost:8080/openmrs", "openmrs.username=admin", + "openmrs.password=password" }) public class OpenmrsFhirConfigurationTest { @Autowired diff --git a/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java new file mode 100644 index 000000000..c0af1cba2 --- /dev/null +++ b/camel-openmrs-fhir/src/test/java/org/openmrs/eip/fhir/spring/OpenmrsRestConfigurationTest.java @@ -0,0 +1,38 @@ +package org.openmrs.eip.fhir.spring; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.apache.camel.component.http.HttpClientConfigurer; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.env.Environment; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; + +@SpringBootTest +@ContextConfiguration(classes = OpenmrsRestConfiguration.class) +@TestPropertySource(properties = { "eip.fhir.resources=Encounter", "openmrs.eip.log.level=DEBUG", + "eip.fhir.serverUrl=http://localhost:8080/openmrs/ws/fhir2/R4", "eip.fhir.username=admin", + "eip.fhir.password=password", "openmrs.baseUrl=http://localhost:8080/openmrs", "openmrs.username=admin", + "openmrs.password=password" }) +public class OpenmrsRestConfigurationTest { + + @Autowired + Environment environment; + + @Autowired + OpenmrsRestConfiguration openmrsRestConfiguration; + + @Test + void shouldCreateHttpClientConfigurer() { + // verify username and password are set correctly + assertEquals("http://localhost:8080/openmrs", environment.getProperty("openmrs.baseUrl")); + assertEquals("admin", environment.getProperty("openmrs.username")); + assertEquals("password", environment.getProperty("openmrs.password")); + + HttpClientConfigurer httpClientConfigurer = openmrsRestConfiguration.createHttpClientConfigurer(); + assertNotNull(httpClientConfigurer); + } +} diff --git a/camel-openmrs-fhir/src/test/resources/application-test.properties b/camel-openmrs-fhir/src/test/resources/application-test.properties index e69de29bb..ae803942f 100644 --- a/camel-openmrs-fhir/src/test/resources/application-test.properties +++ b/camel-openmrs-fhir/src/test/resources/application-test.properties @@ -0,0 +1,5 @@ +# *********************** OpenMRS EIP Configuration ******************************************************************** +openmrs.baseUrl=http://openmrs:8080/openmrs +openmrs.username=admin +openmrs.password=Admin123 +# ---------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5c8ef5868..cf20b72b5 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,7 @@ 2.4.0 5.6.0 2.0.9 + 1.18.30 @@ -259,6 +260,11 @@ + + org.projectlombok + lombok + ${lombok.version} +