Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Platform beta release #298

Merged
merged 10 commits into from
May 21, 2024
3 changes: 2 additions & 1 deletion config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ profiles:
- openhim-mapping-mediator
- kafka-mapper-consumer
- kafka-unbundler-consumer
- fhir-ig-importer
- reprocess-mediator
envFiles:
- cdr-dw.env

Expand Down Expand Up @@ -75,4 +77,3 @@ profiles:
- openhim-mapping-mediator
envFiles:
- mpi.env

2 changes: 1 addition & 1 deletion fhir-ig-importer/docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ services:
fhir-ig-importer-ui:
ports:
- target: 8080
published: 3000
published: 3334
mode: host
2 changes: 1 addition & 1 deletion fhir-ig-importer/importer/volume/ig-importer-app.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"description": "FHIR IG microfrontend app",
"category": "HIE Configuration",
"type": "esmodule",
"url": "http://localhost:3000/jembi-fhir-ig-importer.js",
"url": "http://localhost:3334/jembi-fhir-ig-importer.js",
"showInPortal": true,
"showInSideBar": true,
"access_roles": ["admin"],
Expand Down
4 changes: 2 additions & 2 deletions fhir-ig-importer/package-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"FHIR_IG_IMPORTER_CORE_PORT": 3001,
"FHIR_IG_IMPORTER_CORE_HOST": "0.0.0.0",
"FHIR_IG_IMPORTER_CORE_URL": "http://0.0.0.0:3001/fhir/ig/v1.0",
"FHIR_IG_IMPORTER_UI_VERSION": "0.1.0",
"FHIR_IG_IMPORTER_CORE_VERSION": "1.0.0"
"FHIR_IG_IMPORTER_UI_VERSION": "v1.0.0",
"FHIR_IG_IMPORTER_CORE_VERSION": "v1.0.0"
}
}
4 changes: 2 additions & 2 deletions interoperability-layer-openhim/package-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"type": "infrastructure",
"dependencies": [],
"environmentVariables": {
"OPENHIM_CORE_IMAGE": "jembi/openhim-core:microfrontends-3.0.0-beta",
"OPENHIM_CONSOLE_IMAGE": "jembi/openhim-console:v1.18.2",
"OPENHIM_CORE_IMAGE": "jembi/openhim-core:v8.4.3",
"OPENHIM_CONSOLE_IMAGE": "jembi/openhim-console:poc-microfrontend",
"MONGO_IMAGE": "mongo:4.2",
"AWAIT_HELPER_IMAGE": "jembi/await-helper:1.0.1",
"MONGO_1_PLACEMENT": "node-1",
Expand Down
4 changes: 2 additions & 2 deletions kafka-mapper-consumer/package-metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"REGISTER_MEDIATOR": "true",
"CLICKHOUSE_HOST": "analytics-datastore-clickhouse",
"CLICKHOUSE_PORT": "8123",
"KAFKA_CONSUMER_MAPPER_MEDIATOR_VERSION": "jembi/kafka-mapper-consumer:0.1.0",
"KAFKA_CONSUMER_MAPPER_UI_VERSION": "jembi/kafka-mapper-consumer-ui:0.1.1-alpha"
"KAFKA_CONSUMER_MAPPER_MEDIATOR_VERSION": "jembi/kafka-mapper-consumer:v0.0.1",
"KAFKA_CONSUMER_MAPPER_UI_VERSION": "jembi/kafka-mapper-consumer-ui:v0.0.1"
}
}
2 changes: 1 addition & 1 deletion mpi-mediator/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ version: '3.9'

services:
mpi-mediator:
image: jembi/mpi-mediator:v2.1.1
image: jembi/mpi-mediator:v2.2.0
networks:
openhim:
kafka:
Expand Down
31 changes: 8 additions & 23 deletions mpi-mediator/importer/volume/openhim-import.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
"surname": "User",
"email": "[email protected]",
"provider": "token",
"groups": [
"admin"
],
"groups": ["admin"],
"passwordAlgorithm": "sha512",
"passwordHash": "ea3824f17cf1379eb118a36bc7c8cf0f45712e2af7748567fca5313dec6fa66d61064e82a5e5cb88e998486ee3c7d0dac235bbeda8c341d6edc1c77406be2ab6",
"passwordSalt": "d4f622c0404f09bd959bfb263efa3452",
Expand All @@ -21,9 +19,7 @@
{
"clientID": "test",
"name": "Test Client",
"roles": [
"instant"
],
"roles": ["instant"],
"customTokenID": "test"
}
],
Expand Down Expand Up @@ -98,7 +94,7 @@
"urlPattern": "^/fhir.*$",
"methods": ["GET", "POST"],
"type": "http",
"priority": null,
"priority": 2,
"tcpPort": null,
"tcpHost": null,
"pollingSchedule": null,
Expand Down Expand Up @@ -147,19 +143,15 @@
{
"name": "MPI Orchestration for fhir bundles - Asynchronous flow",
"urlPattern": "^/async/fhir/?$",
"methods": [
"POST"
],
"methods": ["POST"],
"type": "http",
"priority": null,
"tcpPort": null,
"tcpHost": null,
"pollingSchedule": null,
"requestBody": true,
"responseBody": true,
"allow": [
"instant"
],
"allow": ["instant"],
"whitelist": [],
"authType": "private",
"routes": [
Expand Down Expand Up @@ -240,9 +232,7 @@
"pollingSchedule": null,
"requestBody": true,
"responseBody": true,
"allow": [
"instant"
],
"allow": ["instant"],
"whitelist": [],
"authType": "private",
"routes": [
Expand Down Expand Up @@ -328,14 +318,9 @@
{
"name": "MPI mediator",
"urlPattern": "^(/async)?/fhir.*$",
"methods": [
"POST",
"GET"
],
"methods": ["POST", "GET"],
"type": "http",
"allow": [
"instant"
],
"allow": ["instant"],
"whitelist": [],
"authType": "private",
"routes": [
Expand Down
2 changes: 1 addition & 1 deletion reprocess-mediator/docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ services:
reprocess-mediator:
ports:
- target: 3000
published: 3000
published: 3335
mode: host

reprocess-mediator-ui:
Expand Down
32 changes: 16 additions & 16 deletions reprocess-mediator/package-metadata.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
{
"id": "reprocess-mediator",
"name": "Reprocess Mediator",
"description": "A mediator that allows for configuring and reprocessing of transactions",
"type": "use-case",
"version": "1.4.2",
"dependencies": ["interoperability-layer-openhim"],
"environmentVariables": {
"TRUST_SELF_SIGNED": "true",
"OPENHIM_MEDIATOR_URL": "https://openhim-core:8080",
"OPENHIM_USERNAME": "[email protected]",
"OPENHIM_PASSWORD": "instant101",
"REGISTER_MEDIATOR": "true",
"REPROCESSOR_API_BASE_URL": "http://reprocess-mediator:3000",
"REPROCESS_CORE_VERSION": "latest",
"REPROCESS_UI_VERSION": "latest"
}
"id": "reprocess-mediator",
"name": "Reprocess Mediator",
"description": "A mediator that allows for configuring and reprocessing of transactions",
"type": "use-case",
"version": "1.4.2",
"dependencies": ["interoperability-layer-openhim"],
"environmentVariables": {
"TRUST_SELF_SIGNED": "true",
"OPENHIM_MEDIATOR_URL": "https://openhim-core:8080",
"OPENHIM_USERNAME": "[email protected]",
"OPENHIM_PASSWORD": "instant101",
"REGISTER_MEDIATOR": "true",
"REPROCESSOR_API_BASE_URL": "http://reprocess-mediator:3000",
"REPROCESS_CORE_VERSION": "v0.1.0",
"REPROCESS_UI_VERSION": "v0.1.0"
}
}
105 changes: 67 additions & 38 deletions test/cucumber/features/steps/recipesSteps.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
"use strict"
"use strict";

const axios = require("axios");
const fs = require("fs");
const path = require('path');
const path = require("path");
const chai = require("chai");
const { ClickHouse } = require('clickhouse');
const { ClickHouse } = require("clickhouse");
const { Given, When, Then, setDefaultTimeout } = require("@cucumber/cucumber");
setDefaultTimeout(30 * 60 * 1000);

const HOST =
process.env.HOST || 'localhost';
const CLICKHOUSE_PORT = parseInt(process.env.CLICKHOUSE_PORT || '8124');
const HOST = process.env.HOST || "localhost";
const CLICKHOUSE_PORT = parseInt(process.env.CLICKHOUSE_PORT || "8124");
const CLICKHOUSE_DEBUG = Boolean(process.env.CLICKHOUSE_DEBUG || false);

const { expect } = chai;
Expand All @@ -22,69 +21,99 @@ const clickhouse = new ClickHouse({
raw: true,
});

const query = table => `SELECT * FROM ${table}`;
const query = (table) => `SELECT * FROM ${table}`;

const sendRequest = (url, method='POST', data={}) => {
const sendRequest = (url, method = "POST", data = {}) => {
return axios({
url,
headers: {
'Content-Type': 'application/fhir+json',
Authorization: `Custom test`
"Content-Type": "application/fhir+json",
Authorization: `Custom test`,
},
data,
method
})
method,
});
};
drizzentic marked this conversation as resolved.
Show resolved Hide resolved

let PatientID;

Given("I have configured the cdr", async function () {
await new Promise((resolve) => {
setTimeout(() => resolve(), 300000)
setTimeout(() => resolve(), 300000);
});
drizzentic marked this conversation as resolved.
Show resolved Hide resolved
const organization = JSON.parse(
fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'organization.json'))
fs.readFileSync(
path.resolve(__dirname, "..", "resources", "organization.json")
)
);

this.cdrConfigResult = await sendRequest(`http://${HOST}:5001/fhir`, 'POST', organization);
this.cdrConfigResult = await sendRequest(
`http://${HOST}:5001/fhir`,
"POST",
organization
);
});

When("I send a fhir patient bundle", async function () {
const fhirBundle = JSON.parse(
fs.readFileSync(path.resolve(__dirname, '..' , 'resources', 'fhirBundle.json'))
fs.readFileSync(
path.resolve(__dirname, "..", "resources", "fhirBundle.json")
)
);

this.fhirBundleSentResult = await sendRequest(`http://${HOST}:5001/fhir`, 'POST', fhirBundle);
this.fhirBundleSentResult = await sendRequest(
`http://${HOST}:5001/fhir`,
"POST",
fhirBundle
);
});

When("I then send a fhir patient summary request", async function () {
this.IPSResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$summary`, 'GET');
});

When("I then send a request for all the patient's clinical data", async function () {
this.EverythingResult = await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}/$everything?_mdm=true`, 'GET');
this.IPSResult = await sendRequest(
`http://${HOST}:5001/fhir/Patient/${PatientID}/$summary`,
"GET"
);
});

When("I wait for the services to start up", async function() {
When(
"I then send a request for all the patient's clinical data",
async function () {
this.EverythingResult = await sendRequest(
`http://${HOST}:5001/fhir/Patient/${PatientID}/$everything?_mdm=true`,
"GET"
);
}
);

When("I wait for the services to start up", async function () {
await new Promise((resolve) => {
setTimeout(() => resolve(), 1500000);
});
});

Then("the clinical data should be stored in hapi fhir", async function () {
this.fhirBundleSentResult.data.entry.forEach(rec => {
this.fhirBundleSentResult.data.entry.forEach((rec) => {
expect(rec.response.status).to.match(/201|200/);
});
});

Then("the patient data in the Jempi client registry", async function () {
const patientResource = this.fhirBundleSentResult.data.entry.filter(rec => rec.response.location.match('Patient'))[0];
const patientResource = this.fhirBundleSentResult.data.entry.filter((rec) =>
rec.response.location.match("Patient")
)[0];

PatientID = patientResource.response.location.split('/')[1];
PatientID = patientResource.response.location.split("/")[1];

const patient = await sendRequest(`http://${HOST}:5001/fhir/links/Patient/${PatientID}`, 'GET');
const patient = await sendRequest(
`http://${HOST}:5001/fhir/Patient/${PatientID}`,
"GET"
);

expect(patient.data.link.filter(pat => pat.other.reference.match(`Patient/${PatientID}`)).length).to.equal(1);
expect(
patient.data.link.filter((pat) =>
pat.other.reference.match(`Patient/${PatientID}`)
).length
).to.equal(1);
});

Then("I should get a successful summary response", function () {
Expand All @@ -96,22 +125,22 @@ Then("I should get a successful everything response", function () {
});

Then("a request to fetch data from the cdr should fail", async function () {
await sendRequest(`http://${HOST}:5001/fhir/links/Patient/${PatientID}`).catch(err => {
expect(err.message).to.match(/ECONNREFUSED|socket hang up|ETIMEDOUT/);
});
await sendRequest(`http://${HOST}:5001/fhir/Patient/${PatientID}`).catch(
(err) => {
expect(err.message).to.match(/ECONNREFUSED|socket hang up|ETIMEDOUT/);
}
);
});

Then("the data should be stored in clickhouse", async function () {
await new Promise((resolve) => {
setTimeout(() => resolve(), 20000)
setTimeout(() => resolve(), 20000);
});

const patient = await clickhouse.query(
query("patient_example"),
).toPromise();
const observation = await clickhouse.query(
query("observation_example")
).toPromise();
const patient = await clickhouse.query(query("patient_example")).toPromise();
const observation = await clickhouse
.query(query("observation_example"))
.toPromise();

expect(JSON.parse(patient).rows).to.be.greaterThan(0);
expect(JSON.parse(observation).rows).to.be.greaterThan(0);
Expand Down
Loading