us_core_test_kit 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (350) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/lib/us_core_test_kit/custom_groups/capability_statement/conformance_support_test.rb +41 -0
  4. data/lib/us_core_test_kit/custom_groups/capability_statement/fhir_version_test.rb +15 -0
  5. data/lib/us_core_test_kit/custom_groups/capability_statement/json_support_test.rb +40 -0
  6. data/lib/us_core_test_kit/custom_groups/capability_statement/profile_support_test.rb +90 -0
  7. data/lib/us_core_test_kit/custom_groups/capability_statement_group.rb +64 -0
  8. data/lib/us_core_test_kit/custom_groups/clinical_notes_guidance_group.rb +208 -0
  9. data/lib/us_core_test_kit/custom_groups/data_absent_reason_group.rb +59 -0
  10. data/lib/us_core_test_kit/date_search_validation.rb +101 -0
  11. data/lib/us_core_test_kit/ext/fhir_models.rb +59 -0
  12. data/lib/us_core_test_kit/fhir_resource_navigation.rb +63 -0
  13. data/lib/us_core_test_kit/generated/allergy_intolerance/allergy_intolerance_must_support_test.rb +40 -0
  14. data/lib/us_core_test_kit/generated/allergy_intolerance/allergy_intolerance_patient_clinical_status_search_test.rb +46 -0
  15. data/lib/us_core_test_kit/generated/allergy_intolerance/allergy_intolerance_patient_search_test.rb +60 -0
  16. data/lib/us_core_test_kit/generated/allergy_intolerance/allergy_intolerance_provenance_revinclude_search_test.rb +49 -0
  17. data/lib/us_core_test_kit/generated/allergy_intolerance/allergy_intolerance_read_test.rb +24 -0
  18. data/lib/us_core_test_kit/generated/allergy_intolerance/allergy_intolerance_reference_resolution_test.rb +28 -0
  19. data/lib/us_core_test_kit/generated/allergy_intolerance/allergy_intolerance_validation_test.rb +34 -0
  20. data/lib/us_core_test_kit/generated/allergy_intolerance_group.rb +85 -0
  21. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_must_support_test.rb +49 -0
  22. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_patient_category_date_search_test.rb +46 -0
  23. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_patient_category_search_test.rb +45 -0
  24. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_patient_category_status_search_test.rb +47 -0
  25. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_patient_code_date_search_test.rb +48 -0
  26. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_patient_code_search_test.rb +62 -0
  27. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_provenance_revinclude_search_test.rb +51 -0
  28. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_read_test.rb +24 -0
  29. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_reference_resolution_test.rb +28 -0
  30. data/lib/us_core_test_kit/generated/bodyheight/bodyheight_validation_test.rb +34 -0
  31. data/lib/us_core_test_kit/generated/bodyheight_group.rb +93 -0
  32. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_must_support_test.rb +49 -0
  33. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_patient_category_date_search_test.rb +46 -0
  34. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_patient_category_search_test.rb +45 -0
  35. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_patient_category_status_search_test.rb +47 -0
  36. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_patient_code_date_search_test.rb +48 -0
  37. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_patient_code_search_test.rb +62 -0
  38. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_provenance_revinclude_search_test.rb +51 -0
  39. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_read_test.rb +24 -0
  40. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_reference_resolution_test.rb +28 -0
  41. data/lib/us_core_test_kit/generated/bodytemp/bodytemp_validation_test.rb +34 -0
  42. data/lib/us_core_test_kit/generated/bodytemp_group.rb +93 -0
  43. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_must_support_test.rb +49 -0
  44. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_patient_category_date_search_test.rb +46 -0
  45. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_patient_category_search_test.rb +45 -0
  46. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_patient_category_status_search_test.rb +47 -0
  47. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_patient_code_date_search_test.rb +48 -0
  48. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_patient_code_search_test.rb +62 -0
  49. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_provenance_revinclude_search_test.rb +51 -0
  50. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_read_test.rb +24 -0
  51. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_reference_resolution_test.rb +28 -0
  52. data/lib/us_core_test_kit/generated/bodyweight/bodyweight_validation_test.rb +34 -0
  53. data/lib/us_core_test_kit/generated/bodyweight_group.rb +93 -0
  54. data/lib/us_core_test_kit/generated/bp/bp_must_support_test.rb +52 -0
  55. data/lib/us_core_test_kit/generated/bp/bp_patient_category_date_search_test.rb +46 -0
  56. data/lib/us_core_test_kit/generated/bp/bp_patient_category_search_test.rb +45 -0
  57. data/lib/us_core_test_kit/generated/bp/bp_patient_category_status_search_test.rb +47 -0
  58. data/lib/us_core_test_kit/generated/bp/bp_patient_code_date_search_test.rb +48 -0
  59. data/lib/us_core_test_kit/generated/bp/bp_patient_code_search_test.rb +62 -0
  60. data/lib/us_core_test_kit/generated/bp/bp_provenance_revinclude_search_test.rb +51 -0
  61. data/lib/us_core_test_kit/generated/bp/bp_read_test.rb +24 -0
  62. data/lib/us_core_test_kit/generated/bp/bp_reference_resolution_test.rb +28 -0
  63. data/lib/us_core_test_kit/generated/bp/bp_validation_test.rb +34 -0
  64. data/lib/us_core_test_kit/generated/bp_group.rb +93 -0
  65. data/lib/us_core_test_kit/generated/care_plan/care_plan_must_support_test.rb +41 -0
  66. data/lib/us_core_test_kit/generated/care_plan/care_plan_patient_category_date_search_test.rb +48 -0
  67. data/lib/us_core_test_kit/generated/care_plan/care_plan_patient_category_search_test.rb +62 -0
  68. data/lib/us_core_test_kit/generated/care_plan/care_plan_patient_category_status_date_search_test.rb +48 -0
  69. data/lib/us_core_test_kit/generated/care_plan/care_plan_patient_category_status_search_test.rb +47 -0
  70. data/lib/us_core_test_kit/generated/care_plan/care_plan_provenance_revinclude_search_test.rb +51 -0
  71. data/lib/us_core_test_kit/generated/care_plan/care_plan_read_test.rb +24 -0
  72. data/lib/us_core_test_kit/generated/care_plan/care_plan_reference_resolution_test.rb +28 -0
  73. data/lib/us_core_test_kit/generated/care_plan/care_plan_validation_test.rb +34 -0
  74. data/lib/us_core_test_kit/generated/care_plan_group.rb +89 -0
  75. data/lib/us_core_test_kit/generated/care_team/care_team_must_support_test.rb +39 -0
  76. data/lib/us_core_test_kit/generated/care_team/care_team_patient_status_search_test.rb +62 -0
  77. data/lib/us_core_test_kit/generated/care_team/care_team_provenance_revinclude_search_test.rb +50 -0
  78. data/lib/us_core_test_kit/generated/care_team/care_team_read_test.rb +24 -0
  79. data/lib/us_core_test_kit/generated/care_team/care_team_reference_resolution_test.rb +28 -0
  80. data/lib/us_core_test_kit/generated/care_team/care_team_validation_test.rb +34 -0
  81. data/lib/us_core_test_kit/generated/care_team_group.rb +83 -0
  82. data/lib/us_core_test_kit/generated/condition/condition_must_support_test.rb +39 -0
  83. data/lib/us_core_test_kit/generated/condition/condition_patient_category_search_test.rb +47 -0
  84. data/lib/us_core_test_kit/generated/condition/condition_patient_clinical_status_search_test.rb +46 -0
  85. data/lib/us_core_test_kit/generated/condition/condition_patient_code_search_test.rb +47 -0
  86. data/lib/us_core_test_kit/generated/condition/condition_patient_onset_date_search_test.rb +47 -0
  87. data/lib/us_core_test_kit/generated/condition/condition_patient_search_test.rb +60 -0
  88. data/lib/us_core_test_kit/generated/condition/condition_provenance_revinclude_search_test.rb +49 -0
  89. data/lib/us_core_test_kit/generated/condition/condition_read_test.rb +24 -0
  90. data/lib/us_core_test_kit/generated/condition/condition_reference_resolution_test.rb +28 -0
  91. data/lib/us_core_test_kit/generated/condition/condition_validation_test.rb +34 -0
  92. data/lib/us_core_test_kit/generated/condition_group.rb +91 -0
  93. data/lib/us_core_test_kit/generated/device/device_must_support_test.rb +43 -0
  94. data/lib/us_core_test_kit/generated/device/device_patient_search_test.rb +65 -0
  95. data/lib/us_core_test_kit/generated/device/device_patient_type_search_test.rb +52 -0
  96. data/lib/us_core_test_kit/generated/device/device_provenance_revinclude_search_test.rb +49 -0
  97. data/lib/us_core_test_kit/generated/device/device_read_test.rb +24 -0
  98. data/lib/us_core_test_kit/generated/device/device_reference_resolution_test.rb +28 -0
  99. data/lib/us_core_test_kit/generated/device/device_validation_test.rb +34 -0
  100. data/lib/us_core_test_kit/generated/device_group.rb +85 -0
  101. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_must_support_test.rb +43 -0
  102. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_patient_category_date_search_test.rb +46 -0
  103. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_patient_category_search_test.rb +63 -0
  104. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_patient_code_date_search_test.rb +48 -0
  105. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_patient_code_search_test.rb +45 -0
  106. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_patient_search_test.rb +44 -0
  107. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_patient_status_search_test.rb +46 -0
  108. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_provenance_revinclude_search_test.rb +51 -0
  109. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_read_test.rb +24 -0
  110. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_reference_resolution_test.rb +28 -0
  111. data/lib/us_core_test_kit/generated/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +34 -0
  112. data/lib/us_core_test_kit/generated/diagnostic_report_lab_group.rb +96 -0
  113. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_must_support_test.rb +43 -0
  114. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_patient_category_date_search_test.rb +46 -0
  115. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_patient_category_search_test.rb +63 -0
  116. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_patient_code_date_search_test.rb +48 -0
  117. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_patient_code_search_test.rb +45 -0
  118. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_patient_search_test.rb +44 -0
  119. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_patient_status_search_test.rb +46 -0
  120. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_provenance_revinclude_search_test.rb +51 -0
  121. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_read_test.rb +24 -0
  122. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_reference_resolution_test.rb +28 -0
  123. data/lib/us_core_test_kit/generated/diagnostic_report_note/diagnostic_report_note_validation_test.rb +34 -0
  124. data/lib/us_core_test_kit/generated/diagnostic_report_note_group.rb +96 -0
  125. data/lib/us_core_test_kit/generated/document_reference/document_reference_id_search_test.rb +40 -0
  126. data/lib/us_core_test_kit/generated/document_reference/document_reference_must_support_test.rb +49 -0
  127. data/lib/us_core_test_kit/generated/document_reference/document_reference_patient_category_date_search_test.rb +46 -0
  128. data/lib/us_core_test_kit/generated/document_reference/document_reference_patient_category_search_test.rb +45 -0
  129. data/lib/us_core_test_kit/generated/document_reference/document_reference_patient_search_test.rb +61 -0
  130. data/lib/us_core_test_kit/generated/document_reference/document_reference_patient_status_search_test.rb +46 -0
  131. data/lib/us_core_test_kit/generated/document_reference/document_reference_patient_type_period_search_test.rb +48 -0
  132. data/lib/us_core_test_kit/generated/document_reference/document_reference_patient_type_search_test.rb +45 -0
  133. data/lib/us_core_test_kit/generated/document_reference/document_reference_provenance_revinclude_search_test.rb +50 -0
  134. data/lib/us_core_test_kit/generated/document_reference/document_reference_read_test.rb +24 -0
  135. data/lib/us_core_test_kit/generated/document_reference/document_reference_reference_resolution_test.rb +28 -0
  136. data/lib/us_core_test_kit/generated/document_reference/document_reference_validation_test.rb +34 -0
  137. data/lib/us_core_test_kit/generated/document_reference_group.rb +99 -0
  138. data/lib/us_core_test_kit/generated/encounter/encounter_class_patient_search_test.rb +47 -0
  139. data/lib/us_core_test_kit/generated/encounter/encounter_date_patient_search_test.rb +45 -0
  140. data/lib/us_core_test_kit/generated/encounter/encounter_id_search_test.rb +40 -0
  141. data/lib/us_core_test_kit/generated/encounter/encounter_identifier_search_test.rb +43 -0
  142. data/lib/us_core_test_kit/generated/encounter/encounter_must_support_test.rb +51 -0
  143. data/lib/us_core_test_kit/generated/encounter/encounter_patient_search_test.rb +61 -0
  144. data/lib/us_core_test_kit/generated/encounter/encounter_patient_status_search_test.rb +45 -0
  145. data/lib/us_core_test_kit/generated/encounter/encounter_patient_type_search_test.rb +47 -0
  146. data/lib/us_core_test_kit/generated/encounter/encounter_provenance_revinclude_search_test.rb +50 -0
  147. data/lib/us_core_test_kit/generated/encounter/encounter_read_test.rb +24 -0
  148. data/lib/us_core_test_kit/generated/encounter/encounter_reference_resolution_test.rb +28 -0
  149. data/lib/us_core_test_kit/generated/encounter/encounter_validation_test.rb +34 -0
  150. data/lib/us_core_test_kit/generated/encounter_group.rb +97 -0
  151. data/lib/us_core_test_kit/generated/goal/goal_must_support_test.rb +39 -0
  152. data/lib/us_core_test_kit/generated/goal/goal_patient_lifecycle_status_search_test.rb +45 -0
  153. data/lib/us_core_test_kit/generated/goal/goal_patient_search_test.rb +60 -0
  154. data/lib/us_core_test_kit/generated/goal/goal_patient_target_date_search_test.rb +47 -0
  155. data/lib/us_core_test_kit/generated/goal/goal_provenance_revinclude_search_test.rb +49 -0
  156. data/lib/us_core_test_kit/generated/goal/goal_read_test.rb +24 -0
  157. data/lib/us_core_test_kit/generated/goal/goal_reference_resolution_test.rb +28 -0
  158. data/lib/us_core_test_kit/generated/goal/goal_validation_test.rb +34 -0
  159. data/lib/us_core_test_kit/generated/goal_group.rb +87 -0
  160. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_must_support_test.rb +49 -0
  161. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_patient_category_date_search_test.rb +46 -0
  162. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_patient_category_search_test.rb +45 -0
  163. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_patient_category_status_search_test.rb +47 -0
  164. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_patient_code_date_search_test.rb +48 -0
  165. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_patient_code_search_test.rb +62 -0
  166. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_provenance_revinclude_search_test.rb +51 -0
  167. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_read_test.rb +24 -0
  168. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_reference_resolution_test.rb +28 -0
  169. data/lib/us_core_test_kit/generated/head_circumference/head_circumference_validation_test.rb +34 -0
  170. data/lib/us_core_test_kit/generated/head_circumference_group.rb +93 -0
  171. data/lib/us_core_test_kit/generated/heartrate/heartrate_must_support_test.rb +49 -0
  172. data/lib/us_core_test_kit/generated/heartrate/heartrate_patient_category_date_search_test.rb +46 -0
  173. data/lib/us_core_test_kit/generated/heartrate/heartrate_patient_category_search_test.rb +45 -0
  174. data/lib/us_core_test_kit/generated/heartrate/heartrate_patient_category_status_search_test.rb +47 -0
  175. data/lib/us_core_test_kit/generated/heartrate/heartrate_patient_code_date_search_test.rb +48 -0
  176. data/lib/us_core_test_kit/generated/heartrate/heartrate_patient_code_search_test.rb +62 -0
  177. data/lib/us_core_test_kit/generated/heartrate/heartrate_provenance_revinclude_search_test.rb +51 -0
  178. data/lib/us_core_test_kit/generated/heartrate/heartrate_read_test.rb +24 -0
  179. data/lib/us_core_test_kit/generated/heartrate/heartrate_reference_resolution_test.rb +28 -0
  180. data/lib/us_core_test_kit/generated/heartrate/heartrate_validation_test.rb +34 -0
  181. data/lib/us_core_test_kit/generated/heartrate_group.rb +93 -0
  182. data/lib/us_core_test_kit/generated/immunization/immunization_must_support_test.rb +40 -0
  183. data/lib/us_core_test_kit/generated/immunization/immunization_patient_date_search_test.rb +47 -0
  184. data/lib/us_core_test_kit/generated/immunization/immunization_patient_search_test.rb +60 -0
  185. data/lib/us_core_test_kit/generated/immunization/immunization_patient_status_search_test.rb +45 -0
  186. data/lib/us_core_test_kit/generated/immunization/immunization_provenance_revinclude_search_test.rb +50 -0
  187. data/lib/us_core_test_kit/generated/immunization/immunization_read_test.rb +24 -0
  188. data/lib/us_core_test_kit/generated/immunization/immunization_reference_resolution_test.rb +28 -0
  189. data/lib/us_core_test_kit/generated/immunization/immunization_validation_test.rb +34 -0
  190. data/lib/us_core_test_kit/generated/immunization_group.rb +87 -0
  191. data/lib/us_core_test_kit/generated/medication_request/medication_request_must_support_test.rb +44 -0
  192. data/lib/us_core_test_kit/generated/medication_request/medication_request_patient_intent_authoredon_search_test.rb +53 -0
  193. data/lib/us_core_test_kit/generated/medication_request/medication_request_patient_intent_encounter_search_test.rb +52 -0
  194. data/lib/us_core_test_kit/generated/medication_request/medication_request_patient_intent_search_test.rb +68 -0
  195. data/lib/us_core_test_kit/generated/medication_request/medication_request_patient_intent_status_search_test.rb +49 -0
  196. data/lib/us_core_test_kit/generated/medication_request/medication_request_provenance_revinclude_search_test.rb +51 -0
  197. data/lib/us_core_test_kit/generated/medication_request/medication_request_read_test.rb +24 -0
  198. data/lib/us_core_test_kit/generated/medication_request/medication_request_reference_resolution_test.rb +28 -0
  199. data/lib/us_core_test_kit/generated/medication_request/medication_request_validation_test.rb +34 -0
  200. data/lib/us_core_test_kit/generated/medication_request/medication_validation_test.rb +34 -0
  201. data/lib/us_core_test_kit/generated/medication_request_group.rb +92 -0
  202. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_must_support_test.rb +41 -0
  203. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_patient_category_date_search_test.rb +46 -0
  204. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_patient_category_search_test.rb +62 -0
  205. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_patient_category_status_search_test.rb +47 -0
  206. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_patient_code_date_search_test.rb +48 -0
  207. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_patient_code_search_test.rb +45 -0
  208. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_provenance_revinclude_search_test.rb +51 -0
  209. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_read_test.rb +24 -0
  210. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_reference_resolution_test.rb +28 -0
  211. data/lib/us_core_test_kit/generated/observation_lab/observation_lab_validation_test.rb +34 -0
  212. data/lib/us_core_test_kit/generated/observation_lab_group.rb +93 -0
  213. data/lib/us_core_test_kit/generated/organization/organization_address_search_test.rb +39 -0
  214. data/lib/us_core_test_kit/generated/organization/organization_must_support_test.rb +47 -0
  215. data/lib/us_core_test_kit/generated/organization/organization_name_search_test.rb +49 -0
  216. data/lib/us_core_test_kit/generated/organization/organization_read_test.rb +24 -0
  217. data/lib/us_core_test_kit/generated/organization/organization_reference_resolution_test.rb +28 -0
  218. data/lib/us_core_test_kit/generated/organization/organization_validation_test.rb +34 -0
  219. data/lib/us_core_test_kit/generated/organization_group.rb +84 -0
  220. data/lib/us_core_test_kit/generated/patient/patient_birthdate_family_search_test.rb +41 -0
  221. data/lib/us_core_test_kit/generated/patient/patient_birthdate_name_search_test.rb +39 -0
  222. data/lib/us_core_test_kit/generated/patient/patient_family_gender_search_test.rb +41 -0
  223. data/lib/us_core_test_kit/generated/patient/patient_gender_name_search_test.rb +39 -0
  224. data/lib/us_core_test_kit/generated/patient/patient_id_search_test.rb +53 -0
  225. data/lib/us_core_test_kit/generated/patient/patient_identifier_search_test.rb +40 -0
  226. data/lib/us_core_test_kit/generated/patient/patient_must_support_test.rb +57 -0
  227. data/lib/us_core_test_kit/generated/patient/patient_name_search_test.rb +39 -0
  228. data/lib/us_core_test_kit/generated/patient/patient_provenance_revinclude_search_test.rb +49 -0
  229. data/lib/us_core_test_kit/generated/patient/patient_read_test.rb +24 -0
  230. data/lib/us_core_test_kit/generated/patient/patient_reference_resolution_test.rb +28 -0
  231. data/lib/us_core_test_kit/generated/patient/patient_validation_test.rb +34 -0
  232. data/lib/us_core_test_kit/generated/patient_group.rb +99 -0
  233. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_must_support_test.rb +49 -0
  234. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_patient_category_date_search_test.rb +46 -0
  235. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_patient_category_search_test.rb +45 -0
  236. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_patient_category_status_search_test.rb +47 -0
  237. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_patient_code_date_search_test.rb +48 -0
  238. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_patient_code_search_test.rb +62 -0
  239. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_provenance_revinclude_search_test.rb +51 -0
  240. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_read_test.rb +24 -0
  241. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_reference_resolution_test.rb +28 -0
  242. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age/pediatric_bmi_for_age_validation_test.rb +34 -0
  243. data/lib/us_core_test_kit/generated/pediatric_bmi_for_age_group.rb +93 -0
  244. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_must_support_test.rb +49 -0
  245. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_patient_category_date_search_test.rb +46 -0
  246. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_patient_category_search_test.rb +45 -0
  247. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_patient_category_status_search_test.rb +47 -0
  248. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_patient_code_date_search_test.rb +48 -0
  249. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_patient_code_search_test.rb +62 -0
  250. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_provenance_revinclude_search_test.rb +51 -0
  251. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_read_test.rb +24 -0
  252. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_reference_resolution_test.rb +28 -0
  253. data/lib/us_core_test_kit/generated/pediatric_weight_for_height/pediatric_weight_for_height_validation_test.rb +34 -0
  254. data/lib/us_core_test_kit/generated/pediatric_weight_for_height_group.rb +93 -0
  255. data/lib/us_core_test_kit/generated/practitioner/practitioner_identifier_search_test.rb +40 -0
  256. data/lib/us_core_test_kit/generated/practitioner/practitioner_must_support_test.rb +40 -0
  257. data/lib/us_core_test_kit/generated/practitioner/practitioner_name_search_test.rb +49 -0
  258. data/lib/us_core_test_kit/generated/practitioner/practitioner_read_test.rb +24 -0
  259. data/lib/us_core_test_kit/generated/practitioner/practitioner_reference_resolution_test.rb +28 -0
  260. data/lib/us_core_test_kit/generated/practitioner/practitioner_validation_test.rb +34 -0
  261. data/lib/us_core_test_kit/generated/practitioner_group.rb +84 -0
  262. data/lib/us_core_test_kit/generated/procedure/procedure_must_support_test.rb +38 -0
  263. data/lib/us_core_test_kit/generated/procedure/procedure_patient_code_date_search_test.rb +48 -0
  264. data/lib/us_core_test_kit/generated/procedure/procedure_patient_date_search_test.rb +45 -0
  265. data/lib/us_core_test_kit/generated/procedure/procedure_patient_search_test.rb +60 -0
  266. data/lib/us_core_test_kit/generated/procedure/procedure_patient_status_search_test.rb +46 -0
  267. data/lib/us_core_test_kit/generated/procedure/procedure_provenance_revinclude_search_test.rb +50 -0
  268. data/lib/us_core_test_kit/generated/procedure/procedure_read_test.rb +24 -0
  269. data/lib/us_core_test_kit/generated/procedure/procedure_reference_resolution_test.rb +28 -0
  270. data/lib/us_core_test_kit/generated/procedure/procedure_validation_test.rb +34 -0
  271. data/lib/us_core_test_kit/generated/procedure_group.rb +90 -0
  272. data/lib/us_core_test_kit/generated/provenance/provenance_must_support_test.rb +44 -0
  273. data/lib/us_core_test_kit/generated/provenance/provenance_read_test.rb +24 -0
  274. data/lib/us_core_test_kit/generated/provenance/provenance_reference_resolution_test.rb +28 -0
  275. data/lib/us_core_test_kit/generated/provenance/provenance_validation_test.rb +34 -0
  276. data/lib/us_core_test_kit/generated/provenance_group.rb +56 -0
  277. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_must_support_test.rb +65 -0
  278. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_patient_category_date_search_test.rb +46 -0
  279. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_patient_category_search_test.rb +45 -0
  280. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_patient_category_status_search_test.rb +47 -0
  281. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_patient_code_date_search_test.rb +48 -0
  282. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_patient_code_search_test.rb +62 -0
  283. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_provenance_revinclude_search_test.rb +51 -0
  284. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_read_test.rb +24 -0
  285. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_reference_resolution_test.rb +28 -0
  286. data/lib/us_core_test_kit/generated/pulse_oximetry/pulse_oximetry_validation_test.rb +34 -0
  287. data/lib/us_core_test_kit/generated/pulse_oximetry_group.rb +93 -0
  288. data/lib/us_core_test_kit/generated/resource_list.rb +26 -0
  289. data/lib/us_core_test_kit/generated/resprate/resprate_must_support_test.rb +49 -0
  290. data/lib/us_core_test_kit/generated/resprate/resprate_patient_category_date_search_test.rb +46 -0
  291. data/lib/us_core_test_kit/generated/resprate/resprate_patient_category_search_test.rb +45 -0
  292. data/lib/us_core_test_kit/generated/resprate/resprate_patient_category_status_search_test.rb +47 -0
  293. data/lib/us_core_test_kit/generated/resprate/resprate_patient_code_date_search_test.rb +48 -0
  294. data/lib/us_core_test_kit/generated/resprate/resprate_patient_code_search_test.rb +62 -0
  295. data/lib/us_core_test_kit/generated/resprate/resprate_provenance_revinclude_search_test.rb +51 -0
  296. data/lib/us_core_test_kit/generated/resprate/resprate_read_test.rb +24 -0
  297. data/lib/us_core_test_kit/generated/resprate/resprate_reference_resolution_test.rb +28 -0
  298. data/lib/us_core_test_kit/generated/resprate/resprate_validation_test.rb +34 -0
  299. data/lib/us_core_test_kit/generated/resprate_group.rb +93 -0
  300. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_must_support_test.rb +39 -0
  301. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_patient_category_date_search_test.rb +48 -0
  302. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_patient_category_search_test.rb +47 -0
  303. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_patient_category_status_search_test.rb +47 -0
  304. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_patient_code_date_search_test.rb +48 -0
  305. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_patient_code_search_test.rb +62 -0
  306. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_provenance_revinclude_search_test.rb +51 -0
  307. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_read_test.rb +24 -0
  308. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_reference_resolution_test.rb +28 -0
  309. data/lib/us_core_test_kit/generated/smokingstatus/smokingstatus_validation_test.rb +34 -0
  310. data/lib/us_core_test_kit/generated/smokingstatus_group.rb +93 -0
  311. data/lib/us_core_test_kit/generated/us_core_test_suite.rb +110 -0
  312. data/lib/us_core_test_kit/generator/group_generator.rb +171 -0
  313. data/lib/us_core_test_kit/generator/group_metadata.rb +98 -0
  314. data/lib/us_core_test_kit/generator/group_metadata_extractor.rb +281 -0
  315. data/lib/us_core_test_kit/generator/ig_loader.rb +63 -0
  316. data/lib/us_core_test_kit/generator/ig_metadata.rb +49 -0
  317. data/lib/us_core_test_kit/generator/ig_metadata_extractor.rb +56 -0
  318. data/lib/us_core_test_kit/generator/ig_resources.rb +48 -0
  319. data/lib/us_core_test_kit/generator/must_support_metadata_extractor.rb +221 -0
  320. data/lib/us_core_test_kit/generator/must_support_test_generator.rb +86 -0
  321. data/lib/us_core_test_kit/generator/naming.rb +58 -0
  322. data/lib/us_core_test_kit/generator/provenance_revinclude_search_test_generator.rb +186 -0
  323. data/lib/us_core_test_kit/generator/read_test_generator.rb +89 -0
  324. data/lib/us_core_test_kit/generator/reference_resolution_test_generator.rb +72 -0
  325. data/lib/us_core_test_kit/generator/resource_list_generator.rb +46 -0
  326. data/lib/us_core_test_kit/generator/search_definition_metadata_extractor.rb +181 -0
  327. data/lib/us_core_test_kit/generator/search_metadata_extractor.rb +74 -0
  328. data/lib/us_core_test_kit/generator/search_test_generator.rb +280 -0
  329. data/lib/us_core_test_kit/generator/special_cases.rb +17 -0
  330. data/lib/us_core_test_kit/generator/suite_generator.rb +67 -0
  331. data/lib/us_core_test_kit/generator/terminology_binding_metadata_extractor.rb +105 -0
  332. data/lib/us_core_test_kit/generator/validation_test_generator.rb +124 -0
  333. data/lib/us_core_test_kit/generator.rb +86 -0
  334. data/lib/us_core_test_kit/igs/StructureDefinition-bodyheight.json +3772 -0
  335. data/lib/us_core_test_kit/igs/StructureDefinition-bodytemp.json +3772 -0
  336. data/lib/us_core_test_kit/igs/StructureDefinition-bodyweight.json +3772 -0
  337. data/lib/us_core_test_kit/igs/StructureDefinition-bp.json +6034 -0
  338. data/lib/us_core_test_kit/igs/StructureDefinition-heartrate.json +3756 -0
  339. data/lib/us_core_test_kit/igs/StructureDefinition-resprate.json +3756 -0
  340. data/lib/us_core_test_kit/igs/package.tgz +0 -0
  341. data/lib/us_core_test_kit/must_support_test.rb +146 -0
  342. data/lib/us_core_test_kit/read_test.rb +62 -0
  343. data/lib/us_core_test_kit/reference_resolution_test.rb +111 -0
  344. data/lib/us_core_test_kit/request_logger.rb +46 -0
  345. data/lib/us_core_test_kit/search_test.rb +686 -0
  346. data/lib/us_core_test_kit/search_test_properties.rb +56 -0
  347. data/lib/us_core_test_kit/validation_test.rb +48 -0
  348. data/lib/us_core_test_kit/version.rb +3 -0
  349. data/lib/us_core_test_kit.rb +2 -0
  350. metadata +477 -0
@@ -0,0 +1,110 @@
1
+ require 'inferno/dsl/oauth_credentials'
2
+ require_relative '../version'
3
+ require_relative '../custom_groups/capability_statement_group'
4
+ require_relative '../custom_groups/clinical_notes_guidance_group'
5
+ require_relative '../custom_groups/data_absent_reason_group'
6
+ require_relative 'patient_group'
7
+ require_relative 'allergy_intolerance_group'
8
+ require_relative 'care_plan_group'
9
+ require_relative 'care_team_group'
10
+ require_relative 'condition_group'
11
+ require_relative 'device_group'
12
+ require_relative 'diagnostic_report_note_group'
13
+ require_relative 'diagnostic_report_lab_group'
14
+ require_relative 'document_reference_group'
15
+ require_relative 'goal_group'
16
+ require_relative 'immunization_group'
17
+ require_relative 'medication_request_group'
18
+ require_relative 'smokingstatus_group'
19
+ require_relative 'pediatric_weight_for_height_group'
20
+ require_relative 'observation_lab_group'
21
+ require_relative 'pediatric_bmi_for_age_group'
22
+ require_relative 'pulse_oximetry_group'
23
+ require_relative 'head_circumference_group'
24
+ require_relative 'bodyheight_group'
25
+ require_relative 'bodytemp_group'
26
+ require_relative 'bp_group'
27
+ require_relative 'bodyweight_group'
28
+ require_relative 'heartrate_group'
29
+ require_relative 'resprate_group'
30
+ require_relative 'procedure_group'
31
+ require_relative 'encounter_group'
32
+ require_relative 'organization_group'
33
+ require_relative 'practitioner_group'
34
+ require_relative 'provenance_group'
35
+
36
+ module USCoreTestKit
37
+ class USCoreTestSuite < Inferno::TestSuite
38
+ title 'US Core 3.1.1'
39
+ version VERSION
40
+
41
+ VALIDATION_MESSAGE_FILTERS = [
42
+ %r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris$},
43
+ %r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris$},
44
+ /^Observation\.effective\.ofType\(Period\): vs-1:/, # Invalid invariant in FHIR v4.0.1
45
+ /^Observation\.effective\.ofType\(Period\): us-core-1:/ # Invalid invariant in US Core v3.1.1
46
+ ].freeze
47
+
48
+ def self.metadata
49
+ @metadata ||= YAML.load_file(File.join(__dir__, 'metadata.yml'))[:groups].map do |raw_metadata|
50
+ Generator::GroupMetadata.new(raw_metadata)
51
+ end
52
+ end
53
+
54
+ validator do
55
+ url ENV.fetch('VALIDATOR_URL', 'http://validator_service:4567')
56
+ exclude_message do |message|
57
+ VALIDATION_MESSAGE_FILTERS.any? { |filter| filter.match? message.message }
58
+ end
59
+ end
60
+
61
+ id :us_core_311
62
+
63
+ input :url,
64
+ title: 'FHIR Endpoint',
65
+ description: 'URL of the FHIR endpoint'
66
+ input :smart_credentials,
67
+ title: 'OAuth Credentials',
68
+ type: :oauth_credentials,
69
+ optional: true
70
+
71
+ fhir_client do
72
+ url :url
73
+ oauth_credentials :smart_credentials
74
+ end
75
+
76
+ group from: :us_core_311_capability_statement
77
+
78
+ group from: :us_core_311_patient
79
+ group from: :us_core_311_allergy_intolerance
80
+ group from: :us_core_311_care_plan
81
+ group from: :us_core_311_care_team
82
+ group from: :us_core_311_condition
83
+ group from: :us_core_311_device
84
+ group from: :us_core_311_diagnostic_report_note
85
+ group from: :us_core_311_diagnostic_report_lab
86
+ group from: :us_core_311_document_reference
87
+ group from: :us_core_311_goal
88
+ group from: :us_core_311_immunization
89
+ group from: :us_core_311_medication_request
90
+ group from: :us_core_311_smokingstatus
91
+ group from: :us_core_311_pediatric_weight_for_height
92
+ group from: :us_core_311_observation_lab
93
+ group from: :us_core_311_pediatric_bmi_for_age
94
+ group from: :us_core_311_pulse_oximetry
95
+ group from: :us_core_311_head_circumference
96
+ group from: :us_core_311_bodyheight
97
+ group from: :us_core_311_bodytemp
98
+ group from: :us_core_311_bp
99
+ group from: :us_core_311_bodyweight
100
+ group from: :us_core_311_heartrate
101
+ group from: :us_core_311_resprate
102
+ group from: :us_core_311_procedure
103
+ group from: :us_core_311_encounter
104
+ group from: :us_core_311_organization
105
+ group from: :us_core_311_practitioner
106
+ group from: :us_core_311_provenance
107
+ group from: :us_core_311_clinical_notes_guidance
108
+ group from: :us_core_311_data_absent_reason
109
+ end
110
+ end
@@ -0,0 +1,171 @@
1
+ require_relative 'naming'
2
+ require_relative 'special_cases'
3
+
4
+ module USCoreTestKit
5
+ class Generator
6
+ class GroupGenerator
7
+ class << self
8
+ def generate(ig_metadata)
9
+ ig_metadata.ordered_groups
10
+ .reject { |group| SpecialCases.exclude_resource? group.resource }
11
+ .each { |group| new(group).generate }
12
+ end
13
+ end
14
+
15
+ attr_accessor :group_metadata
16
+
17
+ def initialize(group_metadata)
18
+ self.group_metadata = group_metadata
19
+ end
20
+
21
+ def template
22
+ @template ||= File.read(File.join(__dir__, 'templates', 'group.rb.erb'))
23
+ end
24
+
25
+ def output
26
+ @output ||= ERB.new(template).result(binding)
27
+ end
28
+
29
+ def base_output_file_name
30
+ "#{class_name.underscore}.rb"
31
+ end
32
+
33
+ def base_metadata_file_name
34
+ "metadata.yml"
35
+ end
36
+
37
+ def class_name
38
+ "#{Naming.upper_camel_case_for_profile(group_metadata)}Group"
39
+ end
40
+
41
+ def title
42
+ group_metadata.title
43
+ end
44
+
45
+ def short_description
46
+ group_metadata.short_description
47
+ end
48
+
49
+ def output_file_name
50
+ File.join(__dir__, '..', 'generated', base_output_file_name)
51
+ end
52
+
53
+ def metadata_file_name
54
+ File.join(__dir__, '..', 'generated', profile_identifier, base_metadata_file_name)
55
+ end
56
+
57
+ def profile_identifier
58
+ Naming.snake_case_for_profile(group_metadata)
59
+ end
60
+
61
+ def group_id
62
+ "us_core_311_#{profile_identifier}"
63
+ end
64
+
65
+ def resource_type
66
+ group_metadata.resource
67
+ end
68
+
69
+ def profile_name
70
+ group_metadata.profile_name
71
+ end
72
+
73
+ def profile_url
74
+ group_metadata.profile_url
75
+ end
76
+
77
+ def generate
78
+ File.open(output_file_name, 'w') { |f| f.write(output) }
79
+ group_metadata.id = group_id
80
+ group_metadata.file_name = base_output_file_name
81
+ File.open(metadata_file_name, 'w') { |f| f.write(YAML.dump(group_metadata.to_hash)) }
82
+ end
83
+
84
+ def test_id_list
85
+ @test_id_list ||=
86
+ group_metadata.tests.map { |test| test[:id] }
87
+ end
88
+
89
+ def test_file_list
90
+ @test_file_list ||=
91
+ group_metadata.tests.map { |test| test[:file_name].delete_suffix('.rb') }
92
+ end
93
+
94
+ def required_searches
95
+ group_metadata.searches.select { |search| search[:expectation] == 'SHALL' }
96
+ end
97
+
98
+ def search_param_name_string
99
+ required_searches
100
+ .map { |search| search[:names].join(' + ') }
101
+ .map { |names| "* #{names}" }
102
+ .join("\n")
103
+ end
104
+
105
+ def search_description
106
+ return '' if required_searches.blank?
107
+
108
+ <<~SEARCH_DESCRIPTION
109
+ ## Searching
110
+ This test sequence will first perform each required search associated
111
+ with this resource. This sequence will perform searches with the
112
+ following parameters:
113
+
114
+ #{search_param_name_string}
115
+
116
+ ### Search Parameters
117
+ The first search uses the selected patient(s) from the prior launch
118
+ sequence. Any subsequent searches will look for its parameter values
119
+ from the results of the first search. For example, the `identifier`
120
+ search in the patient sequence is performed by looking for an existing
121
+ `Patient.identifier` from any of the resources returned in the `_id`
122
+ search. If a value cannot be found this way, the search is skipped.
123
+
124
+ ### Search Validation
125
+ Inferno will retrieve up to the first 20 bundle pages of the reply for
126
+ #{resource_type} resources and save them for subsequent tests. Each of
127
+ these resources is then checked to see if it matches the searched
128
+ parameters in accordance with [FHIR search
129
+ guidelines](https://www.hl7.org/fhir/search.html). The test will fail,
130
+ for example, if a Patient search for `gender=male` returns a `female`
131
+ patient.
132
+ SEARCH_DESCRIPTION
133
+ end
134
+
135
+ def description
136
+ <<~DESCRIPTION
137
+ # Background
138
+
139
+ The US Core #{title} sequence verifies that the system under test is
140
+ able to provide correct responses for #{resource_type} queries. These queries
141
+ must contain resources conforming to the #{profile_name} as
142
+ specified in the US Core v3.1.1 Implementation Guide.
143
+
144
+ # Testing Methodology
145
+ #{search_description}
146
+
147
+ ## Must Support
148
+ Each profile contains elements marked as "must support". This test
149
+ sequence expects to see each of these elements at least once. If at
150
+ least one cannot be found, the test will fail. The test will look
151
+ through the #{resource_type} resources found in the first test for these
152
+ elements.
153
+
154
+ ## Profile Validation
155
+ Each resource returned from the first search is expected to conform to
156
+ the [#{profile_name}](#{profile_url}). Each element is checked against
157
+ teminology binding and cardinality requirements.
158
+
159
+ Elements with a required binding are validated against their bound
160
+ ValueSet. If the code/system in the element is not part of the ValueSet,
161
+ then the test will fail.
162
+
163
+ ## Reference Validation
164
+ Each reference within the resources found from the previous tests must
165
+ resolve. The test will attempt to read each reference found and will
166
+ fail if any attempted read fails.
167
+ DESCRIPTION
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,98 @@
1
+ module USCoreTestKit
2
+ class Generator
3
+ class GroupMetadata
4
+ ATTRIBUTES = [
5
+ :name,
6
+ :class_name,
7
+ :version,
8
+ :reformatted_version,
9
+ :resource,
10
+ :profile_url,
11
+ :profile_name,
12
+ :title,
13
+ :short_description,
14
+ :interactions,
15
+ :operations,
16
+ :searches,
17
+ :search_definitions,
18
+ :include_params,
19
+ :revincludes,
20
+ :required_concepts,
21
+ :must_supports,
22
+ :mandatory_elements,
23
+ :bindings,
24
+ :references,
25
+ :tests,
26
+ :id,
27
+ :file_name,
28
+ :delayed_references
29
+ ].freeze
30
+
31
+ NON_USCDI_RESOURCES = [
32
+ 'Encounter',
33
+ 'Location',
34
+ 'Organization',
35
+ 'Practitioner',
36
+ 'PractitionerRole',
37
+ 'Provenance'
38
+ ].freeze
39
+
40
+ ATTRIBUTES.each { |name| attr_accessor name }
41
+
42
+ def initialize(**params)
43
+ params.each do |key, value|
44
+ raise "Unknown attribute #{key}" unless ATTRIBUTES.include? key
45
+
46
+ instance_variable_set(:"@#{key}", value)
47
+ end
48
+ end
49
+
50
+ def delayed?
51
+ return false if resource == 'Patient'
52
+
53
+ no_patient_searches? || non_uscdi_resource?
54
+ end
55
+
56
+ def no_patient_searches?
57
+ searches.none? { |search| search[:names].include? 'patient' }
58
+ end
59
+
60
+ def non_uscdi_resource?
61
+ NON_USCDI_RESOURCES.include? resource
62
+ end
63
+
64
+ def add_test(id:, file_name:)
65
+ self.tests ||= []
66
+
67
+ test_metadata = {
68
+ id: id,
69
+ file_name: file_name
70
+ }
71
+
72
+ if delayed? && id.include?('read')
73
+ self.tests.unshift(test_metadata)
74
+ else
75
+ self.tests << test_metadata
76
+ end
77
+ end
78
+
79
+ def to_hash
80
+ ATTRIBUTES.each_with_object({}) { |key, hash| hash[key] = send(key) }
81
+ end
82
+
83
+ def add_delayed_references(delayed_profiles, ig_resources)
84
+ self.delayed_references =
85
+ references
86
+ .select { |reference| (reference[:profiles] & delayed_profiles).present? }
87
+ .map do |reference|
88
+ profile_urls = (reference[:profiles] & delayed_profiles)
89
+ delayed_resources = profile_urls.map { |url| ig_resources.resource_for_profile(url) }
90
+ {
91
+ path: reference[:path].gsub("#{resource}.", ''),
92
+ resources: delayed_resources
93
+ }
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,281 @@
1
+ require_relative 'group_metadata'
2
+ require_relative 'ig_metadata'
3
+ require_relative 'must_support_metadata_extractor'
4
+ require_relative 'search_metadata_extractor'
5
+ require_relative 'terminology_binding_metadata_extractor'
6
+
7
+ module USCoreTestKit
8
+ class Generator
9
+ class GroupMetadataExtractor
10
+ attr_accessor :resource_capabilities, :profile_url, :ig_metadata, :ig_resources
11
+
12
+ def initialize(resource_capabilities, profile_url, ig_metadata, ig_resources)
13
+ self.resource_capabilities = resource_capabilities
14
+ self.profile_url = profile_url
15
+ self.ig_metadata = ig_metadata
16
+ self.ig_resources = ig_resources
17
+ end
18
+
19
+ def group_metadata
20
+ @group_metadata ||=
21
+ GroupMetadata.new(group_metadata_hash)
22
+ end
23
+
24
+ def group_metadata_hash
25
+ @group_metadata_hash ||=
26
+ {
27
+ name: name,
28
+ class_name: class_name,
29
+ version: version,
30
+ reformatted_version: reformatted_version,
31
+ # test_id_prefix: test_id_prefix,
32
+ resource: resource,
33
+ profile_url: profile_url,
34
+ profile_name: profile_name,
35
+ title: title,
36
+ short_description: short_description,
37
+ interactions: interactions,
38
+ operations: operations,
39
+ searches: searches,
40
+ search_definitions: search_definitions,
41
+ include_params: include_params,
42
+ revincludes: revincludes,
43
+ required_concepts: required_concepts,
44
+ must_supports: must_supports,
45
+ mandatory_elements: mandatory_elements,
46
+ bindings: bindings,
47
+ references: references
48
+ # tests: []
49
+ }
50
+
51
+ mark_mandatory_and_must_support_searches
52
+ handle_special_cases
53
+
54
+ @group_metadata_hash
55
+ end
56
+
57
+ def mark_mandatory_and_must_support_searches
58
+ searches.each do |search|
59
+ search[:names_not_must_support_or_mandatory] = search[:names].reject do |name|
60
+ path = search_definitions[name.to_sym][:full_path]
61
+ any_must_support_elements = (must_supports[:elements]).any? do |element|
62
+ full_must_support_path = "#{resource}.#{element[:path]}"
63
+
64
+ # allow for non-choice, choice types, and _id
65
+ name == '_id' || full_must_support_path == path || full_must_support_path == "#{path}[x]"
66
+ end
67
+
68
+ any_must_support_slices = must_supports[:slices].any? do |slice|
69
+ # only handle type slices because that is all we need for now
70
+ if slice[:discriminator] && slice[:discriminator][:type] == 'type'
71
+ full_must_support_path = "#{resource}.#{slice[:path].sub('[x]', slice[:discriminator][:code])}"
72
+ full_must_support_path == path
73
+ else
74
+ false
75
+ end
76
+ end
77
+
78
+ any_mandatory_elements = mandatory_elements.any? do |element|
79
+ element == path
80
+ end
81
+
82
+ any_must_support_elements || any_must_support_slices || any_mandatory_elements
83
+ end
84
+
85
+ search[:must_support_or_mandatory] = search[:names_not_must_support_or_mandatory].empty?
86
+ end
87
+ end
88
+
89
+ ### BEGIN SPECIAL CASES ###
90
+
91
+ CATEGORY_FIRST_PROFILES = [
92
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-careplan',
93
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-observation-lab',
94
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-diagnosticreport-lab',
95
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-diagnosticreport-note'
96
+ ]
97
+
98
+ def category_first_profile?
99
+ CATEGORY_FIRST_PROFILES.include?(profile_url)
100
+ end
101
+
102
+ def first_search_params
103
+ @first_search_params ||=
104
+ if category_first_profile?
105
+ ['patient', 'category']
106
+ elsif resource == 'Observation'
107
+ ['patient', 'code']
108
+ elsif resource == 'MedicationRequest'
109
+ ['patient', 'intent']
110
+ else
111
+ ['patient']
112
+ end
113
+ end
114
+
115
+ def handle_special_cases
116
+ set_first_search
117
+
118
+ case profile_url
119
+ when 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-implantable-device'
120
+ must_supports[:elements].delete_if do |element|
121
+ ['udiCarrier.carrierAIDC', 'udiCarrier.carrierHRF'].include? element[:path]
122
+ end
123
+ when 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-documentreference'
124
+ must_supports[:elements].delete_if do |element|
125
+ ['content.attachment.data', 'content.attachment.url'].include? element[:path]
126
+ end
127
+ end
128
+ end
129
+
130
+ def set_first_search
131
+ search = searches.find { |param| param[:names] == first_search_params }
132
+ return if search.nil?
133
+
134
+ searches.delete(search)
135
+ searches.unshift(search)
136
+ end
137
+
138
+ ### END SPECIAL CASES ###
139
+
140
+ def profile
141
+ @profile ||= ig_resources.profile_by_url(profile_url)
142
+ end
143
+
144
+ def profile_elements
145
+ @profile_elements ||= profile.snapshot.element
146
+ end
147
+
148
+ def base_name
149
+ profile_url.split('StructureDefinition/').last
150
+ end
151
+
152
+ def name
153
+ base_name.tr('-', '_')
154
+ end
155
+
156
+ def class_name
157
+ base_name
158
+ .split('-')
159
+ .map(&:capitalize)
160
+ .join
161
+ .gsub('UsCore', "USCore#{ig_metadata.reformatted_version}")
162
+ .concat('Sequence')
163
+ end
164
+
165
+ def version
166
+ ig_metadata.ig_version
167
+ end
168
+
169
+ def reformatted_version
170
+ ig_metadata.reformatted_version
171
+ end
172
+
173
+ def resource
174
+ resource_capabilities.type
175
+ end
176
+
177
+ def profile_name
178
+ profile.title.gsub(' ', ' ')
179
+ end
180
+
181
+ def title
182
+ profile.title.gsub(/US\s*Core\s*/, '').gsub(/\s*Profile/, '').strip
183
+ end
184
+
185
+ def short_description
186
+ "Verify support for the server capabilities required by the #{profile_name}."
187
+ end
188
+
189
+ def interactions
190
+ @interactions ||=
191
+ resource_capabilities.interaction.map do |interaction|
192
+ {
193
+ code: interaction.code,
194
+ expectation: interaction.extension.first.valueCode # TODO: fix expectation extension finding
195
+ }
196
+ end
197
+ end
198
+
199
+ def operations
200
+ @operations ||=
201
+ resource_capabilities.operation.map do |operation|
202
+ {
203
+ code: operation.name,
204
+ expectation: operation.extension.first.valueCode # TODO: fix expectation extension finding
205
+ }
206
+ end
207
+ end
208
+
209
+ def search_metadata_extractor
210
+ @search_metadata_extractor ||=
211
+ SearchMetadataExtractor.new(resource_capabilities, ig_resources, resource, profile_elements)
212
+ end
213
+
214
+ def searches
215
+ @searches ||= search_metadata_extractor.searches
216
+ end
217
+
218
+ def search_definitions
219
+ @search_definitions ||= search_metadata_extractor.search_definitions
220
+ end
221
+
222
+ def include_params
223
+ resource_capabilities.searchInclude || []
224
+ end
225
+
226
+ def revincludes
227
+ resource_capabilities.searchRevInclude || []
228
+ end
229
+
230
+ def required_concepts
231
+ # The base FHIR vital signs profile has a required binding that isn't
232
+ # relevant for any of its child profiles
233
+ return if resource == 'Observation'
234
+
235
+ profile_elements
236
+ .select { |element| element.type&.any? { |type| type.code == 'CodeableConcept' } }
237
+ .select { |element| element.binding&.strength == 'required' }
238
+ .map { |element| element.path.gsub("#{resource}.", '').gsub('[x]', 'CodeableConcept') }
239
+ end
240
+
241
+ def terminology_binding_metadata_extractor
242
+ @terminology_binding_metadata_extractor ||=
243
+ TerminologyBindingMetadataExtractor.new(profile_elements, ig_resources, resource)
244
+ end
245
+
246
+ def bindings
247
+ @bindings ||=
248
+ terminology_binding_metadata_extractor.terminology_bindings
249
+ end
250
+
251
+ def must_support_metadata_extractor
252
+ @must_support_metadata_extractor ||=
253
+ MustSupportMetadataExtractor.new(profile_elements, profile, resource)
254
+ end
255
+
256
+ def must_supports
257
+ @must_supports ||=
258
+ must_support_metadata_extractor.must_supports
259
+ end
260
+
261
+ def mandatory_elements
262
+ @mandatory_elements ||=
263
+ profile_elements
264
+ .select { |element| element.min.positive? }
265
+ .map { |element| element.path }
266
+ end
267
+
268
+ def references
269
+ @references ||=
270
+ profile_elements
271
+ .select { |element| element.type&.first&.code == 'Reference' }
272
+ .map do |reference_definition|
273
+ {
274
+ path: reference_definition.path,
275
+ profiles: reference_definition.type.first.targetProfile
276
+ }
277
+ end
278
+ end
279
+ end
280
+ end
281
+ end