plan_executor 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (337) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +44 -0
  3. data/.simplecov +16 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +26 -0
  6. data/Gemfile.lock +197 -0
  7. data/LICENSE +201 -0
  8. data/README.md +126 -0
  9. data/Rakefile +25 -0
  10. data/fixtures/daf/conformance-daf-query-responder.xml +1471 -0
  11. data/fixtures/diagnostic_order/do-100.xml +64 -0
  12. data/fixtures/diagnostic_order/do-200.xml +121 -0
  13. data/fixtures/diagnostic_order/do-300.xml +91 -0
  14. data/fixtures/diagnostic_order/do-400.xml +88 -0
  15. data/fixtures/diagnostic_report/dr-100.xml +96 -0
  16. data/fixtures/diagnostic_report/dr-200.xml +125 -0
  17. data/fixtures/diagnostic_report/dr-300.xml +132 -0
  18. data/fixtures/diagnostic_report/dr-400.xml +121 -0
  19. data/fixtures/financial/claim-example-average.xml +168 -0
  20. data/fixtures/financial/claim-example-simple.xml +67 -0
  21. data/fixtures/observation/obs-100.xml +58 -0
  22. data/fixtures/observation/obs-101.xml +58 -0
  23. data/fixtures/observation/obs-200.xml +125 -0
  24. data/fixtures/observation/obs-300.xml +106 -0
  25. data/fixtures/observation/obs-301.xml +106 -0
  26. data/fixtures/observation/obs-302.xml +106 -0
  27. data/fixtures/observation/obs-303.xml +106 -0
  28. data/fixtures/observation/obs-304.xml +106 -0
  29. data/fixtures/observation/obs-400.xml +87 -0
  30. data/fixtures/observation/obs-401.xml +95 -0
  31. data/fixtures/observation/obs-402.xml +95 -0
  32. data/fixtures/observation/obs-403.xml +84 -0
  33. data/fixtures/observation/obs-404.xml +84 -0
  34. data/fixtures/observation/obs-405.xml +83 -0
  35. data/fixtures/observation/obs-406.xml +83 -0
  36. data/fixtures/observation/obs-407.xml +70 -0
  37. data/fixtures/observation/obs-408.xml +84 -0
  38. data/fixtures/observation/obs-uslab-example5.xml +102 -0
  39. data/fixtures/order/order-100.xml +61 -0
  40. data/fixtures/order/order-200.xml +61 -0
  41. data/fixtures/order/order-300.xml +61 -0
  42. data/fixtures/order/order-400.xml +61 -0
  43. data/fixtures/order_response/ordresp-100.xml +79 -0
  44. data/fixtures/order_response/ordresp-110.xml +79 -0
  45. data/fixtures/order_response/ordresp-200.xml +79 -0
  46. data/fixtures/order_response/ordresp-210.xml +79 -0
  47. data/fixtures/order_response/ordresp-300.xml +79 -0
  48. data/fixtures/order_response/ordresp-310.xml +79 -0
  49. data/fixtures/order_response/ordresp-400.xml +79 -0
  50. data/fixtures/order_response/ordresp-410.xml +79 -0
  51. data/fixtures/organization/org-uslab-example3.xml +49 -0
  52. data/fixtures/patient/patient-example-updated.xml +140 -0
  53. data/fixtures/patient/patient-example-us-extensions(us01).xml +81 -0
  54. data/fixtures/patient/patient-example.xml +132 -0
  55. data/fixtures/patient/patient-format-example.xml +101 -0
  56. data/fixtures/patient/patient-minimal.xml +9 -0
  57. data/fixtures/patient/patient-uslab-example1.xml +44 -0
  58. data/fixtures/practitioner/pract-uslab-example1.xml +18 -0
  59. data/fixtures/practitioner/pract-uslab-example3.xml +36 -0
  60. data/fixtures/record/condition-example-f201-fever.xml +63 -0
  61. data/fixtures/record/condition-example-f205-infection.xml +20 -0
  62. data/fixtures/record/diagnosticreport-example-f201-brainct.xml +18 -0
  63. data/fixtures/record/encounter-example-f201-20130404.xml +17 -0
  64. data/fixtures/record/encounter-example-f202-20130128.xml +17 -0
  65. data/fixtures/record/observation-example-f202-temperature.xml +60 -0
  66. data/fixtures/record/organization-example-f201-aumc.xml +5 -0
  67. data/fixtures/record/organization-example-f203-bumc.xml +5 -0
  68. data/fixtures/record/patient-example-f201-roel.xml +16 -0
  69. data/fixtures/record/practitioner-example-f201-ab.xml +14 -0
  70. data/fixtures/record/procedure-example-f201-tpf.xml +23 -0
  71. data/fixtures/scheduling/appointment-simple.xml +24 -0
  72. data/fixtures/scheduling/appointmentresponse-patient-simple.xml +12 -0
  73. data/fixtures/scheduling/appointmentresponse-practitioner-simple.xml +12 -0
  74. data/fixtures/scheduling/practitioner-simple.xml +10 -0
  75. data/fixtures/scheduling/schedule-simple.xml +12 -0
  76. data/fixtures/scheduling/slot-simple.xml +10 -0
  77. data/fixtures/specimen/spec-100.xml +65 -0
  78. data/fixtures/specimen/spec-400.xml +70 -0
  79. data/fixtures/specimen/spec-uslab-example1.xml +82 -0
  80. data/fixtures/validation/observation.profile.xml +2045 -0
  81. data/fixtures/validation/observations/observation-example(example).xml +50 -0
  82. data/lib/FHIR_structure.json +529 -0
  83. data/lib/daf_resource_generator.rb +94 -0
  84. data/lib/data/fhir_structure.rb +8 -0
  85. data/lib/data/resources.rb +138 -0
  86. data/lib/executor.rb +56 -0
  87. data/lib/ext/client.rb +27 -0
  88. data/lib/ext/client_reply.rb +19 -0
  89. data/lib/plan_executor.rb +31 -0
  90. data/lib/resource_generator.rb +656 -0
  91. data/lib/tasks/tasks.rake +329 -0
  92. data/lib/tasks/templates/summary.html.erb +163 -0
  93. data/lib/test_result.rb +69 -0
  94. data/lib/tests/assertions.rb +261 -0
  95. data/lib/tests/base_test.rb +117 -0
  96. data/lib/tests/suites/argonaut_resprint_1_test.rb +260 -0
  97. data/lib/tests/suites/argonaut_resprint_2_test.rb +369 -0
  98. data/lib/tests/suites/argonaut_resprint_3_test.rb +309 -0
  99. data/lib/tests/suites/argonaut_sprint_1_test.rb +187 -0
  100. data/lib/tests/suites/argonaut_sprint_2_test.rb +115 -0
  101. data/lib/tests/suites/argonaut_sprint_3_test.rb +208 -0
  102. data/lib/tests/suites/argonaut_sprint_4_test.rb +335 -0
  103. data/lib/tests/suites/argonaut_sprint_5_test.rb +196 -0
  104. data/lib/tests/suites/argonaut_sprint_6_test.rb +243 -0
  105. data/lib/tests/suites/argonaut_sprint_7_test.rb +161 -0
  106. data/lib/tests/suites/base_suite.rb +116 -0
  107. data/lib/tests/suites/connectathon_audit_track.rb +354 -0
  108. data/lib/tests/suites/connectathon_fetch_patient_record.rb +443 -0
  109. data/lib/tests/suites/connectathon_financial_track.rb +380 -0
  110. data/lib/tests/suites/connectathon_lab_order_track.rb +239 -0
  111. data/lib/tests/suites/connectathon_patient_track.rb +364 -0
  112. data/lib/tests/suites/connectathon_profile_validation.rb +101 -0
  113. data/lib/tests/suites/connectathon_scheduling_track.rb +266 -0
  114. data/lib/tests/suites/connectathon_terminology_track.rb +242 -0
  115. data/lib/tests/suites/daf_profiles_test.rb +431 -0
  116. data/lib/tests/suites/format_test.rb +453 -0
  117. data/lib/tests/suites/history_test.rb +311 -0
  118. data/lib/tests/suites/read_test.rb +104 -0
  119. data/lib/tests/suites/resource_test.rb +553 -0
  120. data/lib/tests/suites/search_test.rb +219 -0
  121. data/lib/tests/suites/search_test_robust.rb +172 -0
  122. data/lib/tests/suites/sprinkler_search_test.rb +660 -0
  123. data/lib/tests/suites/suite_engine.rb +114 -0
  124. data/lib/tests/suites/transaction_test.rb +571 -0
  125. data/lib/tests/testscripts/base_testscript.rb +480 -0
  126. data/lib/tests/testscripts/testscript_engine.rb +81 -0
  127. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Client Assigned Id/track1-patient-base-client-id-json.xml +348 -0
  128. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Client Assigned Id/track1-patient-base-client-id-xml.xml +348 -0
  129. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Client Assigned Id/track1-patient-bonus-client-id-json.xml +420 -0
  130. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Client Assigned Id/track1-patient-bonus-client-id-xml.xml +420 -0
  131. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/README.html +68 -0
  132. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Server Assigned Id/track1-patient-base-server-id-json.xml +352 -0
  133. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Server Assigned Id/track1-patient-base-server-id-xml.xml +352 -0
  134. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Server Assigned Id/track1-patient-bonus-server-id-json.xml +421 -0
  135. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/Server Assigned Id/track1-patient-bonus-server-id-xml.xml +421 -0
  136. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/conformance/PatientConformance.xml +34 -0
  137. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-PeterChalmers-min.json +45 -0
  138. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-PeterChalmers-min.xml +26 -0
  139. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-PeterChalmers.json +100 -0
  140. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-PeterChalmers.xml +102 -0
  141. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-bonus-PeterChalmers-min.json +53 -0
  142. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-bonus-PeterChalmers-min.xml +30 -0
  143. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-bonus-PeterChalmers.json +108 -0
  144. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-create-bonus-PeterChalmers.xml +108 -0
  145. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-PeterChalmers-min.json +45 -0
  146. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-PeterChalmers-min.xml +26 -0
  147. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-PeterChalmers.json +100 -0
  148. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-PeterChalmers.xml +102 -0
  149. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus1-PeterChalmers-min.json +53 -0
  150. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus1-PeterChalmers-min.xml +30 -0
  151. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus1-PeterChalmers.json +108 -0
  152. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus1-PeterChalmers.xml +107 -0
  153. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus2-PeterChalmers-min.json +53 -0
  154. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus2-PeterChalmers-min.xml +31 -0
  155. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus2-PeterChalmers.json +108 -0
  156. data/lib/tests/testscripts/xml/Connectathon11/Track1-Patient/_reference/resources/patient-update-bonus2-PeterChalmers.xml +106 -0
  157. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/C-CDA_R2-1_CCD-ussg.xml +3414 -0
  158. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-A1-empty-on-instance.xml +9 -0
  159. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-A2-empty-by-ref.xml +15 -0
  160. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-A3-empty-by-identifier.xml +13 -0
  161. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-A4-empty-by-contained.xml +15 -0
  162. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-B1-CCDA-on-instance.xml +15 -0
  163. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-B2-CCDA-by-ref.xml +21 -0
  164. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-B3-CCDA-by-identifier.xml +19 -0
  165. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/parameters-B4-CCDA-by-contained.xml +21 -0
  166. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/questionnaire-sdc-profile-example-ussg-fht.xml +3905 -0
  167. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/questionnaireresponse-expected-ussg-fht-CCDA.xml +190 -0
  168. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/_reference/resources/questionnaireresponse-expected-ussg-fht-empty.xml +177 -0
  169. data/lib/tests/testscripts/xml/Connectathon11/Track11-SDC/track11-sdc-prepop-xml.xml +142 -0
  170. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Expand/Client Assigned Id/track2-ts-suite1-expand-client-id.xml +925 -0
  171. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Expand/Client Assigned Id/track2-ts-suite2-expand-filter-client-id.xml +930 -0
  172. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Expand/Server Assigned Id/track2-ts-suite1-expand-server-id.xml +953 -0
  173. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Expand/Server Assigned Id/track2-ts-suite2-expand-filter-server-id.xml +958 -0
  174. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Lookup/track2-ts-suite5-loinc-lookup-xml.xml +224 -0
  175. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Lookup/track2-ts-suite5-snomed-lookup-xml.xml +224 -0
  176. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/README.html +85 -0
  177. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Translate/track2-ts-suite6-translate-xml.xml +224 -0
  178. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Validate-code/Client Assigned Id/track2-ts-suite3-validate-code-client-id.xml +1807 -0
  179. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Validate-code/Client Assigned Id/track2-ts-suite4-validate-code-client-id.xml +714 -0
  180. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Validate-code/Server Assigned Id/track2-ts-suite3-validate-code-server-id.xml +1835 -0
  181. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/Validate-code/Server Assigned Id/track2-ts-suite4-validate-code-server-id.xml +742 -0
  182. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ConceptMapSuite6Conformance.xml +11 -0
  183. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite1Conformance.xml +17 -0
  184. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite2Conformance.xml +17 -0
  185. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite3Conformance.xml +14 -0
  186. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite4Conformance.xml +14 -0
  187. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/conformance/ValueSetSuite5Conformance.xml +11 -0
  188. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-2-a.xml +11 -0
  189. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-2-b.xml +11 -0
  190. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-3-a.xml +13 -0
  191. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-3-b.xml +13 -0
  192. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-4-a.xml +15 -0
  193. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/extensional-case-1-input-4-4-b.xml +15 -0
  194. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/lookup-loinc-input-5-2.xml +10 -0
  195. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/lookup-loinc-input-5-3.xml +11 -0
  196. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/lookup-snomed-input-5-2.xml +10 -0
  197. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/lookup-snomed-input-5-3.xml +11 -0
  198. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/translate-conceptmap-input-6-2.xml +14 -0
  199. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/input/translate-conceptmap-input-6-3.xml +15 -0
  200. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-1-expand-min.xml +47 -0
  201. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-1-filter-min.xml +23 -0
  202. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-2-expand-min.xml +132 -0
  203. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-2-filter-min.xml +38 -0
  204. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-3-expand-min.xml +252 -0
  205. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-3-filter-min.xml +58 -0
  206. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-4-expand-min.xml +57 -0
  207. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/extensional-case-4-filter-min.xml +28 -0
  208. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-1-expand-min.xml +347 -0
  209. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-1-filter-min.xml +33 -0
  210. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-2-expand-min.xml +637 -0
  211. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-2-filter-min.xml +33 -0
  212. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/intensional-case-3-filter-min.xml +58 -0
  213. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/lookup-loinc-min.xml +11 -0
  214. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/lookup-snomed-min.xml +11 -0
  215. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/suite3-invalid-min.xml +10 -0
  216. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/suite3-valid-min.xml +7 -0
  217. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/suite4-invalid-min.xml +10 -0
  218. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/suite4-valid-min.xml +7 -0
  219. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/output/translate-conceptmap-min.xml +17 -0
  220. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/extensional-case-1.xml +55 -0
  221. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/extensional-case-2.xml +122 -0
  222. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/extensional-case-3.xml +222 -0
  223. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/extensional-case-4.xml +65 -0
  224. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/intensional-case-1.xml +31 -0
  225. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/intensional-case-2.xml +31 -0
  226. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/intensional-case-3.xml +31 -0
  227. data/lib/tests/testscripts/xml/Connectathon11/Track2-Terminology/_reference/resources/translate-conceptmap-case-1.xml +145 -0
  228. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/conformance/DecisionSupportServiceModule-Evaluate.xml +17 -0
  229. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-incomplete-request-payload.xml +26 -0
  230. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-incomplete-response-min-payload.xml +7 -0
  231. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-incomplete-response-payload.xml +332 -0
  232. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-malformed-request-payload.xml +28 -0
  233. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-malformed-response-min-payload.xml +7 -0
  234. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-malformed-response-payload.xml +20 -0
  235. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-request-payload.xml +28 -0
  236. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-response-min-payload.xml +7 -0
  237. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-response-payload.xml +332 -0
  238. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-unauthorized-request-payload.xml +28 -0
  239. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-unauthorized-response-min-payload.xml +7 -0
  240. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/ecrs-fhir-cdc-immunizations-unauthorized-response-payload.xml +8 -0
  241. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/gao-assessment-request-payload.xml +176 -0
  242. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/gao-assessment-response-payload-min.xml +32 -0
  243. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/_reference/resources/gao-assessment-response-payload.xml +80 -0
  244. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/track3-cds-evaluate-cdc-immunization.xml +290 -0
  245. data/lib/tests/testscripts/xml/Connectathon11/Track3-CDS-on-FHIR/track3-cds-evaluate-gao-profile.xml +110 -0
  246. data/lib/tests/testscripts/xml/Connectathon11/Track6-FHIR-Genomics/Client_Assigned_Id/TestScript_FHIR-Genomics.xml +170 -0
  247. data/lib/tests/testscripts/xml/Connectathon11/Track6-FHIR-Genomics/_reference/resources/sequence-example-1.xml +31 -0
  248. data/lib/tests/testscripts/xml/Connectathon11/Track6-FHIR-Genomics/_reference/resources/sequence-example-2.xml +31 -0
  249. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Actors.png +0 -0
  250. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Client_Assigned_Id/track7-laborder100-xml.xml +590 -0
  251. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Client_Assigned_Id/track7-laborder200-xml.xml +587 -0
  252. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Client_Assigned_Id/track7-laborder300-xml.xml +612 -0
  253. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Client_Assigned_Id/track7-laborder400-xml.xml +635 -0
  254. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Peer-to-Peer/track7-laborder100-peer2peer-xml.xml +752 -0
  255. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/Thumbs.db +0 -0
  256. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/conformance/LabOrderLabReport-CreateDeleteReadUpdate.xml +187 -0
  257. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/conformance/html.xslt +45 -0
  258. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-100-update.xml +64 -0
  259. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-100.xml +64 -0
  260. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-200-update.xml +121 -0
  261. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-200.xml +121 -0
  262. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-300-update.xml +91 -0
  263. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-300.xml +91 -0
  264. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-400-update.xml +88 -0
  265. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticOrder/do-400.xml +88 -0
  266. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticReport/dr-100.xml +96 -0
  267. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticReport/dr-200.xml +125 -0
  268. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticReport/dr-300.xml +132 -0
  269. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/DiagnosticReport/dr-400.xml +121 -0
  270. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-100.xml +58 -0
  271. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-101.xml +58 -0
  272. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-200.xml +125 -0
  273. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-300.xml +106 -0
  274. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-301.xml +106 -0
  275. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-302.xml +106 -0
  276. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-303.xml +106 -0
  277. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-304.xml +106 -0
  278. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-400.xml +87 -0
  279. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-401.xml +95 -0
  280. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-402.xml +95 -0
  281. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-403.xml +84 -0
  282. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-404.xml +84 -0
  283. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-405.xml +83 -0
  284. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-406.xml +83 -0
  285. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-407.xml +70 -0
  286. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-408.xml +84 -0
  287. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Observation/obs-uslab-example5.xml +102 -0
  288. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Order/order-100.xml +61 -0
  289. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Order/order-200.xml +61 -0
  290. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Order/order-300.xml +61 -0
  291. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Order/order-400.xml +61 -0
  292. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-100.xml +79 -0
  293. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-110.xml +79 -0
  294. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-200.xml +79 -0
  295. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-210.xml +79 -0
  296. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-300.xml +79 -0
  297. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-310.xml +79 -0
  298. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-400.xml +79 -0
  299. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/OrderResponse/ordresp-410.xml +79 -0
  300. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Organization/org-uslab-example3.xml +49 -0
  301. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Patient/patient-uslab-example1.xml +44 -0
  302. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Practitioner/pract-uslab-example1.xml +18 -0
  303. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Practitioner/pract-uslab-example3.xml +36 -0
  304. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Specimen/Thumbs.db +0 -0
  305. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Specimen/spec-100.xml +65 -0
  306. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Specimen/spec-400.xml +70 -0
  307. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Specimen/spec-uslab-example1.xml +82 -0
  308. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Testscript 1 Document.txt +122 -0
  309. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Testscript 2 Document.txt +103 -0
  310. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Testscript 3 Document.txt +201 -0
  311. data/lib/tests/testscripts/xml/Connectathon11/Track7-LabOrderLabReport/_reference/resources/Testscript 4 Document.txt +310 -0
  312. data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/_reference/conformance/MedicationStatementCreate.xml +11 -0
  313. data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/_reference/conformance/PatientSearchType.xml +15 -0
  314. data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/_reference/resources/medicationstatement-create.json +39 -0
  315. data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/_reference/resources/medicationstatement-patch.json +3 -0
  316. data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/track9-patch-medicationstatement-json-if-match.xml +321 -0
  317. data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/track9-patch-medicationstatement-json.xml +303 -0
  318. data/lib/tests/testscripts/xml/Connectathon11/Track9-Patch/track9-patch-peer2peer-patient-json.xml +235 -0
  319. data/plan_executor.gemspec +14 -0
  320. data/test/fixtures/diagnostic_bundle.xml +51 -0
  321. data/test/fixtures/lab_results_bundle.xml +49 -0
  322. data/test/fixtures/observation_bundle.json +61 -0
  323. data/test/fixtures/testscript-example.xml +202 -0
  324. data/test/fixtures/testscript-history.xml +143 -0
  325. data/test/fixtures/testscript-readtest.xml +272 -0
  326. data/test/fixtures/testscript-search.xml +282 -0
  327. data/test/fixtures/testscript-update.xml +147 -0
  328. data/test/fixtures/vital_signs_bundle.xml +117 -0
  329. data/test/test_helper.rb +8 -0
  330. data/test/unit/argonaut_sprint6_test.rb +31 -0
  331. data/test/unit/argonaut_sprint7_test.rb +21 -0
  332. data/test/unit/basic_test.rb +27 -0
  333. data/test/unit/fetch_patient_record_test.rb +357 -0
  334. data/test/unit/financial_test.rb +41 -0
  335. data/test/unit/fixtures_test.rb +45 -0
  336. data/test/unit/metadata_test.rb +33 -0
  337. 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