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,243 @@
|
|
1
|
+
module Crucible
|
2
|
+
module Tests
|
3
|
+
class ArgonautSprint6Test < BaseSuite
|
4
|
+
def id
|
5
|
+
'ArgonautSprint6Test'
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
'Argonaut Project Sprint 6 Test, to test success of servers at implementing goals of Argonaut Sprint 6'
|
10
|
+
end
|
11
|
+
|
12
|
+
def details
|
13
|
+
{
|
14
|
+
'Overview' => 'Argonaut Implementation Sprint 6 begins support for laboratory results. To provide very specific guidance in this first lab-related sprint, we address two common quantitative lab panels: the Comprehensive Metabolic Panel and the Complete Blood Count (without differential). On the security side, we add support for OAuth 2.0 refresh_tokens, which allow apps to receive long-lasting access.',
|
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}/DiagnosticReport or GET /DiagnosticReport?patient={id}--Retrieve any Laboratory Diagnostic Reports about a given patient. GET /Patient/{id}/Observation or GET /Observation?patient={id}--Retrieve any Observations about a given Patient. Our focus for Sprint 6 is on quantitative lab observations. Other kinds of Diagnostic Reports and Observations may be ignored. As an initial step, we will be focusing on final reports for Comprehensive metabolic panel and Complete Blood Count.',
|
17
|
+
'Authorization' => 'This sprint builds out support for OAuth 2.0 refresh tokens. For full details, see SMART\'s table of scopes and the authorization guide, but briefly: At authorization time, an app asks for the offline_access. This scope indicates to the server that a long-lasting refresh token is desired. After launch, if the request has been approved, the app will receive a refresh_token as part of its access token response. Once the access_token expires, the app can ask for a new one by using its refresh_token.'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(client1, client2 = nil)
|
22
|
+
super
|
23
|
+
@tags.append('argonautp1')
|
24
|
+
@loinc_codes = ['2951-2', '2823-3', '2075-0', '2028-9', '3094-0', '2160-0', '2345-7', '17861-6', '2885-2', '1751-7', '1975-2', '6768-6', '1742-6', '1920-8', '6690-2', ' 789-8', ' 718-7', ' 4544-3', '787-2', '785-6', '786-4', '21000-5', '788-0', '777-3', '32207-3', '32623-1']
|
25
|
+
@category = {id: 'argonautp1', title: 'Argonaut Phase 1'}
|
26
|
+
end
|
27
|
+
|
28
|
+
# [SprinklerTest("AS6001", "GET patient by ID")]
|
29
|
+
test 'AS6001', 'GET patient by ID' do
|
30
|
+
metadata {
|
31
|
+
links "#{REST_SPEC_LINK}#read"
|
32
|
+
requires resource: "Patient", methods: ["read"]
|
33
|
+
validates resource: "Patient", methods: ["read"]
|
34
|
+
}
|
35
|
+
|
36
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
37
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
38
|
+
|
39
|
+
patient_id = @client.client.params["patient"]
|
40
|
+
|
41
|
+
reply = @client.read(FHIR::Patient, patient_id)
|
42
|
+
|
43
|
+
assert_response_ok(reply)
|
44
|
+
assert_equal patient_id.to_s, reply.id.to_s, 'Server returned wrong patient.'
|
45
|
+
warning { assert_valid_resource_content_type_present(reply) }
|
46
|
+
warning { assert_etag_present(reply) }
|
47
|
+
warning { assert_last_modified_present(reply) }
|
48
|
+
end
|
49
|
+
|
50
|
+
test 'AS6002', 'GET Observation Patient Compartment for a specific patient' do
|
51
|
+
metadata {
|
52
|
+
links "#{REST_SPEC_LINK}#search"
|
53
|
+
requires resource: "Patient", methods: ["search"]
|
54
|
+
validates resource: "Patient", methods: ["search"]
|
55
|
+
requires resource: 'Observation', methods: ['read']
|
56
|
+
validates resource: 'Observation', methods: ['read']
|
57
|
+
}
|
58
|
+
|
59
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
60
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
61
|
+
|
62
|
+
patient_id = @client.client.params["patient"]
|
63
|
+
|
64
|
+
options = {
|
65
|
+
:id => patient_id,
|
66
|
+
:search => {
|
67
|
+
:flag => false,
|
68
|
+
:compartment => "Observation",
|
69
|
+
:parameters => nil
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
reply = @client.search(FHIR::Patient, options)
|
74
|
+
|
75
|
+
validate_observation_reply(reply)
|
76
|
+
end
|
77
|
+
|
78
|
+
test 'AS6003', 'GET Observation with Patient ID' do
|
79
|
+
metadata {
|
80
|
+
links "#{REST_SPEC_LINK}#search"
|
81
|
+
requires resource: "Patient", methods: ["read", "search"]
|
82
|
+
validates resource: "Patient", methods: ["read", "search"]
|
83
|
+
requires resource: 'Observation', methods: ['read', 'search']
|
84
|
+
validates resource: 'Observation', methods: ['read', 'search']
|
85
|
+
}
|
86
|
+
|
87
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
88
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
89
|
+
|
90
|
+
patient_id = @client.client.params["patient"]
|
91
|
+
|
92
|
+
options = {
|
93
|
+
search: {
|
94
|
+
flag: false,
|
95
|
+
compartment: nil,
|
96
|
+
parameters: {
|
97
|
+
patient: patient_id
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
reply = @client.search(FHIR::Observation, options)
|
103
|
+
|
104
|
+
validate_observation_reply(reply)
|
105
|
+
end
|
106
|
+
|
107
|
+
test 'AS6004', 'GET DiagnosticReport Patient Compartment for a specific patient' do
|
108
|
+
metadata {
|
109
|
+
links "#{REST_SPEC_LINK}#search"
|
110
|
+
requires resource: "Patient", methods: ["search"]
|
111
|
+
validates resource: "Patient", methods: ["search"]
|
112
|
+
requires resource: 'DiagnosticReport', methods: ['read']
|
113
|
+
validates resource: 'DiagnosticReport', methods: ['read']
|
114
|
+
}
|
115
|
+
|
116
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
117
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
118
|
+
|
119
|
+
patient_id = @client.client.params["patient"]
|
120
|
+
|
121
|
+
options = {
|
122
|
+
:id => patient_id,
|
123
|
+
:search => {
|
124
|
+
:flag => false,
|
125
|
+
:compartment => "DiagnosticReport",
|
126
|
+
:parameters => nil
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
reply = @client.search(FHIR::Patient, options)
|
131
|
+
|
132
|
+
validate_diagnostic_report_reply(reply)
|
133
|
+
end
|
134
|
+
|
135
|
+
test 'AS6005', 'GET DiagnosticReport with Patient ID' do
|
136
|
+
metadata {
|
137
|
+
links "#{REST_SPEC_LINK}#search"
|
138
|
+
requires resource: "Patient", methods: ["read", "search"]
|
139
|
+
validates resource: "Patient", methods: ["read", "search"]
|
140
|
+
requires resource: 'DiagnosticReport', methods: ['read', 'search']
|
141
|
+
validates resource: 'DiagnosticReport', methods: ['read', 'search']
|
142
|
+
}
|
143
|
+
|
144
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
145
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
146
|
+
|
147
|
+
patient_id = @client.client.params["patient"]
|
148
|
+
|
149
|
+
options = {
|
150
|
+
search: {
|
151
|
+
flag: false,
|
152
|
+
compartment: nil,
|
153
|
+
parameters: {
|
154
|
+
patient: patient_id
|
155
|
+
}
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
reply = @client.search(FHIR::DiagnosticReport, options)
|
160
|
+
|
161
|
+
validate_diagnostic_report_reply(reply)
|
162
|
+
end
|
163
|
+
|
164
|
+
private
|
165
|
+
|
166
|
+
def validate_diagnostic_report_reply(reply)
|
167
|
+
assert_response_ok(reply)
|
168
|
+
|
169
|
+
metabolic_index = -1
|
170
|
+
reply.resource.entry.each_with_index do |e,i|
|
171
|
+
r = e.resource
|
172
|
+
categories = r.category.coding.map{|c|c.code.downcase}
|
173
|
+
codes = r.code.coding.map{|c|c.code}
|
174
|
+
metabolic_index = i if categories.include?('ch') && codes.include?('24323-8')
|
175
|
+
end
|
176
|
+
warning { assert (metabolic_index >= 0), "Metabolic panel with category 'CH' code '24323-8' not found." }
|
177
|
+
metabolic_panel_entry = reply.resource.entry[metabolic_index] if metabolic_index >= 0
|
178
|
+
|
179
|
+
blood_index = -1
|
180
|
+
reply.resource.entry.each_with_index do |e,i|
|
181
|
+
r = e.resource
|
182
|
+
categories = r.category.coding.map{|c|c.code.downcase}
|
183
|
+
codes = r.code.coding.map{|c|c.code}
|
184
|
+
blood_index = i if categories.include?('hm') && codes.include?('58410-2')
|
185
|
+
end
|
186
|
+
warning { assert (metabolic_index >= 0), "Blood panel with category 'HM' code '58410-2' not found." }
|
187
|
+
blood_count_panel_entry = reply.resource.entry[blood_index] if blood_index >= 0
|
188
|
+
|
189
|
+
skip if metabolic_panel_entry.nil? && blood_count_panel_entry.nil?
|
190
|
+
|
191
|
+
[ metabolic_panel_entry, blood_count_panel_entry ].keep_if{|x|!x.nil?}.each do |entry|
|
192
|
+
report = entry.resource
|
193
|
+
assert report.category, "DiagnosticReport has no category"
|
194
|
+
if report.category.coding.to_a.find { |c| c.code.downcase == "ch" || c.code.downcase == "hm" }
|
195
|
+
assert report.category.coding.to_a.find { |c| c.system == "http://hl7.org/fhir/v2/0074" }, "Wrong category codeSystem used; expected HL7v2"
|
196
|
+
assert report.status, "No status for DiagnosticReport"
|
197
|
+
assert report.code, "DiagnosticReport has no code"
|
198
|
+
coding = report.code.coding.first
|
199
|
+
assert coding.system == "http://loinc.org", "The DiagnosticReport is coded using the wrong code system, is #{coding}, should be LOINC"
|
200
|
+
assert coding.code == "24323-8" || coding.code == "58410-2", "Wrong code used in DiagnosticReport"
|
201
|
+
assert report.subject, "DiagnosticReport has no subject"
|
202
|
+
assert report.effectivePeriod? || report.effectiveDateTime?, "DiagnosticReport has no effective date/time"
|
203
|
+
assert report.issued, "DiagnosticReport has no issued"
|
204
|
+
assert report.performer, "DiagnosticReport has no performer"
|
205
|
+
assert report.result, "DiagnosticReport has no results"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def validate_observation_reply(reply)
|
211
|
+
assert_response_ok(reply)
|
212
|
+
|
213
|
+
valid_observation_count = 0
|
214
|
+
|
215
|
+
reply.resource.entry.each do |entry|
|
216
|
+
observation = entry.resource
|
217
|
+
if observation.category.nil?
|
218
|
+
warning { assert observation.category, "An observation did not have a category"}
|
219
|
+
next
|
220
|
+
end
|
221
|
+
if observation.category.coding.to_a.find { |c| c.code == "laboratory" }
|
222
|
+
valid_observation_count += 1
|
223
|
+
assert !observation.status.empty?
|
224
|
+
assert observation.category
|
225
|
+
assert observation.category.coding.to_a.find{ |c| c.system == "http://hl7.org/fhir/observation-category" }, "Wrong category codeSystem used, expected FHIR ObservationCategory"
|
226
|
+
assert observation.subject
|
227
|
+
assert get_value(observation) || observation.dataAbsentReason
|
228
|
+
coding = observation.code.coding.first
|
229
|
+
assert coding.system == "http://loinc.org", "The observation is coded using the wrong code system, is #{coding.system}, should be LOINC"
|
230
|
+
warning { assert @loinc_codes.index(coding.code), "The Observation code does not match any of the expected codes within Sprint 6." }
|
231
|
+
end
|
232
|
+
end
|
233
|
+
warning { assert valid_observation_count > 0, "No laboratory Observations were found for this patient" }
|
234
|
+
skip unless valid_observation_count > 0
|
235
|
+
end
|
236
|
+
|
237
|
+
def get_value(observation)
|
238
|
+
observation.valueQuantity || observation.valueCodeableConcept || observation.valueString || observation.valueRange || observation.valueRatio || observation.valueSampledData || observation.valueAttachment || observation.valueTime || observation.valueDateTime || observation.valuePeriod
|
239
|
+
end
|
240
|
+
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
module Crucible
|
2
|
+
module Tests
|
3
|
+
class ArgonautSprint7Test < BaseSuite
|
4
|
+
def id
|
5
|
+
'ArgonautSprint7Test'
|
6
|
+
end
|
7
|
+
|
8
|
+
def description
|
9
|
+
'Argonaut Project Sprint 7 Test, to test success of servers at implementing goals of Argonaut Sprint 7'
|
10
|
+
end
|
11
|
+
|
12
|
+
def details
|
13
|
+
{
|
14
|
+
'Overview' => 'Argonaut Implementation Sprint 7 adds support for vital signs. We want to ensure that vital signs are represented as individual resources, but also grouped explicitly into sets (e.g. heart rate, blood pressure, respiratory rate should be associated so they can be interpreted as a set).',
|
15
|
+
'Instructions' => 'If you\'re working on a server, please complete the "servers" tab of the Sprints Spreadsheet. 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 Sprints Spreadsheet. You\'ll also need to update the status flag to indicate whether you\'ve begun work (or completed work).',
|
16
|
+
'FHIR API Calls' => 'For this sprint, EHRs should build on Sprint 6\'s support for: GET /Patient/{id}/Observation or GET /Observation?patient={id} Retrieve any Observations about a given Patient. Our focus for Sprint 7 is on vital signs, which can be identified with codes in the table below. Note that it\'s possible to search for vital signs at the grouping level (that is, search for "all sets of vital signs" via ?code=http://loinc.org|8716-3) or at the individual level (for example, search for "all heart rates" via ?code=http://loinc.org|8867-4). It\'s also possible to find vital signs at all levels via ?category=http://hl7.org/fhir/observation-category|vital-signs',
|
17
|
+
'Authorization' => 'This sprint does not have any additional authorization requirements.'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(client1, client2 = nil)
|
22
|
+
super
|
23
|
+
@tags.append('argonautp1')
|
24
|
+
@loinc_codes = ['8716-3', '9279-1', '8867-4', '59408-5', '8310-5', '8302-2', '8306-3', '8287-5', '3141-9', '39156-5', '3140-1', '55284-4', '8480-6', '8462-4', '8478-0']
|
25
|
+
@loinc_code_units = {'8716-3' => nil, '9279-1' => '/min', '8867-4' => '/min', '59408-5' => '%', '8310-5' => 'Cel', '8302-2' => 'cm', '8306-3' => 'cm', '8287-5' => 'cm', '3141-9' => 'g, kg', '39156-5' => 'kg/m2', '3140-1' => 'm2', '8478-0' => 'mm[Hg]'}
|
26
|
+
@category = {id: 'argonautp1', title: 'Argonaut Phase 1'}
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
# Systolic blood pressure 8480-6 mm[Hg] This lives in component on a "systolic and diastolic" Observation
|
31
|
+
# Diastolic blood pressure 8462-4 mm[Hg] This lives in component on a "systolic and diastolic" Observation
|
32
|
+
|
33
|
+
test 'AS7001', 'GET patient by ID' do
|
34
|
+
metadata {
|
35
|
+
links "#{REST_SPEC_LINK}#read"
|
36
|
+
requires resource: "Patient", methods: ["read"]
|
37
|
+
validates resource: "Patient", methods: ["read"]
|
38
|
+
}
|
39
|
+
|
40
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
41
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
42
|
+
|
43
|
+
patient_id = @client.client.params["patient"]
|
44
|
+
|
45
|
+
reply = @client.read(FHIR::Patient, patient_id)
|
46
|
+
|
47
|
+
assert_response_ok(reply)
|
48
|
+
assert_equal patient_id, reply.id, 'Server returned wrong patient.'
|
49
|
+
warning { assert_valid_resource_content_type_present(reply) }
|
50
|
+
warning { assert_etag_present(reply) }
|
51
|
+
warning { assert_last_modified_present(reply) }
|
52
|
+
end
|
53
|
+
|
54
|
+
test 'AS7002', 'GET Observation Patient Compartment for a specific patient' do
|
55
|
+
metadata {
|
56
|
+
links "#{REST_SPEC_LINK}#search"
|
57
|
+
requires resource: "Patient", methods: ["search"]
|
58
|
+
validates resource: "Patient", methods: ["search"]
|
59
|
+
}
|
60
|
+
|
61
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
62
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
63
|
+
|
64
|
+
patient_id = @client.client.params["patient"]
|
65
|
+
|
66
|
+
options = {
|
67
|
+
:id => patient_id,
|
68
|
+
:search => {
|
69
|
+
:flag => false,
|
70
|
+
:compartment => "Observation",
|
71
|
+
:parameters => nil
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
reply = @client.search(FHIR::Patient, options)
|
76
|
+
|
77
|
+
validate_observation_reply(reply)
|
78
|
+
end
|
79
|
+
|
80
|
+
test 'AS7003', 'GET Observation with Patient ID' do
|
81
|
+
metadata {
|
82
|
+
links "#{REST_SPEC_LINK}#search"
|
83
|
+
requires resource: "Patient", methods: ["read", "search"]
|
84
|
+
validates resource: "Patient", methods: ["read", "search"]
|
85
|
+
}
|
86
|
+
|
87
|
+
assert !@client.client.try(:params).nil?, "The client was not authorized for the test"
|
88
|
+
assert @client.client.params["patient"], "No patient parameter was passed to the client"
|
89
|
+
|
90
|
+
patient_id = @client.client.params["patient"]
|
91
|
+
|
92
|
+
options = {
|
93
|
+
search: {
|
94
|
+
flag: false,
|
95
|
+
compartment: nil,
|
96
|
+
parameters: {
|
97
|
+
patient: patient_id
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
reply = @client.search(FHIR::Observation, options)
|
103
|
+
|
104
|
+
validate_observation_reply(reply)
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def validate_observation_reply(reply)
|
111
|
+
assert_response_ok(reply)
|
112
|
+
|
113
|
+
valid_observation_count = 0
|
114
|
+
|
115
|
+
reply.resource.entry.each do |entry|
|
116
|
+
observation = entry.resource
|
117
|
+
if observation.category.nil?
|
118
|
+
warning { assert observation.category, "An observation did not have a category"}
|
119
|
+
next
|
120
|
+
end
|
121
|
+
if observation.category.coding.to_a.find { |c| c.code == "vital-signs" }
|
122
|
+
valid_observation_count += 1
|
123
|
+
assert !observation.status.empty?
|
124
|
+
assert observation.category
|
125
|
+
assert observation.category.coding.to_a.find { |c| c.system == "http://hl7.org/fhir/observation-category" }, "Wrong category codeSystem used, expected FHIR ObservationCategory"
|
126
|
+
assert observation.subject
|
127
|
+
assert get_value(observation) || observation.dataAbsentReason || !observation.component.blank?
|
128
|
+
coding = observation.code.coding.first
|
129
|
+
assert coding.system == "http://loinc.org", "The observation is coded using the wrong code system, is #{coding.system}, should be LOINC"
|
130
|
+
warning { assert @loinc_codes.index(coding.code), "The code included in an Observation doesn't match any in the code lists provided by the Argonaut project" }
|
131
|
+
if @loinc_code_units[coding.code] && get_value(observation)
|
132
|
+
value = get_value(observation)
|
133
|
+
if value.respond_to? :unit
|
134
|
+
assert_equal @loinc_code_units[coding.code], value.unit, "The unit of the observation is not correct"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
# systolic and diastolic in components
|
138
|
+
if coding.code == '55284-4'
|
139
|
+
assert observation.component.length >= 2, "expected at least 2 components for combined blood pressure grouping structure"
|
140
|
+
systolic = observation.component.to_a.find {|component| component.code.coding.first.code == '8480-6'}
|
141
|
+
diastolic = observation.component.to_a.find {|component| component.code.coding.first.code == '8462-4'}
|
142
|
+
assert !systolic.blank?, "could not find a systolic blood pressure on a bp grouping vital sign observation"
|
143
|
+
assert !diastolic.blank?, "could not find a diastolic blood pressure on a bp grouping vital sign observation"
|
144
|
+
assert get_value(systolic), "systolic blood pressure did not have a value"
|
145
|
+
assert_equal 'mmHg', get_value(systolic).unit, "The unit of the systolic blood pressure is not correct"
|
146
|
+
assert get_value(diastolic), "systolic blood pressure did not have a value"
|
147
|
+
assert_equal 'mmHg', get_value(diastolic).unit, "The unit of the systolic blood pressure is not correct"
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
152
|
+
warning { assert valid_observation_count > 0, "No vital signs Observations were found for this patient" }
|
153
|
+
skip unless valid_observation_count > 0
|
154
|
+
end
|
155
|
+
|
156
|
+
def get_value(observation)
|
157
|
+
observation.valueQuantity || observation.valueCodeableConcept || observation.valueString || observation.valueRange || observation.valueRatio || observation.valueSampledData || observation.valueAttachment || observation.valueTime || observation.valueDateTime || observation.valuePeriod
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module Crucible
|
2
|
+
module Tests
|
3
|
+
class BaseSuite < BaseTest
|
4
|
+
|
5
|
+
def title
|
6
|
+
self.class.name.demodulize
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse_operation_outcome(body)
|
10
|
+
# body should be a String
|
11
|
+
outcome = nil
|
12
|
+
begin
|
13
|
+
outcome = FHIR::Resource.from_contents(body)
|
14
|
+
outcome = nil if outcome.class!=FHIR::OperationOutcome
|
15
|
+
rescue
|
16
|
+
outcome = nil
|
17
|
+
end
|
18
|
+
outcome
|
19
|
+
end
|
20
|
+
|
21
|
+
def build_messages(operation_outcome)
|
22
|
+
messages = []
|
23
|
+
if !operation_outcome.nil? and !operation_outcome.issue.nil?
|
24
|
+
operation_outcome.issue.each {|issue| messages << "#{issue.severity}: #{issue.code}: #{issue.details.try(:text) || issue.diagnostics}" }
|
25
|
+
end
|
26
|
+
messages
|
27
|
+
end
|
28
|
+
|
29
|
+
def fhir_resources
|
30
|
+
Mongoid.models.select {|c| c.name.include?('FHIR') && !c.included_modules.find_index(FHIR::Resource).nil?}
|
31
|
+
end
|
32
|
+
|
33
|
+
def requires(hash)
|
34
|
+
@requires << hash
|
35
|
+
end
|
36
|
+
|
37
|
+
def validates(hash)
|
38
|
+
@validates << hash
|
39
|
+
end
|
40
|
+
|
41
|
+
def links(url)
|
42
|
+
@links << url
|
43
|
+
end
|
44
|
+
|
45
|
+
def collect_metadata(methods_only=false)
|
46
|
+
@metadata_only = true
|
47
|
+
if @resource_class
|
48
|
+
result = execute(@resource_class)
|
49
|
+
else
|
50
|
+
result = execute
|
51
|
+
end
|
52
|
+
result = result.values.first if methods_only
|
53
|
+
@metadata_only = false
|
54
|
+
result
|
55
|
+
end
|
56
|
+
|
57
|
+
def metadata(&block)
|
58
|
+
yield
|
59
|
+
skip if @setup_failed
|
60
|
+
skip if @metadata_only
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.test(key, desc, &block)
|
64
|
+
test_method = "#{key} #{desc} test".downcase.tr(' ', '_').to_sym
|
65
|
+
contents = block
|
66
|
+
wrapped = -> () do
|
67
|
+
@warnings, @links, @requires, @validates = [],[],[],[]
|
68
|
+
description = nil
|
69
|
+
if respond_to? :supplement_test_description
|
70
|
+
description = supplement_test_description(desc)
|
71
|
+
else
|
72
|
+
description = desc
|
73
|
+
end
|
74
|
+
result = TestResult.new(key, description, STATUS[:pass], '','')
|
75
|
+
begin
|
76
|
+
t = instance_eval &block
|
77
|
+
result.update(t.status, t.message, t.data) if !t.nil? && t.is_a?(Crucible::Tests::TestResult)
|
78
|
+
rescue AssertionException => e
|
79
|
+
result.update(STATUS[:fail], e.message, e.data)
|
80
|
+
rescue SkipException => e
|
81
|
+
result.update(STATUS[:skip], "Skipped: #{test_method}", '')
|
82
|
+
rescue => e
|
83
|
+
result.update(STATUS[:error], "Fatal Error: #{e.message}", e.backtrace.join("\n"))
|
84
|
+
end
|
85
|
+
result.update(STATUS[:skip], "Skipped because setup failed.", "-") if @setup_failed
|
86
|
+
result.warnings = @warnings unless @warnings.empty?
|
87
|
+
result.requires = @requires unless @requires.empty?
|
88
|
+
result.validates = @validates unless @validates.empty?
|
89
|
+
result.links = @links unless @links.empty?
|
90
|
+
result.id = key
|
91
|
+
result.code = contents.source
|
92
|
+
result.id = "#{result.id}_#{result_id_suffix}" if respond_to? :result_id_suffix # add the resource to resource based tests to make ids unique
|
93
|
+
|
94
|
+
result
|
95
|
+
end
|
96
|
+
define_method test_method, wrapped
|
97
|
+
end
|
98
|
+
|
99
|
+
def resource_category(resource)
|
100
|
+
unless @resource_category
|
101
|
+
@categories_by_resource = {}
|
102
|
+
fhir_structure = Crucible::FHIRStructure.get
|
103
|
+
categories = fhir_structure['children'].select {|n| n['name'] == 'RESOURCES'}.first['children']
|
104
|
+
pull_children = lambda {|n, chain| n['children'].nil? ? n['name'] : n['children'].map {|child| chain.call(child, chain)}}
|
105
|
+
categories.each do |category|
|
106
|
+
pull_children.call(category, pull_children).flatten.each do |resource_name|
|
107
|
+
@categories_by_resource[resource_name] = category['name']
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
@categories_by_resource[resource.underscore.humanize.downcase] || 'Uncategorized'
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|