us_core_test_kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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