davinci_plan_net_test_kit 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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