コード例 #1
0
        public void TestPersistComplexPatient()
        {
            TestUtil.CreateAuthority("TEST", "1.2.3.4", "http://santedb.org/fhir/test", "TEST_HARNESS", this.AUTH);
            using (TestUtil.AuthenticateFhir("TEST_HARNESS", this.AUTH))
            {
                // Load the Complex Patient Message
                var request       = TestUtil.GetFhirMessage("ComplexPatient") as Bundle;
                var messageString = TestUtil.MessageToString(request);
                var sourcePatient = request.Entry.FirstOrDefault(o => o.Resource.TypeName == "Patient").Resource as Hl7.Fhir.Model.Patient;

                var result = FhirResourceHandlerUtil.GetMappersFor(ResourceType.Bundle).First().Create(request, TransactionMode.Commit);
                messageString = TestUtil.MessageToString(result);

                Assert.IsInstanceOf <Bundle>(result);
                var bresult = result as Bundle;
                Assert.AreEqual(1, bresult.Entry.Count(o => o.Resource is Hl7.Fhir.Model.Patient));
                Assert.AreEqual(1, bresult.Entry.Count(o => o.Resource is RelatedPerson));
                var createdFhirPatient       = bresult.Entry.FirstOrDefault(o => o.Resource.TypeName == "Patient").Resource;
                var createdFhirRelatedPerson = bresult.Entry.FirstOrDefault(o => o.Resource.TypeName == "RelatedPerson").Resource;

                // Ensure that the message is saved correctly
                var sdbPatient = this.m_patientRepository.Get(Guid.Parse(createdFhirPatient.Id));
                Assert.IsNotNull(sdbPatient);

                // Ensure that the person is related correctly
                var sdbPerson = this.m_relationshipRepository.Get(Guid.Parse(createdFhirRelatedPerson.Id));
                Assert.IsNotNull(sdbPerson);
                Assert.AreEqual(sdbPatient.Key, sdbPerson.HolderKey);

                // Get back the RelatedPerson
                var relatedPersonHandler  = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.RelatedPerson);
                var originalRelatedPerson = relatedPersonHandler.Read(sdbPerson.Key.ToString(), string.Empty);
                messageString = TestUtil.MessageToString(originalRelatedPerson);

                // Ensure that a QUERY in FHIR returns the result
                var patientHandler = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.Patient);
                var query          = new NameValueCollection();
                query.Add("identifier", "http://santedb.org/fhir/test|FHR-1234");
                var queryResult = patientHandler.Query(query);
                Assert.AreEqual(1, queryResult.Total);
                messageString = TestUtil.MessageToString(queryResult);

                // Get the patient - and mother
                patientHandler = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.Patient);
                query          = new NameValueCollection();
                query.Add("identifier", "http://santedb.org/fhir/test|FHR-1234");
                query.Add("_revinclude", "RelatedPerson:patient");
                queryResult = patientHandler.Query(query);
                Assert.AreEqual(1, queryResult.Total);
                Assert.AreEqual(2, queryResult.Entry.Count);
                messageString = TestUtil.MessageToString(queryResult);

                // Grab the related person
                var sourceRelatedPerson = queryResult.Entry.Select(o => o.Resource).OfType <RelatedPerson>().First();
                Assert.AreEqual(sdbPerson.Key.ToString(), sourceRelatedPerson.Id);
                Assert.AreEqual("Ontario", sourceRelatedPerson.Address.First().State);
                Assert.IsTrue(sourceRelatedPerson.Telecom.Count == 1);
                Assert.AreEqual("905 617 2020", sourceRelatedPerson.Telecom.First().Value);
                Assert.AreEqual("25 Tindale Crt", sourceRelatedPerson.Address.First().District);

                // The Persistence layer did not create a patient
                query = new NameValueCollection();
                query.Add("identifier", "http://santedb.org/fhir/test|FHR-9988");
                queryResult = patientHandler.Query(query);
                Assert.AreEqual(0, queryResult.Total);
                messageString = TestUtil.MessageToString(queryResult);

                // Attempt to update the related person's name
                sourceRelatedPerson.Name.First().Family = "SINGH";
                sourceRelatedPerson.Address.First().Use = Address.AddressUse.Old;
                sourceRelatedPerson.Telecom.RemoveAt(0);
                messageString = TestUtil.MessageToString(sourceRelatedPerson);

                var afterRelatedPerson = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.RelatedPerson).Update(sourceRelatedPerson.Id, sourceRelatedPerson, TransactionMode.Commit);
                Assert.AreEqual(sdbPerson.Key.ToString(), afterRelatedPerson.Id);
                sdbPerson = this.m_relationshipRepository.Get(Guid.Parse(createdFhirRelatedPerson.Id));
                Assert.IsTrue(sdbPerson.LoadProperty(o => o.TargetEntity).Names.First().Component.Any(c => c.Value == "SINGH"));
                Assert.AreEqual(Address.AddressUse.Old, sourceRelatedPerson.Address.First().Use);
                Assert.IsFalse(sourceRelatedPerson.Telecom.Any());
                messageString = TestUtil.MessageToString(afterRelatedPerson);

                // The persistence layer did create a SARAH SINGH person
                patientHandler = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.RelatedPerson);
                query          = new NameValueCollection();
                query.Add("identifier", "http://santedb.org/fhir/test|FHR-9988");
                queryResult = patientHandler.Query(query);
                Assert.AreEqual(1, queryResult.Total);
                messageString = TestUtil.MessageToString(queryResult);
                Assert.AreEqual(afterRelatedPerson.Id, queryResult.Entry.First().Resource.Id);

                // Attempt to delete the related person
                var deletedRelatedPerson = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.RelatedPerson).Delete(sourceRelatedPerson.Id, TransactionMode.Commit);
                Assert.NotNull(deletedRelatedPerson);
                Assert.IsInstanceOf <RelatedPerson>(deletedRelatedPerson);
                var actual = (RelatedPerson)deletedRelatedPerson;
                // ensure the related person is NOT active
                Assert.IsFalse(actual.Active);

                // read the related person
                var readPerson = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.RelatedPerson).Read(deletedRelatedPerson.Id, deletedRelatedPerson.VersionId);
                Assert.NotNull(readPerson);
                Assert.IsInstanceOf <RelatedPerson>(readPerson);
                var readRelatedPerson = (RelatedPerson)readPerson;
                Assert.AreEqual(Address.AddressUse.Old, readRelatedPerson.Address.First().Use);
                Assert.IsFalse(readRelatedPerson.Telecom.Any());
                // ensure the related person is NOT active
                Assert.IsFalse(readRelatedPerson.Active);
            }
        }
コード例 #2
0
        public void TestPersistComplexPatientPatientRelationship()
        {
            TestUtil.CreateAuthority("TEST", "1.2.3.4", "http://santedb.org/fhir/test", "TEST_HARNESS", this.AUTH);
            using (TestUtil.AuthenticateFhir("TEST_HARNESS", this.AUTH))
            {
                // Load the Complex Patient Message
                var request = TestUtil.GetFhirMessage("ComplexPatientPatientRelationship") as Bundle;

                var sourcePatient  = request.Entry.FirstOrDefault(o => o.Resource.TypeName == "Patient").Resource as Hl7.Fhir.Model.Patient;
                var relatedPatient = request.Entry.LastOrDefault(o => o.Resource.TypeName == "Patient").Resource as Hl7.Fhir.Model.Patient;

                // Patients must be different
                Assert.AreNotEqual(sourcePatient.Id, relatedPatient.Id);

                //
                var result = FhirResourceHandlerUtil.GetMappersFor(ResourceType.Bundle).First().Create(request, TransactionMode.Commit);
                Assert.IsInstanceOf <Bundle>(result);
                var bresult = result as Bundle;
                Assert.AreEqual(2, bresult.Entry.Count(o => o.Resource is Hl7.Fhir.Model.Patient));
                Assert.AreEqual(1, bresult.Entry.Count(o => o.Resource is RelatedPerson));

                var createdFhirPatient        = bresult.Entry.FirstOrDefault(o => o.Resource.TypeName == "Patient").Resource;
                var createdFhirRelatedPerson  = bresult.Entry.FirstOrDefault(o => o.Resource.TypeName == "RelatedPerson").Resource;
                var createdFhirRelatedPatient = bresult.Entry.LastOrDefault(o => o.Resource.TypeName == "Patient").Resource;

                // Ensure focal patient was created
                var sdbFocalPatient = this.m_patientRepository.Get(Guid.Parse(createdFhirPatient.Id));
                Assert.IsNotNull(sdbFocalPatient);

                // Ensure related patient was created
                var sdbRelatedPatient = this.m_patientRepository.Get(Guid.Parse(createdFhirRelatedPatient.Id));
                Assert.IsNotNull(sdbRelatedPatient);

                // Ensure that the focal <> related patient was created
                var sdbRelationship = this.m_relationshipRepository.Get(Guid.Parse(createdFhirRelatedPerson.Id));
                Assert.IsNotNull(sdbRelationship);                               // was saved
                Assert.AreEqual(sdbFocalPatient.Key, sdbRelationship.HolderKey); // Focal patient is the holder
                // Relationship target is a patient
                Assert.IsInstanceOf <Person>(sdbRelationship.LoadProperty(o => o.TargetEntity));

                // There is a patient related to the person
                var equivRel = sdbRelatedPatient.LoadCollection(o => o.Relationships).FirstOrDefault(o => o.RelationshipTypeKey == EntityRelationshipTypeKeys.EquivalentEntity);
                Assert.IsNotNull(equivRel);
                // Assert created patient is a the equivalent entity
                Assert.AreEqual(sdbRelatedPatient.Key, equivRel.SourceEntityKey); // Related Patient is the holder

                // Assert that the target of the related patient is the target of the relationship
                Assert.AreEqual(sdbRelationship.TargetEntityKey, equivRel.TargetEntityKey);

                // Ensure that there is a separate PERSON and separate PATIENT with the same identity
                var relatedPersons = this.m_personRepository.Find(o => o.Identifiers.Any(id => id.Authority.Url == "http://santedb.org/fhir/test" && id.Value == "FHR-4321"));
                Assert.AreEqual(2, relatedPersons.Count());
                Assert.AreEqual(1, relatedPersons.OfType <Patient>().Count());

                // Ensure that a QUERY for focal patient returns
                var patientHandler = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.Patient);
                var query          = new NameValueCollection();
                query.Add("identifier", "http://santedb.org/fhir/test|FHR-4322");
                var queryResult = patientHandler.Query(query);
                Assert.AreEqual(1, queryResult.Total);

                // Ensure a QUERY for related person returns
                query = new NameValueCollection();
                query.Add("identifier", "http://santedb.org/fhir/test|FHR-4321");
                queryResult = patientHandler.Query(query);
                Assert.AreEqual(1, queryResult.Total);

                // Ensure Query for RelatedPerson returns 1
                patientHandler = FhirResourceHandlerUtil.GetResourceHandler(ResourceType.RelatedPerson);
                query          = new NameValueCollection();
                query.Add("identifier", "http://santedb.org/fhir/test|FHR-4321");
                queryResult = patientHandler.Query(query);
                Assert.AreEqual(1, queryResult.Total);
            }
        }