diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2Test.java index 0a663f3e0ad..82465a1dede 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2Test.java @@ -44,6 +44,7 @@ import ca.uhn.fhir.jpa.dao.BaseHapiFhirDao; import ca.uhn.fhir.jpa.dao.BaseHapiFhirResourceDao; import ca.uhn.fhir.jpa.dao.FhirResourceDaoDstu2; import ca.uhn.fhir.jpa.dao.SearchParameterMap; +import ca.uhn.fhir.jpa.dao.dstu3.FhirResourceDaoDstu3Test; import ca.uhn.fhir.jpa.entity.ResourceIndexedSearchParamString; import ca.uhn.fhir.jpa.entity.TagTypeEnum; import ca.uhn.fhir.model.api.IQueryParameterType; @@ -804,7 +805,8 @@ public class FhirResourceDaoDstu2Test extends BaseJpaDstu2Test { myOrganizationDao.delete(orgId, mySrd); fail(); } catch (ResourceVersionConflictException e) { - assertThat(e.getMessage(), containsString("Delete failed because of constraint")); + FhirResourceDaoDstu3Test.assertConflictException(e); + } myPatientDao.delete(patId, mySrd); diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3Test.java index d5e1b95d32b..ff67156dd0d 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3Test.java @@ -23,67 +23,25 @@ import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.RandomStringUtils; import org.hamcrest.Matchers; import org.hamcrest.core.StringContains; -import org.hl7.fhir.dstu3.model.Age; -import org.hl7.fhir.dstu3.model.BaseResource; -import org.hl7.fhir.dstu3.model.Bundle; +import org.hl7.fhir.dstu3.model.*; import org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent; import org.hl7.fhir.dstu3.model.Bundle.BundleType; import org.hl7.fhir.dstu3.model.Bundle.HTTPVerb; -import org.hl7.fhir.dstu3.model.CarePlan; -import org.hl7.fhir.dstu3.model.CodeSystem; -import org.hl7.fhir.dstu3.model.CodeType; -import org.hl7.fhir.dstu3.model.CodeableConcept; -import org.hl7.fhir.dstu3.model.Coding; -import org.hl7.fhir.dstu3.model.CompartmentDefinition; -import org.hl7.fhir.dstu3.model.ConceptMap; -import org.hl7.fhir.dstu3.model.Condition; -import org.hl7.fhir.dstu3.model.DateTimeType; -import org.hl7.fhir.dstu3.model.DateType; -import org.hl7.fhir.dstu3.model.Device; -import org.hl7.fhir.dstu3.model.DiagnosticReport; -import org.hl7.fhir.dstu3.model.Encounter; import org.hl7.fhir.dstu3.model.Enumerations.AdministrativeGender; import org.hl7.fhir.dstu3.model.Enumerations.ConformanceResourceStatus; -import org.hl7.fhir.dstu3.model.IdType; -import org.hl7.fhir.dstu3.model.Meta; -import org.hl7.fhir.dstu3.model.NamingSystem; -import org.hl7.fhir.dstu3.model.Observation; import org.hl7.fhir.dstu3.model.Observation.ObservationStatus; -import org.hl7.fhir.dstu3.model.OperationDefinition; -import org.hl7.fhir.dstu3.model.OperationOutcome; import org.hl7.fhir.dstu3.model.OperationOutcome.IssueSeverity; import org.hl7.fhir.dstu3.model.OperationOutcome.IssueType; -import org.hl7.fhir.dstu3.model.Organization; -import org.hl7.fhir.dstu3.model.Patient; -import org.hl7.fhir.dstu3.model.Period; -import org.hl7.fhir.dstu3.model.Quantity; import org.hl7.fhir.dstu3.model.Quantity.QuantityComparator; -import org.hl7.fhir.dstu3.model.Questionnaire; -import org.hl7.fhir.dstu3.model.Range; -import org.hl7.fhir.dstu3.model.Reference; -import org.hl7.fhir.dstu3.model.SimpleQuantity; -import org.hl7.fhir.dstu3.model.StringType; -import org.hl7.fhir.dstu3.model.StructureDefinition; -import org.hl7.fhir.dstu3.model.Timing; -import org.hl7.fhir.dstu3.model.UriType; import org.hl7.fhir.instance.model.api.IAnyResource; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; -import org.hl7.fhir.instance.model.valuesets.ObservationCategory; import org.junit.AfterClass; import org.junit.Ignore; import org.junit.Test; @@ -100,7 +58,6 @@ import ca.uhn.fhir.jpa.entity.TagTypeEnum; import ca.uhn.fhir.model.api.IQueryParameterType; import ca.uhn.fhir.model.api.Include; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; -import ca.uhn.fhir.model.base.composite.BaseCodingDt; import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum; import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum; @@ -109,34 +66,18 @@ import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.api.RestOperationTypeEnum; import ca.uhn.fhir.rest.api.SortOrderEnum; import ca.uhn.fhir.rest.api.SortSpec; -import ca.uhn.fhir.rest.param.DateParam; -import ca.uhn.fhir.rest.param.DateRangeParam; -import ca.uhn.fhir.rest.param.QuantityParam; -import ca.uhn.fhir.rest.param.ReferenceParam; -import ca.uhn.fhir.rest.param.StringParam; -import ca.uhn.fhir.rest.param.TokenOrListParam; -import ca.uhn.fhir.rest.param.TokenParam; +import ca.uhn.fhir.rest.param.*; import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.IBundleProvider; -import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; -import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException; -import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException; -import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; -import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException; -import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException; +import ca.uhn.fhir.rest.server.exceptions.*; import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails; import ca.uhn.fhir.util.TestUtil; -@SuppressWarnings("unchecked") +@SuppressWarnings({ "unchecked", "deprecation" }) public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoDstu3Test.class); - @AfterClass - public static void afterClassClearContext() { - TestUtil.clearAllStaticFieldsForUnitTest(); - } - private void assertGone(IIdType theId) { try { assertNotGone(theId); @@ -145,99 +86,6 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { // good } } - - @Test - public void testDeleteWithHas() { - Observation obs1 = new Observation(); - obs1.setStatus(ObservationStatus.FINAL); - IIdType obs1id = myObservationDao.create(obs1).getId().toUnqualifiedVersionless(); - - Observation obs2 = new Observation(); - obs2.setStatus(ObservationStatus.FINAL); - IIdType obs2id = myObservationDao.create(obs2).getId().toUnqualifiedVersionless(); - - DiagnosticReport rpt = new DiagnosticReport(); - rpt.addIdentifier().setSystem("foo").setValue("IDENTIFIER"); - rpt.addResult(new Reference(obs2id)); - IIdType rptId = myDiagnosticReportDao.create(rpt).getId().toUnqualifiedVersionless(); - - myObservationDao.read(obs1id); - myObservationDao.read(obs2id); - - try { - myObservationDao.deleteByUrl("Observation?_has:DiagnosticReport:result:identifier=foo|IDENTIFIER", mySrd); - fail(); - } catch (ResourceVersionConflictException e) { - assertThat(e.getMessage(), matchesPattern("Unable to delete Observation/[0-9]+ because at least one resource has a reference to this resource. First reference found was resource Observation/[0-9]+ in path DiagnosticReport.result")); - } - - myObservationDao.read(obs1id); - myObservationDao.read(obs2id); - } - - @Test - public void testCodeSystemCreateAndDelete() { - CodeSystem cs = new CodeSystem(); - cs.setStatus(ConformanceResourceStatus.DRAFT); - IIdType id = myCodeSystemDao.create(cs, mySrd).getId().toUnqualifiedVersionless(); - - myCodeSystemDao.delete(id, mySrd); - - assertGone(id.toUnqualifiedVersionless()); - } - - @Test - public void testIndexConditionWithAllOnsetTypes() { - // DateTimeType.class, Age.class, Period.class, Range.class, StringType.class - - Condition c0 = new Condition(); - c0.setOnset(new DateTimeType("2011-01-01")); - IIdType id0 = myConditionDao.create(c0, mySrd).getId().toUnqualifiedVersionless(); - - Condition c1 = new Condition(); - c1.setOnset(new Age().setValue(100L).setCode("AGECODE")); - IIdType id1 = myConditionDao.create(c1, mySrd).getId().toUnqualifiedVersionless(); - - Condition c2 = new Condition(); - c2.setOnset(new Period().setStart(new Date()).setEnd(new Date())); - IIdType id2 = myConditionDao.create(c2, mySrd).getId().toUnqualifiedVersionless(); - - Condition c3 = new Condition(); - c3.setOnset(new Range().setLow((SimpleQuantity) new SimpleQuantity().setValue(200L)).setHigh((SimpleQuantity) new SimpleQuantity().setValue(300L))); - IIdType id3 = myConditionDao.create(c3, mySrd).getId().toUnqualifiedVersionless(); - - Condition c4 = new Condition(); - c4.setOnset(new StringType("FOO")); - IIdType id4 = myConditionDao.create(c4, mySrd).getId().toUnqualifiedVersionless(); -} - - @Test - @Ignore - public void testCreateBuiltInProfiles() throws Exception { - org.hl7.fhir.dstu3.model.Bundle bundle; - String name = "profiles-resources"; - ourLog.info("Uploading " + name); - String vsContents; - vsContents = IOUtils.toString(FhirResourceDaoDstu3Test.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/profile/" + name + ".xml"), "UTF-8"); - - bundle = myFhirCtx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents); - for (BundleEntryComponent i : bundle.getEntry()) { - org.hl7.fhir.dstu3.model.Resource next = i.getResource(); - - ourLog.debug(myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(next)); - if (next instanceof StructureDefinition) { - myStructureDefinitionDao.update((StructureDefinition) next, mySrd); - } else if (next instanceof CompartmentDefinition) { - myCompartmentDefinitionDao.update((CompartmentDefinition) next, mySrd); - } else if (next instanceof OperationDefinition) { - myOperationDefinitionDao.update((OperationDefinition) next, mySrd); - } else { - fail(next.getClass().getName()); - } - - } - - } /** * This gets called from assertGone too! Careful about exceptions... @@ -253,7 +101,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { fail("Can't handle type: " + theId.getResourceType()); } } - + private List extractNames(IBundleProvider theSearch) { ArrayList retVal = new ArrayList(); for (IBaseResource next : theSearch.getResources(0, theSearch.size())) { @@ -268,7 +116,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { retVal.addCoding().setSystem(theSystem).setCode(theCode); return retVal; } - + private void sort(ArrayList thePublished) { ArrayList tags = new ArrayList(thePublished); Collections.sort(tags, new Comparator() { @@ -295,7 +143,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { } }); } - + private List sortIds(List theProfiles) { ArrayList retVal = new ArrayList(theProfiles); Collections.sort(retVal, new Comparator() { @@ -367,26 +215,6 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { } } - @Test - public void testCreateDifferentTypesWithSameForcedId() { - String idName = "forcedId"; - - Patient pat = new Patient(); - pat.setId(idName); - pat.addName().addFamily("FAM"); - IIdType patId = myPatientDao.update(pat, mySrd).getId(); - assertEquals("Patient/" + idName, patId.toUnqualifiedVersionless().getValue()); - - Observation obs = new Observation(); - obs.setId(idName); - obs.getCode().addCoding().setSystem("foo").setCode("testCreateDifferentTypesWithSameForcedId"); - IIdType obsId = myObservationDao.update(obs, mySrd).getId(); - assertEquals("Observation/" + idName, obsId.toUnqualifiedVersionless().getValue()); - - pat = myPatientDao.read(patId.toUnqualifiedVersionless(), mySrd); - obs = myObservationDao.read(obsId.toUnqualifiedVersionless(), mySrd); - } - @Test public void testChoiceParamDateAlt() { Observation o2 = new Observation(); @@ -432,7 +260,6 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { } - @Test public void testChoiceParamDateRange() { Observation o1 = new Observation(); @@ -585,6 +412,108 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { } } + @Test + public void testCodeSystemCreateAndDelete() { + CodeSystem cs = new CodeSystem(); + cs.setStatus(ConformanceResourceStatus.DRAFT); + IIdType id = myCodeSystemDao.create(cs, mySrd).getId().toUnqualifiedVersionless(); + + myCodeSystemDao.delete(id, mySrd); + + assertGone(id.toUnqualifiedVersionless()); + } + + @Test + @Ignore + public void testCreateBuiltInProfiles() throws Exception { + org.hl7.fhir.dstu3.model.Bundle bundle; + String name = "profiles-resources"; + ourLog.info("Uploading " + name); + String vsContents; + vsContents = IOUtils.toString(FhirResourceDaoDstu3Test.class.getResourceAsStream("/org/hl7/fhir/instance/model/dstu3/profile/" + name + ".xml"), "UTF-8"); + + bundle = myFhirCtx.newXmlParser().parseResource(org.hl7.fhir.dstu3.model.Bundle.class, vsContents); + for (BundleEntryComponent i : bundle.getEntry()) { + org.hl7.fhir.dstu3.model.Resource next = i.getResource(); + + ourLog.debug(myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(next)); + if (next instanceof StructureDefinition) { + myStructureDefinitionDao.update((StructureDefinition) next, mySrd); + } else if (next instanceof CompartmentDefinition) { + myCompartmentDefinitionDao.update((CompartmentDefinition) next, mySrd); + } else if (next instanceof OperationDefinition) { + myOperationDefinitionDao.update((OperationDefinition) next, mySrd); + } else { + fail(next.getClass().getName()); + } + + } + + } + + @Test + public void testCreateBundleAllowsDocumentAndCollection() { + String methodName = "testCreateBundleAllowsDocumentAndCollection"; + + Patient p = new Patient(); + p.addIdentifier().setSystem("urn:system").setValue(methodName); + IIdType pid = myPatientDao.create(p, mySrd).getId(); + p.setId(pid); + ourLog.info("Created patient, got it: {}", pid); + + Bundle bundle = new Bundle(); + bundle.setType(null); + bundle.addEntry().setResource(p).setFullUrl(pid.toUnqualifiedVersionless().getValue()); + try { + myBundleDao.create(bundle, mySrd); + fail(); + } catch (UnprocessableEntityException e) { + assertEquals("Unable to store a Bundle resource on this server with a Bundle.type value of: (missing)", e.getMessage()); + } + + bundle = new Bundle(); + bundle.setType(BundleType.SEARCHSET); + bundle.addEntry().setResource(p).setFullUrl(pid.toUnqualifiedVersionless().getValue()); + try { + myBundleDao.create(bundle, mySrd); + fail(); + } catch (UnprocessableEntityException e) { + assertEquals("Unable to store a Bundle resource on this server with a Bundle.type value of: searchset", e.getMessage()); + } + + bundle = new Bundle(); + bundle.setType(BundleType.COLLECTION); + bundle.addEntry().setResource(p).setFullUrl(pid.toUnqualifiedVersionless().getValue()); + myBundleDao.create(bundle, mySrd); + + bundle = new Bundle(); + bundle.setType(BundleType.DOCUMENT); + bundle.addEntry().setResource(p).setFullUrl(pid.toUnqualifiedVersionless().getValue()); + myBundleDao.create(bundle, mySrd); + + } + + + @Test + public void testCreateDifferentTypesWithSameForcedId() { + String idName = "forcedId"; + + Patient pat = new Patient(); + pat.setId(idName); + pat.addName().addFamily("FAM"); + IIdType patId = myPatientDao.update(pat, mySrd).getId(); + assertEquals("Patient/" + idName, patId.toUnqualifiedVersionless().getValue()); + + Observation obs = new Observation(); + obs.setId(idName); + obs.getCode().addCoding().setSystem("foo").setCode("testCreateDifferentTypesWithSameForcedId"); + IIdType obsId = myObservationDao.update(obs, mySrd).getId(); + assertEquals("Observation/" + idName, obsId.toUnqualifiedVersionless().getValue()); + + pat = myPatientDao.read(patId.toUnqualifiedVersionless(), mySrd); + obs = myObservationDao.read(obsId.toUnqualifiedVersionless(), mySrd); + } + @Test public void testCreateLongString() { //@formatter:off @@ -654,7 +583,6 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { p.addIdentifier().setSystem("urn:system").setValue("testCreateTextIdFails"); p.addName().addFamily("Hello"); - ArrayList tl = new ArrayList(); p.getMeta().addTag().setSystem(Constants.TAG_SUBSETTED_SYSTEM).setCode(Constants.TAG_SUBSETTED_CODE); try { @@ -675,79 +603,6 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { assertNotEquals("ABC", id); } - @Test - public void testTimingSearchParams() throws Exception { - Date before = new DateTimeType("2011-01-01T10:00:00Z").getValue(); - Date middle = new DateTimeType("2011-01-02T10:00:00Z").getValue(); - Date after = new DateTimeType("2011-01-03T10:00:00Z").getValue(); - - CarePlan cp = new CarePlan(); - cp.addActivity().getDetail().setScheduled(new Timing().addEvent(before).addEvent(middle).addEvent(after)); - cp.addActivity().getDetail(); - IIdType id = myCarePlanDao.create(cp, mySrd).getId().toUnqualifiedVersionless(); - - CarePlan cp2 = new CarePlan(); - cp2.addActivity().getDetail().setScheduled(new StringType("FOO")); - cp2.addActivity().getDetail(); - IIdType id2 = myCarePlanDao.create(cp2, mySrd).getId().toUnqualifiedVersionless(); - - SearchParameterMap params; - - params = new SearchParameterMap(); - params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2010-01-01T10:00:00Z", null)); - assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), contains(id.getValue())); - - params = new SearchParameterMap(); - params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2011-01-01T10:00:00Z", null)); - assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), contains(id.getValue())); - - params = new SearchParameterMap(); - params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2012-01-01T10:00:00Z", null)); - assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), empty()); - } - - @Test - public void testCreateBundleAllowsDocumentAndCollection() { - String methodName = "testCreateBundleAllowsDocumentAndCollection"; - - Patient p = new Patient(); - p.addIdentifier().setSystem("urn:system").setValue(methodName); - IIdType pid = myPatientDao.create(p, mySrd).getId(); - p.setId(pid); - ourLog.info("Created patient, got it: {}", pid); - - Bundle bundle = new Bundle(); - bundle.setType(null); - bundle.addEntry().setResource(p).setFullUrl(pid.toUnqualifiedVersionless().getValue()); - try { - myBundleDao.create(bundle, mySrd); - fail(); - } catch (UnprocessableEntityException e) { - assertEquals("Unable to store a Bundle resource on this server with a Bundle.type value of: (missing)", e.getMessage()); - } - - bundle = new Bundle(); - bundle.setType(BundleType.SEARCHSET); - bundle.addEntry().setResource(p).setFullUrl(pid.toUnqualifiedVersionless().getValue()); - try { - myBundleDao.create(bundle, mySrd); - fail(); - } catch (UnprocessableEntityException e) { - assertEquals("Unable to store a Bundle resource on this server with a Bundle.type value of: searchset", e.getMessage()); - } - - bundle = new Bundle(); - bundle.setType(BundleType.COLLECTION); - bundle.addEntry().setResource(p).setFullUrl(pid.toUnqualifiedVersionless().getValue()); - myBundleDao.create(bundle, mySrd); - - bundle = new Bundle(); - bundle.setType(BundleType.DOCUMENT); - bundle.addEntry().setResource(p).setFullUrl(pid.toUnqualifiedVersionless().getValue()); - myBundleDao.create(bundle, mySrd); - - } - @Test public void testCreateWithIfNoneExistBasic() { String methodName = "testCreateWithIfNoneExistBasic"; @@ -1118,7 +973,7 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { myOrganizationDao.delete(orgId, mySrd); fail(); } catch (ResourceVersionConflictException e) { - assertThat(e.getMessage(), containsString("Delete failed because of constraint")); + assertConflictException(e); } myPatientDao.delete(patId, mySrd); @@ -1235,6 +1090,35 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { assertEquals(id2, gotId); } + @Test + public void testDeleteWithHas() { + Observation obs1 = new Observation(); + obs1.setStatus(ObservationStatus.FINAL); + IIdType obs1id = myObservationDao.create(obs1).getId().toUnqualifiedVersionless(); + + Observation obs2 = new Observation(); + obs2.setStatus(ObservationStatus.FINAL); + IIdType obs2id = myObservationDao.create(obs2).getId().toUnqualifiedVersionless(); + + DiagnosticReport rpt = new DiagnosticReport(); + rpt.addIdentifier().setSystem("foo").setValue("IDENTIFIER"); + rpt.addResult(new Reference(obs2id)); + myDiagnosticReportDao.create(rpt).getId().toUnqualifiedVersionless(); + + myObservationDao.read(obs1id); + myObservationDao.read(obs2id); + + try { + myObservationDao.deleteByUrl("Observation?_has:DiagnosticReport:result:identifier=foo|IDENTIFIER", mySrd); + fail(); + } catch (ResourceVersionConflictException e) { + assertConflictException(e); + } + + myObservationDao.read(obs1id); + myObservationDao.read(obs2id); + } + @Test public void testDeleteWithMatchUrl() { String methodName = "testDeleteWithMatchUrl"; @@ -1302,8 +1186,6 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { public void testDeleteWithMatchUrlChainedProfile() { String methodName = "testDeleteWithMatchUrlChainedProfile"; - List profileList = new ArrayList(); - Organization org = new Organization(); org.getMeta().getProfile().add(new IdType("http://foo")); @@ -1495,37 +1377,6 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { assertNotEquals(idv1, idv2); } - @Test - public void testHistoryWithFromAndTo() throws Exception { - String methodName = "testHistoryWithFromAndTo"; - - Patient patient = new Patient(); - patient.addName().addFamily(methodName); - IIdType id = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); - - List preDates = Lists.newArrayList(); - List ids = Lists.newArrayList(); - for (int i = 0; i < 10; i++) { - Thread.sleep(100); - preDates.add(new Date()); - Thread.sleep(100); - patient.setId(id); - patient.getName().get(0).getFamily().get(0).setValue(methodName + "_i"); - ids.add(myPatientDao.update(patient, mySrd).getId().toUnqualified().getValue()); - } - - List idValues; - - idValues = toUnqualifiedIdValues(myPatientDao.history(id, preDates.get(0), preDates.get(3), mySrd)); - assertThat(idValues, contains(ids.get(2), ids.get(1), ids.get(0))); - - idValues = toUnqualifiedIdValues(myPatientDao.history(preDates.get(0), preDates.get(3), mySrd)); - assertThat(idValues, contains(ids.get(2), ids.get(1), ids.get(0))); - - idValues = toUnqualifiedIdValues(mySystemDao.history(preDates.get(0), preDates.get(3), mySrd)); - assertThat(idValues, contains(ids.get(2), ids.get(1), ids.get(0))); - } - @Test public void testHistoryOverMultiplePages() throws Exception { String methodName = "testHistoryOverMultiplePages"; @@ -1676,45 +1527,6 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { } - @Test - public void testHistoryWithFutureSinceDate() throws Exception { - - Date before = new Date(); - Thread.sleep(10); - - Patient inPatient = new Patient(); - inPatient.addName().addFamily("version1"); - inPatient.getMeta().addProfile("http://example.com/1"); - myPatientDao.create(inPatient, mySrd).getId().toUnqualifiedVersionless(); - - Thread.sleep(10); - Date after = new Date(); - - // No since - - IBundleProvider history = myPatientDao.history((Date)null, null, mySrd); - assertEquals(1, history.size()); - Patient outPatient = (Patient) history.getResources(0, 1).get(0); - assertEquals("version1", inPatient.getName().get(0).getFamilyAsSingleString()); - List profiles = toStringList(outPatient.getMeta().getProfile()); - assertThat(profiles, contains("http://example.com/1")); - - // Before since - - history = myPatientDao.history(before, null, mySrd); - assertEquals(1, history.size()); - outPatient = (Patient) history.getResources(0, 1).get(0); - assertEquals("version1", inPatient.getName().get(0).getFamilyAsSingleString()); - profiles = toStringList(outPatient.getMeta().getProfile()); - assertThat(profiles, contains("http://example.com/1")); - - // After since - - history = myPatientDao.history(after, null, mySrd); - assertEquals(0, history.size()); - - } - @Test public void testHistoryReflectsMetaOperations() throws Exception { Patient inPatient = new Patient(); @@ -1799,6 +1611,76 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { assertEquals(BundleEntryTransactionMethodEnum.POST.getCode(), ResourceMetadataKeyEnum.ENTRY_TRANSACTION_METHOD.get((IAnyResource) entries.get(2))); } + @Test + public void testHistoryWithFromAndTo() throws Exception { + String methodName = "testHistoryWithFromAndTo"; + + Patient patient = new Patient(); + patient.addName().addFamily(methodName); + IIdType id = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); + + List preDates = Lists.newArrayList(); + List ids = Lists.newArrayList(); + for (int i = 0; i < 10; i++) { + Thread.sleep(100); + preDates.add(new Date()); + Thread.sleep(100); + patient.setId(id); + patient.getName().get(0).getFamily().get(0).setValue(methodName + "_i"); + ids.add(myPatientDao.update(patient, mySrd).getId().toUnqualified().getValue()); + } + + List idValues; + + idValues = toUnqualifiedIdValues(myPatientDao.history(id, preDates.get(0), preDates.get(3), mySrd)); + assertThat(idValues, contains(ids.get(2), ids.get(1), ids.get(0))); + + idValues = toUnqualifiedIdValues(myPatientDao.history(preDates.get(0), preDates.get(3), mySrd)); + assertThat(idValues, contains(ids.get(2), ids.get(1), ids.get(0))); + + idValues = toUnqualifiedIdValues(mySystemDao.history(preDates.get(0), preDates.get(3), mySrd)); + assertThat(idValues, contains(ids.get(2), ids.get(1), ids.get(0))); + } + + @Test + public void testHistoryWithFutureSinceDate() throws Exception { + + Date before = new Date(); + Thread.sleep(10); + + Patient inPatient = new Patient(); + inPatient.addName().addFamily("version1"); + inPatient.getMeta().addProfile("http://example.com/1"); + myPatientDao.create(inPatient, mySrd).getId().toUnqualifiedVersionless(); + + Thread.sleep(10); + Date after = new Date(); + + // No since + + IBundleProvider history = myPatientDao.history((Date)null, null, mySrd); + assertEquals(1, history.size()); + Patient outPatient = (Patient) history.getResources(0, 1).get(0); + assertEquals("version1", inPatient.getName().get(0).getFamilyAsSingleString()); + List profiles = toStringList(outPatient.getMeta().getProfile()); + assertThat(profiles, contains("http://example.com/1")); + + // Before since + + history = myPatientDao.history(before, null, mySrd); + assertEquals(1, history.size()); + outPatient = (Patient) history.getResources(0, 1).get(0); + assertEquals("version1", inPatient.getName().get(0).getFamilyAsSingleString()); + profiles = toStringList(outPatient.getMeta().getProfile()); + assertThat(profiles, contains("http://example.com/1")); + + // After since + + history = myPatientDao.history(after, null, mySrd); + assertEquals(0, history.size()); + + } + @Test public void testHistoryWithInvalidId() throws Exception { try { @@ -1879,6 +1761,31 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { } } + @Test + public void testIndexConditionWithAllOnsetTypes() { + // DateTimeType.class, Age.class, Period.class, Range.class, StringType.class + + Condition c0 = new Condition(); + c0.setOnset(new DateTimeType("2011-01-01")); + myConditionDao.create(c0, mySrd).getId().toUnqualifiedVersionless(); + + Condition c1 = new Condition(); + c1.setOnset(new Age().setValue(100L).setCode("AGECODE")); + myConditionDao.create(c1, mySrd).getId().toUnqualifiedVersionless(); + + Condition c2 = new Condition(); + c2.setOnset(new Period().setStart(new Date()).setEnd(new Date())); + myConditionDao.create(c2, mySrd).getId().toUnqualifiedVersionless(); + + Condition c3 = new Condition(); + c3.setOnset(new Range().setLow((SimpleQuantity) new SimpleQuantity().setValue(200L)).setHigh((SimpleQuantity) new SimpleQuantity().setValue(300L))); + myConditionDao.create(c3, mySrd).getId().toUnqualifiedVersionless(); + + Condition c4 = new Condition(); + c4.setOnset(new StringType("FOO")); + myConditionDao.create(c4, mySrd).getId().toUnqualifiedVersionless(); +} + @Test public void testInstanceMetaOperations() { String methodName = "testMetaRead"; @@ -1889,11 +1796,9 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { patient.getMeta().addTag("tag_scheme1", "tag_code1", "tag_display1"); patient.getMeta().addTag("tag_scheme2", "tag_code2", "tag_display2"); - List securityLabels = new ArrayList(); patient.getMeta().addSecurity().setSystem("seclabel_sys1").setCode("seclabel_code1").setDisplay("seclabel_dis1"); patient.getMeta().addSecurity().setSystem("seclabel_sys2").setCode("seclabel_code2").setDisplay("seclabel_dis2"); - ArrayList profiles = new ArrayList(); patient.getMeta().addProfile(("http://profile/1")); patient.getMeta().addProfile(("http://profile/2")); @@ -3337,6 +3242,37 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { } + @Test + public void testTimingSearchParams() throws Exception { + Date before = new DateTimeType("2011-01-01T10:00:00Z").getValue(); + Date middle = new DateTimeType("2011-01-02T10:00:00Z").getValue(); + Date after = new DateTimeType("2011-01-03T10:00:00Z").getValue(); + + CarePlan cp = new CarePlan(); + cp.addActivity().getDetail().setScheduled(new Timing().addEvent(before).addEvent(middle).addEvent(after)); + cp.addActivity().getDetail(); + IIdType id = myCarePlanDao.create(cp, mySrd).getId().toUnqualifiedVersionless(); + + CarePlan cp2 = new CarePlan(); + cp2.addActivity().getDetail().setScheduled(new StringType("FOO")); + cp2.addActivity().getDetail(); + myCarePlanDao.create(cp2, mySrd).getId().toUnqualifiedVersionless(); + + SearchParameterMap params; + + params = new SearchParameterMap(); + params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2010-01-01T10:00:00Z", null)); + assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), contains(id.getValue())); + + params = new SearchParameterMap(); + params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2011-01-01T10:00:00Z", null)); + assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), contains(id.getValue())); + + params = new SearchParameterMap(); + params.add(CarePlan.SP_ACTIVITYDATE, new DateRangeParam("2012-01-01T10:00:00Z", null)); + assertThat(toUnqualifiedVersionlessIdValues(myCarePlanDao.search(params)), empty()); + } + @Test public void testTokenParamWhichIsTooLong() { @@ -3372,6 +3308,15 @@ public class FhirResourceDaoDstu3Test extends BaseJpaDstu3Test { } } + @AfterClass + public static void afterClassClearContext() { + TestUtil.clearAllStaticFieldsForUnitTest(); + } + + public static void assertConflictException(ResourceVersionConflictException e) { + assertThat(e.getMessage(), matchesPattern("Unable to delete Observation/[0-9]+ because at least one resource has a reference to this resource. First reference found was resource Observation/[0-9]+ in path DiagnosticReport.result")); + } + private static List toStringList(List theUriType) { ArrayList retVal = new ArrayList(); for (UriType next : theUriType) {