plan_executor 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +44 -0
- data/.simplecov +16 -0
- data/.travis.yml +13 -0
- data/Gemfile +26 -0
- data/Gemfile.lock +197 -0
- data/LICENSE +201 -0
- data/README.md +126 -0
- data/Rakefile +25 -0
- data/fixtures/daf/conformance-daf-query-responder.xml +1471 -0
- data/fixtures/diagnostic_order/do-100.xml +64 -0
- data/fixtures/diagnostic_order/do-200.xml +121 -0
- data/fixtures/diagnostic_order/do-300.xml +91 -0
- data/fixtures/diagnostic_order/do-400.xml +88 -0
- data/fixtures/diagnostic_report/dr-100.xml +96 -0
- data/fixtures/diagnostic_report/dr-200.xml +125 -0
- data/fixtures/diagnostic_report/dr-300.xml +132 -0
- data/fixtures/diagnostic_report/dr-400.xml +121 -0
- data/fixtures/financial/claim-example-average.xml +168 -0
- data/fixtures/financial/claim-example-simple.xml +67 -0
- data/fixtures/observation/obs-100.xml +58 -0
- data/fixtures/observation/obs-101.xml +58 -0
- data/fixtures/observation/obs-200.xml +125 -0
- data/fixtures/observation/obs-300.xml +106 -0
- data/fixtures/observation/obs-301.xml +106 -0
- data/fixtures/observation/obs-302.xml +106 -0
- data/fixtures/observation/obs-303.xml +106 -0
- data/fixtures/observation/obs-304.xml +106 -0
- data/fixtures/observation/obs-400.xml +87 -0
- data/fixtures/observation/obs-401.xml +95 -0
- data/fixtures/observation/obs-402.xml +95 -0
- data/fixtures/observation/obs-403.xml +84 -0
- data/fixtures/observation/obs-404.xml +84 -0
- data/fixtures/observation/obs-405.xml +83 -0
- data/fixtures/observation/obs-406.xml +83 -0
- data/fixtures/observation/obs-407.xml +70 -0
- data/fixtures/observation/obs-408.xml +84 -0
- data/fixtures/observation/obs-uslab-example5.xml +102 -0
- data/fixtures/order/order-100.xml +61 -0
- data/fixtures/order/order-200.xml +61 -0
- data/fixtures/order/order-300.xml +61 -0
- data/fixtures/order/order-400.xml +61 -0
- data/fixtures/order_response/ordresp-100.xml +79 -0
- data/fixtures/order_response/ordresp-110.xml +79 -0
- data/fixtures/order_response/ordresp-200.xml +79 -0
- data/fixtures/order_response/ordresp-210.xml +79 -0
- data/fixtures/order_response/ordresp-300.xml +79 -0
- data/fixtures/order_response/ordresp-310.xml +79 -0
- data/fixtures/order_response/ordresp-400.xml +79 -0
- data/fixtures/order_response/ordresp-410.xml +79 -0
- data/fixtures/organization/org-uslab-example3.xml +49 -0
- data/fixtures/patient/patient-example-updated.xml +140 -0
- data/fixtures/patient/patient-example-us-extensions(us01).xml +81 -0
- data/fixtures/patient/patient-example.xml +132 -0
- data/fixtures/patient/patient-format-example.xml +101 -0
- data/fixtures/patient/patient-minimal.xml +9 -0
- data/fixtures/patient/patient-uslab-example1.xml +44 -0
- data/fixtures/practitioner/pract-uslab-example1.xml +18 -0
- data/fixtures/practitioner/pract-uslab-example3.xml +36 -0
- data/fixtures/record/condition-example-f201-fever.xml +63 -0
- data/fixtures/record/condition-example-f205-infection.xml +20 -0
- data/fixtures/record/diagnosticreport-example-f201-brainct.xml +18 -0
- data/fixtures/record/encounter-example-f201-20130404.xml +17 -0
- data/fixtures/record/encounter-example-f202-20130128.xml +17 -0
- data/fixtures/record/observation-example-f202-temperature.xml +60 -0
- data/fixtures/record/organization-example-f201-aumc.xml +5 -0
- data/fixtures/record/organization-example-f203-bumc.xml +5 -0
- data/fixtures/record/patient-example-f201-roel.xml +16 -0
- data/fixtures/record/practitioner-example-f201-ab.xml +14 -0
- data/fixtures/record/procedure-example-f201-tpf.xml +23 -0
- data/fixtures/scheduling/appointment-simple.xml +24 -0
- data/fixtures/scheduling/appointmentresponse-patient-simple.xml +12 -0
- data/fixtures/scheduling/appointmentresponse-practitioner-simple.xml +12 -0
- data/fixtures/scheduling/practitioner-simple.xml +10 -0
- data/fixtures/scheduling/schedule-simple.xml +12 -0
- data/fixtures/scheduling/slot-simple.xml +10 -0
- data/fixtures/specimen/spec-100.xml +65 -0
- data/fixtures/specimen/spec-400.xml +70 -0
- data/fixtures/specimen/spec-uslab-example1.xml +82 -0
- data/fixtures/validation/observation.profile.xml +2045 -0
- data/fixtures/validation/observations/observation-example(example).xml +50 -0
- data/lib/FHIR_structure.json +529 -0
- data/lib/daf_resource_generator.rb +94 -0
- data/lib/data/fhir_structure.rb +8 -0
- data/lib/data/resources.rb +138 -0
- data/lib/executor.rb +56 -0
- data/lib/ext/client.rb +27 -0
- data/lib/ext/client_reply.rb +19 -0
- data/lib/plan_executor.rb +31 -0
- data/lib/resource_generator.rb +656 -0
- data/lib/tasks/tasks.rake +329 -0
- data/lib/tasks/templates/summary.html.erb +163 -0
- data/lib/test_result.rb +69 -0
- data/lib/tests/assertions.rb +261 -0
- data/lib/tests/base_test.rb +117 -0
- data/lib/tests/suites/argonaut_resprint_1_test.rb +260 -0
- data/lib/tests/suites/argonaut_resprint_2_test.rb +369 -0
- data/lib/tests/suites/argonaut_resprint_3_test.rb +309 -0
- data/lib/tests/suites/argonaut_sprint_1_test.rb +187 -0
- data/lib/tests/suites/argonaut_sprint_2_test.rb +115 -0
- data/lib/tests/suites/argonaut_sprint_3_test.rb +208 -0
- data/lib/tests/suites/argonaut_sprint_4_test.rb +335 -0
- data/lib/tests/suites/argonaut_sprint_5_test.rb +196 -0
- data/lib/tests/suites/argonaut_sprint_6_test.rb +243 -0
- data/lib/tests/suites/argonaut_sprint_7_test.rb +161 -0
- data/lib/tests/suites/base_suite.rb +116 -0
- data/lib/tests/suites/connectathon_audit_track.rb +354 -0
- data/lib/tests/suites/connectathon_fetch_patient_record.rb +443 -0
- data/lib/tests/suites/connectathon_financial_track.rb +380 -0
- data/lib/tests/suites/connectathon_lab_order_track.rb +239 -0
- data/lib/tests/suites/connectathon_patient_track.rb +364 -0
- data/lib/tests/suites/connectathon_profile_validation.rb +101 -0
- data/lib/tests/suites/connectathon_scheduling_track.rb +266 -0
- data/lib/tests/suites/connectathon_terminology_track.rb +242 -0
- data/lib/tests/suites/daf_profiles_test.rb +431 -0
- data/lib/tests/suites/format_test.rb +453 -0
- data/lib/tests/suites/history_test.rb +311 -0
- data/lib/tests/suites/read_test.rb +104 -0
- data/lib/tests/suites/resource_test.rb +553 -0
- data/lib/tests/suites/search_test.rb +219 -0
- data/lib/tests/suites/search_test_robust.rb +172 -0
- data/lib/tests/suites/sprinkler_search_test.rb +660 -0
- data/lib/tests/suites/suite_engine.rb +114 -0
- data/lib/tests/suites/transaction_test.rb +571 -0
- data/lib/tests/testscripts/base_testscript.rb +480 -0
- data/lib/tests/testscripts/testscript_engine.rb +81 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Client Assigned Id/track1-patient-base-client-id-json.xml +348 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Client Assigned Id/track1-patient-base-client-id-xml.xml +348 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Client Assigned Id/track1-patient-bonus-client-id-json.xml +420 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Client Assigned Id/track1-patient-bonus-client-id-xml.xml +420 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/README.html +68 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Server Assigned Id/track1-patient-base-server-id-json.xml +352 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Server Assigned Id/track1-patient-base-server-id-xml.xml +352 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Server Assigned Id/track1-patient-bonus-server-id-json.xml +421 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Server Assigned Id/track1-patient-bonus-server-id-xml.xml +421 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/conformance/PatientConformance.xml +34 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-PeterChalmers-min.json +45 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-PeterChalmers-min.xml +26 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-PeterChalmers.json +100 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-PeterChalmers.xml +102 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-bonus-PeterChalmers-min.json +53 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-bonus-PeterChalmers-min.xml +30 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-bonus-PeterChalmers.json +108 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-bonus-PeterChalmers.xml +108 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-PeterChalmers-min.json +45 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-PeterChalmers-min.xml +26 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-PeterChalmers.json +100 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-PeterChalmers.xml +102 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus1-PeterChalmers-min.json +53 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus1-PeterChalmers-min.xml +30 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus1-PeterChalmers.json +108 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus1-PeterChalmers.xml +107 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus2-PeterChalmers-min.json +53 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus2-PeterChalmers-min.xml +31 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus2-PeterChalmers.json +108 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus2-PeterChalmers.xml +106 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/C-CDA_R2-1_CCD-ussg.xml +3414 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-A1-empty-on-instance.xml +9 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-A2-empty-by-ref.xml +15 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-A3-empty-by-identifier.xml +13 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-A4-empty-by-contained.xml +15 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-B1-CCDA-on-instance.xml +15 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-B2-CCDA-by-ref.xml +21 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-B3-CCDA-by-identifier.xml +19 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-B4-CCDA-by-contained.xml +21 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/questionnaire-sdc-profile-example-ussg-fht.xml +3905 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/questionnaireresponse-expected-ussg-fht-CCDA.xml +190 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/questionnaireresponse-expected-ussg-fht-empty.xml +177 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/track11-sdc-prepop-xml.xml +142 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Expand/Client Assigned Id/track2-ts-suite1-expand-client-id.xml +925 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Expand/Client Assigned Id/track2-ts-suite2-expand-filter-client-id.xml +930 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Expand/Server Assigned Id/track2-ts-suite1-expand-server-id.xml +953 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Expand/Server Assigned Id/track2-ts-suite2-expand-filter-server-id.xml +958 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Lookup/track2-ts-suite5-loinc-lookup-xml.xml +224 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Lookup/track2-ts-suite5-snomed-lookup-xml.xml +224 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/README.html +85 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Translate/track2-ts-suite6-translate-xml.xml +224 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Validate-code/Client Assigned Id/track2-ts-suite3-validate-code-client-id.xml +1807 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Validate-code/Client Assigned Id/track2-ts-suite4-validate-code-client-id.xml +714 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Validate-code/Server Assigned Id/track2-ts-suite3-validate-code-server-id.xml +1835 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Validate-code/Server Assigned Id/track2-ts-suite4-validate-code-server-id.xml +742 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ConceptMapSuite6Conformance.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite1Conformance.xml +17 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite2Conformance.xml +17 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite3Conformance.xml +14 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite4Conformance.xml +14 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite5Conformance.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-2-a.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-2-b.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-3-a.xml +13 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-3-b.xml +13 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-4-a.xml +15 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-4-b.xml +15 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/lookup-loinc-input-5-2.xml +10 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/lookup-loinc-input-5-3.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/lookup-snomed-input-5-2.xml +10 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/lookup-snomed-input-5-3.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/translate-conceptmap-input-6-2.xml +14 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/translate-conceptmap-input-6-3.xml +15 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-1-expand-min.xml +47 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-1-filter-min.xml +23 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-2-expand-min.xml +132 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-2-filter-min.xml +38 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-3-expand-min.xml +252 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-3-filter-min.xml +58 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-4-expand-min.xml +57 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-4-filter-min.xml +28 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-1-expand-min.xml +347 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-1-filter-min.xml +33 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-2-expand-min.xml +637 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-2-filter-min.xml +33 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-3-filter-min.xml +58 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/lookup-loinc-min.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/lookup-snomed-min.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/suite3-invalid-min.xml +10 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/suite3-valid-min.xml +7 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/suite4-invalid-min.xml +10 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/suite4-valid-min.xml +7 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/translate-conceptmap-min.xml +17 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/extensional-case-1.xml +55 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/extensional-case-2.xml +122 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/extensional-case-3.xml +222 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/extensional-case-4.xml +65 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/intensional-case-1.xml +31 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/intensional-case-2.xml +31 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/intensional-case-3.xml +31 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/translate-conceptmap-case-1.xml +145 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/conformance/DecisionSupportServiceModule-Evaluate.xml +17 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-incomplete-request-payload.xml +26 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-incomplete-response-min-payload.xml +7 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-incomplete-response-payload.xml +332 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-malformed-request-payload.xml +28 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-malformed-response-min-payload.xml +7 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-malformed-response-payload.xml +20 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-request-payload.xml +28 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-response-min-payload.xml +7 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-response-payload.xml +332 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-unauthorized-request-payload.xml +28 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-unauthorized-response-min-payload.xml +7 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-unauthorized-response-payload.xml +8 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/gao-assessment-request-payload.xml +176 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/gao-assessment-response-payload-min.xml +32 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/gao-assessment-response-payload.xml +80 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/track3-cds-evaluate-cdc-immunization.xml +290 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/track3-cds-evaluate-gao-profile.xml +110 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track6-FHIR-Genomics/Client_Assigned_Id/TestScript_FHIR-Genomics.xml +170 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track6-FHIR-Genomics/_reference/resources/sequence-example-1.xml +31 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track6-FHIR-Genomics/_reference/resources/sequence-example-2.xml +31 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Actors.png +0 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Client_Assigned_Id/track7-laborder100-xml.xml +590 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Client_Assigned_Id/track7-laborder200-xml.xml +587 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Client_Assigned_Id/track7-laborder300-xml.xml +612 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Client_Assigned_Id/track7-laborder400-xml.xml +635 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Peer-to-Peer/track7-laborder100-peer2peer-xml.xml +752 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Thumbs.db +0 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/conformance/LabOrderLabReport-CreateDeleteReadUpdate.xml +187 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/conformance/html.xslt +45 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-100-update.xml +64 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-100.xml +64 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-200-update.xml +121 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-200.xml +121 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-300-update.xml +91 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-300.xml +91 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-400-update.xml +88 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-400.xml +88 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticReport/dr-100.xml +96 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticReport/dr-200.xml +125 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticReport/dr-300.xml +132 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticReport/dr-400.xml +121 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-100.xml +58 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-101.xml +58 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-200.xml +125 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-300.xml +106 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-301.xml +106 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-302.xml +106 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-303.xml +106 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-304.xml +106 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-400.xml +87 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-401.xml +95 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-402.xml +95 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-403.xml +84 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-404.xml +84 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-405.xml +83 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-406.xml +83 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-407.xml +70 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-408.xml +84 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-uslab-example5.xml +102 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Order/order-100.xml +61 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Order/order-200.xml +61 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Order/order-300.xml +61 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Order/order-400.xml +61 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-100.xml +79 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-110.xml +79 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-200.xml +79 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-210.xml +79 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-300.xml +79 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-310.xml +79 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-400.xml +79 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-410.xml +79 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Organization/org-uslab-example3.xml +49 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Patient/patient-uslab-example1.xml +44 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Practitioner/pract-uslab-example1.xml +18 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Practitioner/pract-uslab-example3.xml +36 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Specimen/Thumbs.db +0 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Specimen/spec-100.xml +65 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Specimen/spec-400.xml +70 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Specimen/spec-uslab-example1.xml +82 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Testscript 1 Document.txt +122 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Testscript 2 Document.txt +103 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Testscript 3 Document.txt +201 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Testscript 4 Document.txt +310 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/_reference/conformance/MedicationStatementCreate.xml +11 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/_reference/conformance/PatientSearchType.xml +15 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/_reference/resources/medicationstatement-create.json +39 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/_reference/resources/medicationstatement-patch.json +3 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/track9-patch-medicationstatement-json-if-match.xml +321 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/track9-patch-medicationstatement-json.xml +303 -0
- data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/track9-patch-peer2peer-patient-json.xml +235 -0
- data/plan_executor.gemspec +14 -0
- data/test/fixtures/diagnostic_bundle.xml +51 -0
- data/test/fixtures/lab_results_bundle.xml +49 -0
- data/test/fixtures/observation_bundle.json +61 -0
- data/test/fixtures/testscript-example.xml +202 -0
- data/test/fixtures/testscript-history.xml +143 -0
- data/test/fixtures/testscript-readtest.xml +272 -0
- data/test/fixtures/testscript-search.xml +282 -0
- data/test/fixtures/testscript-update.xml +147 -0
- data/test/fixtures/vital_signs_bundle.xml +117 -0
- data/test/test_helper.rb +8 -0
- data/test/unit/argonaut_sprint6_test.rb +31 -0
- data/test/unit/argonaut_sprint7_test.rb +21 -0
- data/test/unit/basic_test.rb +27 -0
- data/test/unit/fetch_patient_record_test.rb +357 -0
- data/test/unit/financial_test.rb +41 -0
- data/test/unit/fixtures_test.rb +45 -0
- data/test/unit/metadata_test.rb +33 -0
- metadata +394 -0
@@ -0,0 +1,335 @@
|
|
1
|
+
module Crucible
|
2
|
+
module Tests
|
3
|
+
class ArgonautSprint4Test < BaseSuite
|
4
|
+
def id
|
5
|
+
'ArgonautSprint4Test'
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
'Argonaut Project Sprint 4 Test, to test success of servers at implementing goals of Argonaut Sprint 4'
|
10
|
+
end
|
11
|
+
|
12
|
+
def details
|
13
|
+
{
|
14
|
+
'Overview' => 'Argonaut Implementation Sprint 4 focuses on the scenario where a clinician launches a medication list app from within the EHR. The app is given EHR context using SMART\'s "EHR Launch Flow", meaning that it knows the currently-open patient record (as well as the current user -- but we\'ll tackle that in Sprint 5). On successful launch, the app is authorized to view a set of patient-specific medication-related data.',
|
15
|
+
'Instructions' => 'If you\'re working on a server, please complete the "servers" tab of the Sprint 4 Spreadsheet. This time around you\'ll need to update the status flag to indicate whether you\'ve begun work (or completed work), so clients will know when to start testing. You\'ll also share details about how a developer can obtain OAuth client credentials (client_id for public apps, or a client_id and client_secret for confidential apps) as well as user login credentials. You might consider simply sharing a set of fixed credentials in this spreadsheet, or else directing users to a web page where they can complete self-service registration. If absolutely necessary, you can ask developers to e-mail you directly.',
|
16
|
+
'FHIR API Calls' => 'FHIR provides a rich set of resource definitions for medication data. These include MedicationStatement, which expresses a high-level claim that a patient is (or is not) taking a specific drug, without further details about who prescribed it or how it was dispensed. MedicationOrder, MedicationDispense, MedicationAdministration, which are more detailed, workflow-oriented resources describing exactly what was prescribed, how it was dispensed, and how it was administered to the patient. The following search parameters must be supported at a minimum (code, identifier, medication, patient, status, effectivedate (for for MedicationStatement), datewritten (for MedicationOrder), prescriber (for MedicationOrder)). For this sprint, we ask EHRs to focus on two resources: GET /Patient/{id}/MedicationOrder or GET /MedicationOrder?patient={id} Retrieve any medications where the EHR directly manages a prescription. GET /Patient/{id}/MedicationStatement or GET /MedicationStatement?patient={id} Retrieve any other medications, including patient-reported over-the-counter drugs, or drugs manage by an outside provider or system.',
|
17
|
+
'Authorization' => 'This sprint builds on our introduction to the SMART on FHIR OAuth 2.0 authorization process. Recall that in Sprint 2, we authorized access at a very coarse level, delegating all of a user\'s read privileges to an app. This time, we add support for apps that don\'t need access to an entire population of patient records, but instead require just one record. We accomplish this through a set of "launch scopes". In terms of SMART\'s authorization guide, we\'ll make the following assumptions: Standalone launch sequence only Public clients and confidential clients are both supported Access scopes include: launch/patient (indicates to the EHR that a single patient must be selected to complete the launch process) patient/*.read (to ensure a patient-specific access token) Onecontext parameter is returned to the app upon successful authorization: - patient (indicates the patient currently open in the EHR) - No single-sign-on (OpenID Connect) is required'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(client1, client2 = nil)
|
22
|
+
super
|
23
|
+
@tags.append('argonautp1')
|
24
|
+
@category = {id: 'argonautp1', title: 'Argonaut Phase 1'}
|
25
|
+
end
|
26
|
+
|
27
|
+
# [SprinklerTest("AS3001", "GET patient by ID")]
|
28
|
+
test 'AS4001', 'GET patient by ID' do
|
29
|
+
metadata {
|
30
|
+
links "#{REST_SPEC_LINK}#read"
|
31
|
+
requires resource: "Patient", methods: ["read"]
|
32
|
+
validates resource: "Patient", methods: ["read"]
|
33
|
+
}
|
34
|
+
|
35
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
36
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
37
|
+
|
38
|
+
patient_id = @client.client.params["patient"]
|
39
|
+
|
40
|
+
reply = @client.read(FHIR::Patient, patient_id, FHIR::Formats::ResourceFormat::RESOURCE_JSON)
|
41
|
+
|
42
|
+
assert_response_ok(reply)
|
43
|
+
assert_equal patient_id, reply.id, 'Server returned wrong patient.'
|
44
|
+
warning { assert_valid_resource_content_type_present(reply) }
|
45
|
+
warning { assert_etag_present(reply) }
|
46
|
+
warning { assert_last_modified_present(reply) }
|
47
|
+
end
|
48
|
+
|
49
|
+
test 'AS4002', 'GET MedicationOrder Patient Compartment for a specific patient' do
|
50
|
+
metadata {
|
51
|
+
links "#{REST_SPEC_LINK}#search"
|
52
|
+
requires resource: "Patient", methods: ["search"]
|
53
|
+
validates resource: "Patient", methods: ["search"]
|
54
|
+
requires resource: 'MedicationOrder', methods: ['read']
|
55
|
+
validates resource: 'MedicationOrder', methods: ['read']
|
56
|
+
}
|
57
|
+
|
58
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
59
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
60
|
+
|
61
|
+
patient_id = @client.client.params["patient"]
|
62
|
+
|
63
|
+
options = {
|
64
|
+
:id => patient_id,
|
65
|
+
:search => {
|
66
|
+
:flag => false,
|
67
|
+
:compartment => "MedicationOrder",
|
68
|
+
:parameters => nil
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
reply = @client.search(FHIR::Patient, options)
|
73
|
+
|
74
|
+
assert_response_ok(reply)
|
75
|
+
|
76
|
+
reply.resource.entry.each do |entry|
|
77
|
+
assert (!entry.resource.medicationReference.nil? || !entry.resource.medicationCodeableConcept.nil?), "MedicationOrder was missing a medication reference or codeable concept"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
test 'AS4003', 'GET MedicationOrder with Patient IDs' do
|
82
|
+
metadata {
|
83
|
+
links "#{REST_SPEC_LINK}#search"
|
84
|
+
requires resource: "Patient", methods: ["read", "search"]
|
85
|
+
validates resource: "Patient", methods: ["read", "search"]
|
86
|
+
requires resource: 'MedicationOrder', methods: ['read', 'search']
|
87
|
+
validates resource: 'MedicationOrder', methods: ['read', 'search']
|
88
|
+
}
|
89
|
+
|
90
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
91
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
92
|
+
|
93
|
+
patient_id = @client.client.params["patient"]
|
94
|
+
|
95
|
+
options = {
|
96
|
+
search: {
|
97
|
+
flag: false,
|
98
|
+
compartment: nil,
|
99
|
+
parameters: {
|
100
|
+
patient: patient_id
|
101
|
+
}
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
reply = @client.search(FHIR::MedicationOrder, options)
|
106
|
+
|
107
|
+
assert_response_ok(reply)
|
108
|
+
|
109
|
+
reply.resource.entry.each do |entry|
|
110
|
+
assert (!entry.resource.medicationReference.nil? || !entry.resource.medicationCodeableConcept.nil?), "MedicationOrder was missing a medication reference or codeable concept"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
test 'AS4004', 'GET MedicationStatement Patient Compartment for a specific patient' do
|
115
|
+
metadata {
|
116
|
+
links "#{REST_SPEC_LINK}#search"
|
117
|
+
requires resource: "Patient", methods: ["search"]
|
118
|
+
validates resource: "Patient", methods: ["search"]
|
119
|
+
requires resource: 'MedicationOrder', methods: ['read']
|
120
|
+
validates resource: 'MedicationOrder', methods: ['read']
|
121
|
+
}
|
122
|
+
|
123
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
124
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
125
|
+
|
126
|
+
patient_id = @client.client.params["patient"]
|
127
|
+
|
128
|
+
options = {
|
129
|
+
:id => patient_id,
|
130
|
+
:search => {
|
131
|
+
:flag => false,
|
132
|
+
:compartment => "MedicationStatement",
|
133
|
+
:parameters => nil
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
reply = @client.search(FHIR::Patient, options)
|
138
|
+
|
139
|
+
assert_response_ok(reply)
|
140
|
+
|
141
|
+
reply.resource.entry.each do |entry|
|
142
|
+
assert (!entry.resource.medicationReference.nil? || !entry.resource.medicationCodeableConcept.nil?), "MedicationStatement was missing a medication reference or codeable concept"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
test 'AS4005', 'GET MedicationStatement with Patient IDs' do
|
147
|
+
metadata {
|
148
|
+
links "#{REST_SPEC_LINK}#search"
|
149
|
+
requires resource: "Patient", methods: ["read", "search"]
|
150
|
+
validates resource: "Patient", methods: ["read", "search"]
|
151
|
+
requires resource: 'MedicationOrder', methods: ['read', 'search']
|
152
|
+
validates resource: 'MedicationOrder', methods: ['read', 'search']
|
153
|
+
}
|
154
|
+
|
155
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
156
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
157
|
+
|
158
|
+
patient_id = @client.client.params["patient"]
|
159
|
+
|
160
|
+
options = {
|
161
|
+
search: {
|
162
|
+
flag: false,
|
163
|
+
compartment: nil,
|
164
|
+
parameters: {
|
165
|
+
patient: patient_id
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
|
170
|
+
reply = @client.search(FHIR::MedicationStatement, options)
|
171
|
+
|
172
|
+
assert_response_ok(reply)
|
173
|
+
|
174
|
+
reply.resource.entry.each do |entry|
|
175
|
+
assert (!entry.resource.medicationReference.nil? || !entry.resource.medicationCodeableConcept.nil?), "MedicationStatement was missing a medication reference or codeable concept"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# TODO: Medication and Prescriber - need to handle references
|
180
|
+
['code', 'identifier', 'status', 'dateWritten'].each do |field|
|
181
|
+
|
182
|
+
test "AS4006_#{field}", "Search for MedicationOrder by #{field}" do
|
183
|
+
metadata {
|
184
|
+
links "#{REST_SPEC_LINK}#search"
|
185
|
+
links "#{BASE_SPEC_LINK}/MedicationOrder.html"
|
186
|
+
requires resource: 'MedicationOrder', methods: ['read', 'search']
|
187
|
+
validates resource: "MedicationOrder", methods: ['read', "search"]
|
188
|
+
}
|
189
|
+
|
190
|
+
resources = getResources(FHIR::MedicationOrder)
|
191
|
+
|
192
|
+
match_target = resources.select {|r| r.resource.respond_to?(field.to_sym) && !r.resource.send(field).nil?}.first
|
193
|
+
search_string = match_target.resource.send(field) unless match_target.nil?
|
194
|
+
case field
|
195
|
+
when 'code'
|
196
|
+
begin
|
197
|
+
match_target = resources.select {|r| !r.resource.medicationCodeableConcept.nil?}.first
|
198
|
+
coding = match_target.resource.medicationCodeableConcept.coding.first
|
199
|
+
search_string = "#{coding.system}|#{coding.code}"
|
200
|
+
rescue
|
201
|
+
assert false, "could not get a code to search on"
|
202
|
+
end
|
203
|
+
when 'identifier'
|
204
|
+
search_string = search_string.first.value unless search_string.blank?
|
205
|
+
end
|
206
|
+
|
207
|
+
warning {assert !search_string.blank? && !match_target.nil?, "could not get a MedicationOrder with a #{field} value to search on"}
|
208
|
+
if search_string.blank? || match_target.nil?
|
209
|
+
skip
|
210
|
+
end
|
211
|
+
|
212
|
+
options = {
|
213
|
+
:search => {
|
214
|
+
:flag => false,
|
215
|
+
:compartment => nil,
|
216
|
+
:parameters => {
|
217
|
+
field.downcase => search_string
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
221
|
+
reply = @client.search(FHIR::MedicationOrder, options)
|
222
|
+
assert_response_ok(reply)
|
223
|
+
assert_bundle_response(reply)
|
224
|
+
assert reply.resource, "Search did not return any MedicationOrders for #{field.downcase} => #{search_string}, should have matched Medication Order id: #{match_target.resource.xmlId}"
|
225
|
+
assert (reply.resource.entry && reply.resource.entry.length > 0), "Search did not return any MedicationOrders for #{field.downcase} => #{search_string}, should have matched Medication Order id: #{match_target.resource.xmlId}"
|
226
|
+
assert getIdList(reply.resource).select {|id| id == match_target.resource.xmlId}.length > 0, "Search did not find the expected MedicationOrder with ID: #{match_target.resource.xmlId}"
|
227
|
+
end
|
228
|
+
|
229
|
+
end
|
230
|
+
|
231
|
+
['code', 'identifier', 'status', 'effectiveDateTime'].each do |field|
|
232
|
+
|
233
|
+
test "AS4007_#{field}", "Search for MedicationStatement by #{field}" do
|
234
|
+
metadata {
|
235
|
+
links "#{REST_SPEC_LINK}#search"
|
236
|
+
links "#{BASE_SPEC_LINK}/MedicationStatement.html"
|
237
|
+
requires resource: 'MedicationStatement', methods: ['read', 'search']
|
238
|
+
validates resource: "MedicationStatement", methods: ['read', "search"]
|
239
|
+
}
|
240
|
+
|
241
|
+
resources = getResources(FHIR::MedicationStatement)
|
242
|
+
|
243
|
+
match_target = resources.select {|r| r.resource.respond_to?(field.to_sym) && !r.resource.send(field).nil?}.first
|
244
|
+
search_string = match_target.resource.send(field) unless match_target.nil?
|
245
|
+
case field
|
246
|
+
when 'code'
|
247
|
+
begin
|
248
|
+
match_target = resources.select {|r| !r.resource.medicationCodeableConcept.nil?}.first
|
249
|
+
coding = match_target.resource.medicationCodeableConcept.coding.first
|
250
|
+
search_string = "#{coding.system}|#{coding.code}"
|
251
|
+
rescue
|
252
|
+
assert false, "could not get a code to search on"
|
253
|
+
end
|
254
|
+
when 'identifier'
|
255
|
+
search_string = search_string.first.value unless search_string.blank?
|
256
|
+
end
|
257
|
+
|
258
|
+
warning {assert !search_string.blank? && !match_target.nil?, "could not get a MedicationStatement with a #{field} value to search on"}
|
259
|
+
if search_string.blank? || match_target.nil?
|
260
|
+
skip
|
261
|
+
end
|
262
|
+
|
263
|
+
options = {
|
264
|
+
:search => {
|
265
|
+
:flag => false,
|
266
|
+
:compartment => nil,
|
267
|
+
:parameters => {
|
268
|
+
field.downcase => search_string
|
269
|
+
}
|
270
|
+
}
|
271
|
+
}
|
272
|
+
reply = @client.search(FHIR::MedicationStatement, options)
|
273
|
+
assert_response_ok(reply)
|
274
|
+
assert_bundle_response(reply)
|
275
|
+
assert reply.resource, "Search did not return any MedicationStatements for #{field.downcase} => #{search_string}, should have matched Medication Order id: #{match_target.resource.xmlId}"
|
276
|
+
assert (reply.resource.entry && reply.resource.entry.length > 0), "Search did not return any MedicationStatements for #{field.downcase} => #{search_string}, should have matched Medication Order id: #{match_target.resource.xmlId}"
|
277
|
+
assert getIdList(reply.resource).select {|id| id == match_target.resource.xmlId}.length > 0, "Search did not find the expected MedicationStatements with ID: #{match_target.resource.xmlId}"
|
278
|
+
end
|
279
|
+
|
280
|
+
end
|
281
|
+
|
282
|
+
|
283
|
+
def getResources(type)
|
284
|
+
|
285
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
286
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
287
|
+
|
288
|
+
patient_id = @client.client.params["patient"]
|
289
|
+
|
290
|
+
options = {
|
291
|
+
search: {
|
292
|
+
flag: false,
|
293
|
+
compartment: nil,
|
294
|
+
parameters: {
|
295
|
+
patient: patient_id
|
296
|
+
}
|
297
|
+
}
|
298
|
+
}
|
299
|
+
|
300
|
+
reply = @client.search(type, options)
|
301
|
+
|
302
|
+
return reply.resource.entry if (reply.resource && reply.resource.entry && reply.resource.entry.length > 0)
|
303
|
+
|
304
|
+
options = {
|
305
|
+
:id => patient_id,
|
306
|
+
:search => {
|
307
|
+
:flag => false,
|
308
|
+
:compartment => type.to_s.demodulize,
|
309
|
+
:parameters => nil
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
313
|
+
reply = @client.search(FHIR::Patient, options)
|
314
|
+
|
315
|
+
return reply.resource.entry if (reply.resource && reply.resource.entry && reply.resource.entry.length > 0)
|
316
|
+
|
317
|
+
return []
|
318
|
+
|
319
|
+
end
|
320
|
+
|
321
|
+
def getIdList(bundle)
|
322
|
+
return [] unless bundle.entry
|
323
|
+
bundle.entry.map do |entry|
|
324
|
+
if (entry.fullUrl)
|
325
|
+
FHIR::ResourceAddress.pull_out_id(entry.resourceType, entry.fullUrl)
|
326
|
+
elsif entry.resource
|
327
|
+
entry.resource.xmlId
|
328
|
+
else
|
329
|
+
nil
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
module Crucible
|
2
|
+
module Tests
|
3
|
+
class ArgonautSprint5Test < BaseSuite
|
4
|
+
def id
|
5
|
+
'ArgonautSprint5Test'
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
'Argonaut Project Sprint 5 Test, to test success of servers at implementing goals of Argonaut Sprint 5'
|
10
|
+
end
|
11
|
+
|
12
|
+
def details
|
13
|
+
{
|
14
|
+
'Overview' => 'Argonaut Implementation Sprint 5 focuses on the scenario where a clinician launches a care management app from within the EHR. Building on Sprint 4\'s objectives, we add support for exposing a patient\'s problem list, and allergy list as well as more advanced app/EHR integration using additional parameters in SMART\'s "EHR Launch Flow".',
|
15
|
+
'Instructions' => 'If you\'re working on a server, please complete the "servers" tab of the Sprint 5 Spreadsheet. This time around you\'ll need to update the status flag to indicate whether you\'ve begun work (or completed work), so clients will know when to start testing. You\'ll also share details about how a developer can obtain OAuth client credentials (client_id for public apps, or a client_id and client_secret for confidential apps) as well as user login credentials. You might consider simply sharing a set of fixed credentials in this spreadsheet, or else directing users to a web page where they can complete self-service registration. If absolutely necessary, you can ask developers to e-mail you directly.',
|
16
|
+
'FHIR API Calls' => 'For this sprint, EHRs should add support for: GET /Patient/{id}/Condition or GET /Condition?patient={id}: Retrieve any conditions (problems) on a patient\'s list, including current as well as resolved conditions, all coded in SNOMED CT per the DAF profile. GET /Patient/{id}/AllergyIntolerance or GET /AllergyIntolerance?patient={id}: Retrieve any allegies on a patient\'s list. Values are coded in NDF-RT (for drug class allergies), RxNorm (for drug ingredient allergies), UNII (for other substance allergies), or SNOMED CT (if all else fails).',
|
17
|
+
'Authorization' => 'This sprint builds on Sprint 4\'s authorization scenario, adding two more context parameters to the launch response, both designed to improve the visual integration of third-party apps within a surrounding EHR system: need_patient_banner; indicates whether the app is responsible for displaying a demographic banner identifying the patient (should be set to true when an EHR does not already display such data in a frame around the app), and smart_style_url; indicates a set of style parameters (preferred colors, etc.) that the app may want to use.'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(client1, client2 = nil)
|
22
|
+
super
|
23
|
+
@tags.append('argonautp1')
|
24
|
+
@category = {id: 'argonautp1', title: 'Argonaut Phase 1'}
|
25
|
+
end
|
26
|
+
|
27
|
+
# [SprinklerTest("AS5001", "GET patient by ID")]
|
28
|
+
test 'AS5001', 'GET patient by ID' do
|
29
|
+
metadata {
|
30
|
+
links "#{REST_SPEC_LINK}#read"
|
31
|
+
requires resource: "Patient", methods: ["read"]
|
32
|
+
validates resource: "Patient", methods: ["read"]
|
33
|
+
}
|
34
|
+
|
35
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
36
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
37
|
+
|
38
|
+
patient_id = @client.client.params["patient"]
|
39
|
+
|
40
|
+
reply = @client.read(FHIR::Patient, patient_id, FHIR::Formats::ResourceFormat::RESOURCE_JSON)
|
41
|
+
|
42
|
+
assert_response_ok(reply)
|
43
|
+
assert_equal patient_id, reply.id, 'Server returned wrong patient.'
|
44
|
+
warning { assert_valid_resource_content_type_present(reply) }
|
45
|
+
warning { assert_etag_present(reply) }
|
46
|
+
warning { assert_last_modified_present(reply) }
|
47
|
+
end
|
48
|
+
|
49
|
+
test 'AS5002', 'GET Condition Patient Compartment for a specific patient' do
|
50
|
+
metadata {
|
51
|
+
links "#{REST_SPEC_LINK}#search"
|
52
|
+
requires resource: "Patient", methods: ["search"]
|
53
|
+
validates resource: "Patient", methods: ["search"]
|
54
|
+
requires resource: 'Condition', methods: ['read']
|
55
|
+
validates resource: 'Condition', methods: ['read']
|
56
|
+
}
|
57
|
+
|
58
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
59
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
60
|
+
|
61
|
+
patient_id = @client.client.params["patient"]
|
62
|
+
|
63
|
+
options = {
|
64
|
+
:id => patient_id,
|
65
|
+
:search => {
|
66
|
+
:flag => false,
|
67
|
+
:compartment => "Condition",
|
68
|
+
:parameters => nil
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
reply = @client.search(FHIR::Patient, options)
|
73
|
+
|
74
|
+
assert_response_ok(reply)
|
75
|
+
|
76
|
+
reply.resource.entry.each do |entry|
|
77
|
+
assert (entry.resource.patient && entry.resource.patient.reference.include?(patient_id)), "Patient on condition does not match patient requested"
|
78
|
+
entry.resource.code.coding.each do |coding|
|
79
|
+
assert coding.system == "http://snomed.info/sct", "Code System is not SNOMEDCT"
|
80
|
+
assert !coding.code.empty?, "No code defined for coding"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
test 'AS5003', 'GET Condition with Patient IDs' do
|
86
|
+
metadata {
|
87
|
+
links "#{REST_SPEC_LINK}#search"
|
88
|
+
requires resource: "Patient", methods: ["read"]
|
89
|
+
validates resource: "Patient", methods: ["read"]
|
90
|
+
requires resource: 'Condition', methods: ['read', 'search']
|
91
|
+
validates resource: 'Condition', methods: ['read', 'search']
|
92
|
+
}
|
93
|
+
|
94
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
95
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
96
|
+
|
97
|
+
patient_id = @client.client.params["patient"]
|
98
|
+
|
99
|
+
options = {
|
100
|
+
search: {
|
101
|
+
flag: false,
|
102
|
+
compartment: nil,
|
103
|
+
parameters: {
|
104
|
+
patient: patient_id
|
105
|
+
}
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
reply = @client.search(FHIR::Condition, options)
|
110
|
+
|
111
|
+
assert_response_ok(reply)
|
112
|
+
|
113
|
+
reply.resource.entry.each do |entry|
|
114
|
+
assert (entry.resource.patient && entry.resource.patient.reference.include?(patient_id)), "Patient on condition does not match patient requested"
|
115
|
+
entry.resource.code.coding.each do |coding|
|
116
|
+
assert coding.system == "http://snomed.info/sct", "Code System is not SNOMEDCT"
|
117
|
+
assert !coding.code.empty?, "No code defined for coding"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
test 'AS5004', 'GET AllergyIntolerance Patient Compartment for a specific patient' do
|
123
|
+
metadata {
|
124
|
+
links "#{REST_SPEC_LINK}#search"
|
125
|
+
requires resource: "Patient", methods: ["search"]
|
126
|
+
validates resource: "Patient", methods: ["search"]
|
127
|
+
requires resource: 'AllergyIntolerance', methods: ['read']
|
128
|
+
validates resource: 'AllergyIntolerance', methods: ['read']
|
129
|
+
}
|
130
|
+
|
131
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
132
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
133
|
+
|
134
|
+
patient_id = @client.client.params["patient"]
|
135
|
+
|
136
|
+
options = {
|
137
|
+
:id => patient_id,
|
138
|
+
:search => {
|
139
|
+
:flag => false,
|
140
|
+
:compartment => "AllergyIntolerance",
|
141
|
+
:parameters => nil
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
reply = @client.search(FHIR::Patient, options)
|
146
|
+
|
147
|
+
assert_response_ok(reply)
|
148
|
+
|
149
|
+
reply.resource.entry.each do |entry|
|
150
|
+
assert (entry.resource.patient && entry.resource.patient.reference.include?(patient_id)), "Patient on AllergyIntolerance does not match patient requested"
|
151
|
+
assert entry.resource.substance, "No substance defined for AllergyIntolerance"
|
152
|
+
entry.resource.substance.coding.each do |coding|
|
153
|
+
assert ['http://fda.gov/UNII/', 'http://rxnav.nlm.nih.gov/REST/Ndfrt', 'http://snomed.info/sct', 'http://www.nlm.nih.gov/research/umls/rxnorm'].include?(coding.system), "Code system #{coding.system} does not match expected code systems."
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
test 'AS5005', 'GET AllergyIntolerance with Patient IDs' do
|
159
|
+
metadata {
|
160
|
+
links "#{REST_SPEC_LINK}#search"
|
161
|
+
requires resource: "Patient", methods: ["read", "search"]
|
162
|
+
validates resource: "Patient", methods: ["read", "search"]
|
163
|
+
requires resource: 'AllergyIntolerance', methods: ['read', 'search']
|
164
|
+
validates resource: 'AllergyIntolerance', methods: ['read', 'search']
|
165
|
+
}
|
166
|
+
|
167
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
168
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
169
|
+
|
170
|
+
patient_id = @client.client.params["patient"]
|
171
|
+
|
172
|
+
options = {
|
173
|
+
search: {
|
174
|
+
flag: false,
|
175
|
+
compartment: nil,
|
176
|
+
parameters: {
|
177
|
+
patient: patient_id
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
|
182
|
+
reply = @client.search(FHIR::AllergyIntolerance, options)
|
183
|
+
|
184
|
+
assert_response_ok(reply)
|
185
|
+
|
186
|
+
reply.resource.entry.each do |entry|
|
187
|
+
assert (entry.resource.patient && entry.resource.patient.reference.include?(patient_id)), "Patient on AllergyIntolerance does not match patient requested"
|
188
|
+
assert entry.resource.substance, "No substance defined for AllergyIntolerance"
|
189
|
+
entry.resource.substance.coding.each do |coding|
|
190
|
+
assert ['http://fda.gov/UNII/', 'http://rxnav.nlm.nih.gov/REST/Ndfrt', 'http://snomed.info/sct', 'http://www.nlm.nih.gov/research/umls/rxnorm'].include?(coding.system), "Code system #{coding.system} does not match expected code systems."
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|