au_core_test_kit 0.0.16

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 (501) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/lib/au_core_test_kit/assert_helpers.rb +31 -0
  4. data/lib/au_core_test_kit/au_core_options.rb +11 -0
  5. data/lib/au_core_test_kit/chained_search_test.rb +99 -0
  6. data/lib/au_core_test_kit/constants.rb +11 -0
  7. data/lib/au_core_test_kit/custom_groups/capability_statement/conformance_support_test.rb +43 -0
  8. data/lib/au_core_test_kit/custom_groups/capability_statement/fhir_version_test.rb +21 -0
  9. data/lib/au_core_test_kit/custom_groups/capability_statement/instantiate_test.rb +21 -0
  10. data/lib/au_core_test_kit/custom_groups/capability_statement/json_support_test.rb +39 -0
  11. data/lib/au_core_test_kit/custom_groups/capability_statement/profile_support_test.rb +53 -0
  12. data/lib/au_core_test_kit/custom_groups/capability_statement/xml_support_test.rb +40 -0
  13. data/lib/au_core_test_kit/custom_groups/clinical_note_attachment_test.rb +45 -0
  14. data/lib/au_core_test_kit/custom_groups/clinical_note_type_test.rb +114 -0
  15. data/lib/au_core_test_kit/custom_groups/missing_data_group.rb +88 -0
  16. data/lib/au_core_test_kit/custom_groups/smart_app_launch_group.rb +167 -0
  17. data/lib/au_core_test_kit/custom_groups/v0.3.0-ballot/capability_statement_group.rb +81 -0
  18. data/lib/au_core_test_kit/custom_groups/v0.3.0-ballot/profile_support_test.rb +51 -0
  19. data/lib/au_core_test_kit/custom_groups/v4.0.0/document_reference_custodian_test.rb +50 -0
  20. data/lib/au_core_test_kit/custom_suites/validation_suite.rb +53 -0
  21. data/lib/au_core_test_kit/date_search_validation.rb +114 -0
  22. data/lib/au_core_test_kit/fhir_resource_navigation.rb +177 -0
  23. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_clinical_status_search_test.rb +47 -0
  24. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_must_support_test.rb +46 -0
  25. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_patient_chain_search_test.rb +50 -0
  26. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_patient_clinical_status_search_test.rb +52 -0
  27. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_patient_dva_chain_search_test.rb +51 -0
  28. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_patient_ihi_chain_search_test.rb +51 -0
  29. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_patient_medicare_chain_search_test.rb +51 -0
  30. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_patient_search_test.rb +66 -0
  31. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_read_test.rb +28 -0
  32. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_reference_resolution_test.rb +42 -0
  33. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/allergy_intolerance_validation_test.rb +42 -0
  34. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance/metadata.yml +159 -0
  35. data/lib/au_core_test_kit/generated/v1.0.0-preview/allergy_intolerance_group.rb +93 -0
  36. data/lib/au_core_test_kit/generated/v1.0.0-preview/au_core_test_suite.rb +164 -0
  37. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_category_search_test.rb +48 -0
  38. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_code_multiple_or_search_test.rb +49 -0
  39. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_code_search_test.rb +48 -0
  40. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_date_multiple_and_search_test.rb +49 -0
  41. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_date_search_test.rb +48 -0
  42. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_must_support_test.rb +67 -0
  43. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_category_date_search_test.rb +52 -0
  44. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_category_search_test.rb +51 -0
  45. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_category_status_search_test.rb +52 -0
  46. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_chain_search_test.rb +50 -0
  47. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_code_date_search_test.rb +54 -0
  48. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_code_search_test.rb +68 -0
  49. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_dva_chain_search_test.rb +51 -0
  50. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_ihi_chain_search_test.rb +51 -0
  51. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_medicare_chain_search_test.rb +51 -0
  52. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_patient_search_test.rb +52 -0
  53. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_read_test.rb +28 -0
  54. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_reference_resolution_test.rb +42 -0
  55. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_status_multiple_or_search_test.rb +49 -0
  56. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_status_search_test.rb +46 -0
  57. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/bloodpressure_validation_test.rb +42 -0
  58. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure/metadata.yml +364 -0
  59. data/lib/au_core_test_kit/generated/v1.0.0-preview/bloodpressure_group.rb +115 -0
  60. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_category_search_test.rb +48 -0
  61. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_code_multiple_or_search_test.rb +49 -0
  62. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_code_search_test.rb +48 -0
  63. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_date_multiple_and_search_test.rb +49 -0
  64. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_date_search_test.rb +48 -0
  65. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_must_support_test.rb +53 -0
  66. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_category_date_search_test.rb +52 -0
  67. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_category_search_test.rb +51 -0
  68. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_category_status_search_test.rb +52 -0
  69. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_chain_search_test.rb +50 -0
  70. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_code_date_search_test.rb +54 -0
  71. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_code_search_test.rb +68 -0
  72. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_dva_chain_search_test.rb +51 -0
  73. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_ihi_chain_search_test.rb +51 -0
  74. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_medicare_chain_search_test.rb +51 -0
  75. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_patient_search_test.rb +52 -0
  76. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_read_test.rb +28 -0
  77. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_reference_resolution_test.rb +42 -0
  78. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_status_multiple_or_search_test.rb +49 -0
  79. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_status_search_test.rb +46 -0
  80. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/bodyheight_validation_test.rb +42 -0
  81. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight/metadata.yml +330 -0
  82. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyheight_group.rb +115 -0
  83. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_category_search_test.rb +48 -0
  84. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_code_multiple_or_search_test.rb +49 -0
  85. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_code_search_test.rb +48 -0
  86. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_date_multiple_and_search_test.rb +49 -0
  87. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_date_search_test.rb +48 -0
  88. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_must_support_test.rb +53 -0
  89. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_category_date_search_test.rb +52 -0
  90. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_category_search_test.rb +51 -0
  91. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_category_status_search_test.rb +52 -0
  92. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_chain_search_test.rb +50 -0
  93. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_code_date_search_test.rb +54 -0
  94. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_code_search_test.rb +68 -0
  95. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_dva_chain_search_test.rb +51 -0
  96. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_ihi_chain_search_test.rb +51 -0
  97. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_medicare_chain_search_test.rb +51 -0
  98. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_patient_search_test.rb +52 -0
  99. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_read_test.rb +28 -0
  100. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_reference_resolution_test.rb +42 -0
  101. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_status_multiple_or_search_test.rb +49 -0
  102. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_status_search_test.rb +46 -0
  103. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/bodytemp_validation_test.rb +42 -0
  104. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp/metadata.yml +330 -0
  105. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodytemp_group.rb +115 -0
  106. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_category_search_test.rb +48 -0
  107. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_code_multiple_or_search_test.rb +49 -0
  108. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_code_search_test.rb +48 -0
  109. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_date_multiple_and_search_test.rb +49 -0
  110. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_date_search_test.rb +48 -0
  111. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_must_support_test.rb +53 -0
  112. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_category_date_search_test.rb +52 -0
  113. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_category_search_test.rb +51 -0
  114. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_category_status_search_test.rb +52 -0
  115. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_chain_search_test.rb +50 -0
  116. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_code_date_search_test.rb +54 -0
  117. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_code_search_test.rb +68 -0
  118. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_dva_chain_search_test.rb +51 -0
  119. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_ihi_chain_search_test.rb +51 -0
  120. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_medicare_chain_search_test.rb +51 -0
  121. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_patient_search_test.rb +52 -0
  122. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_read_test.rb +28 -0
  123. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_reference_resolution_test.rb +42 -0
  124. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_status_multiple_or_search_test.rb +49 -0
  125. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_status_search_test.rb +46 -0
  126. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/bodyweight_validation_test.rb +42 -0
  127. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight/metadata.yml +330 -0
  128. data/lib/au_core_test_kit/generated/v1.0.0-preview/bodyweight_group.rb +115 -0
  129. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_category_search_test.rb +48 -0
  130. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_clinical_status_search_test.rb +47 -0
  131. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_code_multiple_or_search_test.rb +48 -0
  132. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_code_search_test.rb +48 -0
  133. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_must_support_test.rb +47 -0
  134. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_onset_date_multiple_and_search_test.rb +49 -0
  135. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_onset_date_search_test.rb +48 -0
  136. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_category_clinical_status_search_test.rb +52 -0
  137. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_category_search_test.rb +51 -0
  138. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_chain_search_test.rb +50 -0
  139. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_clinical_status_search_test.rb +50 -0
  140. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_code_search_test.rb +53 -0
  141. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_dva_chain_search_test.rb +51 -0
  142. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_ihi_chain_search_test.rb +51 -0
  143. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_medicare_chain_search_test.rb +51 -0
  144. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_onset_date_search_test.rb +53 -0
  145. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_patient_search_test.rb +66 -0
  146. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_read_test.rb +28 -0
  147. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_reference_resolution_test.rb +42 -0
  148. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/condition_validation_test.rb +42 -0
  149. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition/metadata.yml +259 -0
  150. data/lib/au_core_test_kit/generated/v1.0.0-preview/condition_group.rb +113 -0
  151. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_category_search_test.rb +48 -0
  152. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_code_multiple_or_search_test.rb +49 -0
  153. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_code_search_test.rb +48 -0
  154. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_date_multiple_and_search_test.rb +49 -0
  155. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_date_search_test.rb +48 -0
  156. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_must_support_test.rb +50 -0
  157. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_category_date_search_test.rb +52 -0
  158. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_category_search_test.rb +51 -0
  159. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_category_status_search_test.rb +52 -0
  160. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_chain_search_test.rb +50 -0
  161. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_code_date_search_test.rb +54 -0
  162. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_code_search_test.rb +69 -0
  163. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_dva_chain_search_test.rb +51 -0
  164. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_ihi_chain_search_test.rb +51 -0
  165. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_medicare_chain_search_test.rb +51 -0
  166. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_patient_search_test.rb +52 -0
  167. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_read_test.rb +28 -0
  168. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_reference_resolution_test.rb +44 -0
  169. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_status_multiple_or_search_test.rb +49 -0
  170. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_status_search_test.rb +46 -0
  171. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/diagnosticresult_validation_test.rb +42 -0
  172. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult/metadata.yml +299 -0
  173. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_group.rb +115 -0
  174. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_category_search_test.rb +48 -0
  175. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_code_multiple_or_search_test.rb +49 -0
  176. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_code_search_test.rb +48 -0
  177. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_date_multiple_and_search_test.rb +49 -0
  178. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_date_search_test.rb +48 -0
  179. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_must_support_test.rb +56 -0
  180. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_category_date_search_test.rb +52 -0
  181. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_category_search_test.rb +69 -0
  182. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_category_status_search_test.rb +52 -0
  183. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_chain_search_test.rb +50 -0
  184. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_code_date_search_test.rb +54 -0
  185. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_code_search_test.rb +51 -0
  186. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_dva_chain_search_test.rb +51 -0
  187. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_ihi_chain_search_test.rb +51 -0
  188. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_medicare_chain_search_test.rb +51 -0
  189. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_patient_search_test.rb +52 -0
  190. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_read_test.rb +28 -0
  191. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_reference_resolution_test.rb +45 -0
  192. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_status_multiple_or_search_test.rb +49 -0
  193. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_status_search_test.rb +46 -0
  194. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/diagnosticresult_path_validation_test.rb +42 -0
  195. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path/metadata.yml +312 -0
  196. data/lib/au_core_test_kit/generated/v1.0.0-preview/diagnosticresult_path_group.rb +115 -0
  197. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_class_patient_search_test.rb +53 -0
  198. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_class_search_test.rb +48 -0
  199. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_date_multiple_and_search_test.rb +49 -0
  200. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_date_patient_search_test.rb +51 -0
  201. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_date_search_test.rb +48 -0
  202. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_location_search_test.rb +47 -0
  203. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_must_support_test.rb +51 -0
  204. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_patient_chain_search_test.rb +50 -0
  205. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_patient_dva_chain_search_test.rb +51 -0
  206. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_patient_ihi_chain_search_test.rb +51 -0
  207. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_patient_location_search_test.rb +52 -0
  208. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_patient_medicare_chain_search_test.rb +51 -0
  209. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_patient_search_test.rb +67 -0
  210. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_patient_status_search_test.rb +51 -0
  211. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_read_test.rb +28 -0
  212. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_reference_resolution_test.rb +46 -0
  213. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_status_multiple_or_search_test.rb +48 -0
  214. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_status_search_test.rb +46 -0
  215. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/encounter_validation_test.rb +42 -0
  216. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter/metadata.yml +305 -0
  217. data/lib/au_core_test_kit/generated/v1.0.0-preview/encounter_group.rb +110 -0
  218. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_category_search_test.rb +48 -0
  219. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_code_multiple_or_search_test.rb +49 -0
  220. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_code_search_test.rb +48 -0
  221. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_date_multiple_and_search_test.rb +49 -0
  222. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_date_search_test.rb +48 -0
  223. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_must_support_test.rb +53 -0
  224. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_category_date_search_test.rb +52 -0
  225. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_category_search_test.rb +51 -0
  226. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_category_status_search_test.rb +52 -0
  227. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_chain_search_test.rb +50 -0
  228. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_code_date_search_test.rb +54 -0
  229. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_code_search_test.rb +68 -0
  230. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_dva_chain_search_test.rb +51 -0
  231. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_ihi_chain_search_test.rb +51 -0
  232. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_medicare_chain_search_test.rb +51 -0
  233. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_patient_search_test.rb +52 -0
  234. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_read_test.rb +28 -0
  235. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_reference_resolution_test.rb +42 -0
  236. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_status_multiple_or_search_test.rb +49 -0
  237. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_status_search_test.rb +46 -0
  238. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/heartrate_validation_test.rb +42 -0
  239. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate/metadata.yml +327 -0
  240. data/lib/au_core_test_kit/generated/v1.0.0-preview/heartrate_group.rb +115 -0
  241. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_date_multiple_and_search_test.rb +49 -0
  242. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_date_search_test.rb +48 -0
  243. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_must_support_test.rb +44 -0
  244. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_patient_chain_search_test.rb +50 -0
  245. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_patient_date_search_test.rb +53 -0
  246. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_patient_dva_chain_search_test.rb +51 -0
  247. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_patient_ihi_chain_search_test.rb +51 -0
  248. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_patient_medicare_chain_search_test.rb +51 -0
  249. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_patient_search_test.rb +66 -0
  250. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_patient_status_search_test.rb +49 -0
  251. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_patient_vaccine_code_search_test.rb +53 -0
  252. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_read_test.rb +28 -0
  253. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_reference_resolution_test.rb +42 -0
  254. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_status_search_test.rb +46 -0
  255. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_vaccine_code_multiple_or_search_test.rb +49 -0
  256. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_vaccine_code_search_test.rb +48 -0
  257. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/immunization_validation_test.rb +42 -0
  258. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization/metadata.yml +226 -0
  259. data/lib/au_core_test_kit/generated/v1.0.0-preview/immunization_group.rb +106 -0
  260. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_address_city_search_test.rb +46 -0
  261. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_address_postalcode_search_test.rb +46 -0
  262. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_address_search_test.rb +57 -0
  263. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_address_state_search_test.rb +46 -0
  264. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_must_support_test.rb +43 -0
  265. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_name_search_test.rb +44 -0
  266. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_read_test.rb +34 -0
  267. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_reference_resolution_test.rb +42 -0
  268. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/location_validation_test.rb +42 -0
  269. data/lib/au_core_test_kit/generated/v1.0.0-preview/location/metadata.yml +162 -0
  270. data/lib/au_core_test_kit/generated/v1.0.0-preview/location_group.rb +89 -0
  271. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_authoredon_multiple_and_search_test.rb +50 -0
  272. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_authoredon_search_test.rb +54 -0
  273. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_id_include_medication_test.rb +49 -0
  274. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_id_search_test.rb +53 -0
  275. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_intent_multiple_or_search_test.rb +50 -0
  276. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_intent_search_test.rb +53 -0
  277. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_must_support_test.rb +48 -0
  278. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_chain_search_test.rb +50 -0
  279. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_dva_chain_search_test.rb +51 -0
  280. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_ihi_chain_search_test.rb +51 -0
  281. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_include_medication_test.rb +50 -0
  282. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_intent_authoredon_include_medication_test.rb +49 -0
  283. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_intent_authoredon_search_test.rb +59 -0
  284. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_intent_include_medication_test.rb +49 -0
  285. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_intent_search_test.rb +58 -0
  286. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_intent_status_include_medication_test.rb +49 -0
  287. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_intent_status_search_test.rb +57 -0
  288. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_medicare_chain_search_test.rb +51 -0
  289. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_search_test.rb +73 -0
  290. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_patient_status_search_test.rb +55 -0
  291. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_read_test.rb +28 -0
  292. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_reference_resolution_test.rb +46 -0
  293. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_status_multiple_or_search_test.rb +48 -0
  294. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_status_search_test.rb +52 -0
  295. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_request_validation_test.rb +42 -0
  296. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/medication_validation_test.rb +41 -0
  297. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request/metadata.yml +330 -0
  298. data/lib/au_core_test_kit/generated/v1.0.0-preview/medication_request_group.rb +124 -0
  299. data/lib/au_core_test_kit/generated/v1.0.0-preview/metadata.yml +4882 -0
  300. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/metadata.yml +122 -0
  301. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_address_search_test.rb +46 -0
  302. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_id_search_test.rb +56 -0
  303. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_identifier_abn_search_test.rb +45 -0
  304. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_identifier_hpio_search_test.rb +45 -0
  305. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_identifier_search_test.rb +45 -0
  306. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_must_support_test.rb +43 -0
  307. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_name_search_test.rb +44 -0
  308. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_read_test.rb +34 -0
  309. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization/organization_validation_test.rb +42 -0
  310. data/lib/au_core_test_kit/generated/v1.0.0-preview/organization_group.rb +90 -0
  311. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/metadata.yml +293 -0
  312. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_birthdate_family_search_test.rb +48 -0
  313. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_birthdate_multiple_and_search_test.rb +48 -0
  314. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_birthdate_name_search_test.rb +48 -0
  315. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_birthdate_search_test.rb +48 -0
  316. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_family_gender_search_test.rb +47 -0
  317. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_family_search_test.rb +47 -0
  318. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_gender_identity_multiple_and_search_test.rb +48 -0
  319. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_gender_identity_multiple_or_search_test.rb +48 -0
  320. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_gender_identity_search_test.rb +47 -0
  321. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_gender_name_search_test.rb +47 -0
  322. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_gender_search_test.rb +47 -0
  323. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_id_search_test.rb +61 -0
  324. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_identifier_dva_search_test.rb +45 -0
  325. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_identifier_ihi_search_test.rb +45 -0
  326. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_identifier_medicare_search_test.rb +45 -0
  327. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_identifier_search_test.rb +46 -0
  328. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_indigenous_status_multiple_and_search_test.rb +48 -0
  329. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_indigenous_status_multiple_or_search_test.rb +48 -0
  330. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_indigenous_status_search_test.rb +46 -0
  331. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_must_support_test.rb +54 -0
  332. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_name_search_test.rb +47 -0
  333. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_read_test.rb +28 -0
  334. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient/patient_validation_test.rb +42 -0
  335. data/lib/au_core_test_kit/generated/v1.0.0-preview/patient_group.rb +118 -0
  336. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner/metadata.yml +108 -0
  337. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner/practitioner_id_search_test.rb +56 -0
  338. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner/practitioner_identifier_hpii_search_test.rb +45 -0
  339. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner/practitioner_identifier_search_test.rb +45 -0
  340. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner/practitioner_must_support_test.rb +42 -0
  341. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner/practitioner_name_search_test.rb +46 -0
  342. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner/practitioner_read_test.rb +34 -0
  343. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner/practitioner_validation_test.rb +42 -0
  344. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_group.rb +85 -0
  345. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/metadata.yml +204 -0
  346. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_id_include_practitioner_test.rb +50 -0
  347. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_id_search_test.rb +58 -0
  348. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_identifier_include_practitioner_test.rb +49 -0
  349. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_identifier_medicare_search_test.rb +45 -0
  350. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_identifier_search_test.rb +46 -0
  351. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_must_support_test.rb +44 -0
  352. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_organization_search_test.rb +47 -0
  353. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_practitioner_chain_search_test.rb +50 -0
  354. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_practitioner_include_practitioner_test.rb +49 -0
  355. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_practitioner_multiple_and_search_test.rb +49 -0
  356. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_practitioner_multiple_or_search_test.rb +49 -0
  357. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_practitioner_search_test.rb +51 -0
  358. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_read_test.rb +34 -0
  359. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_reference_resolution_test.rb +43 -0
  360. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_role_search_test.rb +48 -0
  361. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_specialty_include_practitioner_test.rb +49 -0
  362. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_specialty_search_test.rb +48 -0
  363. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role/practitioner_role_validation_test.rb +42 -0
  364. data/lib/au_core_test_kit/generated/v1.0.0-preview/practitioner_role_group.rb +108 -0
  365. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/metadata.yml +265 -0
  366. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_code_multiple_or_search_test.rb +49 -0
  367. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_code_search_test.rb +48 -0
  368. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_date_multiple_and_search_test.rb +48 -0
  369. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_date_search_test.rb +48 -0
  370. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_must_support_test.rb +45 -0
  371. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_patient_chain_search_test.rb +50 -0
  372. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_patient_code_date_search_test.rb +54 -0
  373. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_patient_date_search_test.rb +51 -0
  374. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_patient_dva_chain_search_test.rb +51 -0
  375. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_patient_ihi_chain_search_test.rb +51 -0
  376. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_patient_medicare_chain_search_test.rb +51 -0
  377. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_patient_search_test.rb +66 -0
  378. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_patient_status_search_test.rb +51 -0
  379. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_read_test.rb +28 -0
  380. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_reference_resolution_test.rb +44 -0
  381. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_status_multiple_or_search_test.rb +49 -0
  382. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_status_search_test.rb +46 -0
  383. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure/procedure_validation_test.rb +42 -0
  384. data/lib/au_core_test_kit/generated/v1.0.0-preview/procedure_group.rb +108 -0
  385. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/metadata.yml +327 -0
  386. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_category_search_test.rb +48 -0
  387. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_code_multiple_or_search_test.rb +49 -0
  388. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_code_search_test.rb +48 -0
  389. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_date_multiple_and_search_test.rb +49 -0
  390. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_date_search_test.rb +48 -0
  391. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_must_support_test.rb +53 -0
  392. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_category_date_search_test.rb +52 -0
  393. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_category_search_test.rb +51 -0
  394. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_category_status_search_test.rb +52 -0
  395. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_chain_search_test.rb +50 -0
  396. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_code_date_search_test.rb +54 -0
  397. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_code_search_test.rb +68 -0
  398. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_dva_chain_search_test.rb +51 -0
  399. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_ihi_chain_search_test.rb +51 -0
  400. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_medicare_chain_search_test.rb +51 -0
  401. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_patient_search_test.rb +52 -0
  402. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_read_test.rb +28 -0
  403. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_reference_resolution_test.rb +42 -0
  404. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_status_multiple_or_search_test.rb +49 -0
  405. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_status_search_test.rb +46 -0
  406. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate/resprate_validation_test.rb +42 -0
  407. data/lib/au_core_test_kit/generated/v1.0.0-preview/resprate_group.rb +115 -0
  408. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/metadata.yml +287 -0
  409. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_category_search_test.rb +48 -0
  410. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_code_multiple_or_search_test.rb +49 -0
  411. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_code_search_test.rb +48 -0
  412. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_date_multiple_and_search_test.rb +49 -0
  413. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_date_search_test.rb +48 -0
  414. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_must_support_test.rb +44 -0
  415. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_category_date_search_test.rb +52 -0
  416. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_category_search_test.rb +51 -0
  417. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_category_status_search_test.rb +52 -0
  418. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_chain_search_test.rb +50 -0
  419. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_code_date_search_test.rb +54 -0
  420. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_code_search_test.rb +68 -0
  421. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_dva_chain_search_test.rb +51 -0
  422. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_ihi_chain_search_test.rb +51 -0
  423. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_medicare_chain_search_test.rb +51 -0
  424. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_patient_search_test.rb +52 -0
  425. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_read_test.rb +28 -0
  426. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_reference_resolution_test.rb +42 -0
  427. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_status_multiple_or_search_test.rb +49 -0
  428. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_status_search_test.rb +46 -0
  429. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus/smokingstatus_validation_test.rb +42 -0
  430. data/lib/au_core_test_kit/generated/v1.0.0-preview/smokingstatus_group.rb +115 -0
  431. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/metadata.yml +325 -0
  432. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_category_search_test.rb +48 -0
  433. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_code_multiple_or_search_test.rb +49 -0
  434. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_code_search_test.rb +48 -0
  435. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_date_multiple_and_search_test.rb +49 -0
  436. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_date_search_test.rb +48 -0
  437. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_must_support_test.rb +49 -0
  438. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_category_date_search_test.rb +52 -0
  439. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_category_search_test.rb +51 -0
  440. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_category_status_search_test.rb +52 -0
  441. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_chain_search_test.rb +50 -0
  442. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_code_date_search_test.rb +54 -0
  443. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_code_search_test.rb +68 -0
  444. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_dva_chain_search_test.rb +51 -0
  445. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_ihi_chain_search_test.rb +51 -0
  446. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_medicare_chain_search_test.rb +51 -0
  447. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_patient_search_test.rb +52 -0
  448. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_read_test.rb +28 -0
  449. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_reference_resolution_test.rb +42 -0
  450. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_status_multiple_or_search_test.rb +49 -0
  451. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_status_search_test.rb +46 -0
  452. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum/waistcircum_validation_test.rb +42 -0
  453. data/lib/au_core_test_kit/generated/v1.0.0-preview/waistcircum_group.rb +115 -0
  454. data/lib/au_core_test_kit/generator/chain_search_test_generator.rb +169 -0
  455. data/lib/au_core_test_kit/generator/group_generator.rb +143 -0
  456. data/lib/au_core_test_kit/generator/group_metadata.rb +103 -0
  457. data/lib/au_core_test_kit/generator/group_metadata_extractor.rb +336 -0
  458. data/lib/au_core_test_kit/generator/ig_download.rb +59 -0
  459. data/lib/au_core_test_kit/generator/ig_loader.rb +88 -0
  460. data/lib/au_core_test_kit/generator/ig_metadata.rb +51 -0
  461. data/lib/au_core_test_kit/generator/ig_metadata_extractor.rb +92 -0
  462. data/lib/au_core_test_kit/generator/ig_resources.rb +106 -0
  463. data/lib/au_core_test_kit/generator/include_search_test_generator.rb +111 -0
  464. data/lib/au_core_test_kit/generator/multiple_and_search_test_generator.rb +216 -0
  465. data/lib/au_core_test_kit/generator/multiple_or_search_test_generator.rb +219 -0
  466. data/lib/au_core_test_kit/generator/must_support_metadata_extractor.rb +472 -0
  467. data/lib/au_core_test_kit/generator/must_support_metadata_extractor_au_core_3.rb +64 -0
  468. data/lib/au_core_test_kit/generator/must_support_test_generator.rb +118 -0
  469. data/lib/au_core_test_kit/generator/naming.rb +57 -0
  470. data/lib/au_core_test_kit/generator/provenance_revinclude_search_test_generator.rb +193 -0
  471. data/lib/au_core_test_kit/generator/read_test_generator.rb +112 -0
  472. data/lib/au_core_test_kit/generator/reference_resolution_test_generator.rb +94 -0
  473. data/lib/au_core_test_kit/generator/search_definition_metadata_extractor.rb +340 -0
  474. data/lib/au_core_test_kit/generator/search_metadata_extractor.rb +95 -0
  475. data/lib/au_core_test_kit/generator/search_test_generator.rb +386 -0
  476. data/lib/au_core_test_kit/generator/special_cases.rb +91 -0
  477. data/lib/au_core_test_kit/generator/special_identifier_search_test_generator.rb +85 -0
  478. data/lib/au_core_test_kit/generator/special_identifiers_chain_search_test_generator.rb +77 -0
  479. data/lib/au_core_test_kit/generator/suite_generator.rb +104 -0
  480. data/lib/au_core_test_kit/generator/summary_generator.rb +172 -0
  481. data/lib/au_core_test_kit/generator/terminology_binding_metadata_extractor.rb +118 -0
  482. data/lib/au_core_test_kit/generator/validation_test_generator.rb +142 -0
  483. data/lib/au_core_test_kit/generator/value_extractor.rb +107 -0
  484. data/lib/au_core_test_kit/generator.rb +146 -0
  485. data/lib/au_core_test_kit/helpers.rb +238 -0
  486. data/lib/au_core_test_kit/igs/1.0.0-preview.tgz +0 -0
  487. data/lib/au_core_test_kit/igs/au-base-resources.json +1 -0
  488. data/lib/au_core_test_kit/igs/search-params.json +80725 -0
  489. data/lib/au_core_test_kit/must_support_test.rb +221 -0
  490. data/lib/au_core_test_kit/provenance_validator.rb +38 -0
  491. data/lib/au_core_test_kit/read_test.rb +121 -0
  492. data/lib/au_core_test_kit/reference_resolution_test.rb +193 -0
  493. data/lib/au_core_test_kit/request_logger.rb +48 -0
  494. data/lib/au_core_test_kit/search_test.rb +1032 -0
  495. data/lib/au_core_test_kit/search_test_helpers.rb +21 -0
  496. data/lib/au_core_test_kit/search_test_properties.rb +67 -0
  497. data/lib/au_core_test_kit/special_identifier_search_test.rb +94 -0
  498. data/lib/au_core_test_kit/validation_test.rb +62 -0
  499. data/lib/au_core_test_kit/version.rb +5 -0
  500. data/lib/au_core_test_kit.rb +15 -0
  501. metadata +642 -0
@@ -0,0 +1,1032 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'date_search_validation'
4
+ require_relative 'fhir_resource_navigation'
5
+ require_relative 'search_test_properties'
6
+ require_relative 'read_test'
7
+ require_relative 'assert_helpers'
8
+ require_relative 'search_test_helpers'
9
+ require_relative 'generator/special_cases'
10
+
11
+ module AUCoreTestKit
12
+ module SearchTest
13
+ extend Forwardable
14
+ include DateSearchValidation
15
+ include FHIRResourceNavigation
16
+ include ReadTest
17
+ include AssertHelpers
18
+
19
+ def_delegators 'self.class', :metadata, :provenance_metadata, :properties
20
+ def_delegators 'properties',
21
+ :resource_type,
22
+ :search_param_names,
23
+ :saves_delayed_references?,
24
+ :first_search?,
25
+ :fixed_value_search?,
26
+ :possible_status_search?,
27
+ :test_medication_inclusion?,
28
+ :test_post_search?,
29
+ :token_search_params,
30
+ :test_reference_variants?,
31
+ :params_with_comparators,
32
+ :multiple_or_search_params,
33
+ :optional_multiple_or_search_params,
34
+ :multiple_and_search_params,
35
+ :optional_multiple_and_search_params,
36
+ :first_search_for_patient_by_patient_id,
37
+ :includes,
38
+ :use_any_data_for_search,
39
+ :search_by_target_resource_data
40
+
41
+ def all_search_params
42
+ @all_search_params ||=
43
+ patient_id_list.each_with_object({}) do |patient_id, params|
44
+ params[patient_id] ||= []
45
+ new_params =
46
+ if fixed_value_search?
47
+ fixed_value_search_param_values.map { |value| fixed_value_search_params(value, patient_id) }
48
+ else
49
+ [search_params_with_values(search_param_names, patient_id)]
50
+ end
51
+ new_params.reject! do |params|
52
+ params.any? { |_key, value| value.blank? }
53
+ end
54
+
55
+ params[patient_id].concat(new_params)
56
+ end
57
+ end
58
+
59
+ def all_provenance_revinclude_search_params
60
+ @all_provenance_revinclude_search_params ||=
61
+ all_search_params.transform_values! do |params_list|
62
+ params_list.map { |params| params.merge(_revinclude: 'Provenance:target') }
63
+ end
64
+ end
65
+
66
+ def any_valid_search_params?(search_params)
67
+ search_params.any? { |_patient_id, params| params.present? }
68
+ end
69
+
70
+ def run_provenance_revinclude_search_test
71
+ # TODO: skip if not supported?
72
+ conditional_skip_with_msg !any_valid_search_params?(all_provenance_revinclude_search_params), unable_to_resolve_params_message
73
+
74
+ provenance_resources =
75
+ all_provenance_revinclude_search_params.flat_map do |_patient_id, params_list|
76
+ params_list.flat_map do |params|
77
+ fhir_search(resource_type, params:)
78
+
79
+ perform_search_with_status(params, patient_id) if response[:status] == 400 && possible_status_search?
80
+
81
+ check_search_response
82
+
83
+ fetch_all_bundled_resources(additional_resource_types: ['Provenance'])
84
+ .select { |resource| resource.resourceType == 'Provenance' }
85
+ end
86
+ end
87
+
88
+ scratch_provenance_resources[:all] ||= []
89
+ scratch_provenance_resources[:all].concat(provenance_resources)
90
+
91
+ save_delayed_references(provenance_resources, 'Provenance')
92
+
93
+ # NOTE: https://github.com/hl7au/au-fhir-core-inferno/issues/8
94
+ # skip_if provenance_resources.empty?, no_resources_skip_message('Provenance')
95
+ end
96
+
97
+ def search_by_patient_id_is_available(patient_id)
98
+ fhir_search('Patient', params: { _id: patient_id })
99
+ response[:status] == 200
100
+ end
101
+
102
+ def run_search_test
103
+ run_search_test_common(method(:perform_search))
104
+ end
105
+
106
+ def run_search_test_with_system
107
+ run_search_test_common(method(:perform_search_with_system))
108
+ end
109
+
110
+ def run_include_test
111
+ resources = []
112
+ all_search_params.each do |patient_id, params_list|
113
+ params_list.each do |params|
114
+ includes.each do |include_param|
115
+ patient_resources = find_include_resources(
116
+ params,
117
+ patient_id,
118
+ include_param,
119
+ false
120
+ )
121
+ if patient_resources.length.positive?
122
+ resources.concat(patient_resources)
123
+ break
124
+ end
125
+ end
126
+ end
127
+ break if resources.length.positive?
128
+ end
129
+ pass if resources.length.positive?
130
+
131
+ skip_with_msg 'No resources were included in the search results'
132
+ end
133
+
134
+ def run_read_test_and_skip_first_search(patient_id)
135
+ resource = create_reference('Patient', patient_id)
136
+ read_and_validate_as_first(resource, patient_id)
137
+ end
138
+
139
+ def check_availability_of_count_search_parameter(resource_type, params)
140
+ search_params = params.merge({ _count: 1 })
141
+
142
+ fhir_search(resource_type, params: search_params)
143
+
144
+ response[:status] == 200
145
+ end
146
+
147
+ def is_count_available_for_resource_type?(resource_type, params)
148
+ resource_sym = resource_type.to_sym
149
+ count = scratch&.dig(:info, resource_sym, :count)
150
+
151
+ return count unless count.nil?
152
+
153
+ result = check_availability_of_count_search_parameter(resource_type, params)
154
+
155
+ scratch[:info] ||= {}
156
+ scratch[:info][resource_sym] ||= {}
157
+ scratch[:info][resource_sym][:count] ||= result
158
+
159
+ result
160
+ end
161
+
162
+ def perform_search(params, patient_id)
163
+ search_params = is_count_available_for_resource_type?(resource_type, params) == false ? params : params.merge({ _count: 10 })
164
+ fhir_search(resource_type, params: search_params)
165
+
166
+ if SearchTestHelpers.search_by_reference?(search_params)
167
+ search_params = SearchTestHelpers.replace_full_reference_search_param_to_id(search_params)
168
+ fhir_search(resource_type, params: search_params)
169
+ end
170
+
171
+ perform_search_with_status(params, patient_id) if response[:status] == 400 && possible_status_search?
172
+
173
+ check_search_response
174
+ fetch_all_bundled_resources = is_count_available_for_resource_type?(resource_type, params) == false ? fetch_all_bundled_resources() : fetch_all_bundled_resources(max_pages: 2)
175
+ resources_returned =
176
+ fetch_all_bundled_resources.select { |resource| resource.resourceType == resource_type }
177
+
178
+ return [] if resources_returned.blank?
179
+
180
+ perform_comparator_searches(params, patient_id) if params_with_comparators.present?
181
+
182
+ filter_conditions(resources_returned) if resource_type == 'Condition' && metadata.version == 'v5.0.1'
183
+ filter_devices(resources_returned) if resource_type == 'Device'
184
+
185
+ if first_search?
186
+ all_scratch_resources.concat(resources_returned).uniq!
187
+ scratch_resources_for_patient(patient_id).concat(resources_returned).uniq!
188
+ end
189
+
190
+ resources_returned.each do |resource|
191
+ check_resource_against_params(resource, params)
192
+ end
193
+
194
+ save_delayed_references(resources_returned) if saves_delayed_references?
195
+
196
+ return resources_returned if all_search_variants_tested?
197
+
198
+ perform_post_search(resources_returned, params) if test_post_search?
199
+ if includes.present?
200
+ includes.each do |include_param|
201
+ test_include_param(resources_returned, params, patient_id, include_param)
202
+ end
203
+ end
204
+
205
+ perform_reference_with_type_search(params, resources_returned.count) if test_reference_variants?
206
+ perform_search_with_system(params, patient_id) if token_search_params.present?
207
+
208
+ resources_returned
209
+ end
210
+
211
+ def perform_post_search(get_search_resources, params)
212
+ fhir_search resource_type, params:, search_method: :post
213
+
214
+ check_search_response
215
+
216
+ post_search_resources = fetch_all_bundled_resources.select { |resource| resource.resourceType == resource_type }
217
+
218
+ filter_conditions(post_search_resources) if resource_type == 'Condition' && metadata.version == 'v5.0.1'
219
+ filter_devices(post_search_resources) if resource_type == 'Device'
220
+
221
+ get_resource_count = get_search_resources.length
222
+ post_resource_count = post_search_resources.length
223
+
224
+ search_variant_test_records[:post_variant] = true
225
+
226
+ assert get_resource_count == post_resource_count,
227
+ 'Expected search by POST to return the same results as search by GET, ' \
228
+ "but GET search returned #{get_resource_count} resources, and POST search " \
229
+ "returned #{post_resource_count} resources."
230
+ end
231
+
232
+ def filter_devices(resources)
233
+ codes_to_include = implantable_device_codes&.split(',')&.map(&:strip)
234
+ return resources if codes_to_include.blank?
235
+
236
+ resources.select! do |resource|
237
+ resource&.type&.coding&.any? { |coding| codes_to_include.include?(coding.code) }
238
+ end
239
+ end
240
+
241
+ def filter_conditions(resources)
242
+ # HL7 JIRA FHIR-37917. AU Core v5.0.1 does not required patient+category.
243
+ # In order to distinguish which resources matches the current profile, Inferno has to manually filter
244
+ # the result of first search, which is searching by patient.
245
+ resources.select! do |resource|
246
+ resource.category.any? do |category|
247
+ category.coding.any? do |coding|
248
+ metadata.search_definitions[:category][:values].include? coding.code
249
+ end
250
+ end
251
+ end
252
+ end
253
+
254
+ def search_and_check_response(params, resource_type = self.resource_type)
255
+ fhir_search(resource_type, params:)
256
+ check_search_response
257
+ end
258
+
259
+ def optional_search_and_check_response(params, resource_type = self.resource_type)
260
+ fhir_search(resource_type, params:)
261
+ end
262
+
263
+ def check_search_response
264
+ assert_response_status(200)
265
+ assert_resource_type(:bundle)
266
+ # NOTE: how do we want to handle validating Bundles?
267
+ end
268
+
269
+ def search_variant_test_records
270
+ @search_variant_test_records ||= initial_search_variant_test_records
271
+ end
272
+
273
+ def initial_search_variant_test_records
274
+ {}.tap do |records|
275
+ records[:post_variant] = false if test_post_search?
276
+ records[:inclusion] = false if includes&.length&.positive?
277
+ records[:reference_variants] = false if test_reference_variants?
278
+ records[:token_variants] = false if token_search_params.present?
279
+ records[:comparator_searches] = Set.new if params_with_comparators.present?
280
+ end
281
+ end
282
+
283
+ def all_search_variants_tested?
284
+ search_variant_test_records.all? { |_variant, tested| tested.present? } &&
285
+ all_comparator_searches_tested?
286
+ end
287
+
288
+ def all_comparator_searches_tested?
289
+ return true if params_with_comparators.blank?
290
+
291
+ Set.new(params_with_comparators) == search_variant_test_records[:comparator_searches]
292
+ end
293
+
294
+ def date_comparator_value(comparator, date)
295
+ date = date.start || date.end if date.is_a? FHIR::Period
296
+ case comparator
297
+ when 'lt', 'le'
298
+ comparator + (DateTime.xmlschema(date) + 1).xmlschema
299
+ when 'gt', 'ge'
300
+ comparator + (DateTime.xmlschema(date) - 1).xmlschema
301
+ else
302
+ # ''
303
+ raise "Unsupported comparator '#{comparator}'"
304
+ end
305
+ end
306
+
307
+ def required_comparators(name)
308
+ metadata
309
+ .search_definitions
310
+ .dig(name.to_sym, :comparators)
311
+ .select { |_comparator, expectation| expectation == 'SHALL' }
312
+ .keys
313
+ .map(&:to_s)
314
+ end
315
+
316
+ def birthdate_comparator_value(comparator, date)
317
+ case comparator
318
+ when 'lt', 'le'
319
+ comparator + (DateTime.xmlschema(date) + 1).strftime('%F')
320
+ when 'gt', 'ge'
321
+ comparator + (DateTime.xmlschema(date) - 1).strftime('%F')
322
+ else
323
+ raise "Unsupported comparator '#{comparator}'"
324
+ end
325
+ end
326
+
327
+ def perform_comparator_searches(params, patient_id)
328
+ params_with_comparators.each do |name|
329
+ next if search_variant_test_records[:comparator_searches].include? name
330
+
331
+ required_comparators(name).each do |comparator|
332
+ paths = search_param_paths(name).first
333
+ date_element = find_a_value_at(scratch_resources_for_patient(patient_id), paths)
334
+ params_with_comparator = params.merge(name => name != 'birthdate' ? date_comparator_value(comparator, date_element) : birthdate_comparator_value(comparator, date_element))
335
+
336
+ search_and_check_response(params_with_comparator)
337
+
338
+ fetch_all_bundled_resources.each do |resource|
339
+ check_resource_against_params(resource, params_with_comparator) if resource.resourceType == resource_type
340
+ end
341
+ end
342
+
343
+ search_variant_test_records[:comparator_searches] << name
344
+ end
345
+ end
346
+
347
+ def perform_reference_with_type_search(params, resource_count)
348
+ return if resource_count.zero?
349
+ return if search_variant_test_records[:reference_variants]
350
+
351
+ if params.keys.include?('patient')
352
+ new_search_params = params.merge('patient' => "Patient/#{params['patient']}")
353
+ else
354
+ param_key = params.keys.first
355
+ new_search_params = params.merge(param_key => params[param_key].split('/').last)
356
+ end
357
+ search_and_check_response(new_search_params)
358
+
359
+ reference_with_type_resources = fetch_all_bundled_resources.select do |resource|
360
+ resource.resourceType == resource_type
361
+ end
362
+
363
+ filter_conditions(reference_with_type_resources) if resource_type == 'Condition' && metadata.version == 'v5.0.1'
364
+ filter_devices(reference_with_type_resources) if resource_type == 'Device'
365
+
366
+ new_resource_count = reference_with_type_resources.count
367
+
368
+ assert new_resource_count == resource_count,
369
+ "Expected search by `#{params['patient']}` to to return the same results as searching " \
370
+ "by `#{new_search_params['patient']}`, but found #{resource_count} resources with " \
371
+ "`#{params['patient']}` and #{new_resource_count} with `#{new_search_params['patient']}`"
372
+
373
+ search_variant_test_records[:reference_variants] = true
374
+ end
375
+
376
+ def perform_search_with_system(params, patient_id)
377
+ return if search_variant_test_records[:token_variants]
378
+
379
+ new_search_params = search_params_with_values(token_search_params, patient_id, include_system: true)
380
+ return if new_search_params.any? { |_name, value| value.blank? }
381
+
382
+ search_params = params.merge(new_search_params)
383
+ search_and_check_response(search_params)
384
+
385
+ resources_returned =
386
+ fetch_all_bundled_resources
387
+ .select { |resource| resource.resourceType == resource_type }
388
+
389
+ assert resources_returned.present?, 'No resources were returned when searching by `system|code`'
390
+
391
+ search_variant_test_records[:token_variants] = true
392
+ end
393
+
394
+ def perform_search_with_status(
395
+ original_params,
396
+ _patient_id,
397
+ status_search_values: self.status_search_values,
398
+ resource_type: self.resource_type
399
+ )
400
+ assert resource.is_a?(FHIR::OperationOutcome), 'Server returned a status of 400 without an OperationOutcome'
401
+ # TODO: warn about documenting status requirements
402
+ status_search_values.flat_map do |status_value|
403
+ search_params = original_params.merge("#{status_search_param_name}": status_value)
404
+
405
+ search_and_check_response(search_params)
406
+
407
+ entries = resource.entry.select { |entry| entry.resource.resourceType == resource_type }
408
+
409
+ if entries.present?
410
+ original_params.merge!("#{status_search_param_name}": status_value)
411
+ break
412
+ end
413
+ end
414
+ end
415
+
416
+ def status_search_param_name
417
+ @status_search_param_name ||=
418
+ metadata.search_definitions.keys.find { |key| key.to_s.include? 'status' }
419
+ end
420
+
421
+ def status_search_values
422
+ default_search_values(status_search_param_name)
423
+ end
424
+
425
+ def default_values_for_param(param_name)
426
+ definition = metadata.search_definitions[param_name]
427
+ return [] if definition.blank?
428
+
429
+ definition[:values]
430
+ end
431
+
432
+ def default_search_values(param_name)
433
+ definition = metadata.search_definitions[param_name]
434
+ return [] if definition.blank?
435
+
436
+ definition[:multiple_or] == 'SHALL' || definition[:multiple_or] == 'SHOULD' ? [definition[:values].join(',')] : Array.wrap(definition[:values])
437
+ end
438
+
439
+ def default_search_values_clean(param_name)
440
+ definition = metadata.search_definitions[param_name]
441
+ return [] if definition.blank?
442
+
443
+ definition[:values]
444
+ end
445
+
446
+ def extract_existing_values_safety(resources_arr, param_name)
447
+ results = []
448
+
449
+ resources_arr.each do |resource|
450
+ temp = search_param_value(param_name, resource)
451
+ results << temp
452
+ end
453
+
454
+ results.compact.uniq
455
+ end
456
+
457
+ def perform_multiple_or_search_test
458
+ perform_multiple_search_test('or')
459
+ end
460
+
461
+ def perform_multiple_and_search_test
462
+ perform_multiple_search_test('and')
463
+ end
464
+
465
+ def modify_value_by_multiple_type(values, multiple_type)
466
+ return [values.join(',')] if multiple_type == 'or'
467
+
468
+ Array.wrap(values)
469
+ end
470
+
471
+ def perform_multiple_search_test(multiple_type)
472
+ if search_param_names.length > 2
473
+ skip 'Inconsistent state of the test (params to search more than 2)'
474
+ elsif search_param_names.empty?
475
+ skip 'Inconsistent state of the test (number of params to search is 0)'
476
+ else
477
+ param_name = search_param_names[0]
478
+ default_search_values = default_search_values_clean(param_name.to_sym)
479
+
480
+ if default_search_values.length > 1
481
+ if default_search_values.length == 2
482
+ search_params = { param_name => modify_value_by_multiple_type(default_search_values, multiple_type) }
483
+ search_and_check_response(search_params)
484
+ else
485
+ chunk_size = 2
486
+ search_params_slices = default_search_values.each_slice(chunk_size).to_a
487
+ search_params_slices.pop if search_params_slices.last.length < chunk_size
488
+ search_params_slices.each do |values_slice|
489
+ search_params = { param_name => modify_value_by_multiple_type(values_slice, multiple_type) }
490
+ search_and_check_response(search_params)
491
+ end
492
+ end
493
+ else
494
+ resources_arr = all_search_params.map { |patient_id, _params_list| scratch_resources_for_patient(patient_id) }.flatten
495
+ resources_arr = scratch_resources[:all].filter { |r| r.resourceType == resource_type } if resources_arr.empty? && search_by_target_resource_data
496
+ existing_values = extract_existing_values_safety(resources_arr, param_name)
497
+
498
+ if existing_values.length > 1
499
+ search_params = { param_name => modify_value_by_multiple_type(existing_values, multiple_type) }
500
+ search_and_check_response(search_params)
501
+ else
502
+ skip insufficient_number_of_values(existing_values)
503
+ end
504
+ end
505
+ end
506
+ end
507
+
508
+ def find_include_resources(params, patient_id, include_param, _keep_search_variant = true)
509
+ resources_to_check = "#{include_param['target_resource'].downcase}_resources".to_sym
510
+ target_resource_type = include_param['target_resource']
511
+ scratch[resources_to_check] ||= {}
512
+ scratch[resources_to_check][:all] ||= []
513
+ scratch[resources_to_check][patient_id] ||= []
514
+ scratch[resources_to_check][:contained] ||= []
515
+
516
+ search_params = params.merge(_include: include_param['parameter'])
517
+ search_and_check_response(search_params)
518
+
519
+ resources = fetch_all_bundled_resources.select { |resource| resource.resourceType == target_resource_type }
520
+
521
+ resources.uniq!(&:id)
522
+ scratch[resources_to_check][:all] += resources
523
+ scratch[resources_to_check][patient_id] += resources
524
+ scratch[resources_to_check][:contained] += resources
525
+
526
+ resources
527
+ end
528
+
529
+ def test_include_param(base_resources, params, patient_id, include_param, keep_search_variant = true)
530
+ return if keep_search_variant && search_variant_test_records[:inclusion]
531
+
532
+ resources_to_check = "#{include_param['target_resource'].downcase}_resources".to_sym
533
+ target_resource_type = include_param['target_resource']
534
+
535
+ scratch[resources_to_check] ||= {}
536
+ scratch[resources_to_check][:all] ||= []
537
+ scratch[resources_to_check][patient_id] ||= []
538
+ scratch[resources_to_check][:contained] ||= []
539
+
540
+ base_resources_with_external_reference =
541
+ base_resources
542
+ .select { |resource| resource&.to_hash&.[](include_param['paths'].first)&.present? }
543
+ .reject { |resource| resource&.to_hash&.[](include_param['paths'].first)&.fetch('reference', '')&.start_with?('#') }
544
+
545
+ contained_resources =
546
+ base_resources
547
+ .select { |resource| resource&.to_hash&.[](include_param['paths'].first)&.fetch('reference', '')&.start_with?('#') }
548
+ .flat_map(&:contained)
549
+ .select { |resource| resource.resourceType == target_resource_type }
550
+
551
+ scratch[resources_to_check][:all] += contained_resources
552
+ scratch[resources_to_check][patient_id] += contained_resources
553
+ scratch[resources_to_check][:contained] += contained_resources
554
+
555
+ return if base_resources_with_external_reference.blank?
556
+
557
+ search_params = params.merge(_include: include_param['parameter'])
558
+
559
+ search_and_check_response(search_params)
560
+
561
+ resources = fetch_all_bundled_resources.select { |resource| resource.resourceType == target_resource_type }
562
+ assert resources.present?, "No #{resource_type} were included in the search results"
563
+
564
+ included_resources = resources.map { |resource| "#{resource.resourceType}/#{resource.id}" }
565
+
566
+ matched_base_resources = base_resources_with_external_reference.select do |base_resource|
567
+ included_resources.any? do |resource_reference|
568
+ is_reference_match?(base_resource&.to_hash&.[](include_param['paths'].first)&.fetch('reference', ''), resource_reference)
569
+ end
570
+ end
571
+
572
+ not_matched_included_resources = included_resources.select do |resource_reference|
573
+ matched_base_resources.none? do |base_resource|
574
+ is_reference_match?(base_resource&.to_hash&.[](include_param['paths'].first)&.fetch('reference', ''), resource_reference)
575
+ end
576
+ end
577
+
578
+ not_matched_included_medications_string = not_matched_included_resources.join(',')
579
+ assert not_matched_included_resources.empty?,
580
+ "No #{resource_type} references #{not_matched_included_medications_string} in the search result."
581
+
582
+ resources.uniq!(&:id)
583
+
584
+ scratch[resources_to_check][:all] += resources
585
+ scratch[resources_to_check][patient_id] += resources
586
+
587
+ return unless keep_search_variant
588
+
589
+ search_variant_test_records[:inclusion] = true
590
+ end
591
+
592
+ def is_reference_match?(reference, local_reference)
593
+ regex_pattern = %r{^(#{Regexp.escape(local_reference)}|\S+/#{Regexp.escape(local_reference)}(?:[/|]\S+)*)$}
594
+ reference.match?(regex_pattern)
595
+ end
596
+
597
+ def all_scratch_resources
598
+ scratch_resources[:all] ||= []
599
+ end
600
+
601
+ def scratch_resources_for_patient(patient_id)
602
+ return all_scratch_resources if patient_id.nil?
603
+
604
+ scratch_resources[patient_id] ||= []
605
+ end
606
+
607
+ def references_to_save(resource_type = nil)
608
+ reference_metadata = resource_type == 'Provenance' ? provenance_metadata : metadata
609
+ reference_metadata.delayed_references
610
+ end
611
+
612
+ def fixed_value_search_param_name
613
+ (search_param_names - ['patient']).first
614
+ end
615
+
616
+ def fixed_value_search_param_values
617
+ metadata.search_definitions[fixed_value_search_param_name.to_sym][:values]
618
+ end
619
+
620
+ def fixed_value_search_params(value, patient_id)
621
+ search_param_names.each_with_object({}) do |name, params|
622
+ params[name] = patient_id_param?(name) ? patient_id : value
623
+ end
624
+ end
625
+
626
+ def search_params_with_values(search_param_names, patient_id, include_system: false)
627
+ resources = scratch_resources_for_patient(patient_id)
628
+
629
+ if resources.empty?
630
+ return search_param_names.each_with_object({}) do |name, params|
631
+ value = patient_id_param?(name) ? patient_id : nil
632
+ if value.nil? && use_any_data_for_search
633
+ scratch_resources[:all].each do |resource|
634
+ value = search_param_value(name, resource, include_system:)
635
+ break if value.present?
636
+ end
637
+ end
638
+ params[name] = value
639
+ end
640
+ end
641
+
642
+ resources.each_with_object({}) do |resource, outer_params|
643
+ results_from_one_resource = search_param_names.each_with_object({}) do |name, params|
644
+ value = if patient_id_param?(name)
645
+ patient_id
646
+ else
647
+ search_param_value(name, resource,
648
+ include_system:)
649
+ end
650
+ params[name] = value
651
+ end
652
+
653
+ outer_params.merge!(results_from_one_resource)
654
+
655
+ # stop if all parameter values are found
656
+ return outer_params if outer_params.all? { |_key, value| value.present? }
657
+ end
658
+ end
659
+
660
+ def patient_id_list
661
+ return [nil] unless respond_to? :patient_ids
662
+
663
+ patient_ids.split(',').map(&:strip)
664
+ end
665
+
666
+ def patient_search?
667
+ search_param_names.any? { |name| patient_id_param? name }
668
+ end
669
+
670
+ def patient_id_param?(name)
671
+ name == 'patient' || (name == '_id' && resource_type == 'Patient')
672
+ end
673
+
674
+ def search_param_paths(name)
675
+ paths = metadata.search_definitions[name.to_sym][:paths]
676
+ paths[0] = 'local_class' if paths.first == 'class'
677
+
678
+ paths
679
+ end
680
+
681
+ def all_search_params_present?(params)
682
+ params.all? { |_name, value| value.present? }
683
+ end
684
+
685
+ def array_of_codes(array)
686
+ array.map { |name| "`#{name}`" }.join(', ')
687
+ end
688
+
689
+ def insufficient_number_of_values(values_to_search)
690
+ "Insufficient number of values for the search. The number of values should be more than 1. The current number of values is #{values_to_search.length}."
691
+ # extra_message = "Current values: #{values_to_search.join(', ')}." if values_to_search.length.positive?
692
+
693
+ # "#{main_message} #{extra_message}"
694
+ end
695
+
696
+ def unable_to_resolve_params_message
697
+ "Could not find values for all search params #{array_of_codes(search_param_names)}"
698
+ end
699
+
700
+ def empty_search_params_message(empty_search_params)
701
+ "Could not find values for the search parameters #{array_of_codes(empty_search_params.keys)}"
702
+ end
703
+
704
+ def no_resources_skip_message(resource_type = self.resource_type)
705
+ msg = "No #{resource_type} resources appear to be available"
706
+
707
+ msg.concat(" with the following Device Type Code filter: #{implantable_device_codes}") if resource_type == 'Device' && implantable_device_codes.present?
708
+
709
+ "#{msg}. Please use patients with more information"
710
+ end
711
+
712
+ def chain_search_restriction(search_parameter)
713
+ "I don't know how to run a chain search with this search parameter: #{search_parameter} (generator restrictions)."
714
+ end
715
+
716
+ def fetch_all_bundled_resources(
717
+ reply_handler: nil,
718
+ max_pages: 20,
719
+ additional_resource_types: [],
720
+ resource_type: self.resource_type
721
+ )
722
+ page_count = 1
723
+ resources = []
724
+ bundle = resource
725
+
726
+ until bundle.nil? || page_count == max_pages
727
+ resources += bundle&.entry&.map { |entry| entry&.resource }
728
+ next_bundle_link = bundle&.link&.find { |link| link.relation == 'next' }&.url
729
+ reply_handler&.call(response)
730
+
731
+ break if next_bundle_link.blank?
732
+
733
+ reply = fhir_client.raw_read_url(next_bundle_link)
734
+
735
+ store_request('outgoing') { reply }
736
+ error_message = cant_resolve_next_bundle_message(next_bundle_link)
737
+
738
+ assert_response_status(200)
739
+ assert_valid_json(reply.body, error_message)
740
+
741
+ bundle = fhir_client.parse_reply(FHIR::Bundle, fhir_client.default_format, reply)
742
+
743
+ page_count += 1
744
+ end
745
+
746
+ valid_resource_types = [resource_type, 'OperationOutcome'].concat(additional_resource_types)
747
+ valid_resource_types << 'Medication' if %w[MedicationRequest MedicationDispense].include?(resource_type)
748
+
749
+ invalid_resource_types =
750
+ resources.reject { |entry| valid_resource_types.include? entry.resourceType }
751
+ .map(&:resourceType)
752
+ .uniq
753
+
754
+ if invalid_resource_types.any?
755
+ info "Received resource type(s) #{invalid_resource_types.join(', ')} in search bundle, " \
756
+ "but only expected resource types #{valid_resource_types.join(', ')}. " \
757
+ 'This is unusual but allowed if the server believes additional resource types are relevant.'
758
+ end
759
+
760
+ resources
761
+ end
762
+
763
+ def cant_resolve_next_bundle_message(link)
764
+ "Could not resolve next bundle: #{link}"
765
+ end
766
+
767
+ def search_param_value(name, resource, include_system: false)
768
+ paths = search_param_paths(name)
769
+ search_value = nil
770
+ paths.each do |path|
771
+ element = find_a_value_at(resource, path) { |element| element_has_valid_value?(element, include_system) }
772
+
773
+ search_value =
774
+ case element
775
+ when FHIR::Period
776
+ if element.start.present?
777
+ "gt#{(DateTime.xmlschema(element.start) - 1).xmlschema}"
778
+ else
779
+ end_datetime = get_fhir_datetime_range(element.end)[:end]
780
+ "lt#{(end_datetime + 1).xmlschema}"
781
+ end
782
+ when FHIR::Reference
783
+ element.reference
784
+ when FHIR::CodeableConcept
785
+ if include_system
786
+ coding =
787
+ find_a_value_at(element, 'coding') { |coding| coding.code.present? && coding.system.present? }
788
+ "#{coding.system}|#{coding.code}"
789
+ else
790
+ find_a_value_at(element, 'coding.code')
791
+ end
792
+ when FHIR::Identifier
793
+ include_system ? "#{element.system}|#{element.value}" : element.value
794
+ when FHIR::Coding
795
+ include_system ? "#{element.system}|#{element.code}" : element.code
796
+ when FHIR::HumanName
797
+ element.family || element.given&.first || element.text
798
+ when FHIR::Address
799
+ element.text || element.city || element.state || element.postalCode || element.country
800
+ else
801
+ if metadata.version != 'v3.1.1' &&
802
+ metadata.search_definitions[name.to_sym][:type] == 'date' &&
803
+ params_with_comparators&.include?(name)
804
+ # convert date search to greath-than comparator search with correct precision
805
+ # For all date search parameters:
806
+ # Patient.birthDate does not mandate comparators so cannot be converted
807
+ # Goal.target-date has day precision
808
+ # All others have second + time offset precision
809
+ if /^\d{4}(-\d{2})?$/.match?(element) || # YYYY or YYYY-MM
810
+ (/^\d{4}-\d{2}-\d{2}$/.match?(element) && resource_type != 'Goal') # YYY-MM-DD AND Resource is NOT Goal
811
+ if !(path == 'birthDate' && resource_type == 'Patient')
812
+ "gt#{(DateTime.xmlschema(element) - 1).xmlschema}"
813
+ else
814
+ "gt#{(DateTime.xmlschema(element) - 1).strftime('%F')}"
815
+ end
816
+ else
817
+ element
818
+ end
819
+ else
820
+ element
821
+ end
822
+ end
823
+
824
+ break if search_value.present?
825
+ end
826
+ search_value&.gsub(',', '\\,')
827
+ end
828
+
829
+ def element_has_valid_value?(element, include_system)
830
+ case element
831
+ when FHIR::Reference
832
+ element.reference.present?
833
+ when FHIR::CodeableConcept
834
+ if include_system
835
+ coding =
836
+ find_a_value_at(element, 'coding') { |coding| coding.code.present? && coding.system.present? }
837
+ coding.present?
838
+ else
839
+ find_a_value_at(element, 'coding.code').present?
840
+ end
841
+ when FHIR::Identifier
842
+ include_system ? element.value.present? && element.system.present? : element.value.present?
843
+ when FHIR::Coding
844
+ include_system ? element.code.present? && element.system.present? : element.code.present?
845
+ when FHIR::HumanName
846
+ (element.family || element.given&.first || element.text).present?
847
+ when FHIR::Address
848
+ (element.text || element.city || element.state || element.postalCode || element.country).present?
849
+ else
850
+ true
851
+ end
852
+ end
853
+
854
+ def save_resource_reference(resource_type, reference)
855
+ scratch[:references] ||= {}
856
+ scratch[:references][resource_type] ||= Set.new
857
+ scratch[:references][resource_type] << reference
858
+ end
859
+
860
+ def save_delayed_references(resources, containing_resource_type = resource_type)
861
+ resources.each do |resource|
862
+ references_to_save(containing_resource_type).each do |reference_to_save|
863
+ resolve_path(resource, reference_to_save[:path])
864
+ .select { |reference| reference.is_a?(FHIR::Reference) && !reference.contained? }
865
+ .each do |reference|
866
+ resource_type = reference.resource_class.name.demodulize
867
+ need_to_save = reference_to_save[:resources].include?(resource_type)
868
+ next unless need_to_save
869
+
870
+ save_resource_reference(resource_type, reference)
871
+ end
872
+ end
873
+ end
874
+ end
875
+
876
+ #### RESULT CHECKING ####
877
+
878
+ def extension_check(resource, extension_url)
879
+ extension_elements = resource.extension.filter { |ext| ext.url == extension_url }
880
+ extension_element = extension_elements.first
881
+
882
+ return extension_element.extension.first.valueCodeableConcept.coding.first.code if extension_url == 'http://hl7.org/fhir/StructureDefinition/individual-genderIdentity'
883
+
884
+ extension_element.valueCoding.code
885
+ end
886
+
887
+ def check_resource_against_params(resource, params)
888
+ params.each do |name, escaped_search_value|
889
+ # unescape search value
890
+ search_value = escaped_search_value&.gsub('\\,', ',')
891
+ paths = search_param_paths(name)
892
+
893
+ match_found = false
894
+ values_found = []
895
+ if %w[indigenous-status gender-identity].include?(name)
896
+ search_param_extension_map = {
897
+ 'indigenous-status' => 'http://hl7.org.au/fhir/StructureDefinition/indigenous-status',
898
+ 'gender-identity' => 'http://hl7.org/fhir/StructureDefinition/individual-genderIdentity'
899
+ }
900
+ values_found = [extension_check(resource, search_param_extension_map[name])]
901
+ match_found = search_value.to_s == values_found.first if values_found.length.positive?
902
+ else
903
+ paths.each do |path|
904
+ type = metadata.search_definitions[name.to_sym][:type]
905
+ values_found =
906
+ resolve_path(resource, path)
907
+ .map do |value|
908
+ if value.is_a? FHIR::Reference
909
+ value.reference
910
+ else
911
+ value
912
+ end
913
+ end
914
+
915
+ match_found =
916
+ case type
917
+ when 'Period', 'date', 'instant', 'dateTime'
918
+ values_found.any? { |date| validate_date_search(search_value, date) }
919
+ when 'HumanName'
920
+ # When a string search parameter refers to the types HumanName and Address,
921
+ # the search covers the elements of type string, and does not cover elements such as use and period
922
+ # https://www.hl7.org/fhir/search.html#string
923
+ search_value_downcase = search_value.downcase
924
+ values_found.any? do |name|
925
+ name&.text&.downcase&.start_with?(search_value_downcase) ||
926
+ name&.family&.downcase&.start_with?(search_value_downcase) ||
927
+ name&.given&.any? { |given| given.downcase.start_with?(search_value_downcase) } ||
928
+ name&.prefix&.any? { |prefix| prefix.downcase.start_with?(search_value_downcase) } ||
929
+ name&.suffix&.any? { |suffix| suffix.downcase.start_with?(search_value_downcase) }
930
+ end
931
+ when 'Address'
932
+ search_value_downcase = search_value.downcase
933
+ values_found.any? do |address|
934
+ address&.text&.downcase&.start_with?(search_value_downcase) ||
935
+ address&.city&.downcase&.start_with?(search_value_downcase) ||
936
+ address&.state&.downcase&.start_with?(search_value_downcase) ||
937
+ address&.postalCode&.downcase&.start_with?(search_value_downcase) ||
938
+ address&.country&.downcase&.start_with?(search_value_downcase)
939
+ end
940
+ when 'CodeableConcept'
941
+ # FHIR token search (https://www.hl7.org/fhir/search.html#token): "When in doubt, servers SHOULD
942
+ # treat tokens in a case-insensitive manner, on the grounds that including undesired data has
943
+ # less safety implications than excluding desired behavior".
944
+ codings = values_found.flat_map(&:coding)
945
+ if search_value.include? '|'
946
+ system = search_value.split('|').first
947
+ code = search_value.split('|').last
948
+ codings&.any? { |coding| coding.system == system && coding.code&.casecmp?(code) }
949
+ else
950
+ codings&.any? { |coding| coding.code&.casecmp?(search_value) }
951
+ end
952
+ when 'Coding'
953
+ if search_value.include? '|'
954
+ system = search_value.split('|').first
955
+ code = search_value.split('|').last
956
+ values_found.any? { |coding| coding.system == system && coding.code&.casecmp?(code) }
957
+ else
958
+ values_found.any? { |coding| coding.code&.casecmp?(search_value) }
959
+ end
960
+ when 'Identifier'
961
+ if search_value.include? '|'
962
+ values_found.any? { |identifier| "#{identifier.system}|#{identifier.value}" == search_value }
963
+ else
964
+ values_found.any? { |identifier| identifier.value == search_value }
965
+ end
966
+ when 'string'
967
+ searched_values = search_value.downcase.split(/(?<!\\\\),/).map { |string| string.gsub('\\,', ',') }
968
+ values_found.any? do |value_found|
969
+ searched_values.any? { |searched_value| value_found.downcase.starts_with? searched_value }
970
+ end
971
+ else
972
+ # searching by patient requires special case because we are searching by a resource identifier
973
+ # references can also be URLs, so we may need to resolve those URLs
974
+ if %w[subject patient].include? name.to_s
975
+ id = search_value.split('Patient/').last
976
+ possible_values = [id, "Patient/#{id}", "#{url}/Patient/#{id}"]
977
+ values_found.any? do |reference|
978
+ possible_values.include? reference
979
+ end
980
+ else
981
+ search_values = search_value.split(/(?<!\\\\),/).map { |string| string.gsub('\\,', ',') }
982
+ values_found.any? { |value_found| search_values.include? value_found }
983
+ end
984
+ end
985
+
986
+ break if match_found
987
+ end
988
+ end
989
+
990
+ assert match_found,
991
+ "#{resource_type}/#{resource.id} did not match the search parameters:\n" \
992
+ "* Expected: #{search_value}\n" \
993
+ "* Found: #{values_found.map(&:inspect).join(', ')}"
994
+ end
995
+ end
996
+
997
+ private
998
+
999
+ def run_search_test_common(search_method)
1000
+ conditional_skip_with_msg !any_valid_search_params?(all_search_params), unable_to_resolve_params_message
1001
+
1002
+ ability_to_search_is_checked = false
1003
+ search_is_available = true
1004
+
1005
+ resources_returned = all_search_params.flat_map do |patient_id, params_list|
1006
+ params_list.flat_map do |params|
1007
+ if first_search_for_patient_by_patient_id
1008
+ unless ability_to_search_is_checked
1009
+ search_is_available = search_by_patient_id_is_available(patient_id)
1010
+ ability_to_search_is_checked = true
1011
+ end
1012
+
1013
+ if search_is_available
1014
+ search_method.call(params, patient_id)
1015
+ else
1016
+ run_read_test_and_skip_first_search(patient_id)
1017
+ end
1018
+ else
1019
+ search_method.call(params, patient_id)
1020
+ end
1021
+ end
1022
+ end
1023
+
1024
+ conditional_skip_with_msg resources_returned.empty?, no_resources_skip_message
1025
+
1026
+ return unless search_is_available == false
1027
+
1028
+ info 'This test was run as a read test. The search functionality is missing in this test, so the test will fail. However, the obtained data will be available.'
1029
+ assert false
1030
+ end
1031
+ end
1032
+ end