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,186 @@
1
+ require_relative 'naming'
2
+ require_relative 'special_cases'
3
+
4
+ module USCoreTestKit
5
+ class Generator
6
+ class ProvenanceRevincludeSearchTestGenerator
7
+ class << self
8
+ def generate(ig_metadata)
9
+ ig_metadata.groups
10
+ .reject { |group| SpecialCases.exclude_resource? group.resource }
11
+ .select { |group| group.revincludes.include? 'Provenance:target' }
12
+ .each { |group| new(group, group.searches.first).generate }
13
+ end
14
+ end
15
+
16
+ attr_accessor :group_metadata, :search_metadata
17
+
18
+ def initialize(group_metadata, search_metadata)
19
+ self.group_metadata = group_metadata
20
+ self.search_metadata = search_metadata
21
+ end
22
+
23
+ def template
24
+ @template ||= File.read(File.join(__dir__, 'templates', 'provenance_revinclude_search.rb.erb'))
25
+ end
26
+
27
+ def output
28
+ @output ||= ERB.new(template).result(binding)
29
+ end
30
+
31
+ def base_output_file_name
32
+ "#{class_name.underscore}.rb"
33
+ end
34
+
35
+ def output_file_directory
36
+ File.join(__dir__, '..', 'generated', profile_identifier)
37
+ end
38
+
39
+ def output_file_name
40
+ File.join(output_file_directory, base_output_file_name)
41
+ end
42
+
43
+ def profile_identifier
44
+ Naming.snake_case_for_profile(group_metadata)
45
+ end
46
+
47
+ def test_id
48
+ "us_core_311_#{profile_identifier}_#{search_identifier}_search_test"
49
+ end
50
+
51
+ def search_identifier
52
+ 'provenance_revinclude'
53
+ end
54
+
55
+ def search_title
56
+ search_identifier.camelize
57
+ end
58
+
59
+ def class_name
60
+ "#{Naming.upper_camel_case_for_profile(group_metadata)}#{search_title}SearchTest"
61
+ end
62
+
63
+ def resource_type
64
+ group_metadata.resource
65
+ end
66
+
67
+ def search_params
68
+ @search_params ||=
69
+ search_metadata[:names].map do |name|
70
+ {
71
+ name: name,
72
+ path: search_definition(name)[:path]
73
+ }
74
+ end
75
+ end
76
+
77
+ def first_search?
78
+ group_metadata.searches.first == search_metadata
79
+ end
80
+
81
+ def fixed_value_search?
82
+ search_metadata[:names] != ['patient'] &&
83
+ !group_metadata.delayed? && resource_type != 'Patient'
84
+ end
85
+
86
+ def fixed_value_search_param_name
87
+ (search_metadata[:names] - [:patient]).first
88
+ end
89
+
90
+ def search_param_name_string
91
+ search_metadata[:names].join(' + ') + ' + revInclude:Provenance:target'
92
+ end
93
+
94
+ def needs_patient_id?
95
+ search_metadata[:names].include?('patient') ||
96
+ (resource_type == 'Patient' && search_metadata[:names].include?('_id'))
97
+ end
98
+
99
+ def search_param_names
100
+ search_params.map { |param| param[:name] }
101
+ end
102
+
103
+ def search_param_names_array
104
+ array_of_strings(search_param_names)
105
+ end
106
+
107
+ def path_for_value(path)
108
+ path == 'class' ? 'local_class' : path
109
+ end
110
+
111
+ def required_comparators_for_param(name)
112
+ search_definition(name)[:comparators].select { |_comparator, expectation| expectation == 'SHALL' }
113
+ end
114
+
115
+ def required_comparators
116
+ @required_comparators ||=
117
+ search_param_names.each_with_object({}) do |name, comparators|
118
+ required_comparators = required_comparators_for_param(name)
119
+ comparators[name] = required_comparators if required_comparators.present?
120
+ end
121
+ end
122
+
123
+ # def patient_id_param?(param)
124
+ # param[:name] == 'patient' ||
125
+ # (resource_type == 'Patient' && param[:name] == '_id')
126
+ # end
127
+
128
+ def search_definition(name)
129
+ group_metadata.search_definitions[name.to_sym]
130
+ end
131
+
132
+ def saves_delayed_references?
133
+ first_search? && group_metadata.delayed_references.present?
134
+ end
135
+
136
+ def possible_status_search?
137
+ !search_metadata[:names].include?('status') && group_metadata.search_definitions.key?(:status)
138
+ end
139
+
140
+ def token_search_params
141
+ @token_search_params ||=
142
+ search_param_names.select do |name|
143
+ ['Identifier', 'CodeableConcept', 'Coding'].include? group_metadata.search_definitions[name.to_sym][:type]
144
+ end
145
+ end
146
+
147
+ def token_search_params_string
148
+ array_of_strings(token_search_params)
149
+ end
150
+
151
+ def required_comparators_string
152
+ array_of_strings(required_comparators.keys)
153
+ end
154
+
155
+ def array_of_strings(array)
156
+ quoted_strings = array.map { |element| "'#{element}'" }
157
+ "[#{quoted_strings.join(', ')}]"
158
+ end
159
+
160
+ def search_properties
161
+ {}.tap do |properties|
162
+ properties[:fixed_value_search] = 'true' if fixed_value_search?
163
+ properties[:resource_type] = "'#{resource_type}'"
164
+ properties[:search_param_names] = search_param_names_array
165
+ properties[:possible_status_search] = 'true' if possible_status_search?
166
+ end
167
+ end
168
+
169
+ def search_test_properties_string
170
+ search_properties
171
+ .map { |key, value| "#{' ' * 8}#{key}: #{value}" }
172
+ .join(",\n")
173
+ end
174
+
175
+ def generate
176
+ FileUtils.mkdir_p(output_file_directory)
177
+ File.open(output_file_name, 'w') { |f| f.write(output) }
178
+
179
+ group_metadata.add_test(
180
+ id: test_id,
181
+ file_name: base_output_file_name
182
+ )
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,89 @@
1
+ require_relative 'naming'
2
+ require_relative 'special_cases'
3
+
4
+ module USCoreTestKit
5
+ class Generator
6
+ class ReadTestGenerator
7
+ class << self
8
+ def generate(ig_metadata)
9
+ ig_metadata.groups
10
+ .reject { |group| SpecialCases.exclude_resource? group.resource }
11
+ .select { |group| read_interaction(group).present? }
12
+ .each { |group| new(group).generate }
13
+ end
14
+
15
+ def read_interaction(group_metadata)
16
+ group_metadata.interactions.find { |interaction| interaction[:code] == 'read' }
17
+ end
18
+ end
19
+
20
+ attr_accessor :group_metadata
21
+
22
+ def initialize(group_metadata)
23
+ self.group_metadata = group_metadata
24
+ end
25
+
26
+ def template
27
+ @template ||= File.read(File.join(__dir__, 'templates', 'read.rb.erb'))
28
+ end
29
+
30
+ def output
31
+ @output ||= ERB.new(template).result(binding)
32
+ end
33
+
34
+ def base_output_file_name
35
+ "#{class_name.underscore}.rb"
36
+ end
37
+
38
+ def output_file_directory
39
+ File.join(__dir__, '..', 'generated', profile_identifier)
40
+ end
41
+
42
+ def output_file_name
43
+ File.join(output_file_directory, base_output_file_name)
44
+ end
45
+
46
+ def read_interaction
47
+ self.class.read_interaction(group_metadata)
48
+ end
49
+
50
+ def profile_identifier
51
+ Naming.snake_case_for_profile(group_metadata)
52
+ end
53
+
54
+ def test_id
55
+ "us_core_311_#{profile_identifier}_read_test"
56
+ end
57
+
58
+ def class_name
59
+ "#{Naming.upper_camel_case_for_profile(group_metadata)}ReadTest"
60
+ end
61
+
62
+ def resource_type
63
+ group_metadata.resource
64
+ end
65
+
66
+ def resource_collection_string
67
+ if group_metadata.delayed? && resource_type != 'Provenance'
68
+ "scratch.dig(:references, '#{resource_type}')"
69
+ else
70
+ 'all_scratch_resources'
71
+ end
72
+ end
73
+
74
+ def conformance_expectation
75
+ read_interaction[:expectation]
76
+ end
77
+
78
+ def generate
79
+ FileUtils.mkdir_p(output_file_directory)
80
+ File.open(output_file_name, 'w') { |f| f.write(output) }
81
+
82
+ group_metadata.add_test(
83
+ id: test_id,
84
+ file_name: base_output_file_name
85
+ )
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,72 @@
1
+ require_relative 'naming'
2
+ require_relative 'special_cases'
3
+
4
+ module USCoreTestKit
5
+ class Generator
6
+ class ReferenceResolutionTestGenerator
7
+ class << self
8
+ def generate(ig_metadata)
9
+ ig_metadata.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', 'reference_resolution.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 output_file_directory
34
+ File.join(__dir__, '..', 'generated', profile_identifier)
35
+ end
36
+
37
+ def output_file_name
38
+ File.join(output_file_directory, base_output_file_name)
39
+ end
40
+
41
+ def profile_identifier
42
+ Naming.snake_case_for_profile(group_metadata)
43
+ end
44
+
45
+ def test_id
46
+ "us_core_311_#{profile_identifier}_reference_resolution_test"
47
+ end
48
+
49
+ def class_name
50
+ "#{Naming.upper_camel_case_for_profile(group_metadata)}ReferenceResolutionTest"
51
+ end
52
+
53
+ def resource_type
54
+ group_metadata.resource
55
+ end
56
+
57
+ def resource_collection_string
58
+ 'scratch_resources[:all]'
59
+ end
60
+
61
+ def generate
62
+ FileUtils.mkdir_p(output_file_directory)
63
+ File.open(output_file_name, 'w') { |f| f.write(output) }
64
+
65
+ group_metadata.add_test(
66
+ id: test_id,
67
+ file_name: base_output_file_name
68
+ )
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,46 @@
1
+ module USCoreTestKit
2
+ class Generator
3
+ class ResourceListGenerator
4
+ class << self
5
+ def generate(ig_metadata)
6
+ @ig_metadata = ig_metadata
7
+
8
+ FileUtils.mkdir_p(output_file_directory)
9
+ File.open(output_file_name, 'w') { |f| f.write(output) }
10
+ end
11
+
12
+ def resource_list
13
+ @ig_metadata.groups.map(&:resource).uniq
14
+ end
15
+
16
+ def resource_list_string
17
+ resource_list.map { |resource| " '#{resource}'" }.join(",\n")
18
+ end
19
+
20
+ def read_interaction(group_metadata)
21
+ group_metadata.interactions.find { |interaction| interaction[:code] == 'read' }
22
+ end
23
+
24
+ def template
25
+ @template ||= File.read(File.join(__dir__, 'templates', 'resource_list.rb.erb'))
26
+ end
27
+
28
+ def output
29
+ @output ||= ERB.new(template).result(binding)
30
+ end
31
+
32
+ def base_output_file_name
33
+ "resource_list.rb"
34
+ end
35
+
36
+ def output_file_directory
37
+ File.join(__dir__, '..', 'generated')
38
+ end
39
+
40
+ def output_file_name
41
+ File.join(output_file_directory, base_output_file_name)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,181 @@
1
+ module USCoreTestKit
2
+ class Generator
3
+ class SearchDefinitionMetadataExtractor
4
+ attr_accessor :ig_resources, :name, :resource, :profile_elements
5
+
6
+ def initialize(name, ig_resources, resource, profile_elements)
7
+ self.name = name
8
+ self.ig_resources = ig_resources
9
+ self.resource = resource
10
+ self.profile_elements = profile_elements
11
+ end
12
+
13
+ def search_definition
14
+ @search_definition ||=
15
+ {
16
+ path: path,
17
+ full_path: full_path,
18
+ comparators: comparators,
19
+ values: values,
20
+ type: type,
21
+ contains_multiple: contains_multiple?,
22
+ multiple_or: multiple_or_expectation,
23
+ chain: chain
24
+ }.compact
25
+ end
26
+
27
+ def param
28
+ @param ||= ig_resources.search_param_by_resource_and_name(resource, name)
29
+ end
30
+
31
+ def param_hash
32
+ param.source_hash
33
+ end
34
+
35
+ def full_path
36
+ @full_path ||=
37
+ begin
38
+ path = param.expression.gsub(/.where\((.*)/, '')
39
+ path = path[1..-2] if path.start_with?('(') && path.end_with?(')')
40
+ as_type = path.scan(/[. ]as[( ]([^)]*)[)]?/).flatten.first
41
+ path.gsub!(/[. ]as[( ]([^)]*)[)]?/, as_type.upcase_first) if as_type.present?
42
+ path
43
+ end
44
+ end
45
+
46
+ def path
47
+ @path ||= full_path.gsub("#{resource}.", '')
48
+ end
49
+
50
+ def profile_element
51
+ @profile_element ||=
52
+ profile_elements.find { |element| element.id == full_path }
53
+ end
54
+
55
+ def comparator_expectation_extensions
56
+ @comparator_expectation_extensions ||= param_hash['_comparator'] || []
57
+ end
58
+
59
+ def support_expectation(extension)
60
+ extension['extension'].first['valueCode']
61
+ end
62
+
63
+ def comparator_expectation(extension)
64
+ if extension.nil?
65
+ 'MAY'
66
+ else
67
+ support_expectation(extension)
68
+ end
69
+ end
70
+
71
+ def comparators
72
+ {}.tap do |comparators|
73
+ param.comparator&.each_with_index do |comparator, index|
74
+ comparators[comparator.to_sym] = comparator_expectation(comparator_expectation_extensions[index])
75
+ end
76
+ end
77
+ end
78
+
79
+ def type
80
+ if profile_element.present?
81
+ profile_element.type.first.code
82
+ else
83
+ # search is a variable type, eg. Condition.onsetDateTime - element
84
+ # in profile def is Condition.onset[x]
85
+ param.type
86
+ end
87
+ end
88
+
89
+ def contains_multiple?
90
+ profile_element&.max == '*'
91
+ end
92
+
93
+ def chain_extensions
94
+ param_hash['_chain']
95
+ end
96
+
97
+ def chain_expectations
98
+ chain_extensions.map { |extension| support_expectation(extension) }
99
+ end
100
+
101
+ def chain
102
+ return nil if param.chain.blank?
103
+
104
+ param.chain
105
+ .zip(chain_expectations)
106
+ .map { |chain, expectation| { chain: chain, expectation: expectation } }
107
+ end
108
+
109
+ def multiple_or_expectation
110
+ param_hash['_multipleOr']['extension'].first['valueCode']
111
+ end
112
+
113
+ def values
114
+ (
115
+ values_from_slices +
116
+ values_from_fixed_codes +
117
+ values_from_pattern_codeable_concept +
118
+ values_from_value_set_binding
119
+ ).uniq.presence || values_from_resource_metadata
120
+ end
121
+
122
+ def slices
123
+ return [] unless contains_multiple?
124
+
125
+ profile_elements.select do |element|
126
+ element.path == full_path &&
127
+ element.sliceName.present? &&
128
+ element.patternCodeableConcept.present?
129
+ end
130
+ end
131
+
132
+ def values_from_slices
133
+ slices.map do |slice|
134
+ slice.patternCodeableConcept.coding.first.code
135
+ end
136
+ end
137
+
138
+ def values_from_fixed_codes
139
+ return [] unless type == 'CodeableConcept'
140
+
141
+ profile_elements
142
+ .select { |element| element.path == "#{profile_element.path}.coding.code" && element.fixedCode.present? }
143
+ .map { |element| element.fixedCode }
144
+ end
145
+
146
+ def values_from_pattern_codeable_concept
147
+ return [] if type != 'CodeableConcept' || profile_element.patternCodeableConcept.blank?
148
+
149
+ [profile_element.patternCodeableConcept.coding.first.code]
150
+ end
151
+
152
+ def value_set_binding
153
+ profile_element&.binding
154
+ end
155
+
156
+ def value_set
157
+ ig_resources.value_set_by_url(value_set_binding&.valueSet)
158
+ end
159
+
160
+ def bound_systems
161
+ value_set&.compose&.include&.reject { |code| code.concept.nil? }
162
+ end
163
+
164
+ def values_from_value_set_binding
165
+ return [] if bound_systems.blank?
166
+
167
+ bound_systems.flat_map { |system| system.concept.map { |code| code.code } }.uniq
168
+ end
169
+
170
+ def fhir_metadata
171
+ FHIR.const_get(resource)::METADATA[path.gsub("#{resource}.", '')]
172
+ end
173
+
174
+ def values_from_resource_metadata
175
+ return [] if fhir_metadata&.dig('valid_codes').blank?
176
+
177
+ fhir_metadata['valid_codes'].values.flatten
178
+ end
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,74 @@
1
+ require_relative 'search_definition_metadata_extractor'
2
+
3
+ module USCoreTestKit
4
+ class Generator
5
+ class SearchMetadataExtractor
6
+ COMBO_EXTENSION_URL =
7
+ 'http://hl7.org/fhir/StructureDefinition/capabilitystatement-search-parameter-combination'.freeze
8
+
9
+ attr_accessor :resource_capabilities, :ig_resources, :resource, :profile_elements
10
+
11
+ def initialize(resource_capabilities, ig_resources, resource, profile_elements)
12
+ self.resource_capabilities = resource_capabilities
13
+ self.ig_resources = ig_resources
14
+ self.resource = resource
15
+ self.profile_elements = profile_elements
16
+ end
17
+
18
+ def searches
19
+ @searches ||= basic_searches + combo_searches
20
+ end
21
+
22
+ def conformance_expectation(search_param)
23
+ search_param.extension.first.valueCode # TODO: fix expectation extension finding
24
+ end
25
+
26
+ def no_search_params?
27
+ resource_capabilities.searchParam.blank?
28
+ end
29
+
30
+ def basic_searches
31
+ return [] if no_search_params?
32
+
33
+ resource_capabilities.searchParam
34
+ .select { |search_param| ['SHALL', 'SHOULD'].include? conformance_expectation(search_param) }
35
+ .map do |search_param|
36
+ {
37
+ names: [search_param.name],
38
+ expectation: conformance_expectation(search_param)
39
+ }
40
+ end
41
+ end
42
+
43
+ def search_extensions
44
+ resource_capabilities.extension
45
+ end
46
+
47
+ def combo_searches
48
+ return [] if search_extensions.blank?
49
+
50
+ search_extensions
51
+ .select { |extension| extension.url == COMBO_EXTENSION_URL }
52
+ .select { |extension| ['SHALL', 'SHOULD'].include? conformance_expectation(extension) }
53
+ .map do |extension|
54
+ names = extension.extension.select { |param| param.valueString.present? }.map(&:valueString)
55
+ {
56
+ expectation: conformance_expectation(extension),
57
+ names: names
58
+ }
59
+ end
60
+ end
61
+
62
+ def search_param_names
63
+ searches.flat_map { |search| search[:names] }.uniq
64
+ end
65
+
66
+ def search_definitions
67
+ search_param_names.each_with_object({}) do |name, definitions|
68
+ definitions[name.to_sym] =
69
+ SearchDefinitionMetadataExtractor.new(name, ig_resources, resource, profile_elements).search_definition
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end