public void TestDeepCopy() { var p = new Patient(); p.Name = new List <HumanName>(); p.Name.Add(HumanName.ForFamily("Kramer").WithGiven("Ewout")); p.Name.Add(HumanName.ForFamily("Kramer").WithGiven("Wouter")); p.SetExtension("http://test.nl/test", new FhirString("Hello, world")); var p2 = (Patient)p.DeepCopy(); Assert.IsTrue(p2 is Patient); Assert.AreNotEqual(p, p2); Assert.IsNotNull(p2.Name); Assert.AreNotEqual(p.Name, p2.Name); Assert.AreEqual(p.Name[0].Family.First(), p2.Name[0].Family.First()); Assert.AreEqual(p.Name[0].Given.First(), p2.Name[0].Given.First()); Assert.AreEqual(p.Name[1].Family.First(), p2.Name[1].Family.First()); Assert.AreEqual(p.Name[1].Given.First(), p2.Name[1].Given.First()); var ext = p.GetExtension("http://test.nl/test"); var ext2 = p2.GetExtension("http://test.nl/test"); Assert.AreNotEqual(ext, ext2); Assert.AreNotEqual(ext.Value, ext2.Value); Assert.AreEqual(((FhirString)ext.Value).Value, ((FhirString)ext2.Value).Value); }
public void Test_Init() { FHIRbase = new FHIRbaseApi(); CommonPatient = (Patient)FhirParser.ParseFromJson(File.ReadAllText("Examples/common_patient.json")); SimplePatient = new Patient(); SimplePatient.Name.Add(HumanName.ForFamily("Hello").WithGiven("World")); SimplePatient.Telecom.Add(new ContactPoint { System = ContactPoint.ContactPointSystem.Phone, Use = ContactPoint.ContactPointUse.Mobile, Value = "123456789" }); RemovedPatient = FHIRbase.Search("Patient"); foreach (var entryComponent in RemovedPatient.Entry) { FHIRbase.Delete(entryComponent.Resource); } SearchPatients = new List <Patient> { (Patient)FHIRbase.Create(SimplePatient), (Patient)FHIRbase.Create(SimplePatient), (Patient)FHIRbase.Create(SimplePatient), (Patient)FHIRbase.Create(CommonPatient), (Patient)FHIRbase.Create(CommonPatient), (Patient)FHIRbase.Create(CommonPatient), (Patient)FHIRbase.Create(CommonPatient) }; }
public void TestNullExtensionRemoval() { var p = new Patient { Extension = new List <Extension> { new Extension("http://hl7.org/fhir/Profile/iso-21090#qualifier", new Code("VV")), null }, Contact = new List <Patient.ContactComponent> { null, new Patient.ContactComponent { Name = HumanName.ForFamily("Kramer") }, } }; var xml = FhirXmlSerializer.SerializeToString(p); var p2 = (new FhirXmlParser()).Parse <Patient>(xml); Assert.AreEqual(1, p2.Extension.Count); Assert.AreEqual(1, p2.Contact.Count); }
public void TestSigning() { Bundle b = new Bundle(); b.Title = "Updates to resource 233"; b.Id = new Uri("urn:uuid:0d0dcca9-23b9-4149-8619-65002224c3"); b.LastUpdated = new DateTimeOffset(2012, 11, 2, 14, 17, 21, TimeSpan.Zero); b.AuthorName = "Ewout Kramer"; ResourceEntry <Patient> p = new ResourceEntry <Patient>(); p.Id = new ResourceIdentity("http://test.com/fhir/Patient/233"); p.Resource = new Patient(); p.Resource.Name = new List <HumanName> { HumanName.ForFamily("Kramer").WithGiven("Ewout") }; b.Entries.Add(p); var certificate = getCertificate(); var bundleData = FhirSerializer.SerializeBundleToXmlBytes(b); var bundleXml = Encoding.UTF8.GetString(bundleData); var bundleSigned = XmlSignatureHelper.Sign(bundleXml, certificate); _signedXml = bundleSigned; using (var response = postBundle(bundleSigned)) { if (response.StatusCode != HttpStatusCode.OK) { TestResult.Fail("Server refused POSTing signed document at /"); } } }
private Patient createData() { var result = new Patient() { Active = true, Gender = AdministrativeGender.Male }; result.Name.Add(HumanName.ForFamily("Kramer").WithGiven("Ewout")); return(result); }
public void TryScriptInject() { var x = new Patient(); x.Name.Add(HumanName.ForFamily("<script language='javascript'></script>")); var xml = FhirXmlSerializer.SerializeToString(x); Assert.IsFalse(xml.Contains("<script")); }
public void ClientForPPT() { var client = new FhirClient(new Uri("http://hl7connect.healthintersections.com.au/svc/fhir/patient/")); // Note patient is a ResourceEntry<Patient>, not a Patient var patEntry = client.Read <Patient>("1"); var pat = patEntry.Resource; pat.Name.Add(HumanName.ForFamily("Kramer").WithGiven("Ewout")); client.Update <Patient>(patEntry); }
public void Shold_ReadPatients_When_KeyIsValid() { // Setup mock fhir client and patient response Mock <IFhirClient> mockClient = new Mock <IFhirClient>(); Patient res = new Patient(); res.Name.Add(HumanName.ForFamily("Doe").WithGiven("John")); mockClient.Setup(x => x.Read <DomainResource>(It.IsAny <string>(), It.IsAny <string>(), null)).Returns(res); // Create service to tests IFhirService service = new TestService(mockClient.Object); // Execute the request to read patient's data Key key = Key.Create("Patient"); ServerFhirResponse response = service.Read(key); // Verify the response Assert.Equal(res.Name[0].Family, ((Patient)response.Resource).Name[0].Family); }
public void Test_Patient_CRUD() { var createdPatient = FhirResourceHelper.CreatePatient(); Assert.That(createdPatient, Is.Not.Null); Assert.That(createdPatient.VersionId, Is.Not.Empty); var patient = Client.Read <Patient>(string.Format("Patient/{0}", createdPatient.Id)); Assert.That(patient, Is.Not.Null); Assert.That(patient.VersionId, Is.Not.Empty); createdPatient.Name.Add(HumanName.ForFamily("Kramer").WithGiven("Hello")); var updatedPatient = Client.Update(createdPatient); Assert.That(createdPatient.VersionId, Is.Not.EqualTo(updatedPatient.VersionId)); Assert.That(updatedPatient.Name.Exists(x => x.Given.Any(y => y == "Hello")), Is.True); Client.Delete(updatedPatient); }
public void TestSigning() { Bundle b = new Bundle(); b.Title = "Updates to resource 233"; b.Id = new Uri("urn:uuid:0d0dcca9-23b9-4149-8619-65002224c3"); b.LastUpdated = new DateTimeOffset(2012, 11, 2, 14, 17, 21, TimeSpan.Zero); b.AuthorName = "Ewout Kramer"; ResourceEntry <Patient> p = new ResourceEntry <Patient>(); p.Id = new ResourceIdentity("http://test.com/fhir/Patient/233"); p.Resource = new Patient(); p.Resource.Name = new List <HumanName> { HumanName.ForFamily("Kramer").WithGiven("Ewout") }; b.Entries.Add(p); var myAssembly = typeof(TestXmlSignature).Assembly; var stream = myAssembly.GetManifestResourceStream("Spark.Tests.spark.pfx"); var data = new byte[stream.Length]; stream.Read(data, 0, (int)stream.Length); var certificate = new X509Certificate2(data); var bundleData = FhirSerializer.SerializeBundleToXmlBytes(b); var bundleXml = Encoding.UTF8.GetString(bundleData); var bundleSigned = XmlSignatureHelper.Sign(bundleXml, certificate); Assert.IsTrue(XmlSignatureHelper.IsSigned(bundleSigned)); Assert.IsTrue(XmlSignatureHelper.VerifySignature(bundleSigned)); var changedBundle = bundleSigned.Replace("<name>Ewout", "<name>Ewald"); Assert.AreEqual(bundleSigned.Length, changedBundle.Length); Assert.IsFalse(XmlSignatureHelper.VerifySignature(changedBundle)); }
// When button 2 is clikced, create patient private void button2_Click(object sender, EventArgs e) { // Edit status text createPatientStatus.Text = "Creating..."; // Set FHIR endpoint and create client var endpoint = new Uri("http://fhirtest.uhn.ca/baseDstu2"); var client = new FhirClient(endpoint); // Create new patient birthdate and name var pat = new Patient() { BirthDate = birthDate.Text, Name = new List <HumanName>() }; pat.Name.Add(HumanName.ForFamily(lastName.Text).WithGiven(givenName.Text)); // Upload to server //client.ReturnFullResource = true; client.Create(pat); createPatientStatus.Text = "Created!"; }
public static Patient CreateTestPatient(string Mrn = "", string FhirId = "") { string PatientMRNIdentifer = Mrn; if (string.IsNullOrWhiteSpace(PatientMRNIdentifer)) { PatientMRNIdentifer = Guid.NewGuid().ToString(); } //Add a Patient resource by Create Patient Pat = new Patient(); if (!string.IsNullOrWhiteSpace(FhirId)) { Pat.Id = FhirId; } Pat.Name.Add(HumanName.ForFamily("TestPatient").WithGiven("Test")); Pat.BirthDateElement = new Date("1979-09-30"); Pat.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, PatientMRNIdentifer)); Pat.Gender = AdministrativeGender.Unknown; return(Pat); }
public async Task GivenRedactAnonymizationConfig_WhenAnonymizeResource_ThenPropertiesShouldBeRedacted() { string configurationContent = @" { ""fhirPathRules"": [ { ""path"": ""Patient.name"", ""method"": ""redact"" } ] }"; Patient patient = new Patient(); patient.Name.Add(HumanName.ForFamily("Test")); IAnonymizer anonymizer = await CreateAnonymizerFromConfigContent(configurationContent); ResourceElement resourceElement = anonymizer.Anonymize(new ResourceElement(patient.ToTypedElement())); Patient anonymizedResource = resourceElement.Instance.ToPoco <Patient>(); Assert.Empty(anonymizedResource.Name); }
public async Task GivenSubstituteAnonymizationConfig_WhenAnonymizeResource_ThenSubstitutedNodeShouldBeReturned() { string configurationContent = @" { ""fhirPathRules"": [ { ""path"": ""Patient.name.family"", ""method"": ""substitute"", ""replaceWith"": ""test"" } ] }"; Patient patient = new Patient(); patient.Name.Add(HumanName.ForFamily("input")); IAnonymizer anonymizer = await CreateAnonymizerFromConfigContent(configurationContent); ResourceElement resourceElement = anonymizer.Anonymize(new ResourceElement(patient.ToTypedElement())); Patient anonymizedResource = resourceElement.Instance.ToPoco <Patient>(); Assert.Equal("test", anonymizedResource.Name.First().Family); }
public void Test_DeleteHistoryIndexes() { FhirClient clientFhir = new FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 720; // give the call a while to execute (particularly while debugging). string PatientOneResourceId = Guid.NewGuid().ToString(); string PatientOneMRNIdentifer = Guid.NewGuid().ToString(); //Add a Patient resource by Create Patient PatientOne = new Patient(); PatientOne.Id = PatientOneResourceId; PatientOne.Name.Add(HumanName.ForFamily("TestPatient").WithGiven("Test")); PatientOne.BirthDateElement = new Date("1979-09-30"); PatientOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, PatientOneMRNIdentifer)); PatientOne.Gender = AdministrativeGender.Unknown; Patient PatientResult = null; try { PatientResult = clientFhir.Update <Patient>(PatientOne); } catch (Exception Exec) { Assert.True(false, "Exception thrown on Patient resource Update: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource create by Updated returned resource of null"); PatientResult = null; //Update the patient again to ensure there are History indexes to delete try { PatientResult = clientFhir.Update <Patient>(PatientOne); } catch (Exception Exec) { Assert.True(false, "Exception thrown on Patient resource Update: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource create by Updated returned resource of null"); //------------------------------------------------------------------------------------ // ------------ Base Operation, limited types by parameters -------------------------- //------------------------------------------------------------------------------------ //Now setup to use the base operation $delete-history-indexes //Parameter Resource Parameters ParametersIn = new Parameters(); //ParametersIn.Id = Guid.NewGuid().ToString(); ParametersIn.Parameter = new List <Parameters.ParameterComponent>(); var ParamOne = new Parameters.ParameterComponent(); ParametersIn.Parameter.Add(ParamOne); ParamOne.Name = "ResourceType"; ParamOne.Value = new FhirString(FHIRAllTypes.Patient.GetLiteral()); Parameters ParametersResult = null; try { var ResourceResult = clientFhir.WholeSystemOperation(OperationName, ParametersIn); ParametersResult = ResourceResult as Parameters; } catch (Exception Exec) { Assert.True(false, $"Exception thrown on Operation call to ${OperationName}: " + Exec.Message); } Assert.NotNull(ParametersResult, "Resource create by Updated returned resource of null"); Assert.NotNull(ParametersResult.Parameter, "ParametersResult.Parameter is null"); Assert.AreEqual(ParametersResult.Parameter.Count(), 1, "ParametersResult.Parameter contains more than one parameter."); Assert.AreEqual(ParametersResult.Parameter[0].Name, $"{FHIRAllTypes.Patient.GetLiteral()}_TotalIndexesDeletedCount", "ParametersResult.Parameter.Name not as expected."); Assert.IsInstanceOf <FhirDecimal>(ParametersResult.Parameter[0].Value, "ParametersResult.Parameter.Value expected FhirDecimal."); Assert.Greater((ParametersResult.Parameter[0].Value as FhirDecimal).Value, 0, "ParametersResult.Parameter.Value expected to be greater than 0."); ParametersResult = null; //------------------------------------------------------------------------------------ // ------------ Resource Base Operation ALL resource ResourceType = *---------------------------------------------- //------------------------------------------------------------------------------------ //Now setup to use the base operation $delete-history-indexes //Parameter Resource ParametersIn = new Parameters(); ParametersIn.Id = Guid.NewGuid().ToString(); ParametersIn.Parameter = new List <Parameters.ParameterComponent>(); ParamOne = new Parameters.ParameterComponent(); ParametersIn.Parameter.Add(ParamOne); ParamOne.Name = "ResourceType"; ParamOne.Value = new FhirString("*"); ParametersResult = null; try { var ResourceResult = clientFhir.WholeSystemOperation(OperationName, ParametersIn); ParametersResult = ResourceResult as Parameters; } catch (Exception Exec) { Assert.True(false, $"Exception thrown on Operation call to ${OperationName}: " + Exec.Message); } Assert.NotNull(ParametersResult, "Resource create by Updated returned resource of null"); Assert.NotNull(ParametersResult.Parameter, "ParametersResult.Parameter is null"); Assert.AreEqual(ParametersResult.Parameter.Count(), ModelInfo.SupportedResources.Count, "ParametersResult.Parameter.Count Not equal to Supported resource total."); ParametersResult = null; //------------------------------------------------------------------------------------ // ------------ Resource Type Operation ---------------------------------------------- //------------------------------------------------------------------------------------ //Update the patient again to ensure there are History indexes to delete PatientResult = null; try { PatientResult = clientFhir.Update <Patient>(PatientOne); } catch (Exception Exec) { Assert.True(false, "Exception thrown on Patient resource Update: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource create by Updated returned resource of null"); ParametersIn = new Parameters(); ParametersIn.Id = Guid.NewGuid().ToString(); ParametersResult = null; try { var ResourceResult = clientFhir.TypeOperation <Patient>(OperationName, ParametersIn); ParametersResult = ResourceResult as Parameters; } catch (Exception Exec) { Assert.True(false, $"Exception thrown on Operation call to ${OperationName}: " + Exec.Message); } Assert.NotNull(ParametersResult, "Resource create by Updated returned resource of null"); Assert.NotNull(ParametersResult.Parameter, "ParametersResult.Parameter is null"); Assert.AreEqual(ParametersResult.Parameter.Count(), 1, "ParametersResult.Parameter contains more than one parameter."); Assert.AreEqual(ParametersResult.Parameter[0].Name, $"{FHIRAllTypes.Patient.GetLiteral()}_TotalIndexesDeletedCount", "ParametersResult.Parameter.Name not as expected."); Assert.IsInstanceOf <FhirDecimal>(ParametersResult.Parameter[0].Value, "ParametersResult.Parameter.Value expected FhirDecimal."); Assert.Greater((ParametersResult.Parameter[0].Value as FhirDecimal).Value, 0, "ParametersResult.Parameter.Value expected to be greater than 0."); //--- Clean Up --------------------------------------------------------- //Clean up by deleting all Test Patients SearchParams sp = new SearchParams().Where($"identifier={StaticTestData.TestIdentiferSystem}|"); try { clientFhir.Delete("Patient", sp); } catch (Exception Exec) { Assert.True(false, "Exception thrown on conditional delete of resource Patient: " + Exec.Message); } }
public void Test_ConditionalCreate() { Hl7.Fhir.Rest.FhirClient clientFhir = new Hl7.Fhir.Rest.FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 600; // give the call a while to execute (particularly while debugging). string TempResourceVersion = string.Empty; string TempResourceId = string.Empty; //Best to have this clean up here as things can get out of //synch with the database when debugging. //We always need a clean db to start run. var sp = new SearchParams().Where("identifier=http://TestingSystem.org/id|"); try { clientFhir.Delete("Patient", sp); } catch (Exception Exec) { Assert.True(false, "Exception thrown on conditional delete of resource G: " + Exec.Message); } // Prepare test patient Patient PatientOne = new Patient(); PatientOne.Name.Add(HumanName.ForFamily("FhirMan").WithGiven("Sam")); PatientOne.BirthDateElement = new Date("1970-01"); PatientOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "5")); SearchParams SearchParams = new SearchParams().Where("identifier=5"); try { var ResultOne = clientFhir.Create(PatientOne, SearchParams); TempResourceId = ResultOne.Id; TempResourceVersion = ResultOne.VersionId; } catch (FhirOperationException execOper) { Assert.Fail("Exception was thrown on Condition Create, message was: " + execOper.Message); } try { //This will return status OK but does not commit the resource and therefore //does not increment the resource version number clientFhir.Create(PatientOne, SearchParams); } catch (FhirOperationException execOper) { Assert.Fail("Exception was thrown on Condition Create, message was: " + execOper.Message); } try { //This will return status OK but does not commit the resource and therefore //does not increment the resource version number var PatientResult = (Patient)clientFhir.Get($"{StaticTestData.FhirEndpoint()}/Patient/{TempResourceId}"); Assert.AreEqual(TempResourceVersion, PatientResult.VersionId, "The Version Id was not correct post Conditional Create when Resource was found."); } catch (FhirOperationException execOper) { Assert.Fail("Exception was thrown on Condition Create get operation, message was: " + execOper.Message); } // Create another Patient with the same name Patient PatientTwo = new Patient(); PatientTwo.Name.Add(HumanName.ForFamily("FhirMan").WithGiven("Sam")); PatientTwo.BirthDateElement = new Date("1970-01"); PatientTwo.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "6")); try { var ResultTwo = clientFhir.Create(PatientTwo); } catch (FhirOperationException execOper) { Assert.Fail("Exception was thrown on Condition Create, message was: " + execOper.Message); } //Now try an Create another again with a search on the Name //This should fail as it will resolve to many resource Patient PatientThree = new Patient(); PatientThree.Name.Add(HumanName.ForFamily("FhirMan").WithGiven("Sam")); PatientThree.BirthDateElement = new Date("1970-01"); PatientThree.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "7")); SearchParams = new SearchParams().Where("family=FhirMan").Where("given=Sam"); try { var ResultThree = clientFhir.Create(PatientTwo, SearchParams); Assert.IsNull(ResultThree, "ResultThree should be null as the ConditionaCreate search parameters should find many resource"); } catch (FhirOperationException execOper) { Assert.AreEqual(System.Net.HttpStatusCode.PreconditionFailed, execOper.Status, "Did not get Http status 412 when resolving against many resources on ConditionalCreate"); } //Clean up by deleting all resources created while also testing Conditional Delete many sp = new SearchParams().Where("identifier=http://TestingSystem.org/id|"); try { clientFhir.Delete("Patient", sp); } catch (Exception Exec) { Assert.True(false, "Exception thrown on conditional delete of resource G: " + Exec.Message); } }
/// <summary> /// Executes the specified arguments. /// </summary> /// <param name="arguments">The arguments.</param> /// <returns>System.Int32.</returns> /// <remarks>N/A</remarks> public override int Execute(Arguments arguments) { // Get us the needed parameters first // var url = arguments["url"]; var id = arguments["id"]; var name = arguments["name"]; var firstname = arguments["firstname"]; var gender = arguments["gender"]; var dob = arguments["dob"]; var phone = arguments["phone"]; var email = arguments["email"]; // Try to retrieve patient from server and update it try { // Get patient representation from server // #region retrieve patient var client = new FhirClient(url); var identity = ResourceIdentity.Build("Patient", id); var entry = client.Read(identity) as ResourceEntry <Patient>; var patient = entry.Resource as Patient; if (patient == null) { Console.WriteLine("Could not retrieve patient {0} from server {1}", id, url); return(1); } #endregion // We have the patient now modify local representation // #region prepare patient update if (!(String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(firstname))) { patient.Name = new List <HumanName>(); patient.Name.Add(HumanName.ForFamily(name).WithGiven(firstname)); } if (!String.IsNullOrEmpty(gender)) { patient.Gender = new CodeableConcept("http://dummy.org/gender", gender, gender); } if (!String.IsNullOrEmpty(dob)) { var birthdate = DateTime.ParseExact(dob, "dd/MM/yyyy", new CultureInfo("en-US")); patient.BirthDate = birthdate.ToString("s"); } patient.Telecom = new List <Contact>(); if (!String.IsNullOrEmpty(phone)) { patient.Telecom.Add(new Contact() { Value = phone, System = Contact.ContactSystem.Phone, Use = Contact.ContactUse.Home }); } if (!String.IsNullOrEmpty(email)) { patient.Telecom.Add(new Contact() { Value = email, System = Contact.ContactSystem.Email, Use = Contact.ContactUse.Home }); } #endregion // Finally send the update to the server // #region do patient update entry.Resource = patient; client.Update(entry, false); Console.WriteLine("Patient {0} updated on server {1}", id, url); return(0); #endregion } catch (Exception e) { Console.WriteLine(e.Message); return(1); } }
public void Test_ConditionalRead() { Hl7.Fhir.Rest.FhirClient clientFhir = new Hl7.Fhir.Rest.FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 720; // give the call a while to execute (particularly while debugging). string PatientOneId = string.Empty; string PatientOneVersion = string.Empty; DateTimeOffset?PatientOneModified = null; // Prepare 3 test patients Patient PatientOne = new Patient(); string TestPat1 = Guid.NewGuid().ToString(); PatientOne.Id = TestPat1; PatientOne.Name.Add(HumanName.ForFamily("FhirMan").WithGiven("Sam")); PatientOne.BirthDateElement = new Date("1970-01"); PatientOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "6")); Patient ResultOne = null; try { ResultOne = clientFhir.Update(PatientOne); PatientOneId = ResultOne.Id; PatientOneVersion = ResultOne.VersionId; PatientOneModified = ResultOne.Meta.LastUpdated; } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Get: " + Exec.Message); } Patient PatientTwo = null; try { //Resource has not changed so should return a 304 Not Modified PatientTwo = clientFhir.Read <Patient>($"{StaticTestData.FhirEndpoint()}/Patient/{PatientOneId}", PatientOneVersion, PatientOneModified); Assert.Fail("Conditional Read is expected to throw an exception due to bug in FHIR .NET API"); } catch (FhirOperationException ExecOp) { //Catch the error and check it is a 304 http status. Assert.True(true, "FhirOperationException should be thrown on resource Read: " + ExecOp.Message); Assert.IsTrue(ExecOp.Status.IsRedirection()); } PatientTwo = null; PatientOneModified = PatientOneModified.Value.AddMinutes(-1); try { //If-Modified-Since has been pushed back 1 min so we should get a resource back this time PatientTwo = clientFhir.Read <Patient>($"{StaticTestData.FhirEndpoint()}/Patient/{PatientOneId}", PatientOneVersion, PatientOneModified); Assert.NotNull(PatientTwo, "Not Resource returned when 1 min subtracted from last-modified on Conditional Read."); //reset the PatientOneModified PatientOneModified = PatientTwo.Meta.LastUpdated; } catch (FhirOperationException ExecOp) { Assert.True(false, "FhirOperationException thrown on resource Read: " + ExecOp.Message); Assert.IsTrue(ExecOp.Status.IsRedirection()); } PatientTwo = null; PatientOneVersion = "xxxxx"; try { //If-None-Match version has been set to not match so we should get a resource back this time PatientTwo = clientFhir.Read <Patient>($"{StaticTestData.FhirEndpoint()}/Patient/{PatientOneId}", PatientOneVersion, PatientOneModified); Assert.NotNull(PatientTwo, "Not Resource returned when Resource Version did not match active resource Version on Conditional Read."); } catch (FhirOperationException ExecOp) { Assert.True(false, "FhirOperationException thrown on resource Read: " + ExecOp.Message); } //Clean up by deleting all Test Patients var sp = new SearchParams().Where("identifier=" + StaticTestData.TestIdentiferSystem + "|"); try { clientFhir.Delete("Patient", sp); } catch (Exception Exec) { Assert.True(false, "Exception thrown on conditional delete of resource G: " + Exec.Message); } }
public void Setup() { Server = StaticTestData.StartupServer(); clientFhir = new Hl7.Fhir.Rest.FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 720; // give the call a while to execute (particularly while debugging). //This Set up creates an Observation linked to a Patient as the 'subject' and an Organization as the 'performer' // Observation1 // --> Patient // --> Organization - > Endpoint // --> Observation2 // ----> Observation3 //Add a Endpoint resource //Loop only here for load testing for (int i = 0; i < 1; i++) { Endpoint EndpointOnex = new Endpoint(); EndpointOnex.Name = EndpointOneName; EndpointOneIdentifer = Guid.NewGuid().ToString(); EndpointOnex.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, EndpointOneIdentifer)); Endpoint EndPointOneResult = null; try { EndPointOneResult = clientFhir.Create(EndpointOnex); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.NotNull(EndPointOneResult, "Resource created but returned resource is null"); EndpointOneResourceId = EndPointOneResult.Id; } //Add a Endpoint resource Endpoint EndpointTwo = new Endpoint(); EndpointTwo.Name = EndpointOneName; string EndpointTwoIdentifer = Guid.NewGuid().ToString(); EndpointTwo.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, EndpointTwoIdentifer)); Endpoint EndPointTwoResult = null; try { EndPointTwoResult = clientFhir.Create(EndpointTwo); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.NotNull(EndPointTwoResult, "Resource created but returned resource is null"); string EndpointTwoResourceId = EndPointTwoResult.Id; //Add a Organization resource by Update Organization OrganizationOne = new Organization(); OrganizationOne.Name = OrganizationOneName; OrganizationOneIdentifer = Guid.NewGuid().ToString(); OrganizationOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, OrganizationOneIdentifer)); OrganizationOne.Endpoint = new List <ResourceReference>() { new ResourceReference($"{ResourceType.Endpoint.GetLiteral()}/{EndpointOneResourceId}") }; Organization OrganizationOneResult = null; try { OrganizationOneResult = clientFhir.Create(OrganizationOne); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.NotNull(OrganizationOneResult, "Resource created but returned resource is null"); OrganizationOneResourceId = OrganizationOneResult.Id; //Patient where Obs.performer -> Org.name // Add a Patient to Link to a Observation below ================================ //Loop only here for load testing debugging for (int i = 0; i < 10; i++) { Patient PatientOne = new Patient(); PatientOne.Name.Add(HumanName.ForFamily(PatientOneFamily).WithGiven("Test")); PatientOne.BirthDateElement = new Date("1979-09-30"); PatientOneMRNIdentifer = Guid.NewGuid().ToString(); PatientOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, PatientOneMRNIdentifer)); PatientOne.Gender = AdministrativeGender.Unknown; PatientOne.ManagingOrganization = new ResourceReference($"{ResourceType.Organization.GetLiteral()}/{OrganizationOneResourceId}"); Patient PatientResult = null; try { PatientResult = clientFhir.Create(PatientOne); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource created but returned resource is null"); PatientResourceId = PatientResult.Id; } //Here we set up 3 observations linked in a chain Obs1 -> Obs2 - > Obs3 to test recursive includes // Add Observation 3 Linked to no other observation // This is to test recursive includes Observation ObsResourceThree = new Observation(); ObsResourceThree.Status = ObservationStatus.Final; ObsResourceThree.Code = new CodeableConcept("http://somesystem.net/ObSystem", "WCC"); ObservationThreeIdentifer = Guid.NewGuid().ToString(); ObsResourceThree.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, ObservationTwoIdentifer)); ObsResourceThree.Subject = new ResourceReference($"{ResourceType.Patient.GetLiteral()}/{PatientResourceId}"); ObsResourceThree.Performer = new List <ResourceReference>() { new ResourceReference($"{ResourceType.Organization.GetLiteral()}/{OrganizationOneResourceId}") }; Observation ObservationThreeResult = null; try { ObservationThreeResult = clientFhir.Create(ObsResourceThree); } catch (Exception Exec) { Assert.True(false, "Exception thrown on Observation resource two create: " + Exec.Message); } Assert.NotNull(ObservationThreeResult, "Resource created but returned resource is null"); ObservationThreeResourceId = ObservationThreeResult.Id; ObservationThreeResult = null; // Add Observation 2 Linked to the Observation3 above and Patient above // This is to test recursive includes Observation ObsResourceTwo = new Observation(); ObsResourceTwo.Status = ObservationStatus.Final; ObsResourceTwo.Code = new CodeableConcept("http://somesystem.net/ObSystem", "WCC"); ObservationTwoIdentifer = Guid.NewGuid().ToString(); ObsResourceTwo.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, ObservationTwoIdentifer)); ObsResourceTwo.Subject = new ResourceReference($"{ResourceType.Patient.GetLiteral()}/{PatientResourceId}"); ObsResourceTwo.Performer = new List <ResourceReference>() { new ResourceReference($"{ResourceType.Organization.GetLiteral()}/{OrganizationOneResourceId}") }; ObsResourceTwo.Related = new List <Observation.RelatedComponent>(); var RelatedArtifact2 = new Observation.RelatedComponent(); RelatedArtifact2.Target = new ResourceReference($"{ResourceType.Observation.GetLiteral()}/{ObservationThreeResourceId}"); ObsResourceTwo.Related.Add(RelatedArtifact2); Observation ObservationTwoResult = null; try { ObservationTwoResult = clientFhir.Create(ObsResourceTwo); } catch (Exception Exec) { Assert.True(false, "Exception thrown on Observation resource two create: " + Exec.Message); } Assert.NotNull(ObservationTwoResult, "Resource created but returned resource is null"); ObservationTwoResourceId = ObservationTwoResult.Id; ObservationTwoResult = null; // Add Observation1 linked to Observation 2 above and the Patient above ================================ Observation ObsResourceOne = new Observation(); ObsResourceOne.Status = ObservationStatus.Final; ObsResourceOne.Code = new CodeableConcept("http://somesystem.net/ObSystem", "HB"); ObservationOneIdentifer = Guid.NewGuid().ToString(); ObsResourceOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, ObservationOneIdentifer)); ObsResourceOne.Subject = new ResourceReference($"{ResourceType.Patient.GetLiteral()}/{PatientResourceId}"); ObsResourceOne.Performer = new List <ResourceReference>() { new ResourceReference($"{ResourceType.Organization.GetLiteral()}/{OrganizationOneResourceId}") }; ObsResourceOne.Related = new List <Observation.RelatedComponent>(); var RelatedArtifact1 = new Observation.RelatedComponent(); RelatedArtifact1.Target = new ResourceReference($"{ResourceType.Observation.GetLiteral()}/{ObservationTwoResourceId}"); ObsResourceOne.Related.Add(RelatedArtifact1); Observation ObservationOneResult = null; try { ObservationOneResult = clientFhir.Create(ObsResourceOne); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.NotNull(ObservationOneResult, "Resource created but returned resource is null"); ObservationOneResourceId = ObservationOneResult.Id; ObservationOneResult = null; }
public void Test_PUT_IfMatch() { Hl7.Fhir.Rest.FhirClient clientFhir = new Hl7.Fhir.Rest.FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 720; // give the call a while to execute (particularly while debugging). //Best to have this clean up here as things can get out of //synch with the database when debugging. //We always need a clean db to start run. var sp = new SearchParams().Where("identifier=http://TestingSystem.org/id|"); try { clientFhir.Delete("Patient", sp); } catch (Exception Exec) { Assert.True(false, "Exception thrown on conditional delete of resource G: " + Exec.Message); } string PatientOneId = string.Empty; string PatientOneVersion = string.Empty; DateTimeOffset?PatientOneModified = null; // Prepare Patient Patient PatientOne = new Patient(); string TestPatIfMatch = Guid.NewGuid().ToString(); PatientOne.Id = TestPatIfMatch; PatientOne.Name.Add(HumanName.ForFamily("IfMatch0").WithGiven("Test0")); PatientOne.BirthDateElement = new Date("1970-01"); PatientOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "AF28B8ED-B81A-41D4-96DE-9012ED1868BD")); Patient ResultOne = null; try { ResultOne = clientFhir.Update(PatientOne); PatientOneId = ResultOne.Id; PatientOneVersion = ResultOne.VersionId; PatientOneModified = ResultOne.Meta.LastUpdated; } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Get: " + Exec.Message); } ResultOne.Name.Clear(); ResultOne.Name.Add(HumanName.ForFamily("IfMatch1").WithGiven("Test1")); Patient ResultTwo = null; try { //Perform a Version aware update that should be successfully. This uses "if-match" HTTP Header. ResultTwo = clientFhir.Update(ResultOne, true); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Get: " + Exec.Message); } //Increment the last returned resource's version by one and then attempt a version aware update. //This should fail with a HTTP Error '409 Conflict' ResultTwo.VersionId = (Convert.ToInt32(ResultTwo.VersionId) + 1).ToString(); Patient ResultThree = null; try { ResultThree = clientFhir.Update(ResultTwo, true); } catch (FhirOperationException execOper) { Assert.AreEqual(System.Net.HttpStatusCode.Conflict, execOper.Status, "Did not get Http status 409 Conflict on incorrect Version aware update."); } catch (Exception Exec) { Assert.True(false, "Exception thrown on Version aware update: " + Exec.Message); } //Clean up by deleting all Test Patients sp = new SearchParams().Where("identifier=http://TestingSystem.org/id|"); try { clientFhir.Delete("Patient", sp); } catch (Exception Exec) { Assert.True(false, "Exception thrown on conditional delete of resource G: " + Exec.Message); } }
public void Test_ConditionalUpdate() { Hl7.Fhir.Rest.FhirClient clientFhir = new Hl7.Fhir.Rest.FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 720; // give the call a while to execute (particularly while debugging). // Prepare 3 test patients Patient p1 = new Patient(); string TestPat1 = Guid.NewGuid().ToString(); p1.Id = TestPat1; p1.Name.Add(HumanName.ForFamily("Postlethwaite").WithGiven("Brian")); p1.BirthDateElement = new Date("1970-01"); p1.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "1")); var r1 = clientFhir.Update(p1); Patient p2 = new Patient(); string TestPat2 = Guid.NewGuid().ToString(); p2.Id = TestPat2; p2.Name.Add(HumanName.ForFamily("Portlethwhite").WithGiven("Brian")); p2.BirthDateElement = new Date("1970-01"); p2.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "1")); var r2 = clientFhir.Update(p2); Patient p3 = new Patient(); string TestPat3 = Guid.NewGuid().ToString(); p3.Id = TestPat3; p3.Name.Add(HumanName.ForFamily("Dole").WithGiven("Bob")); p3.BirthDateElement = new Date("1957-01"); p3.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "1")); var r3 = clientFhir.Update(p3); // Test the conditional update now // Try to update Bob Doles data Patient p3a = new Patient(); p3a.Name.Add(HumanName.ForFamily("Dole").WithGiven("Bob")); p3a.BirthDateElement = new Date("1957-01-12"); p3a.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "1")); SearchParams sp = new SearchParams().Where("name=Dole").Where("birthdate=1957-01"); var r3a = clientFhir.Update(p3a, sp); Assert.AreEqual(TestPat3, r3a.Id, "pat3 should have been updated (not a new one created)"); Assert.AreEqual("1957-01-12", r3a.BirthDate, "Birth date should have been updated"); // Try to update Brian's data (which has multuple rows!) Patient p1a = new Patient(); p1a.Name.Add(HumanName.ForFamily("Postlethwaite").WithGiven("Brian")); p1a.BirthDateElement = new Date("1970-02"); p1a.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "1")); sp = new SearchParams().Where("identifier=1"); try { var r1a = clientFhir.Update(p1a, sp); Assert.Fail("This identifier is used multiple times, the conditional update should have failed"); } catch (FhirOperationException ex) { Assert.AreEqual(System.Net.HttpStatusCode.PreconditionFailed, ex.Status, "Expected failure of the update due to a pre-condition check"); } // Try to update Bob Doles data with incorrect id Patient p3b = new Patient(); p3b.Id = "NotTheCorrectId"; p3b.Name.Add(HumanName.ForFamily("Dole").WithGiven("Bob")); p3b.BirthDateElement = new Date("1957-01-01"); p3b.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "1")); try { var r3b = clientFhir.Update(p3b, sp); Assert.Fail("This identifier given in the resource Update does not match the Id in the resource located by search."); } catch (FhirOperationException ex) { Assert.AreEqual(System.Net.HttpStatusCode.PreconditionFailed, ex.Status, "Expected failure of the update due to a pre-condition check"); } // Try to update New Patient resource where search returns zero hits and Resource is created occurs Patient p4 = new Patient(); p4.Name.Add(HumanName.ForFamily("Dole4").WithGiven("John")); p4.BirthDateElement = new Date("1957-01-01"); p4.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, "2")); sp = new SearchParams().Where("identifier=http://TestingSystem.org/id|2"); Patient r4 = null; try { r4 = clientFhir.Update(p4, sp); } catch (FhirOperationException ex) { Assert.True(false, "Update p4 failed" + ex.Message); } //Clean up by deleting all resources created while also testing Conditional Delete many sp = new SearchParams().Where("identifier=http://TestingSystem.org/id|"); try { clientFhir.Delete("Patient", sp); } catch (Exception Exec) { Assert.True(false, "Exception thrown on conditional delete of resource G: " + Exec.Message); } }
private static Resource MediMobiExample() { var patient = new Patient { Id = "patient", Identifier = new List <Identifier> { new Identifier("https://www.ehealth.fgov.be/standards/fhir/NamingSystem/ssin", "00.01.01-003.03") }, Name = new List <HumanName> { HumanName.ForFamily("Doe").WithGiven("Jane") }, Gender = AdministrativeGender.Female, Language = "nl-be", Address = new List <Address> { new Address() { Line = new [] { "Astridstraat 192" }, City = "Zottegem", PostalCode = "9620", Use = Address.AddressUse.Home } }, Telecom = new List <ContactPoint> { new ContactPoint(ContactPoint.ContactPointSystem.Phone, ContactPoint.ContactPointUse.Mobile, "+32478123456"), new ContactPoint(ContactPoint.ContactPointSystem.Email, ContactPoint.ContactPointUse.Home, "*****@*****.**") } }; var campus = new Location() { Id = "campus", Name = "Hospital X - campus Ghent", Address = new Address { Line = new List <string>() { "Steenweg 37" }, PostalCode = "9000", City = "Ghent" } }; var location = new Location { Id = "location", Name = "Wachtzaal Orthopedie", Alias = new [] { "Route 37" }, PartOf = new ResourceReference("#campus"), Contained = new List <Resource> { campus } }; var healthcareService = new HealthcareService() { Id = "healthcareService", Identifier = new List <Identifier> { new Identifier("http://demohospital.mediligo.com/service", "orthopedics") }, Specialty = new List <CodeableConcept> { new CodeableConcept("http://snomed.info/sct", "394801008") }, Name = "Orthopedie" }; var x = new Appointment { Id = "example", Contained = new List <Resource> { patient, location, healthcareService }, Identifier = new List <Identifier> { new Identifier("http://demohospital.mediligo.com/appointement", "1234") }, Status = Appointment.AppointmentStatus.Booked, ServiceCategory = new List <CodeableConcept> { new CodeableConcept("https://demohospital.mediligo.com/serviceType", "shoulder-first-consult"), new CodeableConcept("http://mediligo.com/fhir/MediMobi/CodeSystem/medimobi-appointment-class", "consultation-mobile") }, Start = new DateTimeOffset(2020, 10, 24, 10, 0, 0, TimeSpan.FromHours(1)), End = new DateTimeOffset(2020, 10, 24, 11, 0, 0, TimeSpan.FromHours(1)), Participant = new List <Appointment.ParticipantComponent> { new Appointment.ParticipantComponent { Actor = new ResourceReference("#patient") }, new Appointment.ParticipantComponent { Actor = new ResourceReference("#location") }, new Appointment.ParticipantComponent { Actor = new ResourceReference("#healthcareService") } } }; return(x); }
static void Main(string[] args) { const string kDeviceId = "device-0001"; const string kObservationId = "bp-0001"; const string kPatientId = "patient-0001"; const string kPractitionerId = "practitioner-0001"; Patient patient = new Patient() { Id = kPatientId }; patient.Name.Add(HumanName.ForFamily("Miranda").WithGiven("Jorge")); Practitioner practitioner = new Practitioner() { Id = kPractitionerId }; practitioner.Name.Add(HumanName.ForFamily("Banerjee").WithGiven("Suprateek")); Device device = new Device() { Id = kDeviceId, Manufacturer = "A&D", Model = "UA-651BLE" }; Observation observation = new Observation() { Id = kObservationId, Device = new ResourceReference("Device/" + kDeviceId), Subject = new ResourceReference("Patient" + kPatientId) }; observation.Performer.Add(new ResourceReference("Practitioner" + kPractitionerId)); /* Systolic component */ Observation.ComponentComponent systolic = new Observation.ComponentComponent(); systolic.Code = new CodeableConcept(); systolic.Code.Coding.Add(new Coding("http://loinc.org", "8480 - 6")); systolic.Code.Coding.Add(new Coding("http://snomed.info/sct", "271649006")); systolic.Value = new Quantity() { Value = 107, Unit = "mmHg", Code = "mm[Hg]" }; systolic.Interpretation = new CodeableConcept("http://hl7.org/fhir/v2/0078", "N", "normal"); /* Diastolic component */ Observation.ComponentComponent diastolic = new Observation.ComponentComponent(); diastolic.Code = new CodeableConcept("http://loinc.org", "8462-4"); diastolic.Code = new CodeableConcept("http://snomed.info/sct", "271650006"); diastolic.Value = new Quantity() { Value = 60, Unit = "mmHg", Code = "mm[Hg]" }; diastolic.Interpretation = new CodeableConcept("http://hl7.org/fhir/v2/0078", "L", "low"); observation.Component.Add(systolic); observation.Component.Add(diastolic); string json = FhirSerializer.SerializeToJson(observation); }
public void Test_CaseSensitive_FHIR_Id() { CleanUpByIdentifier(ResourceType.Patient); Hl7.Fhir.Rest.FhirClient clientFhir = new Hl7.Fhir.Rest.FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 720; // give the call a while to execute (particularly while debugging). //Add a Patient resource by Update Patient PatientOne = new Patient(); string PatientOneResourceId = Guid.NewGuid().ToString().ToLower(); PatientOne.Id = PatientOneResourceId; string PatientOneFamilyName = "TestPatientOne"; PatientOne.Name.Add(HumanName.ForFamily(PatientOneFamilyName).WithGiven("Test")); PatientOne.BirthDateElement = new Date("1979-09-30"); string PatientOneMRNIdentifer = Guid.NewGuid().ToString(); PatientOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, PatientOneMRNIdentifer)); PatientOne.Gender = AdministrativeGender.Unknown; Patient PatientResult = null; try { PatientResult = clientFhir.Update(PatientOne); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource create by Updated returned resource of null"); PatientResult = null; //Add a Patient resource by Update Patient PatientTwo = new Patient(); string PatientTwoResourceId = PatientOneResourceId.ToUpper(); PatientTwo.Id = PatientTwoResourceId; string PatientTwoFamilyName = "TestPatientTwo"; PatientTwo.Name.Add(HumanName.ForFamily(PatientTwoFamilyName).WithGiven("Test")); PatientTwo.BirthDateElement = new Date("1979-09-30"); string PatientTwoMRNIdentifer = Guid.NewGuid().ToString(); PatientTwo.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, PatientOneMRNIdentifer)); PatientTwo.Gender = AdministrativeGender.Unknown; PatientResult = null; try { PatientResult = clientFhir.Update(PatientTwo); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource create by Updated returned resource of null"); PatientResult = null; Bundle SearchResult = null; try { SearchResult = clientFhir.SearchById<Patient>(PatientOneResourceId); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.AreEqual(1, SearchResult.Entry.Count); Assert.AreEqual(PatientOneFamilyName, (SearchResult.Entry[0].Resource as Patient).Name[0].Family); SearchResult = null; try { SearchResult = clientFhir.SearchById<Patient>(PatientTwoResourceId); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.AreEqual(1, SearchResult.Entry.Count); Assert.AreEqual(PatientTwoFamilyName, (SearchResult.Entry[0].Resource as Patient).Name[0].Family); //--- Clean Up --------------------------------------------------------- //Clean up by deleting all Test Patients SearchParams sp = new SearchParams().Where($"identifier={StaticTestData.TestIdentiferSystem}|"); try { clientFhir.Delete("Patient", sp); } catch (Exception Exec) { Assert.True(false, "Exception thrown on conditional delete of resource Patient: " + Exec.Message); } }
/// <summary> /// Executes the specified arguments. /// </summary> /// <param name="arguments">The arguments.</param> /// <returns>System.Int32.</returns> public override int Execute(Arguments arguments) { // Get us the needed parameters first // var url = arguments["url"]; var name = arguments["name"]; var firstname = arguments["firstname"]; var gender = arguments["gender"]; var dob = arguments["dob"]; var phone = arguments["phone"]; var email = arguments["email"]; // Create an in-memory representation of a Patient resource var patient = new Patient(); if (!(String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(firstname))) { patient.Name = new List <HumanName>(); patient.Name.Add(HumanName.ForFamily(name).WithGiven(firstname)); } if (!String.IsNullOrEmpty(gender)) { patient.Gender = new CodeableConcept("http://dummy.org/gender", gender, gender); } if (!String.IsNullOrEmpty(dob)) { var birthdate = DateTime.ParseExact(dob, "dd/MM/yyyy", new CultureInfo("en-US")); patient.BirthDate = birthdate.ToString("s"); } patient.Telecom = new List <Contact>(); if (!String.IsNullOrEmpty(phone)) { patient.Telecom.Add(new Contact() { Value = phone, System = Contact.ContactSystem.Phone, Use = Contact.ContactUse.Home }); } if (!String.IsNullOrEmpty(email)) { patient.Telecom.Add(new Contact() { Value = email, System = Contact.ContactSystem.Email, Use = Contact.ContactUse.Home }); } try { var client = new FhirClient(url); var entry = client.Create(patient); if (entry == null) { Console.WriteLine("Couldn not register patient on server {0}", url); return(1); } var identity = new ResourceIdentity(entry.Id); ID = identity.Id; Console.WriteLine("Registered patient {0} on server {1}", ID, url); return(0); } catch (Exception e) { Console.WriteLine(e.Message); return(1); } }
public void Test_BundleTransaction() { Hl7.Fhir.Rest.FhirClient clientFhir = new Hl7.Fhir.Rest.FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 1000; // give the call a while to execute (particularly while debugging). //------------------------------------------------------------------------------------------------------ //Transaction Bundle 1 (Create) --------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------ Bundle TransBundle = new Bundle(); TransBundle.Id = Guid.NewGuid().ToString(); TransBundle.Type = Bundle.BundleType.Transaction; TransBundle.Entry = new List <Bundle.EntryComponent>(); string PatientOneMRNIdentifer = Guid.NewGuid().ToString(); string OrganizationOneMRNIdentifer = Guid.NewGuid().ToString(); //Add a Patient resource by Create Patient PatientOne = StaticTestData.CreateTestPatient(PatientOneMRNIdentifer); string OrgOneResourceIdFulUrl = CreateFullUrlUUID(Guid.NewGuid().ToString()); PatientOne.ManagingOrganization = new ResourceReference() { Reference = OrgOneResourceIdFulUrl }; var PatientEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(PatientEntry); PatientEntry.Resource = PatientOne; PatientEntry.Request = new Bundle.RequestComponent(); PatientEntry.Request.Method = Bundle.HTTPVerb.POST; string PatientResourceIdFulUrl = CreateFullUrlUUID(Guid.NewGuid().ToString()); PatientEntry.FullUrl = PatientResourceIdFulUrl; PatientEntry.Resource = PatientOne; PatientEntry.Request = new Bundle.RequestComponent(); PatientEntry.Request.Method = Bundle.HTTPVerb.POST; PatientEntry.Request.Url = "Patient"; //Add a Organization resource by Create Organization OrganizationOne = new Organization(); OrganizationOne.Name = "Test OrganizationOne"; OrganizationOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, OrganizationOneMRNIdentifer)); var OrganizationOneEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(OrganizationOneEntry); OrganizationOneEntry.Resource = OrganizationOne; OrganizationOneEntry.Request = new Bundle.RequestComponent(); OrganizationOneEntry.Request.Method = Bundle.HTTPVerb.POST; OrganizationOneEntry.FullUrl = OrgOneResourceIdFulUrl; OrganizationOneEntry.Resource = OrganizationOne; OrganizationOneEntry.Request = new Bundle.RequestComponent(); OrganizationOneEntry.Request.Method = Bundle.HTTPVerb.POST; OrganizationOneEntry.Request.Url = "Organization"; Bundle TransactionResult = null; try { TransactionResult = clientFhir.Transaction(TransBundle); } catch (Exception Exec) { Assert.True(false, "Exception thrown on POST Transaction bundle: " + Exec.Message); } Assert.True(TransactionResult.Type == Bundle.BundleType.TransactionResponse); Assert.IsTrue(TransactionResult.Entry[0].Response.Status.Contains(System.Net.HttpStatusCode.Created.ToString())); Assert.IsTrue(TransactionResult.Entry[1].Response.Status.Contains(System.Net.HttpStatusCode.Created.ToString())); Patient TransactionResultPatient = TransactionResult.Entry[0].Resource as Patient; Organization TransactionResultOrganization = TransactionResult.Entry[1].Resource as Organization; string PatientOneResourceId = TransactionResult.Entry[0].Resource.Id; string OrgOneResourceId = TransactionResult.Entry[1].Resource.Id; //Check that the referance in the Patient to the Organization has been updated. Assert.AreEqual(TransactionResultPatient.ManagingOrganization.Reference, $"Organization/{TransactionResultOrganization.Id}"); //Check the Response Etag matches the resource Version number string PatientResourceVersionNumber = TransactionResultPatient.VersionId; Assert.AreEqual(Common.Tools.HttpHeaderSupport.GetEntityTagHeaderValueFromVersion(PatientResourceVersionNumber).Tag, Common.Tools.HttpHeaderSupport.GetETagEntityTagHeaderValueFromETagString(TransactionResult.Entry[0].Response.Etag).Tag); //Check that the FullURL of the entry is correct aginst the returned Resource string PatientFullUrlExpected = $"{StaticTestData.FhirEndpoint()}/Patient/{PatientOneResourceId}"; Assert.AreEqual(PatientFullUrlExpected, TransactionResult.Entry[0].FullUrl); //------------------------------------------------------------------------------------------------------ //Transaction Bundle 2 (Update) ------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------ TransBundle.Id = Guid.NewGuid().ToString(); TransBundle.Entry.Clear(); //Patient PatientOne.Id = PatientOneResourceId; PatientOne.Name.Clear(); string PatientFamilyName = "TestPatientUpdate"; PatientOne.Name.Add(HumanName.ForFamily(PatientFamilyName).WithGiven("TestUpdate")); //PatientOne.BirthDateElement = new Date("1979-09-30"); //PatientOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, PatientOneMRNIdentifer)); //PatientOne.Gender = AdministrativeGender.Unknown; PatientEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(PatientEntry); PatientResourceIdFulUrl = $"{StaticTestData.FhirEndpoint()}/Patient/{PatientOneResourceId}"; PatientEntry.FullUrl = PatientResourceIdFulUrl; PatientEntry.Resource = PatientOne; PatientEntry.Request = new Bundle.RequestComponent(); PatientEntry.Request.Method = Bundle.HTTPVerb.PUT; PatientEntry.Request.Url = $"Patient/{PatientOneResourceId}"; //Organization OrganizationOne.Id = OrgOneResourceId; OrganizationOne.Name = "Test OrganizationOne Updated"; //OrganizationOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, OrganizationOneMRNIdentifer)); OrganizationOneEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(OrganizationOneEntry); OrgOneResourceIdFulUrl = $"{StaticTestData.FhirEndpoint()}/Organization/{OrgOneResourceId}"; OrganizationOneEntry.FullUrl = OrgOneResourceIdFulUrl; OrganizationOneEntry.Resource = OrganizationOne; OrganizationOneEntry.Request = new Bundle.RequestComponent(); OrganizationOneEntry.Request.Method = Bundle.HTTPVerb.PUT; OrganizationOneEntry.Request.Url = $"Organization/{OrgOneResourceId}"; TransactionResult = null; try { TransactionResult = clientFhir.Transaction(TransBundle); } catch (Exception Exec) { Assert.True(false, "Exception thrown on PUT Transaction bundle: " + Exec.Message); } Assert.IsTrue(TransactionResult.Entry[0].Response.Status.Contains(System.Net.HttpStatusCode.OK.ToString())); Assert.IsTrue(TransactionResult.Entry[1].Response.Status.Contains(System.Net.HttpStatusCode.OK.ToString())); TransactionResultPatient = TransactionResult.Entry[0].Resource as Patient; TransactionResultOrganization = TransactionResult.Entry[1].Resource as Organization; //Check the family name was updated in the returned resource Assert.AreEqual(PatientFamilyName, TransactionResultPatient.Name[0].Family); //------------------------------------------------------------------------------------------------------ //Transaction Bundle 3 (GET) ------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------ TransBundle.Id = Guid.NewGuid().ToString(); TransBundle.Entry.Clear(); PatientEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(PatientEntry); PatientEntry.Request = new Bundle.RequestComponent(); PatientEntry.Request.Method = Bundle.HTTPVerb.GET; PatientEntry.Request.Url = $"Patient/{TransactionResultPatient.Id}"; OrganizationOneEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(OrganizationOneEntry); OrganizationOneEntry.Request = new Bundle.RequestComponent(); OrganizationOneEntry.Request.Method = Bundle.HTTPVerb.GET; OrganizationOneEntry.Request.Url = $"Organization/{TransactionResultOrganization.Id}"; TransactionResult = null; try { TransactionResult = clientFhir.Transaction(TransBundle); } catch (Exception Exec) { Assert.True(false, "Exception thrown on GET Transaction bundle" + Exec.Message); } Assert.IsTrue(TransactionResult.Entry[0].Response.Status.Contains(System.Net.HttpStatusCode.OK.ToString())); Assert.IsTrue(TransactionResult.Entry[1].Response.Status.Contains(System.Net.HttpStatusCode.OK.ToString())); TransactionResultPatient = TransactionResult.Entry[0].Resource as Patient; TransactionResultOrganization = TransactionResult.Entry[1].Resource as Organization; //------------------------------------------------------------------------------------------------------ //Transaction Bundle 4 Search (GET) ------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------ TransBundle.Id = Guid.NewGuid().ToString(); TransBundle.Entry.Clear(); PatientEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(PatientEntry); PatientEntry.Request = new Bundle.RequestComponent(); PatientEntry.Request.Method = Bundle.HTTPVerb.GET; PatientEntry.Request.Url = $"Patient?identifier={StaticTestData.TestIdentiferSystem}|{PatientOneMRNIdentifer}"; OrganizationOneEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(OrganizationOneEntry); OrganizationOneEntry.Request = new Bundle.RequestComponent(); OrganizationOneEntry.Request.Method = Bundle.HTTPVerb.GET; OrganizationOneEntry.Request.Url = $"Organization?identifier={StaticTestData.TestIdentiferSystem}|{OrganizationOneMRNIdentifer}"; TransactionResult = null; try { TransactionResult = clientFhir.Transaction(TransBundle); } catch (Exception Exec) { Assert.True(false, "Exception thrown on GET Transaction bundle" + Exec.Message); } Assert.IsTrue(TransactionResult.Entry[0].Response.Status.Contains(System.Net.HttpStatusCode.OK.ToString())); Assert.IsTrue(TransactionResult.Entry[1].Response.Status.Contains(System.Net.HttpStatusCode.OK.ToString())); Bundle TransactionResultSearchPatientOneBundle = TransactionResult.Entry[0].Resource as Bundle; Bundle TransactionResultOrganizationSearchBundle = TransactionResult.Entry[1].Resource as Bundle; //Check we only got one back in the search bundle Assert.AreEqual(TransactionResultSearchPatientOneBundle.Entry.Count, 1); Assert.AreEqual(TransactionResultOrganizationSearchBundle.Entry.Count, 1); //Check that each we got back were the two we added. Assert.AreEqual(TransactionResultSearchPatientOneBundle.Entry[0].Resource.Id, PatientOneResourceId); Assert.AreEqual(TransactionResultOrganizationSearchBundle.Entry[0].Resource.Id, OrgOneResourceId); //------------------------------------------------------------------------------------------------------ //Transaction Bundle 5 If-Match (GET) -------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------ TransBundle.Id = Guid.NewGuid().ToString(); TransBundle.Entry.Clear(); PatientEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(PatientEntry); PatientEntry.Request = new Bundle.RequestComponent(); PatientEntry.Request.Method = Bundle.HTTPVerb.GET; PatientEntry.Request.Url = $"Patient?identifier={StaticTestData.TestIdentiferSystem}|{PatientOneMRNIdentifer}"; PatientEntry.Request.IfMatch = Common.Tools.HttpHeaderSupport.GetETagString(TransactionResultSearchPatientOneBundle.Entry[0].Resource.VersionId); OrganizationOneEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(OrganizationOneEntry); OrganizationOneEntry.Request = new Bundle.RequestComponent(); OrganizationOneEntry.Request.Method = Bundle.HTTPVerb.GET; OrganizationOneEntry.Request.Url = $"Organization?identifier={StaticTestData.TestIdentiferSystem}|{OrganizationOneMRNIdentifer}"; OrganizationOneEntry.Request.IfMatch = Common.Tools.HttpHeaderSupport.GetETagString(TransactionResultOrganizationSearchBundle.Entry[0].Resource.VersionId); TransactionResult = null; try { TransactionResult = clientFhir.Transaction(TransBundle); } catch (Exception Exec) { Assert.True(false, "Exception thrown on GET Transaction bundle" + Exec.Message); } Assert.IsTrue(TransactionResult.Entry[0].Response.Status.Contains(System.Net.HttpStatusCode.OK.ToString())); Assert.IsTrue(TransactionResult.Entry[1].Response.Status.Contains(System.Net.HttpStatusCode.OK.ToString())); TransactionResultSearchPatientOneBundle = TransactionResult.Entry[0].Resource as Bundle; TransactionResultOrganizationSearchBundle = TransactionResult.Entry[1].Resource as Bundle; //Check we only got one back in the search bundle Assert.AreEqual(TransactionResultSearchPatientOneBundle.Entry.Count, 1); Assert.AreEqual(TransactionResultOrganizationSearchBundle.Entry.Count, 1); //------------------------------------------------------------------------------------------------------ //Transaction Bundle 6 If-Match (DELETE) -------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------ TransBundle.Id = Guid.NewGuid().ToString(); TransBundle.Entry.Clear(); PatientEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(PatientEntry); PatientEntry.Request = new Bundle.RequestComponent(); PatientEntry.Request.Method = Bundle.HTTPVerb.DELETE; PatientEntry.Request.Url = $"Patient?identifier={StaticTestData.TestIdentiferSystem}|{PatientOneMRNIdentifer}"; PatientEntry.Request.IfMatch = Common.Tools.HttpHeaderSupport.GetETagString(TransactionResultSearchPatientOneBundle.Entry[0].Resource.VersionId); OrganizationOneEntry = new Bundle.EntryComponent(); TransBundle.Entry.Add(OrganizationOneEntry); OrganizationOneEntry.Request = new Bundle.RequestComponent(); OrganizationOneEntry.Request.Method = Bundle.HTTPVerb.DELETE; OrganizationOneEntry.Request.Url = $"Organization?identifier={StaticTestData.TestIdentiferSystem}|{OrganizationOneMRNIdentifer}"; OrganizationOneEntry.Request.IfMatch = Common.Tools.HttpHeaderSupport.GetETagString(TransactionResultOrganizationSearchBundle.Entry[0].Resource.VersionId); TransactionResult = null; try { TransactionResult = clientFhir.Transaction(TransBundle); } catch (Exception Exec) { Assert.True(false, "Exception thrown on GET Transaction bundle" + Exec.Message); } Assert.IsTrue(TransactionResult.Entry[0].Response.Status.Contains(System.Net.HttpStatusCode.NoContent.ToString())); Assert.IsTrue(TransactionResult.Entry[1].Response.Status.Contains(System.Net.HttpStatusCode.NoContent.ToString())); CleanUpByIdentifier(ResourceType.Patient); CleanUpByIdentifier(ResourceType.Organization); }
public void Test_CRUD() { Hl7.Fhir.Rest.FhirClient clientFhir = new Hl7.Fhir.Rest.FhirClient(StaticTestData.FhirEndpoint(), false); clientFhir.Timeout = 1000 * 720; // give the call a while to execute (particularly while debugging). string PatientResourceId = string.Empty; //Add a Patient resource by Update Patient PatientOne = new Patient(); PatientOne.Name.Add(HumanName.ForFamily("TestPatient").WithGiven("Test")); PatientOne.BirthDateElement = new Date("1979-09-30"); string PatientOneMRNIdentifer = Guid.NewGuid().ToString(); PatientOne.Identifier.Add(new Identifier(StaticTestData.TestIdentiferSystem, PatientOneMRNIdentifer)); PatientOne.Gender = AdministrativeGender.Unknown; Patient PatientResult = null; try { PatientResult = clientFhir.Create(PatientOne); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Create: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource create by Updated returned resource of null"); PatientResourceId = PatientResult.Id; PatientResult = null; //Get the Added resource by Id try { //PatientOneResourceId PatientResult = (Patient)clientFhir.Get($"{StaticTestData.FhirEndpoint()}/Patient/{PatientResourceId}"); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Get: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource Get returned resource of null"); Assert.AreEqual(PatientResourceId, PatientResult.Id, "Resource created by Updated has incorrect Resource Id"); Assert.AreEqual(AdministrativeGender.Unknown, PatientResult.Gender, "Patient gender does not match."); //Update PatientResult.Gender = AdministrativeGender.Male; try { clientFhir.Update(PatientResult); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Get: " + Exec.Message); } PatientResult = null; //Get the Added resource by Id try { PatientResult = (Patient)clientFhir.Get($"{StaticTestData.FhirEndpoint()}/Patient/{PatientResourceId}"); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Get: " + Exec.Message); } Assert.NotNull(PatientResult, "Resource Get returned resource of null"); Assert.AreEqual(AdministrativeGender.Male, PatientResult.Gender, "Patient gender does not match."); //Delete Resource try { clientFhir.Delete($"Patient/{PatientResourceId}"); } catch (Exception Exec) { Assert.True(false, "Exception thrown on resource Get: " + Exec.Message); } //Get the Added resource by Id try { var Result = clientFhir.Get($"{StaticTestData.FhirEndpoint()}/Patient/{PatientResourceId}"); } catch (Hl7.Fhir.Rest.FhirOperationException OpExec) { Assert.AreEqual(OpExec.Status, System.Net.HttpStatusCode.Gone, "Final Get did not return Http Status of Gone."); } }