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,143 @@
1
+ require 'fhir_models'
2
+ require 'inferno/ext/fhir_models'
3
+
4
+ require_relative 'generator/ig_loader'
5
+ require_relative 'generator/ig_metadata_extractor'
6
+ require_relative 'generator/group_generator'
7
+ require_relative 'generator/must_support_test_generator'
8
+ require_relative 'generator/revinclude_search_test_generator'
9
+ require_relative 'generator/reverse_chain_search_test_generator'
10
+ require_relative 'generator/include_search_test_generator'
11
+ require_relative 'generator/read_test_generator'
12
+ require_relative 'generator/reference_resolution_test_generator'
13
+ require_relative 'generator/resource_list_generator'
14
+ require_relative 'generator/search_test_generator'
15
+ require_relative 'generator/search_no_params_test_generator'
16
+ require_relative 'generator/suite_generator'
17
+ require_relative 'generator/validation_test_generator'
18
+ require_relative 'generator/forward_chain_test_generator'
19
+ require_relative 'generator/combination_search_test_generator'
20
+ require_relative 'generator/special_cases'
21
+
22
+ module DaVinciPlanNetTestKit
23
+ class Generator
24
+ def self.generate
25
+ ig_packages = Dir.glob(File.join(Dir.pwd, 'lib', 'davinci_plan_net_test_kit', 'igs', '*.tgz'))
26
+
27
+ ig_packages.each do |ig_package|
28
+ new(ig_package).generate
29
+ end
30
+ end
31
+
32
+ attr_accessor :ig_resources, :ig_metadata, :ig_file_name
33
+
34
+ def initialize(ig_file_name)
35
+ self.ig_file_name = ig_file_name
36
+ end
37
+
38
+ def generate
39
+ puts "Generating tests for IG #{File.basename(ig_file_name)}"
40
+ load_ig_package
41
+ extract_metadata
42
+ generate_resource_list
43
+ generate_search_no_params_tests
44
+ generate_read_tests
45
+ generate_search_tests
46
+ # TODO: generate_vread_tests
47
+ # TODO: generate_history_tests
48
+ generate_include_search_tests
49
+ generate_revinclude_search_tests
50
+ generate_forward_chain_search_tests
51
+ generate_reverse_chain_search_tests
52
+ generate_combination_chain_search_tests
53
+ generate_validation_tests
54
+ generate_must_support_tests
55
+ generate_reference_resolution_tests
56
+
57
+ generate_groups
58
+
59
+ generate_suites
60
+ end
61
+
62
+ def extract_metadata
63
+ self.ig_metadata = IGMetadataExtractor.new(ig_resources).extract
64
+
65
+ # Specific corrections
66
+ SpecialCases.run_special_cases(ig_metadata)
67
+
68
+ FileUtils.mkdir_p(base_output_dir)
69
+ File.open(File.join(base_output_dir, 'metadata.yml'), 'w') do |file|
70
+ file.write(YAML.dump(ig_metadata.to_hash))
71
+ end
72
+ end
73
+
74
+ def base_output_dir
75
+ File.join(__dir__, 'generated', ig_metadata.ig_version)
76
+ end
77
+
78
+ def load_ig_package
79
+ FHIR.logger = Logger.new('/dev/null')
80
+ self.ig_resources = IGLoader.new(ig_file_name).load
81
+ end
82
+
83
+ def generate_resource_list
84
+ ResourceListGenerator.generate(ig_metadata, base_output_dir)
85
+ end
86
+
87
+ def generate_reference_resolution_tests
88
+ ReferenceResolutionTestGenerator.generate(ig_metadata, base_output_dir)
89
+ end
90
+
91
+ def generate_must_support_tests
92
+ MustSupportTestGenerator.generate(ig_metadata, base_output_dir)
93
+ end
94
+
95
+ def generate_validation_tests
96
+ ValidationTestGenerator.generate(ig_metadata, base_output_dir)
97
+ end
98
+
99
+ def generate_read_tests
100
+ ReadTestGenerator.generate(ig_metadata, base_output_dir)
101
+ end
102
+
103
+ def generate_search_tests
104
+ SearchTestGenerator.generate(ig_metadata, base_output_dir)
105
+ end
106
+
107
+ def generate_search_no_params_tests
108
+ SearchNoParamsTestGenerator.generate(ig_metadata, base_output_dir)
109
+ end
110
+
111
+ def generate_include_search_tests
112
+ IncludeSearchTestGenerator.generate(ig_metadata, base_output_dir)
113
+ end
114
+
115
+ def generate_revinclude_search_tests
116
+ RevincludeSearchTestGenerator.generate(ig_metadata, base_output_dir)
117
+ end
118
+
119
+ def generate_reverse_chain_search_tests
120
+ examples = File.read('lib/davinci_plan_net_test_kit/custom_groups/reverse_chain_tests/examples.json')
121
+ examples_hash = JSON.parse(examples)
122
+ ReverseChainSearchTestGenerator.generate(ig_metadata, examples_hash, base_output_dir)
123
+ end
124
+
125
+ def generate_forward_chain_search_tests
126
+ ForwardChainSearchTestGenerator.generate(ig_metadata, base_output_dir)
127
+ end
128
+
129
+ def generate_combination_chain_search_tests
130
+ examples = File.read('lib/davinci_plan_net_test_kit/custom_groups/combination_searches/examples.json')
131
+ examples_hash = JSON.parse(examples)
132
+ CombinationSearchTestGenerator.generate(ig_metadata, examples_hash, base_output_dir)
133
+ end
134
+
135
+ def generate_groups
136
+ GroupGenerator.generate(ig_metadata, base_output_dir)
137
+ end
138
+
139
+ def generate_suites
140
+ SuiteGenerator.generate(ig_metadata, base_output_dir)
141
+ end
142
+ end
143
+ end
@@ -0,0 +1 @@
1
+ {"resourceType":"SearchParameter","id":"Resource-id","extension":[{"url":"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status","valueCode":"trial-use"}],"url":"http://hl7.org/fhir/SearchParameter/Resource-id","version":"4.0.1","name":"_id","status":"draft","experimental":false,"date":"2019-11-01T09:29:23+11:00","publisher":"Health Level Seven International (FHIR Infrastructure)","contact":[{"telecom":[{"system":"url","value":"http://hl7.org/fhir"}]},{"telecom":[{"system":"url","value":"http://www.hl7.org/Special/committees/fiwg/index.cfm"}]}],"description":"Logical id of this artifact","code":"_id","base":["Resource"],"type":"token","expression":"Resource.id","xpath":"f:Resource/f:id","xpathUsage":"normal"}
@@ -0,0 +1 @@
1
+ {"resourceType":"SearchParameter","id":"Resource-lastUpdated","extension":[{"url":"http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status","valueCode":"trial-use"}],"url":"http://hl7.org/fhir/SearchParameter/Resource-lastUpdated","version":"4.0.1","name":"_lastUpdated","status":"draft","experimental":false,"date":"2019-11-01T09:29:23+11:00","publisher":"Health Level Seven International (FHIR Infrastructure)","contact":[{"telecom":[{"system":"url","value":"http://hl7.org/fhir"}]},{"telecom":[{"system":"url","value":"http://www.hl7.org/Special/committees/fiwg/index.cfm"}]}],"description":"When the resource version last changed","code":"_lastUpdated","base":["Resource"],"type":"date","expression":"Resource.meta.lastUpdated","xpath":"f:Resource/f:meta/f:lastUpdated","xpathUsage":"normal","comparator":["eq","ne","gt","ge","lt","le","sa","eb","ap"]}
@@ -0,0 +1,211 @@
1
+ require_relative 'fhir_resource_navigation'
2
+
3
+ module DaVinciPlanNetTestKit
4
+ module MustSupportTest
5
+ extend Forwardable
6
+ include FHIRResourceNavigation
7
+
8
+ def_delegators 'self.class', :metadata
9
+
10
+ def all_scratch_resources
11
+ scratch_resources[:all]
12
+ end
13
+
14
+ def perform_must_support_test(resources)
15
+ skip_if resources.blank?, "No #{resource_type} resources were found"
16
+
17
+ missing_elements(resources)
18
+ missing_slices(resources)
19
+ missing_extensions(resources)
20
+
21
+ handle_must_support_choices if metadata.must_supports[:choices].present?
22
+
23
+ if (missing_elements + missing_slices + missing_extensions).length.zero?
24
+ pass
25
+ end
26
+
27
+ skip "Could not find #{missing_must_support_strings.join(', ')} in the #{resources.length} " \
28
+ "provided #{resource_type} resource(s)"
29
+ end
30
+
31
+ def handle_must_support_choices
32
+ missing_elements.delete_if do |element|
33
+ choices = metadata.must_supports[:choices].find { |choice| choice[:paths]&.include?(element[:path]) }
34
+ is_any_choice_supported?(choices)
35
+ end
36
+
37
+ missing_extensions.delete_if do |extension|
38
+ choices = metadata.must_supports[:choices].find { |choice| choice[:extension_ids]&.include?(extension[:id]) }
39
+ is_any_choice_supported?(choices)
40
+ end
41
+
42
+ missing_slices.delete_if do |slice|
43
+ choices = metadata.must_supports[:choices].find { |choice| choice[:slice_names]&.include?(slice[:name]) }
44
+ is_any_choice_supported?(choices)
45
+ end
46
+ end
47
+
48
+ def is_any_choice_supported? (choices)
49
+ choices.present? &&
50
+ (
51
+ choices[:paths]&.any? { |path| missing_elements.none? { |element| element[:path] == path } } ||
52
+ choices[:extension_ids]&.any? { |extension_id| missing_extensions.none? { |extension| extension[:id] == extension_id} } ||
53
+ choices[:slice_names]&.any? { |slice_name| missing_slices.none? { |slice| slice[:name] == slice_name} }
54
+ )
55
+ end
56
+
57
+ def missing_must_support_strings
58
+ missing_elements.map { |element_definition| missing_element_string(element_definition) } +
59
+ missing_slices.map { |slice_definition| slice_definition[:name] } +
60
+ missing_extensions.map { |extension_definition| extension_definition[:id] }
61
+ end
62
+
63
+ def missing_element_string(element_definition)
64
+ if element_definition[:fixed_value].present?
65
+ "#{element_definition[:path]}:#{element_definition[:fixed_value]}"
66
+ else
67
+ element_definition[:path]
68
+ end
69
+ end
70
+
71
+ def exclude_uscdi_only_test?
72
+ config.options[:exclude_uscdi_only_test] == true
73
+ end
74
+
75
+ def must_support_extensions
76
+ if exclude_uscdi_only_test?
77
+ metadata.must_supports[:extensions].reject{ |extension| extension[:uscdi_only] }
78
+ else
79
+ metadata.must_supports[:extensions]
80
+ end
81
+ end
82
+
83
+ def missing_extensions(resources = [])
84
+ @missing_extensions ||=
85
+ must_support_extensions.select do |extension_definition|
86
+ resources.none? do |resource|
87
+ resource.extension.any? { |extension| extension.url == extension_definition[:url] }
88
+ end
89
+ end
90
+ end
91
+
92
+ def must_support_elements
93
+ if exclude_uscdi_only_test?
94
+ metadata.must_supports[:elements].reject{ |element| element[:uscdi_only] }
95
+ else
96
+ metadata.must_supports[:elements]
97
+ end
98
+ end
99
+
100
+ def missing_elements(resources = [])
101
+ @missing_elements ||=
102
+ must_support_elements.select do |element_definition|
103
+ resources.none? do |resource|
104
+ path = element_definition[:path] #.delete_suffix('[x]')
105
+ value_found = find_a_value_at(resource, path) do |value|
106
+ value_without_extensions =
107
+ value.respond_to?(:to_hash) ? value.to_hash.reject { |key, _| key == 'extension' } : value
108
+
109
+ (value_without_extensions.present? || value_without_extensions == false) &&
110
+ (element_definition[:fixed_value].blank? || value == element_definition[:fixed_value])
111
+
112
+ end
113
+
114
+ # Note that false.present? => false, which is why we need to add this extra check
115
+ value_found.present? || value_found == false
116
+ end
117
+ end
118
+
119
+ @missing_elements
120
+ end
121
+
122
+ def must_support_slices
123
+ if exclude_uscdi_only_test?
124
+ metadata.must_supports[:slices].reject{ |slice| slice[:uscdi_only] }
125
+ else
126
+ metadata.must_supports[:slices]
127
+ end
128
+ end
129
+
130
+ def missing_slices(resources = [])
131
+ @missing_slices ||=
132
+ must_support_slices.select do |slice|
133
+ resources.none? do |resource|
134
+ path = slice[:path] # .delete_suffix('[x]')
135
+ find_slice(resource, path, slice[:discriminator]).present?
136
+ end
137
+ end
138
+ end
139
+
140
+ def find_slice(resource, path, discriminator)
141
+ find_a_value_at(resource, path) do |element|
142
+ case discriminator[:type]
143
+ when 'patternCodeableConcept'
144
+ coding_path = discriminator[:path].present? ? "#{discriminator[:path]}.coding" : 'coding'
145
+ find_a_value_at(element, coding_path) do |coding|
146
+ coding.code == discriminator[:code] && coding.system == discriminator[:system]
147
+ end
148
+ when 'patternCoding'
149
+ coding_path = discriminator[:path].present? ? discriminator[:path] : ''
150
+ find_a_value_at(element, coding_path) do |coding|
151
+ coding.code == discriminator[:code] && coding.system == discriminator[:system]
152
+ end
153
+ when 'patternIdentifier'
154
+ find_a_value_at(element, discriminator[:path]) { |identifier| identifier.system == discriminator[:system] }
155
+ when 'value'
156
+ values = discriminator[:values].map { |value| value.merge(path: value[:path].split('.')) }
157
+ find_slice_by_values(element, values)
158
+ when 'type'
159
+ case discriminator[:code]
160
+ when 'Date'
161
+ begin
162
+ Date.parse(element)
163
+ rescue ArgumentError
164
+ false
165
+ end
166
+ when 'DateTime'
167
+ begin
168
+ DateTime.parse(element)
169
+ rescue ArgumentError
170
+ false
171
+ end
172
+ when 'String'
173
+ element.is_a? String
174
+ else
175
+ element.is_a? FHIR.const_get(discriminator[:code])
176
+ end
177
+ when 'requiredBinding'
178
+ coding_path = discriminator[:path].present? ? "#{discriminator[:path]}.coding" : 'coding'
179
+ find_a_value_at(element, coding_path) {|coding| discriminator[:values].include?(coding.code) }
180
+ end
181
+ end
182
+ end
183
+
184
+ def find_slice_by_values(element, value_definitions)
185
+ path_prefixes = value_definitions.map { |value_definition| value_definition[:path].first }.uniq
186
+ Array.wrap(element).find do |el|
187
+ path_prefixes.all? do |path_prefix|
188
+ value_definitions_for_path =
189
+ value_definitions
190
+ .select { |value_definition| value_definition[:path].first == path_prefix }
191
+ .each { |value_definition| value_definition[:path].shift }
192
+
193
+ find_a_value_at(el, path_prefix) do |el_found|
194
+ child_element_value_definitions, current_element_value_definitions =
195
+ value_definitions_for_path.partition { |value_definition| value_definition[:path].present? }
196
+
197
+ current_element_values_match =
198
+ current_element_value_definitions
199
+ .all? { |value_definition| value_definition[:value] == el_found }
200
+
201
+ child_element_values_match =
202
+ child_element_value_definitions.present? ?
203
+ find_slice_by_values(el_found, child_element_value_definitions) : true
204
+
205
+ current_element_values_match && child_element_values_match
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,37 @@
1
+ module DaVinciPlanNetTestKit
2
+ class ProvenanceValidator
3
+ include FHIRResourceNavigation
4
+
5
+ def self.validate(...)
6
+ new(...).validate
7
+ end
8
+
9
+ attr_reader :resource, :validation_messages
10
+
11
+ def initialize(resource)
12
+ @resource = resource
13
+ @validation_messages = []
14
+ end
15
+
16
+ def validate
17
+ # Invariant provenance-1 in US Core 5 causes validation error. See FHIR-39518
18
+ return validation_messages unless resource.instance_of?(FHIR::Provenance)
19
+
20
+ failed_provenance =
21
+ find_a_value_at(resource, 'agent') do |agent|
22
+ ['Practitioner', 'Device'].any? { |resource_type| agent.who.reference&.include?(resource_type) } &&
23
+ agent.onBehalfOf.nil?
24
+ end
25
+
26
+
27
+ if failed_provenance.present?
28
+ validation_messages << {
29
+ type: 'error',
30
+ message: "#{resource.resourceType}/#{resource.id}: Rule provenance-1: 'onBehalfOf SHALL be present when Provenance.agent.who is a Practitioner or Device' Failed"
31
+ }
32
+ end
33
+
34
+ validation_messages
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,62 @@
1
+ module DaVinciPlanNetTestKit
2
+ module ReadTest
3
+ def all_scratch_resources
4
+ scratch_resources[:all] ||= []
5
+ end
6
+
7
+ def perform_read_test(resources, reply_handler = nil)
8
+ skip_if resources.blank?, no_resources_skip_message
9
+
10
+ resources_to_read = readable_resources(resources)
11
+
12
+ assert resources_to_read.present?, "No #{resource_type} id found."
13
+
14
+ if config.options[:read_all_resources]
15
+ resources_to_read.each do |resource|
16
+ read_and_validate(resource)
17
+ end
18
+ else
19
+ read_and_validate(resources_to_read.first)
20
+ end
21
+ end
22
+
23
+ def readable_resources(resources)
24
+ resources
25
+ .select { |resource| resource.is_a?(resource_class) || resource.is_a?(FHIR::Reference) }
26
+ .select { |resource| (resource.is_a?(FHIR::Reference) ? resource.reference.split('/').last : resource.id).present? }
27
+ .compact
28
+ .uniq { |resource| resource.is_a?(FHIR::Reference) ? resource.reference.split('/').last : resource.id }
29
+ end
30
+
31
+ def read_and_validate(resource_to_read)
32
+ id = resource_id(resource_to_read)
33
+
34
+ fhir_read resource_type, id
35
+
36
+ assert_response_status(200)
37
+ assert_resource_type(resource_type)
38
+ assert resource.id.present? && resource.id == id, bad_resource_id_message(id)
39
+
40
+ if resource_to_read.is_a? FHIR::Reference
41
+ all_scratch_resources << resource
42
+ end
43
+ end
44
+
45
+ def resource_id(resource)
46
+ resource.is_a?(FHIR::Reference) ? resource.reference.split('/').last : resource.id
47
+ end
48
+
49
+ def no_resources_skip_message
50
+ "No #{resource_type} resources appear to be available. " \
51
+ "Please use #{resource_type}s with more information."
52
+ end
53
+
54
+ def bad_resource_id_message(expected_id)
55
+ "Expected resource to have id: `#{expected_id.inspect}`, but found `#{resource.id.inspect}`"
56
+ end
57
+
58
+ def resource_class
59
+ FHIR.const_get(resource_type)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,179 @@
1
+ require_relative 'fhir_resource_navigation'
2
+
3
+ module DaVinciPlanNetTestKit
4
+ module ReferenceResolutionTest
5
+ extend Forwardable
6
+ include FHIRResourceNavigation
7
+
8
+ def_delegators 'self.class', :metadata
9
+
10
+ def perform_reference_resolution_test(resources)
11
+ skip_if resources.blank?, no_resources_skip_message
12
+
13
+ pass if unresolved_references(resources).length.zero?
14
+
15
+ skip "Could not resolve Must Support references #{unresolved_references_strings.join(', ')}"
16
+ end
17
+
18
+ def unresolved_references_strings
19
+ unresolved_reference_hash =
20
+ unresolved_references.each_with_object(Hash.new { |hash, key| hash[key] = [] }) do |missing, hash|
21
+ hash[missing[:path]] << missing[:target_profile]
22
+ end
23
+ unresolved_reference_hash.map { |path, profiles| "#{path}#{"(#{profiles.join('|')})" unless profiles.first.empty?}" }
24
+ end
25
+
26
+ def record_resolved_reference(reference, target_profile)
27
+ saved_reference = resolved_references.find { |item| item[:reference] == reference.reference }
28
+
29
+ if saved_reference.present?
30
+ if target_profile.present? && !saved_reference[:profiles].include?(target_profile)
31
+ saved_reference[:profiles] << target_profile
32
+ end
33
+ else
34
+ saved_reference = {
35
+ reference: reference.reference,
36
+ profiles: []
37
+ }
38
+
39
+ saved_reference[:profiles] << target_profile if target_profile.present?
40
+ resolved_references.add(saved_reference)
41
+ end
42
+ end
43
+
44
+ def is_reference_resolved?(reference, target_profile)
45
+ resolved_references.any? do |item|
46
+ item[:reference] == reference.reference &&
47
+ (
48
+ target_profile.blank? || item[:profiles].include?(target_profile)
49
+ )
50
+ end
51
+ end
52
+
53
+ def resolved_references
54
+ scratch[:resolved_references] ||= Set.new
55
+ end
56
+
57
+ def no_resources_skip_message
58
+ "No #{resource_type} resources appear to be available. " \
59
+ 'Please use resources with more information.'
60
+ end
61
+
62
+ def must_support_references
63
+ metadata.must_supports[:elements].select { |element_definition| element_definition[:types]&.include?('Reference') }
64
+ end
65
+
66
+ def must_support_references_with_target_profile
67
+ # mapping array of target_profiles to array of {path, target_profile} pair
68
+ must_support_references.map do |element_definition|
69
+ (element_definition[:target_profiles] || ['']).map do |target_profile|
70
+ {
71
+ path: element_definition[:path],
72
+ target_profile: target_profile
73
+ }
74
+ end
75
+ end.flatten
76
+ end
77
+
78
+ def unresolved_references(resources = [])
79
+ @unresolved_references ||=
80
+ must_support_references_with_target_profile.select do |reference_path_profile_pair|
81
+ path = reference_path_profile_pair[:path]
82
+ target_profile = reference_path_profile_pair[:target_profile]
83
+
84
+ found_one_reference = false
85
+
86
+ resolve_one_reference = resources.any? do |resource|
87
+ value_found = resolve_path(resource, path)
88
+ next if value_found.empty?
89
+
90
+ found_one_reference = true
91
+
92
+ value_found.any? do |reference|
93
+ validate_reference_resolution(resource, reference, target_profile)
94
+ end
95
+ end
96
+
97
+ found_one_reference && !resolve_one_reference
98
+ end
99
+
100
+ if metadata.must_supports[:choices].present?
101
+ @unresolved_references.delete_if do |reference|
102
+ choice_profiles = metadata.must_supports[:choices].find { |choice| choice[:target_profiles]&.include?(reference[:target_profile]) }
103
+
104
+ choice_profiles.present? &&
105
+ choice_profiles[:target_profiles]&.any? { |profile| @unresolved_references.none? { |element| element[:target_profile] == profile } }
106
+ end
107
+ end
108
+
109
+ @unresolved_references
110
+ end
111
+
112
+ def validate_reference_resolution(resource, reference, target_profile)
113
+ return true if is_reference_resolved?(reference, target_profile)
114
+
115
+ if reference.contained?
116
+ # if reference_id is blank it is referring to itself, so we know it exists
117
+ return true if reference.reference_id.blank?
118
+
119
+ return resource.contained.any? do |contained_resource|
120
+ contained_resource&.id == reference.reference_id &&
121
+ resource_is_valid_with_target_profile?(contained_resource, target_profile)
122
+ end
123
+ end
124
+
125
+ reference_type = reference.resource_type
126
+ reference_id = reference.reference_id
127
+
128
+ resolved_resource =
129
+ begin
130
+ if reference.relative?
131
+ begin
132
+ reference.resource_class
133
+ rescue NameError
134
+ return false
135
+ end
136
+
137
+ fhir_read(reference_type, reference_id)&.resource
138
+ else
139
+ if reference.base_uri.chomp('/') == fhir_client.instance_variable_get(:@base_service_url).chomp('/')
140
+ fhir_read(reference_type, reference_id)&.resource
141
+ else
142
+ get(reference.reference)&.resource
143
+ end
144
+ end
145
+ rescue StandardError => e
146
+ Inferno::Application['logger'].error("Unable to resolve reference #{reference.reference}")
147
+ Inferno::Application['logger'].error(e.full_message)
148
+ return false
149
+ end
150
+
151
+ return false unless resolved_resource&.resourceType == reference_type && resolved_resource&.id == reference_id
152
+
153
+ return false unless resource_is_valid_with_target_profile?(resolved_resource, target_profile)
154
+
155
+ record_resolved_reference(reference, target_profile)
156
+ true
157
+ end
158
+
159
+ def resource_is_valid_with_target_profile?(resource, target_profile)
160
+ return true if target_profile.blank?
161
+
162
+ # Only need to know if the resource is valid.
163
+ # Calling resource_is_valid? causes validation errors to be logged.
164
+ validator = find_validator(:default)
165
+
166
+ target_profile_with_version = target_profile.include?('|') ? target_profile : "#{target_profile}|#{metadata.profile_version}"
167
+
168
+ outcome = FHIR::OperationOutcome.new(JSON.parse(validator.validate(resource, target_profile_with_version)))
169
+
170
+ message_hashes = outcome.issue&.map { |issue| validator.message_hash_from_issue(issue, resource) } || []
171
+
172
+ message_hashes.concat(validator.additional_validation_messages(resource, target_profile_with_version))
173
+
174
+ validator.filter_messages(message_hashes)
175
+
176
+ message_hashes.none? { |message_hash| message_hash[:type] == 'error' }
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,46 @@
1
+ module Inferno
2
+ module Utils
3
+ # @private
4
+ module Middleware
5
+ class RequestLogger
6
+ def log_response(response, start_time, end_time, exception = nil)
7
+ elapsed = end_time - start_time
8
+ status, _response_headers, body = response if response
9
+ status, = response if exception
10
+
11
+ logger.info("#{status} in #{elapsed.in_milliseconds} ms")
12
+ return unless body.present?
13
+
14
+ body = body.is_a?(Array) ? body.join : body
15
+
16
+ if body.length > 100
17
+ logger.info("#{body[0..100]}...")
18
+ else
19
+ logger.info(body)
20
+ end
21
+ end
22
+
23
+ def log_request(env)
24
+ method = env['REQUEST_METHOD']
25
+ scheme = env['rack.url_scheme']
26
+ host = env['HTTP_HOST']
27
+ path = env['REQUEST_URI']
28
+ query = env['rack.request.query_string']
29
+ body = env['rack.input']
30
+ body = body.instance_of?(Puma::NullIO) ? nil : body.string
31
+ query_string = query.blank? ? '' : "?#{query}"
32
+
33
+ logger.info("#{method} #{scheme}://#{host}#{path}#{query_string}")
34
+
35
+ return unless body.present?
36
+
37
+ if body.length > 100
38
+ logger.info("#{body[0..100]}...")
39
+ else
40
+ logger.info(body)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end