begin with failing test
This commit is contained in:
parent
cbbba75d9a
commit
054f7e6678
|
@ -0,0 +1,180 @@
|
|||
package ca.uhn.fhir.jpa.provider.r4;
|
||||
|
||||
import ca.uhn.fhir.jpa.api.config.JpaStorageSettings;
|
||||
import ca.uhn.fhir.jpa.provider.BaseResourceProviderR4Test;
|
||||
import ca.uhn.fhir.parser.StrictErrorHandler;
|
||||
import ca.uhn.fhir.rest.api.Constants;
|
||||
import ca.uhn.fhir.rest.api.EncodingEnum;
|
||||
import ca.uhn.fhir.rest.api.server.SystemRequestDetails;
|
||||
import ca.uhn.fhir.rest.client.api.IGenericClient;
|
||||
import ca.uhn.fhir.util.BundleUtil;
|
||||
import com.google.common.base.Charsets;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPut;
|
||||
import org.hl7.fhir.r4.model.Bundle;
|
||||
import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent;
|
||||
import org.hl7.fhir.r4.model.Encounter;
|
||||
import org.hl7.fhir.r4.model.Encounter.EncounterStatus;
|
||||
import org.hl7.fhir.r4.model.Observation;
|
||||
import org.hl7.fhir.r4.model.Observation.ObservationStatus;
|
||||
import org.hl7.fhir.r4.model.Organization;
|
||||
import org.hl7.fhir.r4.model.Parameters;
|
||||
import org.hl7.fhir.r4.model.Patient;
|
||||
import org.hl7.fhir.r4.model.Reference;
|
||||
import org.hl7.fhir.r4.model.StringType;
|
||||
import org.hl7.fhir.r4.model.Task;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import static ca.uhn.fhir.rest.server.provider.ProviderConstants.OPERATION_MERGE;
|
||||
import static ca.uhn.fhir.rest.server.provider.ProviderConstants.OPERATION_MERGE_SOURCE_PATIENT_IDENTIFIER;
|
||||
import static ca.uhn.fhir.rest.server.provider.ProviderConstants.OPERATION_MERGE_TARGET_PATIENT;
|
||||
import static ca.uhn.fhir.rest.server.provider.ProviderConstants.OPERATION_MERGE_TARGET_PATIENT_IDENTIFIER;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||
|
||||
public class PatientMergeR4Test extends BaseResourceProviderR4Test {
|
||||
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(PatientMergeR4Test.class);
|
||||
private String orgId;
|
||||
private String sourcePatId;
|
||||
private String taskId;
|
||||
private String encId1;
|
||||
private String encId2;
|
||||
private ArrayList<String> myObsIds;
|
||||
private String targetPatId;
|
||||
private String targetEnc1;
|
||||
|
||||
@BeforeEach
|
||||
public void beforeDisableResultReuse() {
|
||||
myStorageSettings.setReuseCachedSearchResultsForMillis(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@AfterEach
|
||||
public void after() throws Exception {
|
||||
super.after();
|
||||
|
||||
myStorageSettings.setReuseCachedSearchResultsForMillis(new JpaStorageSettings().getReuseCachedSearchResultsForMillis());
|
||||
}
|
||||
|
||||
@Override
|
||||
@BeforeEach
|
||||
public void before() throws Exception {
|
||||
super.before();
|
||||
myFhirContext.setParserErrorHandler(new StrictErrorHandler());
|
||||
|
||||
myStorageSettings.setAllowMultipleDelete(true);
|
||||
|
||||
Organization org = new Organization();
|
||||
org.setName("an org");
|
||||
orgId = myClient.create().resource(org).execute().getId().toUnqualifiedVersionless().getValue();
|
||||
ourLog.info("OrgId: {}", orgId);
|
||||
|
||||
Patient patient = new Patient();
|
||||
patient.getManagingOrganization().setReference(orgId);
|
||||
sourcePatId = myClient.create().resource(patient).execute().getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
Patient patient2 = new Patient();
|
||||
patient2.getManagingOrganization().setReference(orgId);
|
||||
targetPatId = myClient.create().resource(patient2).execute().getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
Encounter enc1 = new Encounter();
|
||||
enc1.setStatus(EncounterStatus.CANCELLED);
|
||||
enc1.getSubject().setReference(sourcePatId);
|
||||
enc1.getServiceProvider().setReference(orgId);
|
||||
encId1 = myClient.create().resource(enc1).execute().getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
Encounter enc2 = new Encounter();
|
||||
enc2.setStatus(EncounterStatus.ARRIVED);
|
||||
enc2.getSubject().setReference(sourcePatId);
|
||||
enc2.getServiceProvider().setReference(orgId);
|
||||
encId2 = myClient.create().resource(enc2).execute().getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
Task task = new Task();
|
||||
task.setStatus(Task.TaskStatus.COMPLETED);
|
||||
task.getOwner().setReference(sourcePatId);
|
||||
taskId = myClient.create().resource(task).execute().getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
Encounter targetEnc1 = new Encounter();
|
||||
targetEnc1.setStatus(EncounterStatus.ARRIVED);
|
||||
targetEnc1.getSubject().setReference(targetPatId);
|
||||
targetEnc1.getServiceProvider().setReference(orgId);
|
||||
this.targetEnc1 = myClient.create().resource(targetEnc1).execute().getId().toUnqualifiedVersionless().getValue();
|
||||
|
||||
myObsIds = new ArrayList<>();
|
||||
for (int i = 0; i < 20; i++) {
|
||||
Observation obs = new Observation();
|
||||
obs.getSubject().setReference(sourcePatId);
|
||||
obs.setStatus(ObservationStatus.FINAL);
|
||||
String obsId = myClient.create().resource(obs).execute().getId().toUnqualifiedVersionless().getValue();
|
||||
myObsIds.add(obsId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMerge() throws Exception {
|
||||
Parameters inParams = new Parameters();
|
||||
inParams.addParameter().setName(OPERATION_MERGE_SOURCE_PATIENT_IDENTIFIER).setValue(new Reference(sourcePatId));
|
||||
inParams.addParameter().setName(OPERATION_MERGE_TARGET_PATIENT_IDENTIFIER).setValue(new Reference(targetPatId));
|
||||
|
||||
IGenericClient client = myFhirContext.newRestfulGenericClient(myServerBase);
|
||||
Parameters outParams = client.operation()
|
||||
.onType("Patient")
|
||||
.named(OPERATION_MERGE)
|
||||
.withParameters(inParams)
|
||||
.returnResourceType(Parameters.class)
|
||||
.execute();
|
||||
|
||||
// FIXME KHS validate outParams
|
||||
|
||||
Bundle bundle = fetchBundle(myServerBase + "/" + targetPatId + "/$everything?_format=json&_count=100", EncodingEnum.JSON);
|
||||
|
||||
assertNull(bundle.getLink("next"));
|
||||
|
||||
Set<String> actual = new TreeSet<>();
|
||||
for (BundleEntryComponent nextEntry : bundle.getEntry()) {
|
||||
actual.add(nextEntry.getResource().getIdElement().toUnqualifiedVersionless().getValue());
|
||||
}
|
||||
|
||||
ourLog.info("Found IDs: {}", actual);
|
||||
|
||||
assertThat(actual).doesNotContain(sourcePatId);
|
||||
assertThat(actual).contains(encId1);
|
||||
assertThat(actual).contains(encId2);
|
||||
assertThat(actual).contains(orgId);
|
||||
assertThat(actual).contains(taskId);
|
||||
assertThat(actual).contains(myObsIds.toArray(new String[0]));
|
||||
assertThat(actual).contains(targetPatId);
|
||||
assertThat(actual).contains(targetEnc1);
|
||||
}
|
||||
|
||||
// FIXME KHS look at PatientEverythingR4Test for ideas for other tests
|
||||
|
||||
private Bundle fetchBundle(String theUrl, EncodingEnum theEncoding) throws IOException {
|
||||
Bundle bundle;
|
||||
HttpGet get = new HttpGet(theUrl);
|
||||
CloseableHttpResponse resp = ourHttpClient.execute(get);
|
||||
try {
|
||||
assertEquals(theEncoding.getResourceContentTypeNonLegacy(), resp.getFirstHeader(Constants.HEADER_CONTENT_TYPE).getValue().replaceAll(";.*", ""));
|
||||
bundle = theEncoding.newParser(myFhirContext).parseResource(Bundle.class, IOUtils.toString(resp.getEntity().getContent(), Charsets.UTF_8));
|
||||
} finally {
|
||||
IOUtils.closeQuietly(resp);
|
||||
}
|
||||
|
||||
return bundle;
|
||||
}
|
||||
|
||||
}
|
|
@ -243,4 +243,18 @@ public class ProviderConstants {
|
|||
* Operation name for the "$export" operation
|
||||
*/
|
||||
public static final String OPERATION_EXPORT = "$export";
|
||||
/**
|
||||
* Operation name for the Resource "$merge" operation
|
||||
* Hapi-fhir use is based on https://www.hl7.org/fhir/patient-operation-merge.html
|
||||
*/
|
||||
public static final String OPERATION_MERGE = "$merge";
|
||||
/**
|
||||
* Patient $merge operation parameters
|
||||
*/
|
||||
public static final String OPERATION_MERGE_SOURCE_PATIENT = "source-patient";
|
||||
public static final String OPERATION_MERGE_SOURCE_PATIENT_IDENTIFIER = "source-patient-identifier";
|
||||
public static final String OPERATION_MERGE_TARGET_PATIENT = "target-patient";
|
||||
public static final String OPERATION_MERGE_TARGET_PATIENT_IDENTIFIER = "target-patient-identifier";
|
||||
public static final String OPERATION_MERGE_RESULT_PATIENT = "result-patient";
|
||||
public static final String OPERATION_MERGE_PREVIEW = "preview";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue