davinci_plan_net_test_kit 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/lib/davinci_plan_net_test_kit/custom_groups/capability_statement/conformance_support_test.rb +41 -0
  4. data/lib/davinci_plan_net_test_kit/custom_groups/capability_statement/fhir_version_test.rb +15 -0
  5. data/lib/davinci_plan_net_test_kit/custom_groups/capability_statement/instantiate_test.rb +19 -0
  6. data/lib/davinci_plan_net_test_kit/custom_groups/capability_statement/json_support_test.rb +39 -0
  7. data/lib/davinci_plan_net_test_kit/custom_groups/capability_statement/profile_support_test.rb +38 -0
  8. data/lib/davinci_plan_net_test_kit/custom_groups/combination_searches/examples.json +40 -0
  9. data/lib/davinci_plan_net_test_kit/custom_groups/data_absent_reason_group.rb +59 -0
  10. data/lib/davinci_plan_net_test_kit/custom_groups/reverse_chain_tests/examples.json +60 -0
  11. data/lib/davinci_plan_net_test_kit/custom_groups/v1.1.0/capability_statement_group.rb +75 -0
  12. data/lib/davinci_plan_net_test_kit/date_search_validation.rb +108 -0
  13. data/lib/davinci_plan_net_test_kit/fhir_resource_navigation.rb +75 -0
  14. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/davinci_plan_net_test_suite.rb +231 -0
  15. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_forward_chain_organization_address_search_test.rb +55 -0
  16. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_forward_chain_organization_name_search_test.rb +55 -0
  17. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_forward_chain_organization_partof_search_test.rb +55 -0
  18. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_forward_chain_organization_type_search_test.rb +55 -0
  19. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_id_search_test.rb +41 -0
  20. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_include_endpoint_organization_search_test.rb +52 -0
  21. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_lastupdated_search_test.rb +43 -0
  22. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_must_support_test.rb +47 -0
  23. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_no_params_search_test.rb +49 -0
  24. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_organization_search_test.rb +41 -0
  25. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_read_test.rb +26 -0
  26. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_reference_resolution_test.rb +42 -0
  27. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/endpoint_validation_test.rb +40 -0
  28. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint/metadata.yml +171 -0
  29. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/endpoint_group.rb +168 -0
  30. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_combination_list_specialty_covered_by_network_search_test.rb +55 -0
  31. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_coverage_area_search_test.rb +41 -0
  32. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_endpoint_search_test.rb +41 -0
  33. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_endpoint_organization_search_test.rb +55 -0
  34. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_location_address_city_search_test.rb +55 -0
  35. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_location_address_postalcode_search_test.rb +55 -0
  36. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_location_address_search_test.rb +55 -0
  37. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_location_address_state_search_test.rb +55 -0
  38. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_location_organization_search_test.rb +55 -0
  39. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_location_type_search_test.rb +55 -0
  40. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_organization_address_search_test.rb +55 -0
  41. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_organization_name_search_test.rb +55 -0
  42. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_organization_partof_search_test.rb +55 -0
  43. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_forward_chain_organization_type_search_test.rb +55 -0
  44. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_id_search_test.rb +41 -0
  45. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_include_healthcare_service_coverage_area_search_test.rb +52 -0
  46. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_include_healthcare_service_endpoint_search_test.rb +52 -0
  47. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_include_healthcare_service_location_search_test.rb +52 -0
  48. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_include_healthcare_service_organization_search_test.rb +52 -0
  49. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_lastupdated_search_test.rb +43 -0
  50. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_location_search_test.rb +41 -0
  51. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_must_support_test.rb +65 -0
  52. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_name_search_test.rb +41 -0
  53. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_no_params_search_test.rb +49 -0
  54. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_organization_search_test.rb +41 -0
  55. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_read_test.rb +26 -0
  56. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_reference_resolution_test.rb +45 -0
  57. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_revinclude_organization_affiliation_service_search_test.rb +60 -0
  58. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_revinclude_practitioner_role_service_search_test.rb +60 -0
  59. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_service_category_search_test.rb +42 -0
  60. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_service_type_search_test.rb +42 -0
  61. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_specialty_search_test.rb +42 -0
  62. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/healthcare_service_validation_test.rb +40 -0
  63. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service/metadata.yml +1377 -0
  64. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/healthcare_service_group.rb +240 -0
  65. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_administered_by_search_test.rb +41 -0
  66. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_coverage_area_search_test.rb +41 -0
  67. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_forward_chain_administered_by_name_search_test.rb +55 -0
  68. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_forward_chain_administered_by_partof_search_test.rb +55 -0
  69. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_forward_chain_owned_by_name_search_test.rb +55 -0
  70. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_forward_chain_owned_by_partof_search_test.rb +55 -0
  71. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_id_search_test.rb +41 -0
  72. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_identifier_search_test.rb +44 -0
  73. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_include_insurance_plan_administered_by_search_test.rb +52 -0
  74. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_include_insurance_plan_coverage_area_search_test.rb +52 -0
  75. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_include_insurance_plan_owned_by_search_test.rb +52 -0
  76. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_lastupdated_search_test.rb +43 -0
  77. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_must_support_test.rb +57 -0
  78. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_name_search_test.rb +41 -0
  79. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_no_params_search_test.rb +49 -0
  80. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_owned_by_search_test.rb +41 -0
  81. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_plan_type_search_test.rb +42 -0
  82. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_read_test.rb +26 -0
  83. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_reference_resolution_test.rb +48 -0
  84. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_type_search_test.rb +42 -0
  85. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/insurance_plan_validation_test.rb +40 -0
  86. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan/metadata.yml +368 -0
  87. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/insurance_plan_group.rb +193 -0
  88. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_address_city_search_test.rb +41 -0
  89. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_address_postalcode_search_test.rb +41 -0
  90. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_address_search_test.rb +41 -0
  91. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_address_state_search_test.rb +41 -0
  92. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_endpoint_search_test.rb +41 -0
  93. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_forward_chain_endpoint_organization_search_test.rb +55 -0
  94. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_forward_chain_organization_address_search_test.rb +55 -0
  95. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_forward_chain_organization_name_search_test.rb +55 -0
  96. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_forward_chain_organization_partof_search_test.rb +55 -0
  97. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_forward_chain_organization_type_search_test.rb +55 -0
  98. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_forward_chain_partof_address_search_test.rb +55 -0
  99. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_forward_chain_partof_organization_search_test.rb +55 -0
  100. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_forward_chain_partof_type_search_test.rb +55 -0
  101. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_id_search_test.rb +41 -0
  102. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_include_location_endpoint_search_test.rb +52 -0
  103. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_include_location_organization_search_test.rb +52 -0
  104. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_include_location_partof_search_test.rb +52 -0
  105. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_lastupdated_search_test.rb +43 -0
  106. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_must_support_test.rb +66 -0
  107. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_no_params_search_test.rb +49 -0
  108. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_organization_search_test.rb +41 -0
  109. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_partof_search_test.rb +41 -0
  110. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_read_test.rb +26 -0
  111. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_reference_resolution_test.rb +44 -0
  112. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_reverse_chain_insurance_plan_coverage_area_owned_by_search_test.rb +62 -0
  113. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_revinclude_healthcare_service_location_search_test.rb +60 -0
  114. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_revinclude_insurance_plan_coverage_area_search_test.rb +60 -0
  115. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_revinclude_organization_affiliation_location_search_test.rb +60 -0
  116. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_revinclude_practitioner_role_location_search_test.rb +60 -0
  117. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_type_search_test.rb +42 -0
  118. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/location_validation_test.rb +40 -0
  119. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location/metadata.yml +395 -0
  120. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/location_group.rb +262 -0
  121. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/metadata.yml +5214 -0
  122. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/metadata.yml +304 -0
  123. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_address_search_test.rb +41 -0
  124. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_coverage_area_search_test.rb +41 -0
  125. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_endpoint_search_test.rb +41 -0
  126. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_forward_chain_endpoint_organization_search_test.rb +55 -0
  127. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_forward_chain_partof_address_search_test.rb +55 -0
  128. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_forward_chain_partof_name_search_test.rb +55 -0
  129. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_forward_chain_partof_type_search_test.rb +55 -0
  130. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_id_search_test.rb +41 -0
  131. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_include_organization_coverage_area_search_test.rb +52 -0
  132. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_include_organization_endpoint_search_test.rb +52 -0
  133. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_include_organization_partof_search_test.rb +52 -0
  134. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_lastupdated_search_test.rb +43 -0
  135. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_must_support_test.rb +58 -0
  136. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_name_search_test.rb +41 -0
  137. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_no_params_search_test.rb +49 -0
  138. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_partof_search_test.rb +41 -0
  139. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_read_test.rb +26 -0
  140. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_reference_resolution_test.rb +43 -0
  141. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_reverse_chain_practitioner_role_network_location_search_test.rb +62 -0
  142. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_revinclude_practitioner_role_network_search_test.rb +60 -0
  143. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_type_search_test.rb +42 -0
  144. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network/network_validation_test.rb +40 -0
  145. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/network_group.rb +238 -0
  146. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/metadata.yml +1296 -0
  147. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_endpoint_search_test.rb +41 -0
  148. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_endpoint_organization_search_test.rb +55 -0
  149. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_location_address_city_search_test.rb +55 -0
  150. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_location_address_postalcode_search_test.rb +55 -0
  151. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_location_address_search_test.rb +55 -0
  152. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_location_address_state_search_test.rb +55 -0
  153. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_location_organization_search_test.rb +55 -0
  154. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_location_type_search_test.rb +55 -0
  155. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_network_name_search_test.rb +55 -0
  156. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_network_partof_search_test.rb +55 -0
  157. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_participating_organization_address_search_test.rb +55 -0
  158. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_participating_organization_name_search_test.rb +55 -0
  159. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_participating_organization_partof_search_test.rb +55 -0
  160. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_participating_organization_type_search_test.rb +55 -0
  161. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_primary_organization_address_search_test.rb +55 -0
  162. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_primary_organization_name_search_test.rb +55 -0
  163. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_primary_organization_partof_search_test.rb +55 -0
  164. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_primary_organization_type_search_test.rb +55 -0
  165. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_service_location_search_test.rb +55 -0
  166. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_service_organization_search_test.rb +55 -0
  167. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_forward_chain_service_service_category_search_test.rb +55 -0
  168. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_id_search_test.rb +41 -0
  169. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_include_organization_affiliation_endpoint_search_test.rb +52 -0
  170. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_include_organization_affiliation_location_search_test.rb +52 -0
  171. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_include_organization_affiliation_network_search_test.rb +52 -0
  172. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_include_organization_affiliation_participating_organization_search_test.rb +52 -0
  173. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_include_organization_affiliation_primary_organization_search_test.rb +52 -0
  174. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_include_organization_affiliation_service_search_test.rb +52 -0
  175. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_lastupdated_search_test.rb +43 -0
  176. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_location_search_test.rb +41 -0
  177. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_must_support_test.rb +52 -0
  178. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_network_search_test.rb +41 -0
  179. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_no_params_search_test.rb +49 -0
  180. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_participating_organization_search_test.rb +41 -0
  181. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_primary_organization_search_test.rb +41 -0
  182. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_read_test.rb +26 -0
  183. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_reference_resolution_test.rb +47 -0
  184. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_role_search_test.rb +42 -0
  185. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_service_search_test.rb +41 -0
  186. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_specialty_search_test.rb +42 -0
  187. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil/org_affil_validation_test.rb +40 -0
  188. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/org_affil_group.rb +241 -0
  189. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/metadata.yml +384 -0
  190. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_address_search_test.rb +41 -0
  191. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_coverage_area_search_test.rb +43 -0
  192. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_endpoint_search_test.rb +41 -0
  193. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_forward_chain_endpoint_organization_search_test.rb +55 -0
  194. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_forward_chain_partof_address_search_test.rb +55 -0
  195. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_forward_chain_partof_name_search_test.rb +55 -0
  196. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_forward_chain_partof_type_search_test.rb +55 -0
  197. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_id_search_test.rb +41 -0
  198. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_include_organization_coverage_area_search_test.rb +52 -0
  199. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_include_organization_endpoint_search_test.rb +52 -0
  200. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_include_organization_partof_search_test.rb +52 -0
  201. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_lastupdated_search_test.rb +43 -0
  202. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_must_support_test.rb +68 -0
  203. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_name_search_test.rb +41 -0
  204. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_no_params_search_test.rb +49 -0
  205. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_partof_search_test.rb +41 -0
  206. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_read_test.rb +26 -0
  207. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_reference_resolution_test.rb +43 -0
  208. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_reverse_chain_insurance_plan_owned_by_coverage_area_search_test.rb +62 -0
  209. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_reverse_chain_org_affil_participating_organization_location_search_test.rb +62 -0
  210. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_reverse_chain_org_affil_participating_organization_network_search_test.rb +62 -0
  211. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_reverse_chain_org_affil_participating_organization_specialty_search_test.rb +62 -0
  212. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_revinclude_endpoint_organization_search_test.rb +60 -0
  213. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_revinclude_healthcare_service_organization_search_test.rb +60 -0
  214. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_revinclude_insurance_plan_administered_by_search_test.rb +60 -0
  215. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_revinclude_insurance_plan_owned_by_search_test.rb +60 -0
  216. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_revinclude_organization_affiliation_participating_organization_search_test.rb +60 -0
  217. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_revinclude_organization_affiliation_primary_organization_search_test.rb +60 -0
  218. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_revinclude_practitioner_role_organization_search_test.rb +60 -0
  219. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_type_search_test.rb +42 -0
  220. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization/organization_validation_test.rb +40 -0
  221. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/organization_group.rb +265 -0
  222. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/metadata.yml +253 -0
  223. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_family_search_test.rb +41 -0
  224. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_given_search_test.rb +41 -0
  225. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_id_search_test.rb +41 -0
  226. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_lastupdated_search_test.rb +43 -0
  227. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_must_support_test.rb +57 -0
  228. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_name_search_test.rb +41 -0
  229. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_no_params_search_test.rb +49 -0
  230. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_read_test.rb +26 -0
  231. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_reference_resolution_test.rb +42 -0
  232. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_reverse_chain_practitioner_role_practitioner_location_search_test.rb +62 -0
  233. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_reverse_chain_practitioner_role_practitioner_network_search_test.rb +62 -0
  234. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_reverse_chain_practitioner_role_practitioner_role_search_test.rb +62 -0
  235. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_reverse_chain_practitioner_role_practitioner_specialty_search_test.rb +62 -0
  236. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_revinclude_practitioner_role_practitioner_search_test.rb +60 -0
  237. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner/practitioner_validation_test.rb +40 -0
  238. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_group.rb +188 -0
  239. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/metadata.yml +1198 -0
  240. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_combination_list_practitioners_with_specialty_and_location_search_test.rb +50 -0
  241. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_endpoint_search_test.rb +41 -0
  242. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_endpoint_organization_search_test.rb +55 -0
  243. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_location_address_city_search_test.rb +55 -0
  244. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_location_address_postalcode_search_test.rb +55 -0
  245. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_location_address_search_test.rb +55 -0
  246. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_location_address_state_search_test.rb +55 -0
  247. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_location_organization_search_test.rb +55 -0
  248. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_location_type_search_test.rb +55 -0
  249. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_network_address_search_test.rb +55 -0
  250. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_network_name_search_test.rb +55 -0
  251. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_network_partof_search_test.rb +55 -0
  252. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_network_type_search_test.rb +55 -0
  253. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_organization_address_search_test.rb +55 -0
  254. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_organization_name_search_test.rb +55 -0
  255. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_organization_partof_search_test.rb +55 -0
  256. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_organization_type_search_test.rb +55 -0
  257. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_practitioner_name_search_test.rb +55 -0
  258. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_service_location_search_test.rb +55 -0
  259. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_service_organization_search_test.rb +55 -0
  260. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_forward_chain_service_service_category_search_test.rb +55 -0
  261. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_id_search_test.rb +41 -0
  262. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_include_practitioner_role_endpoint_search_test.rb +52 -0
  263. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_include_practitioner_role_location_search_test.rb +52 -0
  264. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_include_practitioner_role_network_search_test.rb +52 -0
  265. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_include_practitioner_role_organization_search_test.rb +52 -0
  266. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_include_practitioner_role_practitioner_search_test.rb +52 -0
  267. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_include_practitioner_role_service_search_test.rb +52 -0
  268. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_lastupdated_search_test.rb +43 -0
  269. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_location_search_test.rb +41 -0
  270. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_must_support_test.rb +70 -0
  271. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_network_search_test.rb +41 -0
  272. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_no_params_search_test.rb +49 -0
  273. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_organization_search_test.rb +41 -0
  274. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_practitioner_search_test.rb +41 -0
  275. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_read_test.rb +26 -0
  276. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_reference_resolution_test.rb +46 -0
  277. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_role_search_test.rb +42 -0
  278. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_service_search_test.rb +41 -0
  279. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_specialty_search_test.rb +42 -0
  280. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role/practitioner_role_validation_test.rb +40 -0
  281. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/practitioner_role_group.rb +241 -0
  282. data/lib/davinci_plan_net_test_kit/generated/v1.1.0/resource_list.rb +16 -0
  283. data/lib/davinci_plan_net_test_kit/generator/combination_search_test_generator.rb +215 -0
  284. data/lib/davinci_plan_net_test_kit/generator/forward_chain_test_generator.rb +198 -0
  285. data/lib/davinci_plan_net_test_kit/generator/group_generator.rb +377 -0
  286. data/lib/davinci_plan_net_test_kit/generator/group_metadata.rb +77 -0
  287. data/lib/davinci_plan_net_test_kit/generator/group_metadata_extractor.rb +268 -0
  288. data/lib/davinci_plan_net_test_kit/generator/ig_loader.rb +76 -0
  289. data/lib/davinci_plan_net_test_kit/generator/ig_metadata.rb +52 -0
  290. data/lib/davinci_plan_net_test_kit/generator/ig_metadata_extractor.rb +57 -0
  291. data/lib/davinci_plan_net_test_kit/generator/ig_resources.rb +64 -0
  292. data/lib/davinci_plan_net_test_kit/generator/include_search_test_generator.rb +205 -0
  293. data/lib/davinci_plan_net_test_kit/generator/must_support_metadata_extractor.rb +337 -0
  294. data/lib/davinci_plan_net_test_kit/generator/must_support_metadata_extractor_us_core_3.rb +25 -0
  295. data/lib/davinci_plan_net_test_kit/generator/must_support_test_generator.rb +116 -0
  296. data/lib/davinci_plan_net_test_kit/generator/naming.rb +34 -0
  297. data/lib/davinci_plan_net_test_kit/generator/read_test_generator.rb +86 -0
  298. data/lib/davinci_plan_net_test_kit/generator/reference_resolution_test_generator.rb +92 -0
  299. data/lib/davinci_plan_net_test_kit/generator/resource_list_generator.rb +42 -0
  300. data/lib/davinci_plan_net_test_kit/generator/reverse_chain_search_test_generator.rb +194 -0
  301. data/lib/davinci_plan_net_test_kit/generator/revinclude_search_test_generator.rb +204 -0
  302. data/lib/davinci_plan_net_test_kit/generator/search_definition_metadata_extractor.rb +193 -0
  303. data/lib/davinci_plan_net_test_kit/generator/search_metadata_extractor.rb +74 -0
  304. data/lib/davinci_plan_net_test_kit/generator/search_no_params_test_generator.rb +124 -0
  305. data/lib/davinci_plan_net_test_kit/generator/search_test_generator.rb +276 -0
  306. data/lib/davinci_plan_net_test_kit/generator/special_cases.rb +92 -0
  307. data/lib/davinci_plan_net_test_kit/generator/suite_generator.rb +93 -0
  308. data/lib/davinci_plan_net_test_kit/generator/terminology_binding_metadata_extractor.rb +120 -0
  309. data/lib/davinci_plan_net_test_kit/generator/validation_test_generator.rb +140 -0
  310. data/lib/davinci_plan_net_test_kit/generator/value_extractor.rb +117 -0
  311. data/lib/davinci_plan_net_test_kit/generator.rb +143 -0
  312. data/lib/davinci_plan_net_test_kit/igs/package/SearchParameter-Resource-id.json +1 -0
  313. data/lib/davinci_plan_net_test_kit/igs/package/SearchParameter-Resource-lastUpdated.json +1 -0
  314. data/lib/davinci_plan_net_test_kit/igs/package.tgz +0 -0
  315. data/lib/davinci_plan_net_test_kit/must_support_test.rb +211 -0
  316. data/lib/davinci_plan_net_test_kit/provenance_validator.rb +37 -0
  317. data/lib/davinci_plan_net_test_kit/read_test.rb +62 -0
  318. data/lib/davinci_plan_net_test_kit/reference_resolution_test.rb +179 -0
  319. data/lib/davinci_plan_net_test_kit/request_logger.rb +46 -0
  320. data/lib/davinci_plan_net_test_kit/search_test.rb +1252 -0
  321. data/lib/davinci_plan_net_test_kit/search_test_properties.rb +66 -0
  322. data/lib/davinci_plan_net_test_kit/validation_test.rb +56 -0
  323. data/lib/davinci_plan_net_test_kit/version.rb +5 -0
  324. data/lib/davinci_plan_net_test_kit.rb +1 -0
  325. metadata +452 -0
@@ -0,0 +1,198 @@
1
+ require_relative 'naming'
2
+ require_relative 'special_cases'
3
+
4
+ module DaVinciPlanNetTestKit
5
+ class Generator
6
+ class ForwardChainSearchTestGenerator
7
+ class << self
8
+ def generate(ig_metadata, base_output_dir)
9
+ ig_metadata.groups
10
+ .reject { |group| SpecialCases.exclude_group? group }
11
+ .each do |group|
12
+ group.searches.each do |search_param|
13
+ # Generate a test for any parameters that specify chaining, one for each chain requirement
14
+ search_def = group.search_definitions[search_param[:names].first.to_sym]
15
+ search_def[:chain]&.each { |chain_param| new(group, search_param, base_output_dir, chain_param[:chain]).generate }
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ attr_accessor :group_metadata, :search_metadata, :base_output_dir, :chain_param
22
+
23
+ def initialize(group_metadata, search_metadata, base_output_dir, chain_param)
24
+ self.group_metadata = group_metadata
25
+ self.search_metadata = search_metadata
26
+ self.base_output_dir = base_output_dir
27
+ self.chain_param = chain_param
28
+ end
29
+
30
+ def template
31
+ @template ||= File.read(File.join(__dir__, 'templates', 'forward_chain_test.rb.erb'))
32
+ end
33
+
34
+ def output
35
+ @output ||= ERB.new(template).result(binding)
36
+ end
37
+
38
+ def base_output_file_name
39
+ "#{class_name.underscore}.rb"
40
+ end
41
+
42
+ def output_file_directory
43
+ File.join(base_output_dir, profile_identifier.downcase)
44
+ end
45
+
46
+ def output_file_name
47
+ File.join(output_file_directory, base_output_file_name)
48
+ end
49
+
50
+ def profile_identifier
51
+ Naming.snake_case_for_profile(group_metadata)
52
+ end
53
+
54
+ def test_id
55
+ "davinci_plan_net_#{group_metadata.reformatted_version}_forward_chain_#{search_identifier}_search_test"
56
+ end
57
+
58
+ def search_identifier
59
+ "#{chain_param_base}_#{chain_param.to_s.gsub(/[-:]/, '_')}".underscore
60
+ end
61
+
62
+ def search_title
63
+ search_identifier.camelize
64
+ end
65
+
66
+ def class_name
67
+ "#{Naming.upper_camel_case_for_profile(group_metadata)}ForwardChain#{search_title}SearchTest"
68
+ end
69
+
70
+ def module_name
71
+ "DaVinciPlanNet#{group_metadata.reformatted_version.upcase}"
72
+ end
73
+
74
+ def resource_type
75
+ group_metadata.resource
76
+ end
77
+
78
+ def first_search?
79
+ group_metadata.searches.first == search_metadata
80
+ end
81
+
82
+ def fixed_value_search?
83
+ #TODO
84
+ false
85
+ end
86
+
87
+ def fixed_value_search_param_name
88
+ #TODO
89
+ end
90
+
91
+ def chain_param_string
92
+ "#{profile_identifier}.#{chain_param.gsub(/[-:]/, '_')}"
93
+ end
94
+
95
+ def chain_param_base
96
+ search_metadata[:names].first
97
+ end
98
+
99
+ def chained_resource
100
+ res_type = search_definition(chain_param_base.to_sym)[:type]
101
+ res_type = search_definition(chain_param_base.to_sym)[:target] if res_type == "Reference"
102
+ res_type
103
+ end
104
+
105
+ def a_or_an(name)
106
+ ['a','e','i','o','u'].include?(name.first.downcase) ? "an #{name}" : "a #{name}"
107
+ end
108
+
109
+ def search_param_names
110
+ search_params.map { |param| param[:name] }
111
+ end
112
+
113
+ def search_param_names_array
114
+ array_of_strings(search_param_names)
115
+ end
116
+
117
+ def path_for_value(path)
118
+ path == 'class' ? 'local_class' : path
119
+ end
120
+
121
+ def required_comparators_for_param(name)
122
+ search_definition(name)[:comparators].select { |_comparator, expectation| expectation == 'SHALL' }
123
+ end
124
+
125
+ def required_comparators
126
+ @required_comparators ||=
127
+ search_param_names.each_with_object({}) do |name, comparators|
128
+ required_comparators = required_comparators_for_param(name)
129
+ comparators[name] = required_comparators if required_comparators.present?
130
+ end
131
+ end
132
+
133
+ def search_definition(name)
134
+ group_metadata.search_definitions[name.to_sym]
135
+ end
136
+
137
+ def saves_delayed_references?
138
+ first_search? && group_metadata.delayed_references.present?
139
+ end
140
+
141
+ def possible_status_search?
142
+ !search_metadata[:names].include?('status') && group_metadata.search_definitions.key?(:status)
143
+ end
144
+
145
+ def token_search_params
146
+ @token_search_params ||=
147
+ search_param_names.select do |name|
148
+ ['Identifier', 'CodeableConcept', 'Coding'].include? group_metadata.search_definitions[name.to_sym][:type]
149
+ end
150
+ end
151
+
152
+ def token_search_params_string
153
+ array_of_strings(token_search_params)
154
+ end
155
+
156
+ def required_comparators_string
157
+ array_of_strings(required_comparators.keys)
158
+ end
159
+
160
+ def array_of_strings(array)
161
+ quoted_strings = array.map { |element| "'#{element}'" }
162
+ "[#{quoted_strings.join(', ')}]"
163
+ end
164
+
165
+ def input_name
166
+ "#{search_identifier.downcase}_input"
167
+ end
168
+
169
+ def search_properties
170
+ {}.tap do |properties|
171
+ properties[:fixed_value_search] = 'true' if fixed_value_search?
172
+ properties[:resource_type] = "'#{resource_type}'"
173
+ properties[:search_param_names] = []
174
+ properties[:possible_status_search] = 'true' if possible_status_search?
175
+ properties[:chain_param] = "'#{chain_param}'"
176
+ properties[:chain_param_base] = "'#{chain_param_base}'"
177
+ properties[:additional_resource_type] = "'#{chained_resource}'"
178
+ end
179
+ end
180
+
181
+ def search_test_properties_string
182
+ search_properties
183
+ .map { |key, value| "#{' ' * 10}#{key}: #{value}" }
184
+ .join(",\n")
185
+ end
186
+
187
+ def generate
188
+ FileUtils.mkdir_p(output_file_directory)
189
+ File.open(output_file_name, 'w') { |f| f.write(output) }
190
+
191
+ group_metadata.add_test(
192
+ id: test_id,
193
+ file_name: base_output_file_name
194
+ )
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,377 @@
1
+ require_relative 'naming'
2
+ require_relative 'special_cases'
3
+
4
+ module DaVinciPlanNetTestKit
5
+ class Generator
6
+ class GroupGenerator
7
+ class << self
8
+ def generate(ig_metadata, base_output_dir)
9
+ ig_metadata.ordered_groups
10
+ .reject { |group| SpecialCases.exclude_group? group }
11
+ .each { |group| new(group, base_output_dir).generate }
12
+ end
13
+ end
14
+
15
+ attr_accessor :group_metadata, :base_output_dir
16
+
17
+ def initialize(group_metadata, base_output_dir)
18
+ self.group_metadata = group_metadata
19
+ self.base_output_dir = base_output_dir
20
+ end
21
+
22
+ def template
23
+ @template ||= File.read(File.join(__dir__, 'templates', 'group.rb.erb'))
24
+ end
25
+
26
+ def output
27
+ @output ||= ERB.new(template).result(binding)
28
+ end
29
+
30
+ def base_output_file_name
31
+ "#{class_name.underscore}.rb"
32
+ end
33
+
34
+ def base_metadata_file_name
35
+ "metadata.yml"
36
+ end
37
+
38
+ def class_name
39
+ "#{Naming.upper_camel_case_for_profile(group_metadata)}Group"
40
+ end
41
+
42
+ def module_name
43
+ "DaVinciPlanNet#{group_metadata.reformatted_version.upcase}"
44
+ end
45
+
46
+ def title
47
+ group_metadata.title
48
+ end
49
+
50
+ def short_description
51
+ group_metadata.short_description
52
+ end
53
+
54
+ def output_file_name
55
+ File.join(base_output_dir, base_output_file_name)
56
+ end
57
+
58
+ def metadata_file_name
59
+ File.join(base_output_dir, profile_identifier, base_metadata_file_name)
60
+ end
61
+
62
+ def profile_identifier
63
+ Naming.snake_case_for_profile(group_metadata)
64
+ end
65
+
66
+ def group_id
67
+ "davinci_plan_net_#{group_metadata.reformatted_version}_#{profile_identifier}"
68
+ end
69
+
70
+ def resource_type
71
+ group_metadata.resource
72
+ end
73
+
74
+ def search_validation_resource_type
75
+ "#{resource_type} resources"
76
+ end
77
+
78
+ def profile_name
79
+ group_metadata.profile_name
80
+ end
81
+
82
+ def profile_url
83
+ group_metadata.profile_url
84
+ end
85
+
86
+ def optional?
87
+ false #No Optional groups in Plan Net
88
+ end
89
+
90
+ def chain_requirement_list_for_param(search_parameter)
91
+ sym = search_parameter.class != Symbol ? search_parameter.to_sym : search_parameter
92
+ req_list = group_metadata.search_definitions[sym][:chain].nil? ? [] : group_metadata.search_definitions[sym][:chain]
93
+ req_list
94
+ end
95
+
96
+ def any_chain_requirements?
97
+ !chainable_parameters.empty?
98
+ end
99
+
100
+ def chainable_parameters
101
+ chainable_params = group_metadata.search_definitions.keys.reject do |search_parameter|
102
+ req_list = chain_requirement_list_for_param(search_parameter)
103
+ req_list.nil? || req_list.empty?
104
+ end
105
+ chainable_params
106
+ end
107
+
108
+ def generate
109
+ # add_special_tests
110
+ File.open(output_file_name, 'w') { |f| f.write(output) }
111
+ group_metadata.id = group_id
112
+ group_metadata.file_name = base_output_file_name
113
+ File.open(metadata_file_name, 'w') { |f| f.write(YAML.dump(group_metadata.to_hash)) }
114
+ end
115
+
116
+ def add_special_tests
117
+ return if group_metadata.reformatted_version == 'v311'
118
+ end
119
+
120
+ def test_id_list
121
+ @test_id_list ||=
122
+ group_metadata.tests.map { |test| test[:id] }
123
+ end
124
+
125
+ def test_file_list
126
+ @test_file_list ||=
127
+ group_metadata.tests.map do |test|
128
+ name_without_suffix = test[:file_name].delete_suffix('.rb')
129
+ name_without_suffix.start_with?('..') ? name_without_suffix : "#{profile_identifier}/#{name_without_suffix}"
130
+ end
131
+ end
132
+
133
+ def required_searches
134
+ group_metadata.searches.select { |search| search[:expectation] == 'SHALL' }
135
+ end
136
+
137
+ def search_param_name_string
138
+ required_searches
139
+ .map { |search| search[:names].join(' + ') }
140
+ .map { |names| "* #{names}" }
141
+ .join("\n")
142
+ end
143
+
144
+ def include_param_name_string
145
+ group_metadata.include_params
146
+ .map { |names| "* #{names}" }
147
+ .join("\n")
148
+ end
149
+
150
+ def revinclude_param_name_string
151
+ group_metadata.revincludes
152
+ .map { |names| "* #{names}" }
153
+ .join("\n")
154
+ end
155
+
156
+ def forward_chain_table
157
+ chain_table = "| Search Parameters | Chain Requirements |\n| :---: | :---: |\n"
158
+ # Iterate through the chain requirements and add to table
159
+ chainable_parameters.each do |chain_param|
160
+ chain_requirement_list = chain_requirement_list_for_param(chain_param).map { |chain| chain[:chain]}
161
+ chain_table += "| #{chain_param} | #{chain_requirement_list.join(', ')} |\n"
162
+ end
163
+
164
+ chain_table
165
+ end
166
+
167
+ def reverse_chain_string
168
+ # Placeholder until we have a more clear way of inferring reverse requirements
169
+ examples = File.read('lib/davinci_plan_net_test_kit/custom_groups/reverse_chain_tests/examples.json')
170
+ examples_hash = JSON.parse(examples)[Naming.upper_camel_case_for_profile(group_metadata)]
171
+ .map { |test_example| "* #{test_example['source_resource']}:#{test_example['target_param']}:#{test_example['constraining_param']}" }
172
+ .join("\n")
173
+ end
174
+
175
+ def search_description
176
+ return '' if required_searches.blank?
177
+
178
+ <<~SEARCH_DESCRIPTION
179
+
180
+ ## Searching
181
+ This test sequence will perform a search with each required search parameter
182
+ associated with this resource individually. Searches with the
183
+ following parameters will be performed:
184
+
185
+ #{search_param_name_string}
186
+
187
+ ### Search Parameters
188
+ Each search will look for its parameter values
189
+ from the results of the instance gathering step. For example, for a search using
190
+ the `identifier` search parameter, the test searches the gathered instances
191
+ for one with the `identifier` element populated and then uses that value
192
+ as the queried `identifier` value. If a value cannot be found this way,
193
+ the search test is skipped for that search parameter.
194
+
195
+ ### Search Validation
196
+ Inferno will retrieve all bundle pages of the reply for
197
+ #{search_validation_resource_type}. Each of the returned instances
198
+ is then checked to see if it matches the searched
199
+ parameters in accordance with [FHIR search
200
+ guidelines](https://www.hl7.org/fhir/search.html). The test will fail,
201
+ for example, if a #{profile_name} search for `#{required_searches.first[:names].first}=X`
202
+ returns a #{profile_name} instance where `#{required_searches.first[:names].first}!=X`
203
+
204
+ SEARCH_DESCRIPTION
205
+ end
206
+
207
+ def include_description
208
+ return '' if group_metadata.include_params.blank?
209
+
210
+ <<~INCLUDE_DESCRIPTION
211
+ ## _include Requirement Testing
212
+ This test sequence will perform a search with each required _include search
213
+ parameter associated with this profile. This sequence will perform searches with the
214
+ following includes:
215
+
216
+ #{include_param_name_string}
217
+
218
+ Each _include search will look for a candidate id that has the target reference element
219
+ populated from the results of instance gathering. Each search will use the identified
220
+ #{profile_name} id and the include parameter.
221
+ The returned instances are checked to ensure that any instances of the included
222
+ type are referenced by returned instances of the searched resource type.
223
+
224
+ INCLUDE_DESCRIPTION
225
+ end
226
+
227
+ def revinclude_description
228
+ return '' if group_metadata.revincludes.blank?
229
+
230
+ <<~REVINCLUDE_DESCRIPTION
231
+ ## _revinclude Requirement Testing
232
+ This test sequence will perform a search with each required _revinclude search
233
+ parameter associated with this resource. This sequence will perform searches with the
234
+ following revincludes:
235
+
236
+ #{revinclude_param_name_string}
237
+
238
+ All _revinclude searches will look for candidate ids from the results of
239
+ instance gathering _only_ if tests are ran from the suite level. Each search
240
+ will use a #{profile_name} id that is referenced by an instance of the revincluded resource
241
+ in the element that is the target of the revinclude search parameter. The returned instances
242
+ are checked to ensure that any
243
+ instances of the revincluded type reference returned instances of the searched resource type.
244
+
245
+ If running from the group level, inputs of the form
246
+ "#{resource_type} instance ids referenced in \[referencing profile\].\[referencing element\]"
247
+ are provided for these tests. Enter ids of the #{resource_type} profile that
248
+ are referenced by the \[referencing element\] of an instance of the \[referencing profile\].
249
+
250
+ REVINCLUDE_DESCRIPTION
251
+ end
252
+
253
+ def forward_chain_description
254
+ return '' if !any_chain_requirements?
255
+
256
+ <<~FORWARD_CHAINING_DESCRIPTION
257
+ ## Forward Chaining Requirement Testing
258
+ This test sequence will perform a search with each required combination of forward chaining
259
+ search parameters. This sequence will perform searches with the following chaining parameters:
260
+
261
+ #{forward_chain_table}
262
+
263
+ All forward chain searches will look for candidate instances of the resource being chained through
264
+ from the results of previously run _include tests. Candidates are chosen from previously returned
265
+ instances that have the chain parameter element filled. Each search test will use one of these values
266
+ to build the requests for the test. The test will be skipped if no candidates can be found.
267
+
268
+ The test will first create and execute the forward chaining request.
269
+ The test will then perform a basic search test on the resource being chained through,
270
+ using the same value in the previous request. Each resource returned in the first
271
+ request will then be checked, validating that the element being chained through is populated by
272
+ the id of _any_ of the resources returned by the second request.
273
+
274
+ FORWARD_CHAINING_DESCRIPTION
275
+ end
276
+
277
+ def reverse_chain_description
278
+ return '' if !test_id_list.any? {|test_id| test_id.include?('reverse_chain')}
279
+ <<~REVERSE_CHAINING_DESCRIPTION
280
+ ## Reverse Chaining Requirement Testing
281
+ This test sequence will perform a search with each required combination of reverse chaining
282
+ search parameters, including the following combinations:
283
+
284
+ #{reverse_chain_string}
285
+
286
+ All reverse chain searches will look for candidate instances from the results of
287
+ previous tests _only_ if tests are ran from the suite level. Candidates are
288
+ selected by checking they have both the second (reference element) and third (constraining element) elements
289
+ populated. The search value will be taken from the constraining element on the
290
+ identified candidate.
291
+
292
+ If running from the profile level, inputs of the form
293
+ "\'\[constraining element\]\' value from a \[source resource type\] instance with \'\[reference element\]\' populated"
294
+ are provided for these tests upon test start. Enter a value from the \[constraining element\] element
295
+ of an instance of a \[source resource type\] resource that also contains a reference to
296
+ the tested #{resource_type} in its \[reference element\] element. The input will
297
+ be used as the search value.
298
+
299
+ The test will first create and execute a request with the chain parameter.
300
+ The test will then perform a search against the \[source resource type\] with
301
+ the \[constraining\] SeachParameter using the same search value. Each resource returned in the first
302
+ request will then be checked, validating that the ids of those resources are also referenced
303
+ by _any_ of the resources returned by the second request in its \[reference element\] element.
304
+
305
+ REVERSE_CHAINING_DESCRIPTION
306
+ end
307
+
308
+
309
+ def description
310
+ <<~DESCRIPTION
311
+ # Background
312
+
313
+ The #{title} sequence verifies that the system under test is
314
+ able to provide correct responses for #{resource_type} queries. These queries
315
+ must return resources conforming to the #{profile_name} profile as
316
+ specified in the Plan Net #{group_metadata.version} Implementation Guide.
317
+
318
+ # Testing Methodology
319
+
320
+ ## Instance Gathering
321
+
322
+ Inferno will first identify and obtain a set of instances to use for the rest
323
+ of the tests, requiring at least one instance to be identified for the test to pass.
324
+ Instances to gather are indentified in two ways. One or both will be used,
325
+ depending on user input.
326
+
327
+ ### Parameterless searches
328
+ Instances can be gathered using a query requesting all instances of #{resource_type}
329
+ (e.g., `GET [FHIR Endpoint]/#{resource_type}`). #{SpecialCases.has_parameterless_filter?(profile_name) ? SpecialCases.parameterless_filter_description(profile_name) : "" }
330
+ Gathering through this method is controlled by the following inputs (used for all profiles):
331
+ - "Use parameterless searches to identify instances?":
332
+ parameterless searches can be disabled using this input if, for example,
333
+ the server under test does not support them, or not all instances on the server
334
+ should be expected to conform to Plan Net profiles. In this case the user **MUST**
335
+ provide specific instance ids to gather.
336
+ - "Maximum number of instances to gather using parameterless searches": sets an upper
337
+ bound on the number of instances Inferno will gather from parameterless searches.
338
+ - "Maximum pages of results to consider when using parameterless searches": sets an upper bound
339
+ on the number of pages of search results Inferno will load when gathering instances
340
+ using parameterless searches.
341
+
342
+ ### User-provided instance ids
343
+
344
+ If ids are listed in the "ids of #{profile_name} instances" optional input,
345
+ they will be read and included at the start of the set of gathered instances.
346
+
347
+ #{search_description}
348
+ #{include_description}
349
+ #{revinclude_description}
350
+ #{forward_chain_description}
351
+ #{reverse_chain_description}
352
+
353
+ ## Profile Validation
354
+ Each resource identified during instance gathering and other queries run during this test sequence
355
+ is expected to conform to the [#{profile_name}](#{group_metadata.versioned_profile_url}). Each element is checked
356
+ by the HL7 Validator against terminology binding and cardinality requirements. Elements with a
357
+ required binding are validated against their bound ValueSet. If the code/system in the element
358
+ is not part of the ValueSet, then the test will fail.
359
+
360
+ ## Must Support
361
+ Each profile contains elements marked as "must support". This test
362
+ sequence expects to see each of these elements populated at least once.
363
+ The test will look through the #{profile_name} instances identified
364
+ during instance gathering and other queries run during this test sequence.
365
+ If no populated instance can be found for any must support element, the test
366
+ will fail.
367
+
368
+ ## Reference Validation
369
+ At least one instance of each external reference in elements marked as
370
+ "must support" within the resources provided by the system must resolve.
371
+ The test will attempt to read each reference found and will fail if no
372
+ read succeeds.
373
+ DESCRIPTION
374
+ end
375
+ end
376
+ end
377
+ end
@@ -0,0 +1,77 @@
1
+ module DaVinciPlanNetTestKit
2
+ class Generator
3
+ class GroupMetadata
4
+ ATTRIBUTES = [
5
+ :name,
6
+ :class_name,
7
+ :version,
8
+ :reformatted_version,
9
+ :resource,
10
+ :profile_url,
11
+ :versioned_profile_url,
12
+ :profile_name,
13
+ :profile_version,
14
+ :title,
15
+ :short_description,
16
+ :interactions,
17
+ :operations,
18
+ :searches,
19
+ :search_definitions,
20
+ :include_params,
21
+ :revincludes,
22
+ :required_concepts,
23
+ :must_supports,
24
+ :mandatory_elements,
25
+ :bindings,
26
+ :references,
27
+ :tests,
28
+ :id,
29
+ :file_name,
30
+ :delayed_references
31
+ ].freeze
32
+
33
+ ATTRIBUTES.each { |name| attr_accessor name }
34
+
35
+ def initialize(metadata)
36
+ metadata.each do |key, value|
37
+ raise "Unknown attribute #{key}" unless ATTRIBUTES.include? key
38
+
39
+ instance_variable_set(:"@#{key}", value)
40
+ end
41
+ end
42
+
43
+ def delayed?
44
+ # No delayed resources in Plan Net
45
+ false
46
+ end
47
+
48
+ def add_test(id:, file_name:)
49
+ self.tests ||= []
50
+
51
+ test_metadata = {
52
+ id: id,
53
+ file_name: file_name
54
+ }
55
+ self.tests << test_metadata
56
+ end
57
+
58
+ def to_hash
59
+ ATTRIBUTES.each_with_object({}) { |key, hash| hash[key] = send(key) unless send(key).nil? }
60
+ end
61
+
62
+ def add_delayed_references(delayed_profiles, ig_resources)
63
+ self.delayed_references =
64
+ references
65
+ .select { |reference| (reference[:profiles] & delayed_profiles).present? }
66
+ .map do |reference|
67
+ profile_urls = (reference[:profiles] & delayed_profiles)
68
+ delayed_resources = profile_urls.map { |url| ig_resources.resource_for_profile(url) }
69
+ {
70
+ path: reference[:path].gsub("#{resource}.", ''),
71
+ resources: delayed_resources
72
+ }
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end