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,187 @@
|
|
1
|
+
module Crucible
|
2
|
+
module Tests
|
3
|
+
class ArgonautSprint1Test < BaseSuite
|
4
|
+
attr_accessor :rc
|
5
|
+
attr_accessor :conformance
|
6
|
+
attr_accessor :searchParams
|
7
|
+
attr_reader :canSearchById
|
8
|
+
attr_accessor :patient_id
|
9
|
+
|
10
|
+
def id
|
11
|
+
'ArgonautSprint1Test'
|
12
|
+
end
|
13
|
+
|
14
|
+
def description
|
15
|
+
'Argonaut Sprint 1 tests for testing Argonauts Sprint 1 goals: read patient by ID, search for patients by various demographics.'
|
16
|
+
end
|
17
|
+
|
18
|
+
def details
|
19
|
+
{
|
20
|
+
'Overview' => 'Argonaut Sprint 1 tests for testing Argonauts Sprint 1 goals: read patient by ID, search for patients by various demographics.',
|
21
|
+
'Instructions' => 'Servers should provide the following information for the sprint: Organization name and contact, FHIR endpoint URL, List of FHIR Patient IDs (that is, Patient.id, not Patient.identifier), Authorization token(s), which are simple fixed values for now (Note: some servers, including Argonaut\'s reference server, may need to issue different tokens to different clients for policy reasons)',
|
22
|
+
'FHIR API Calls' => 'We\'ll focus on the basics, beginning with two FHIR API calls that every participating server should expose, and every participating client should invoke: GET /Patient/{id} Retrieve a patient\'s basic demographics and identifiers, given a unique patient id. Think of this as the "Hello world" of FHIR. And cross-patient demographics search, using a single FHIR API call: GET /Patient?[parameters] Find patients based on a variety of demographic criteria. The following search parameters must be supported at a minimum: (name, family, given, identifier, gender, birthdate)',
|
23
|
+
'Authorization' => 'The first Argonaut sprint will focus on getting data services up and running even before a complete authorization flow is implemented. This way we can ensure that all participating servers have correctly exposed FHIR API endpoints before we lock those endpoints down with a full OAuth approval process. So for this first sprint, each server will publish its FHIR endpoint URL along with an access token that clients can include in an HTTP Authorization header with each API call',
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(client1, client2=nil)
|
28
|
+
super(client1, client2)
|
29
|
+
@tags.append('argonautp1')
|
30
|
+
@category = {id: 'argonautp1', title: 'Argonaut Phase 1'}
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup
|
34
|
+
@searchParams = [:name, :family, :given, :identifier, :gender, :birthdate]
|
35
|
+
@rc = FHIR::Patient
|
36
|
+
|
37
|
+
if !@client.client.try(:params).nil? && @client.client.params["patient"]
|
38
|
+
@patient_id = @client.client.params["patient"]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_patient_by_param(params = {}, flag = true)
|
43
|
+
assert !params.empty?, "No params for patient"
|
44
|
+
options = {
|
45
|
+
:search => {
|
46
|
+
:flag => flag,
|
47
|
+
:compartment => nil,
|
48
|
+
:parameters => params
|
49
|
+
}
|
50
|
+
}
|
51
|
+
reply = @client.search(@rc, options)
|
52
|
+
assert_response_ok(reply)
|
53
|
+
assert_bundle_response(reply)
|
54
|
+
assert reply.resource.get_by_id(@patient_id).equals?(@patient, ['_id', "text", "meta", "lastUpdated"]), 'Server returned wrong patient.'
|
55
|
+
end
|
56
|
+
|
57
|
+
def define_metadata(method)
|
58
|
+
links "#{REST_SPEC_LINK}##{method}"
|
59
|
+
links "#{BASE_SPEC_LINK}/#{@rc.name.demodulize.downcase}.html"
|
60
|
+
validates resource: @rc.name.demodulize, methods: [method]
|
61
|
+
end
|
62
|
+
|
63
|
+
# [SprinklerTest("R001", "Result headers on normal read")]
|
64
|
+
test 'AS001', 'Get patient by ID' do
|
65
|
+
metadata {
|
66
|
+
links "#{REST_SPEC_LINK}#read"
|
67
|
+
requires resource: "Patient", methods: ["read", "search"]
|
68
|
+
validates resource: "Patient", methods: ["read", "search"]
|
69
|
+
}
|
70
|
+
|
71
|
+
begin
|
72
|
+
options = {
|
73
|
+
:search => {
|
74
|
+
:flag => true,
|
75
|
+
:compartment => nil,
|
76
|
+
:parameters => {
|
77
|
+
_count: 1
|
78
|
+
}
|
79
|
+
}
|
80
|
+
}
|
81
|
+
@patient_id ||= @client.search(@rc, options).resource.entry.first.resource.xmlId
|
82
|
+
rescue NoMethodError
|
83
|
+
@patient = nil
|
84
|
+
end
|
85
|
+
|
86
|
+
skip if !@patient_id
|
87
|
+
|
88
|
+
reply = @client.read(FHIR::Patient, @patient_id)
|
89
|
+
assert_response_ok(reply)
|
90
|
+
assert_equal @patient_id, reply.id, 'Server returned wrong patient.'
|
91
|
+
@patient = reply.resource
|
92
|
+
assert @patient, "could not get patient by id: #{@patient_id}"
|
93
|
+
warning { assert_valid_resource_content_type_present(reply) }
|
94
|
+
warning { assert_last_modified_present(reply) }
|
95
|
+
end
|
96
|
+
|
97
|
+
test 'AS002', 'Search by identifier' do
|
98
|
+
metadata {
|
99
|
+
define_metadata('search')
|
100
|
+
}
|
101
|
+
skip if !@patient
|
102
|
+
get_patient_by_param(:identifier => @patient[:identifier].first.try(:value))
|
103
|
+
end
|
104
|
+
|
105
|
+
test 'AS003', 'Identifier without search keyword' do
|
106
|
+
metadata {
|
107
|
+
define_metadata('search')
|
108
|
+
}
|
109
|
+
skip if !@patient
|
110
|
+
get_patient_by_param({ :identifier => @patient[:identifier].first.try(:value) }, false)
|
111
|
+
end
|
112
|
+
|
113
|
+
test 'AS004', 'Search by Family & Given' do
|
114
|
+
metadata {
|
115
|
+
define_metadata('search')
|
116
|
+
}
|
117
|
+
skip if !@patient
|
118
|
+
family = @patient[:name].first.try(:family).try(:first)
|
119
|
+
given = @patient[:name].first.try(:given).try(:first)
|
120
|
+
assert family, "Patient family name not returned"
|
121
|
+
assert given, "Patient given name not returned"
|
122
|
+
get_patient_by_param(family: family, given: given)
|
123
|
+
end
|
124
|
+
|
125
|
+
test 'AS005', 'Family & Given without search keyword' do
|
126
|
+
metadata {
|
127
|
+
define_metadata('search')
|
128
|
+
}
|
129
|
+
skip if !@patient
|
130
|
+
family = @patient[:name].first.try(:family).try(:first)
|
131
|
+
given = @patient[:name].first.try(:given).try(:first)
|
132
|
+
assert family, "Patient family name not provided"
|
133
|
+
assert given, "Patient given name not provided"
|
134
|
+
get_patient_by_param({ family: family, given: given }, false)
|
135
|
+
end
|
136
|
+
|
137
|
+
test 'AS006', 'Search by name and gender' do
|
138
|
+
metadata {
|
139
|
+
define_metadata('search')
|
140
|
+
}
|
141
|
+
skip if !@patient
|
142
|
+
name = @patient[:name].first.try(:family).try(:first)
|
143
|
+
gender = @patient[:gender]
|
144
|
+
assert name, "Patient name not provided"
|
145
|
+
assert gender, "Patient gender not provided"
|
146
|
+
get_patient_by_param(name: name, gender: gender)
|
147
|
+
end
|
148
|
+
|
149
|
+
test 'AS007', 'Name and gender without search keyword' do
|
150
|
+
metadata {
|
151
|
+
define_metadata('search')
|
152
|
+
}
|
153
|
+
skip if !@patient
|
154
|
+
name = @patient[:name].first.try(:family).try(:first)
|
155
|
+
gender = @patient[:gender]
|
156
|
+
assert name, "Patient name not provided"
|
157
|
+
assert gender, "Patient gender not provided"
|
158
|
+
get_patient_by_param(name: name, gender: gender)
|
159
|
+
end
|
160
|
+
|
161
|
+
test 'AS008', 'Search by Birthdate' do
|
162
|
+
metadata {
|
163
|
+
define_metadata('search')
|
164
|
+
}
|
165
|
+
skip if !@patient
|
166
|
+
birthdate = @patient[:birthDate]
|
167
|
+
gender = @patient[:gender]
|
168
|
+
assert birthdate, "Patient birthdate not provided"
|
169
|
+
assert gender, "Patient gender not provided"
|
170
|
+
get_patient_by_param(birthdate: birthdate, gender: gender)
|
171
|
+
end
|
172
|
+
|
173
|
+
test 'AS009', 'Birthdate without search keyword' do
|
174
|
+
metadata {
|
175
|
+
define_metadata('search')
|
176
|
+
}
|
177
|
+
skip if !@patient
|
178
|
+
birthdate = @patient[:birthDate]
|
179
|
+
gender = @patient[:gender]
|
180
|
+
assert birthdate, "Patient birthdate not provided"
|
181
|
+
assert gender, "Patient gender not provided"
|
182
|
+
get_patient_by_param({ birthdate: birthdate, gender: gender }, false)
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module Crucible
|
2
|
+
module Tests
|
3
|
+
class ArgonautSprint2Test < BaseSuite
|
4
|
+
attr_accessor :rc
|
5
|
+
attr_accessor :conformance
|
6
|
+
attr_accessor :searchParams
|
7
|
+
attr_reader :canSearchById
|
8
|
+
|
9
|
+
def id
|
10
|
+
'ArgonautSprint2Test'
|
11
|
+
end
|
12
|
+
|
13
|
+
def description
|
14
|
+
'Argonaut Sprint 2 tests for testing Argonauts Sprint 2 goals: builds on sprint 1 and provides authorization.'
|
15
|
+
end
|
16
|
+
|
17
|
+
def details
|
18
|
+
{
|
19
|
+
'Overview' => 'Argonaut Implementation Sprint 2 focuses on a scenario where an end-user launches an app from outside of the EHR, and the app gets access to search demographics for a population of patients. That is, the app obtains "user-level" authorization to search whatever patients the end-user is allowed to see.',
|
20
|
+
'Instructions' => 'This sprint builds directly on Sprint 1, adding a FHIR conformance statement and a basic OAuth 2 implementation for authorization.',
|
21
|
+
'FHIR API Calls' => 'Sprint 2 builds on the demographics call from Sprint 1: GET /Patient?[parameters] See Sprint 1 for details. We also add support for a server-specific FHIR Conformance statement, which is a necessary component for endpoint discovery in the authorization protocol. The API call looks like: GET /metadata or (equivalently) OPTIONS / Obtain the FHIR conformance statement for this RESTful server. Each server\'s metadata must include SMART\'s endpoint discovery extensions to enable the OAuth 2.0 process described below.',
|
22
|
+
'Authorization' => 'This sprint introduces the SMART on FHIR OAuth 2.0 authorization process. SMART\'s authorization specs define a number of advanced features, including the ability to pass context from the EHR to a contained app, and to authorize access to a single patient record at a time — but for this sprint, we support only the most basic functionality: delegating a user\'s rights to an app.',
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def requires_authorization
|
27
|
+
false
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(client1, client2=nil)
|
31
|
+
super(client1, client2)
|
32
|
+
@tags.append('argonaut')
|
33
|
+
@category = {id: 'argonaut', title: 'Argonaut'}
|
34
|
+
end
|
35
|
+
|
36
|
+
def setup
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'AS2001', 'Test conformance statement contains an authorize url' do
|
40
|
+
metadata {
|
41
|
+
links "#{BASE_SPEC_LINK}/resource.html#metadata"
|
42
|
+
requires resource: "Conformance", methods: ["read"]
|
43
|
+
validates resource: "Conformance", methods: ["read"]
|
44
|
+
validates resource: nil, methods: ['OAuth2', 'Authorization/Access Control']
|
45
|
+
requires resource: nil, methods: ['OAuth2', 'Authorization/Access Control']
|
46
|
+
}
|
47
|
+
|
48
|
+
conformance = @client.conformanceStatement
|
49
|
+
options = get_security_options(conformance)
|
50
|
+
|
51
|
+
assert options[:authorize_url], "Authorize Url was not found in the conformance"
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
test 'AS2002', 'Test conformance statement contains a token url' do
|
57
|
+
metadata {
|
58
|
+
links "#{BASE_SPEC_LINK}/resource.html#metadata"
|
59
|
+
requires resource: "Conformance", methods: ["read"]
|
60
|
+
validates resource: "Conformance", methods: ["read"]
|
61
|
+
validates resource: nil, methods: ['OAuth2', 'Authorization/Access Control']
|
62
|
+
requires resource: nil, methods: ['OAuth2', 'Authorization/Access Control']
|
63
|
+
}
|
64
|
+
|
65
|
+
conformance = @client.conformanceStatement
|
66
|
+
options = get_security_options(conformance)
|
67
|
+
|
68
|
+
assert options[:token_url], "Token Url was not found in the conformance"
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
def get_security_options(conformance)
|
73
|
+
oauth_extension = 'http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris'
|
74
|
+
authorize_extension = 'authorize'
|
75
|
+
token_extension = 'token'
|
76
|
+
|
77
|
+
options = nil
|
78
|
+
conformance.rest.each do |rest|
|
79
|
+
assert !rest.security.nil?, "could not get authorization extensions, no security section"
|
80
|
+
assert !rest.security.service.nil?, "could not get authorization extensions, no security/service section"
|
81
|
+
rest.security.service.each do |service|
|
82
|
+
assert !service.coding.nil?, "could not get authorization extensions, no codings on sercurity/service"
|
83
|
+
found_oauth2_code = false
|
84
|
+
service.coding.each do |coding|
|
85
|
+
if coding.code == 'SMART-on-FHIR'
|
86
|
+
found_oauth2_code = true
|
87
|
+
assert !rest.security.extension.nil?, "could not get authorization extensions, no security extensions"
|
88
|
+
found_oauth_extension = false
|
89
|
+
options = {}
|
90
|
+
rest.security.extension.where({url: oauth_extension}).first.extension.each do |ext|
|
91
|
+
found_oauth_extension = true
|
92
|
+
case ext.url
|
93
|
+
when authorize_extension
|
94
|
+
options[:authorize_url] = ext.value.value
|
95
|
+
when "#{oauth_extension}\##{authorize_extension}"
|
96
|
+
options[:authorize_url] = ext.value.value
|
97
|
+
when token_extension
|
98
|
+
options[:token_url] = ext.value.value
|
99
|
+
when "#{oauth_extension}\##{token_extension}"
|
100
|
+
options[:token_url] = ext.value.value
|
101
|
+
end
|
102
|
+
end
|
103
|
+
assert found_oauth_extension, "an OAuth extension could not be found"
|
104
|
+
end
|
105
|
+
assert found_oauth2_code, "a security coding set to SMART-on-FHIR could not be found"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
assert !options.nil?, "could not get authorization extensions"
|
110
|
+
options
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
module Crucible
|
2
|
+
module Tests
|
3
|
+
class ArgonautSprint3Test < BaseSuite
|
4
|
+
def id
|
5
|
+
'ArgonautSprint3Test'
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
'Argonaut Project Sprint 3 Test, to test success of servers at implementing goals of Argonaut Sprint 3'
|
10
|
+
end
|
11
|
+
|
12
|
+
def details
|
13
|
+
{
|
14
|
+
'Overview' => 'Argonaut Implementation Sprint 3 focuses on the scenario where a user approves an app with limited permissions, scoped down to a a single patient record. The app will have access to patient demographics and any "documents" available about that patient.',
|
15
|
+
'Instructions' => 'Please sign up! If you\'re working on a server, please complete the "servers" tab of the Sprint 3 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. If you\'re working on a client, please complete the "clients" tab of the Sprint 3 Spreadsheet. You\'ll also need to update the status flag to indicate whether you\'ve begun work (or completed work).',
|
16
|
+
'FHIR API Calls' => 'GET /Patient/{id} Retrieve a patient\'s basic demographics and identifiers, given a unique patient id. GET /Patient/{id}/DocumentReference?type={}&created={} Search for available documents about a patient, given a unique patient id. Optional search parameters can filter results on: - type a code describing this document (see below for details) - created creation date - Notes Argonaut Document Access provides background on how the DocumentReference endpoint works — but note this guide is a work in progress, and our first sprint starts with just a subset of functionality. The Argonaut Implementation Program now uses FHIR DSTU2.',
|
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('argonaut')
|
24
|
+
@category = {id: 'argonaut', title: 'Argonaut'}
|
25
|
+
end
|
26
|
+
|
27
|
+
# [SprinklerTest("AS3001", "GET patient by ID")]
|
28
|
+
test 'AS3001', '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.to_s, reply.id.to_s, '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 'AS3002', 'GET DocumentReference Patient Compartment for a specific patient' do
|
50
|
+
metadata {
|
51
|
+
links "#{REST_SPEC_LINK}#search"
|
52
|
+
requires resource: "Patient", methods: ['read', "search"]
|
53
|
+
validates resource: "Patient", methods: ['read', "search"]
|
54
|
+
requires resource: 'DocumentReference', methods: ['read']
|
55
|
+
validates resource: 'DocumentReference', methods: ['read']
|
56
|
+
requires resource: nil, methods: ['DOCUMENTS']
|
57
|
+
validates resource: nil, methods: ['DOCUMENTS']
|
58
|
+
}
|
59
|
+
|
60
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
61
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
62
|
+
|
63
|
+
patient_id = @client.client.params["patient"]
|
64
|
+
|
65
|
+
options = {
|
66
|
+
:id => patient_id,
|
67
|
+
:search => {
|
68
|
+
:flag => false,
|
69
|
+
:compartment => "DocumentReference",
|
70
|
+
:parameters => nil
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
reply = @client.search(FHIR::Patient, options)
|
75
|
+
|
76
|
+
assert_response_ok(reply)
|
77
|
+
|
78
|
+
reply.resource.entry.each do |entry|
|
79
|
+
assert !entry.resource.content.empty?, "DocumentReference must have at least one 'content' BackboneElement"
|
80
|
+
entry.resource.content.each do |content|
|
81
|
+
attachment = @client.get(URI::encode(@client.strip_base(content.attachment.url)), @client.fhir_headers())
|
82
|
+
assert_response_ok(attachment)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
test 'AS3003', 'GET DocumentReferences with Patient IDs' do
|
88
|
+
metadata {
|
89
|
+
links "#{REST_SPEC_LINK}#search"
|
90
|
+
requires resource: "Patient", methods: ["read", "search"]
|
91
|
+
validates resource: "Patient", methods: ["read", "search"]
|
92
|
+
requires resource: 'DocumentReference', methods: ['read']
|
93
|
+
validates resource: 'DocumentReference', methods: ['read']
|
94
|
+
requires resource: nil, methods: ['DOCUMENTS']
|
95
|
+
validates resource: nil, methods: ['DOCUMENTS']
|
96
|
+
}
|
97
|
+
|
98
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
99
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
100
|
+
|
101
|
+
patient_id = @client.client.params["patient"]
|
102
|
+
|
103
|
+
options = {
|
104
|
+
search: {
|
105
|
+
flag: false,
|
106
|
+
compartment: nil,
|
107
|
+
parameters: {
|
108
|
+
patient: patient_id
|
109
|
+
}
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
reply = @client.search(FHIR::DocumentReference, options)
|
114
|
+
|
115
|
+
assert_response_ok(reply)
|
116
|
+
|
117
|
+
reply.resource.entry.each do |entry|
|
118
|
+
assert !entry.resource.content.empty?, "DocumentReference must have at least one 'content' BackboneElement"
|
119
|
+
entry.resource.content.each do |content|
|
120
|
+
attachment = @client.get(URI::encode(@client.strip_base(content.attachment.url)), @client.fhir_headers())
|
121
|
+
assert_response_ok(attachment)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
test 'AS3004', 'GET DocumentReference by Created Date' do
|
127
|
+
metadata {
|
128
|
+
links "#{REST_SPEC_LINK}#search"
|
129
|
+
requires resource: "Patient", methods: ["read"]
|
130
|
+
validates resource: "Patient", methods: ["read"]
|
131
|
+
requires resource: 'DocumentReference', methods: ['read', 'search']
|
132
|
+
validates resource: 'DocumentReference', methods: ['read', 'search']
|
133
|
+
requires resource: nil, methods: ['DOCUMENTS']
|
134
|
+
validates resource: nil, methods: ['DOCUMENTS']
|
135
|
+
}
|
136
|
+
|
137
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
138
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
139
|
+
|
140
|
+
patient_id = @client.client.params["patient"]
|
141
|
+
|
142
|
+
options = {
|
143
|
+
search: {
|
144
|
+
flag: false,
|
145
|
+
compartment: nil,
|
146
|
+
parameters: {
|
147
|
+
patient: patient_id,
|
148
|
+
created: '2015'
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
reply = @client.search(FHIR::DocumentReference, options)
|
154
|
+
|
155
|
+
assert_response_ok(reply)
|
156
|
+
|
157
|
+
reply.resource.entry.each do |entry|
|
158
|
+
assert !entry.resource.content.empty?, "DocumentReference must have at least one 'content' BackboneElement"
|
159
|
+
entry.resource.content.each do |content|
|
160
|
+
attachment = @client.get(URI::encode(@client.strip_base(content.attachment.url)), @client.fhir_headers())
|
161
|
+
assert_response_ok(attachment)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
test 'AS3005', 'GET DocumentReference by Type' do
|
167
|
+
metadata {
|
168
|
+
links "#{REST_SPEC_LINK}#search"
|
169
|
+
requires resource: "Patient", methods: ["read", "search"]
|
170
|
+
validates resource: "Patient", methods: ["read", "search"]
|
171
|
+
requires resource: 'DocumentReference', methods: ['read', 'search']
|
172
|
+
validates resource: 'DocumentReference', methods: ['read', 'search']
|
173
|
+
requires resource: nil, methods: ['DOCUMENTS']
|
174
|
+
validates resource: nil, methods: ['DOCUMENTS']
|
175
|
+
}
|
176
|
+
|
177
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
178
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
179
|
+
|
180
|
+
patient_id = @client.client.params["patient"]
|
181
|
+
|
182
|
+
options = {
|
183
|
+
search: {
|
184
|
+
flag: false,
|
185
|
+
compartment: nil,
|
186
|
+
parameters: {
|
187
|
+
patient: patient_id,
|
188
|
+
type: 'http://loinc.org|34133-9'
|
189
|
+
}
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
reply = @client.search(FHIR::DocumentReference, options)
|
194
|
+
|
195
|
+
assert_response_ok(reply)
|
196
|
+
|
197
|
+
reply.resource.entry.each do |entry|
|
198
|
+
assert !entry.resource.content.empty?, "DocumentReference must have at least one 'content' BackboneElement"
|
199
|
+
entry.resource.content.each do |content|
|
200
|
+
attachment = @client.get(URI::encode(@client.strip_base(content.attachment.url)), @client.fhir_headers())
|
201
|
+
assert_response_ok(attachment)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|