davinci_crd_test_kit 0.13.0 → 0.14.1

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 (351) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_crd_client_suite.json.erb +20 -14
  3. data/config/presets/inferno_crd_client_suite_prefetch_subset_v221.json.erb +125 -0
  4. data/config/presets/inferno_crd_client_suite_v221.json.erb +188 -0
  5. data/config/presets/inferno_crd_server_suite.json.erb +58 -1
  6. data/config/presets/inferno_crd_server_suite_v221.json.erb +94 -0
  7. data/config/presets/ri_crd_request_generator.json_v221.json.erb +13 -0
  8. data/config/presets/ri_crd_server.json.erb +19 -19
  9. data/lib/davinci_crd_test_kit/client/client_base_urls.rb +80 -0
  10. data/lib/davinci_crd_test_kit/{client_hook_request_validation.rb → client/client_hook_request_validation.rb} +1 -1
  11. data/lib/davinci_crd_test_kit/client/crd_client_options.rb +30 -0
  12. data/lib/davinci_crd_test_kit/client/endpoints/cds_services_discovery_handler.rb +34 -0
  13. data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +342 -0
  14. data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +410 -0
  15. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +239 -0
  16. data/lib/davinci_crd_test_kit/{mock_service_response.rb → client/endpoints/mock_service_response.rb} +165 -59
  17. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/companions_prerequisites.json +1 -0
  18. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/create_update_coverage_information.json +3 -2
  19. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/external_reference.json +1 -1
  20. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +1 -1
  21. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
  22. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
  23. data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
  24. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
  33. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
  34. data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
  38. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
  39. data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
  40. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
  41. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
  42. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
  43. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
  44. data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
  45. data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
  46. data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
  47. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
  48. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
  49. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
  50. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
  51. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
  52. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
  53. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
  54. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
  55. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
  56. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
  57. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
  58. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
  59. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
  60. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
  61. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
  62. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
  63. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
  64. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
  65. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +109 -0
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +102 -0
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +101 -0
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +84 -0
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +107 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +108 -0
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +113 -0
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +33 -0
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +234 -0
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +54 -0
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +108 -0
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
  105. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
  106. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +133 -0
  107. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
  108. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
  109. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
  110. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +75 -0
  111. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
  112. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
  113. data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
  114. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +321 -0
  115. data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
  116. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
  117. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
  118. data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
  119. data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
  120. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
  121. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +476 -0
  122. data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
  123. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
  124. data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
  125. data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
  126. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +203 -0
  127. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +435 -0
  128. data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
  129. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +46 -0
  130. data/lib/davinci_crd_test_kit/metadata.rb +10 -44
  131. data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
  132. data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -0
  133. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  134. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +742 -65
  135. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
  136. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
  137. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
  138. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
  139. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
  140. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  141. data/lib/davinci_crd_test_kit/server/endpoints/jwk_set_endpoint_handler.rb +13 -0
  142. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
  143. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
  144. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
  145. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
  146. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
  147. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
  148. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
  149. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
  150. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
  151. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
  152. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_no_special_requests.rb +17 -0
  153. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
  154. data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
  155. data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
  156. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +183 -0
  157. data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
  158. data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +3 -3
  159. data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
  160. data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
  161. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
  162. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
  163. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
  164. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
  165. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
  166. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
  167. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
  168. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
  169. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
  170. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
  171. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
  172. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
  173. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
  174. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
  175. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
  176. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
  177. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
  178. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
  179. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
  180. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
  181. data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
  182. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
  183. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
  184. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
  185. data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
  186. data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
  187. data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
  188. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
  189. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
  190. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
  191. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
  192. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
  193. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
  194. data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
  195. data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
  196. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
  197. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  198. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  199. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
  200. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
  201. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  202. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
  203. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
  204. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
  205. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
  206. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
  207. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
  208. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
  209. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
  210. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
  211. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
  212. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
  213. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
  214. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
  215. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
  216. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
  217. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
  218. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
  219. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
  220. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
  221. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
  222. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
  223. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
  224. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
  225. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +118 -0
  226. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
  227. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
  228. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
  229. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
  230. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_standard_prefetch_expressions_test.rb +166 -0
  231. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
  232. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
  233. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
  234. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
  235. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
  236. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +121 -0
  237. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +94 -0
  238. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +71 -0
  239. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +107 -0
  240. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +107 -0
  241. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
  242. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +121 -0
  243. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +115 -0
  244. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +132 -0
  245. data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
  246. data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
  247. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_response_group.rb +23 -0
  248. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
  249. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
  250. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
  251. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
  252. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
  253. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
  254. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +31 -0
  255. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
  256. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +40 -0
  257. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +41 -0
  258. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +109 -0
  259. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
  260. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
  261. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
  262. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +130 -0
  263. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +119 -0
  264. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +89 -0
  265. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +126 -0
  266. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +174 -0
  267. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +83 -0
  268. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +88 -0
  269. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
  270. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +81 -0
  271. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +63 -0
  272. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
  273. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
  274. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
  275. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
  276. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
  277. data/lib/davinci_crd_test_kit/version.rb +2 -2
  278. data/lib/davinci_crd_test_kit.rb +4 -2
  279. metadata +307 -93
  280. data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
  281. data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -74
  282. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
  283. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
  284. data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
  285. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
  286. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
  287. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -42
  288. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -40
  289. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
  290. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -42
  291. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -61
  292. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
  293. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
  294. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
  295. data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
  296. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
  297. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
  298. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
  299. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
  300. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
  301. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
  302. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
  303. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
  304. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
  305. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
  306. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
  307. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -48
  308. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
  309. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
  310. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -193
  311. data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
  312. data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
  313. data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
  314. data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
  315. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
  316. data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
  317. data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
  318. data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
  319. data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
  320. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
  321. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
  322. data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
  323. data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
  324. data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
  325. data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
  326. data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
  327. data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
  328. data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
  329. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
  330. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
  331. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
  332. data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
  333. data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
  334. data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
  335. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
  336. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
  337. data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
  338. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
  339. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
  340. data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
  341. data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
  342. data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
  343. data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
  344. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
  345. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
  346. data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
  347. data/lib/davinci_crd_test_kit/tags.rb +0 -10
  348. data/lib/davinci_crd_test_kit/urls.rb +0 -52
  349. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
  350. /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
  351. /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
@@ -0,0 +1,71 @@
1
+ require_relative '../../../cross_suite/cards_identification'
2
+ require_relative '../../../cross_suite/tags'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class CoverageInformationMustSupportTest < Inferno::Test
7
+ include DaVinciCRDTestKit::CardsIdentification
8
+
9
+ title 'Coverage Information responses demonstrate Must Support elements'
10
+ id :crd_v221_coverage_information_must_support
11
+ description <<~DESCRIPTION
12
+ Checks that the server demonstrated must support coverage for the [Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
13
+ extension across the hook responses returned during this test session.
14
+
15
+ At least one hook invocation must have returned a Coverage Information system action.
16
+ Additionally, the set of [coverage-information extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/StructureDefinition-ext-coverage-information.html)
17
+ instances returned across those actions must collectively demonstrate all must support elements.
18
+
19
+ If this test fails, re-run the hook tests using request payloads that cause the server to return
20
+ Coverage Information system actions that cover the full set of must support elements.
21
+ DESCRIPTION
22
+
23
+ ALL_HOOKS = [
24
+ DaVinciCRDTestKit::APPOINTMENT_BOOK_TAG,
25
+ DaVinciCRDTestKit::ENCOUNTER_START_TAG,
26
+ DaVinciCRDTestKit::ENCOUNTER_DISCHARGE_TAG,
27
+ DaVinciCRDTestKit::ORDER_DISPATCH_TAG,
28
+ DaVinciCRDTestKit::ORDER_SELECT_TAG,
29
+ DaVinciCRDTestKit::ORDER_SIGN_TAG
30
+ ].freeze
31
+
32
+ def metadata
33
+ @metadata ||= YAML.load_file(
34
+ File.join(__dir__, '..', '..', '..', 'cross_suite', 'coverage-information_stu221_metadata.yml')
35
+ )
36
+ end
37
+
38
+ class MustSupportMetadataHolder
39
+ attr_accessor :metadata
40
+
41
+ def initialize(metadata)
42
+ self.metadata = metadata
43
+ end
44
+
45
+ def must_supports
46
+ @must_supports ||= {
47
+ extensions: metadata[:must_supports][:extensions] || [],
48
+ slices: metadata[:must_supports][:slices] || [],
49
+ elements: metadata[:must_supports][:elements] || []
50
+ }
51
+ end
52
+ end
53
+
54
+ run do
55
+ ALL_HOOKS.each { |hook_tag| load_tagged_requests(hook_tag) }
56
+ sorted_cards = sorted_cards_from_requests(requests)
57
+ coverage_info_system_actions = sorted_cards['actions'][COVERAGE_INFORMATION_RESPONSE_TYPE]
58
+
59
+ assert coverage_info_system_actions.present?,
60
+ 'Coverage Information system action support not demonstrated.'
61
+
62
+ coverage_information_extensions = extract_coverage_information_extensions(sorted_cards)
63
+ assert_must_support_elements_present(
64
+ coverage_information_extensions,
65
+ COVERAGE_INFO_EXT_URL,
66
+ metadata: MustSupportMetadataHolder.new(metadata)
67
+ )
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../../server_test_helper'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V221
5
+ class CoverageInformationSystemActionAcrossHooksValidationTest < Inferno::Test
6
+ include DaVinciCRDTestKit::ServerTestHelper
7
+
8
+ title 'Coverage Information system actions are valid across all hooks'
9
+ id :crd_v221_coverage_info_system_action_across_hooks_validation
10
+ description %(
11
+ This test verifies the presence of valid [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
12
+ system action returned by CRD services across all hooks invoked. It verifies the following for each action:
13
+ - The action type is `update`.
14
+ - The resource within the action conforms its respective FHIR profile.
15
+
16
+ Additionally, the test examines the `coverage-info` extensions within the resource to ensure that:
17
+ - Entries referencing differing coverage have distinct `coverage-assertion-ids` and `satisfied-pa-ids`
18
+ (if present).
19
+ - Entries referencing the same coverage have the same `coverage-assertion-ids` and `satisfied-pa-ids`
20
+ (if present).
21
+
22
+ The test will be skipped if no valid Coverage Information system actions are returned across all hooks.
23
+ )
24
+
25
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-14'
26
+
27
+ run do
28
+ verify_at_least_one_test_passes(
29
+ self.class.parent.parent.groups,
30
+ 'crd_v221_coverage_info_system_action_validation',
31
+ 'None of the hooks invoked returned valid Coverage Info system actions.'
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,118 @@
1
+ require 'yaml'
2
+ require_relative '../../resource_extractor'
3
+ require_relative '../../server_test_helper'
4
+ require_relative '../../../cross_suite/tags'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V221
8
+ class SupportedUSCoreVersionsTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ResourceExtractor
10
+ include DaVinciCRDTestKit::ServerTestHelper
11
+
12
+ title 'Provided resources demonstrate support for all required US Core versions'
13
+ id :crd_v221_supported_us_core_versions
14
+ description <<~DESCRIPTION
15
+ Checks whether the embedded FHIR resources provided across hook requests during this test
16
+ session demonstrate support for all US Core versions required by the CRD implementation
17
+ guide: 3.1.1, 6.1.0, and 7.0.0.
18
+
19
+ This test does not verify exhaustive support for each US Core version. It inspects FHIR
20
+ resources included in successful hook request `context` and `prefetch` data and verifies
21
+ that at least one provided resource validates against a US Core profile for each required
22
+ version.
23
+ DESCRIPTION
24
+
25
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@conf-2'
26
+
27
+ US_CORE_VERSIONS = {
28
+ '3.1.1' => 'v3.1.1',
29
+ '6.1.0' => 'v6.1.0',
30
+ '7.0.0' => 'v7.0.0'
31
+ }.freeze
32
+
33
+ GENERATED_METADATA_DIR = File.join(
34
+ Gem::Specification.find_by_name('us_core_test_kit').gem_dir,
35
+ 'lib', 'us_core_test_kit', 'generated'
36
+ ).freeze
37
+
38
+ run do
39
+ ALL_HOOK_TAGS.each { |hook_tag| load_tagged_requests(hook_tag) }
40
+ skip_if requests.empty?, 'No requests were made in a previous test as expected.'
41
+
42
+ successful_requests = requests.select { |request| request.status == 200 }
43
+ skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
44
+
45
+ embedded_resources = successful_requests.each.flat_map { |request| resources_from_request(request) }
46
+
47
+ skip_if embedded_resources.blank?,
48
+ 'No embedded FHIR resources were found in successful hook requests.'
49
+
50
+ version_matches = determine_version_matches(embedded_resources)
51
+ missing_versions = US_CORE_VERSIONS.keys - version_matches.keys
52
+
53
+ missing_versions.each do |version|
54
+ add_message('error', "Support for US Core #{version} was not demonstrated.")
55
+ end
56
+
57
+ assert missing_versions.empty?,
58
+ 'Support for one or more required US Core versions was not demonstrated.'
59
+ end
60
+
61
+ private
62
+
63
+ def determine_version_matches(embedded_resources)
64
+ embedded_resources.each_with_object({}) do |resource, matches|
65
+ US_CORE_VERSIONS.each_key do |version|
66
+ next if matches.key?(version)
67
+
68
+ matching_profile = us_core_profiles_by_version
69
+ .dig(version, resource.resourceType)
70
+ &.find { |profile_url| resource_valid_for_profile?(resource, profile_url) }
71
+
72
+ next unless matching_profile.present?
73
+
74
+ matches[version] = matching_profile
75
+ end
76
+ end
77
+ end
78
+
79
+ def resource_valid_for_profile?(resource, profile_url)
80
+ validation_details = []
81
+ resource_is_valid?(
82
+ resource:,
83
+ profile_url:,
84
+ validator_response_details: validation_details,
85
+ add_messages_to_runnable: false
86
+ )
87
+ end
88
+
89
+ def us_core_profiles_by_version
90
+ @us_core_profiles_by_version ||= US_CORE_VERSIONS.transform_values do |directory|
91
+ version_profile_metadata(directory).each_with_object(
92
+ Hash.new { |hash, key| hash[key] = [] }
93
+ ) do |metadata, profiles_by_resource|
94
+ profile_identifier = versioned_profile_identifier(metadata)
95
+ next unless profile_identifier.present?
96
+
97
+ profiles_by_resource[metadata[:resource]] << profile_identifier
98
+ end.transform_values(&:uniq)
99
+ end
100
+ end
101
+
102
+ def version_profile_metadata(directory)
103
+ Dir.glob(File.join(GENERATED_METADATA_DIR, directory, '*', 'metadata.yml')).map do |path|
104
+ YAML.load_file(path, aliases: true)
105
+ end
106
+ end
107
+
108
+ def versioned_profile_identifier(metadata)
109
+ resource_type = metadata[:resource]
110
+ profile_url = metadata[:profile_url]
111
+ profile_version = metadata[:profile_version]
112
+ return if resource_type.blank? || profile_url.blank? || profile_version.blank?
113
+
114
+ "#{profile_url}|#{profile_version}"
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,121 @@
1
+ require_relative '../../cross_suite/tags'
2
+ require_relative 'interaction/server_invoke_hook_test'
3
+ require_relative 'verify_request/service_request_required_fields_validation_test'
4
+ require_relative 'verify_request/service_request_optional_fields_validation_test'
5
+ require_relative 'verify_request/service_request_context_validation_test'
6
+ require_relative 'verify_response/service_response_validation_test'
7
+ require_relative 'verify_response/external_reference_card_validation_test'
8
+ require_relative 'verify_response/coverage_information_system_action_validation_test'
9
+ require_relative 'verify_response/coverage_information_card_absence_test'
10
+ require_relative 'verify_response/coverage_info_configuration_test'
11
+ require_relative 'verify_response/instructions_card_received_test'
12
+ require_relative 'verify_response/form_completion_response_validation_test'
13
+ require_relative 'verify_response/launch_smart_app_card_validation_test'
14
+ require_relative 'verify_response/create_or_update_coverage_info_response_validation_test'
15
+ require_relative 'verify_response/all_responses_include_coverage_information_test'
16
+ require_relative 'verify_response/unknown_configuration_test'
17
+ require_relative 'verify_response/unknown_context_test'
18
+ require_relative 'verify_response/unknown_cds_hooks_elements_test'
19
+
20
+ module DaVinciCRDTestKit
21
+ module V221
22
+ class ServerAppointmentBookGroup < Inferno::TestGroup
23
+ title 'appointment-book'
24
+ id :crd_v221_server_appointment_book
25
+ description %(
26
+ This group of tests invokes the appointment-book hook and ensures that
27
+ the user-provided requests are valid as per the requirements described
28
+ in the [CRD IG section on appointment-book hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#appointment-book)
29
+ and the [CDS Hooks specification section on appointment-book context](https://cds-hooks.hl7.org/hooks/appointment-book/2023SepSTU1Ballot/appointment-book/).
30
+ It also ensures that the contents of the server's response are valid as per the requirements described in
31
+ the [CRD IG section on appointment-book hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#appointment-book)
32
+ and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
33
+
34
+ The [CRD IG section on appointment-book hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#appointment-book)
35
+ states that "servers SHALL, at minimum, support returning and processing the Coverage Information
36
+ system action for all invocations of this hook."
37
+
38
+ This group includes tests to validate the following CRD response types:
39
+ - [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
40
+ - [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
41
+ - optional
42
+ - [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
43
+ - [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions) - optional
44
+ - [Launch SMART application](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application) -
45
+ optional
46
+ - [Request form completion](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion) -
47
+ optional
48
+ )
49
+ # verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@164', 'hl7.fhir.us.davinci-crd_2.0.1@168',
50
+ # 'hl7.fhir.us.davinci-crd_2.0.1@170', 'hl7.fhir.us.davinci-crd_2.0.1@184'
51
+
52
+ config options: { hook_name: APPOINTMENT_BOOK_TAG }
53
+ run_as_group
54
+
55
+ group do
56
+ title 'Interaction'
57
+
58
+ test from: :crd_v221_server_invoke_hook_test,
59
+ config: {
60
+ inputs: {
61
+ service_ids: {
62
+ name: :appointment_book_service_ids,
63
+ title: 'Service id for the service that implements the `appointment-book` hook'
64
+ },
65
+ service_request_bodies: {
66
+ name: :appointment_book_request_bodies,
67
+ title: 'Request body or bodies for invoking the `appointment-book` hook'
68
+ }
69
+ }
70
+ }
71
+ end
72
+
73
+ group do
74
+ title 'Requests'
75
+ simulation_verification
76
+
77
+ test from: :crd_v221_service_request_required_fields_validation,
78
+ config: {
79
+ outputs: {
80
+ contexts: {
81
+ name: :appointment_book_contexts
82
+ }
83
+ }
84
+ }
85
+ test from: :crd_v221_service_request_context_validation,
86
+ config: {
87
+ inputs: {
88
+ contexts: {
89
+ name: :appointment_book_contexts
90
+ }
91
+ }
92
+ }
93
+ test from: :crd_v221_service_request_optional_fields_validation
94
+ end
95
+
96
+ group do
97
+ title 'Responses'
98
+
99
+ test from: :crd_v221_service_response_validation
100
+ test from: :crd_v221_external_reference_card_validation
101
+ test from: :crd_v221_launch_smart_app_card_validation
102
+ test from: :crd_v221_valid_instructions_card_received
103
+ test from: :crd_v221_coverage_info_system_action_validation
104
+ test from: :crd_v221_all_responses_include_coverage_information,
105
+ verifies_requirements: [
106
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-16',
107
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-28',
108
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-26',
109
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-29'
110
+ ]
111
+ test from: :crd_v221_coverage_information_card_absence
112
+ test from: :crd_v221_request_form_completion_response_validation
113
+ test from: :crd_v221_create_or_update_coverage_info_response_validation
114
+ test from: :crd_v221_coverage_info_configuration
115
+ test from: :crd_v221_unknown_configuration
116
+ test from: :crd_v221_unknown_context
117
+ test from: :crd_v221_unknown_cds_hooks_elements
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,94 @@
1
+ require_relative '../../cross_suite/tags'
2
+ require_relative 'interaction/server_invoke_hook_test'
3
+ require_relative 'verify_request/service_request_required_fields_validation_test'
4
+ require_relative 'verify_request/service_request_optional_fields_validation_test'
5
+ require_relative 'verify_request/service_request_context_validation_test'
6
+ require_relative 'verify_response/service_response_validation_test'
7
+
8
+ module DaVinciCRDTestKit
9
+ module V221
10
+ class ServerDemonstrateHookResponseGroup < Inferno::TestGroup
11
+ title 'Hook Response Demonstration'
12
+ id :crd_v221_server_demonstrate_hook_response
13
+ description %(
14
+ This group of tests allows the system to demonstrate its ability to respond to a CRD Hook invocation
15
+ and return a valid response. Inferno will use the provided request body and will either use the provided service
16
+ id or infer one from the hook indicated in the request and the server's discovery response.
17
+ It ensures that the user-provided request and the server's response are both
18
+ valid as per the requirements described in the [CRD IG section](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html)
19
+ and the [CDS Hooks](https://cds-hooks.hl7.org/) hook specification for the corresponding hook.
20
+ )
21
+
22
+ config options: { hook_name: ANY_HOOK_TAG }
23
+ run_as_group
24
+
25
+ group do
26
+ title 'Interaction'
27
+
28
+ test from: :crd_v221_server_invoke_hook_test,
29
+ config: {
30
+ inputs: {
31
+ service_ids: {
32
+ name: :any_hook_service_ids,
33
+ title: 'Service id to use for the "Demonstrate a Hook Response" test',
34
+ description: %(
35
+ If blank, Inferno will attempt to infer the service id to use by finding a service entry in the
36
+ Discovery response for the hook indicated in the provided request body. If it cannot be inferred,
37
+ the tests will be skipped.
38
+ )
39
+ },
40
+ service_request_bodies: {
41
+ name: :any_hook_request_body,
42
+ title: 'Request body to use for the "Demonstrate a Hook Response" test',
43
+ description: %(
44
+ Provide a single JSON request body to submit for the hook invocation. The type of hook invoked
45
+ will be inferred based on the `hook` element in the request.
46
+ )
47
+ }
48
+ }
49
+ }
50
+ end
51
+
52
+ group do
53
+ title 'Requests'
54
+ simulation_verification
55
+
56
+ test from: :crd_v221_service_request_required_fields_validation,
57
+ config: {
58
+ outputs: {
59
+ contexts: {
60
+ name: :any_hook_contexts
61
+ }
62
+ }
63
+ }
64
+ test from: :crd_v221_service_request_context_validation,
65
+ config: {
66
+ inputs: {
67
+ contexts: {
68
+ name: :any_hook_contexts
69
+ },
70
+ request_body: {
71
+ name: :any_hook_request_body
72
+ }
73
+ }
74
+ }
75
+ end
76
+
77
+ group do
78
+ title 'Responses'
79
+
80
+ test from: :crd_v221_service_response_validation,
81
+ config: {
82
+ outputs: {
83
+ valid_cards: {
84
+ name: :any_hook_valid_cards
85
+ },
86
+ valid_system_actions: {
87
+ name: :any_hook_valid_system_actions
88
+ }
89
+ }
90
+ }
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,71 @@
1
+ require 'tls_test_kit'
2
+ require_relative 'discovery/discovery_configuration_test'
3
+ require_relative 'discovery/discovery_endpoint_test'
4
+ require_relative 'discovery/discovery_services_validation_test'
5
+ require_relative 'discovery/discovery_prefetch_support_test'
6
+ require_relative 'discovery/discovery_standard_prefetch_expressions_test'
7
+
8
+ module DaVinciCRDTestKit
9
+ module V221
10
+ class ServerDiscoveryGroup < Inferno::TestGroup
11
+ title 'Discovery'
12
+ id :crd_v221_server_discovery_group
13
+ description %(
14
+ # Background
15
+
16
+ The #{title} Group checks for a CDS Service's Discovery endpoint as described by the
17
+ [CDS Hooks Specification](https://cds-hooks.hl7.org/2.0/#discovery).
18
+ A CDS Service is discoverable via a stable endpoint by CDS Clients. The Discovery endpoint
19
+ includes information such as a description of the CDS Service, when it should be invoked,
20
+ and any data that is requested to be prefetched.
21
+ The Discovery endpoint SHALL always be available at `{baseUrl}/cds-services`.
22
+
23
+ # Test Methodology
24
+
25
+ This test sequence accesses the CRD server Discovery endpoint at /cds-services using a GET request.
26
+ It parses the response and verifies that:
27
+ - The Discovery endpoint is TLS secured.
28
+ - The Discovery endpoint is available at `{baseURL}/cds-services`.
29
+ - Each CDS Service in the response contains the required fields as specified in the [CDS Hooks Spec](https://cds-hooks.hl7.org/2.0/#response).
30
+
31
+ It collects the following information that is saved in the testing session for use by later tests:
32
+ - List of supported CDS Services/Hooks
33
+ - List of service IDs for each supported Hook.
34
+ )
35
+
36
+ run_as_group
37
+
38
+ test from: :tls_version_test do
39
+ title 'CRD server uses TLS 1.2 or higher'
40
+ description <<~DESCRIPTION
41
+ Under [Privacy, Safety, and
42
+ Security](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/security.html),
43
+ the CRD Implementation Guide imposes the following rule about TLS:
44
+
45
+ As per the [CDS Hook specification](https://cds-hooks.hl7.org/2.0/#security-and-safety),
46
+ communications between CRD Clients and CRD Servers SHALL
47
+ use TLS. Mutual TLS is not required by this specification but is permitted. CRD Servers and
48
+ CRD Clients SHOULD enforce a minimum version and other TLS configuration requirements based
49
+ on HRex rules for PHI exchange.
50
+
51
+ This test verifies that the CRD server is using TLS 1.2 or higher.
52
+ DESCRIPTION
53
+
54
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@sec-2'
55
+
56
+ id :crd_v221_server_tls_version_stu2
57
+
58
+ config(
59
+ options: { minimum_allowed_version: OpenSSL::SSL::TLS1_2_VERSION },
60
+ inputs: { url: { name: :base_url } }
61
+ )
62
+ end
63
+
64
+ test from: :crd_v221_discovery_endpoint_test
65
+ test from: :crd_v221_discovery_services_validation
66
+ test from: :crd_v221_discovery_configuration
67
+ test from: :crd_v221_discovery_prefetch_support
68
+ test from: :crd_v221_discovery_standard_prefetch_expressions
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,107 @@
1
+ require_relative '../../cross_suite/tags'
2
+ require_relative 'interaction/server_invoke_hook_test'
3
+ require_relative 'verify_request/service_request_required_fields_validation_test'
4
+ require_relative 'verify_request/service_request_optional_fields_validation_test'
5
+ require_relative 'verify_request/service_request_context_validation_test'
6
+ require_relative 'verify_response/service_response_validation_test'
7
+ require_relative 'verify_response/external_reference_card_validation_test'
8
+ require_relative 'verify_response/launch_smart_app_card_validation_test'
9
+ require_relative 'verify_response/instructions_card_received_test'
10
+ require_relative 'verify_response/form_completion_response_validation_test'
11
+ require_relative 'verify_response/create_or_update_coverage_info_response_validation_test'
12
+ require_relative 'verify_response/coverage_information_card_absence_test'
13
+ require_relative 'verify_response/coverage_info_configuration_test'
14
+ require_relative 'verify_response/unknown_configuration_test'
15
+ require_relative 'verify_response/unknown_context_test'
16
+ require_relative 'verify_response/unknown_cds_hooks_elements_test'
17
+
18
+ module DaVinciCRDTestKit
19
+ module V221
20
+ class ServerEncounterDischargeGroup < Inferno::TestGroup
21
+ title 'encounter-discharge'
22
+ id :crd_v221_server_encounter_discharge
23
+ description %(
24
+ This group of tests invokes the encounter-discharge hook and ensures that
25
+ the user-provided requests are valid as per the requirements described
26
+ in the [CRD IG section on encounter-discharge hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-discharge)
27
+ and the [CDS Hooks specification section on encounter-discharge context](https://cds-hooks.hl7.org/hooks/encounter-discharge/2023SepSTU1Ballot/encounter-discharge/).
28
+ It also ensures that the contents of the server's response are valid as per the requirements described in
29
+ the [CRD IG section on encounter-discharge hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-discharge)
30
+ and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
31
+
32
+ This group includes tests to validate the following CRD response types:
33
+ - [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information) - optional
34
+ - [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
35
+ - optional
36
+ - [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
37
+ - [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions) - optional
38
+ - [Launch SMART application](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application) -
39
+ optional
40
+ - [Request form completion](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion) -
41
+ optional
42
+ )
43
+ # verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@168', 'hl7.fhir.us.davinci-crd_2.0.1@196'
44
+
45
+ config options: { hook_name: ENCOUNTER_DISCHARGE_TAG }
46
+ run_as_group
47
+
48
+ group do
49
+ title 'Interaction'
50
+
51
+ test from: :crd_v221_server_invoke_hook_test,
52
+ config: {
53
+ inputs: {
54
+ service_ids: {
55
+ name: :encounter_discharge_service_ids,
56
+ title: 'Service id for the service that implements the `encounter-discharge` hook'
57
+ },
58
+ service_request_bodies: {
59
+ name: :encounter_discharge_request_bodies,
60
+ title: 'Request body or bodies for invoking the `encounter-discharge` hook'
61
+ }
62
+ }
63
+ }
64
+ end
65
+
66
+ group do
67
+ title 'Requests'
68
+ simulation_verification
69
+
70
+ test from: :crd_v221_service_request_required_fields_validation,
71
+ config: {
72
+ outputs: {
73
+ contexts: {
74
+ name: :encounter_discharge_contexts
75
+ }
76
+ }
77
+ }
78
+ test from: :crd_v221_service_request_context_validation,
79
+ config: {
80
+ inputs: {
81
+ contexts: {
82
+ name: :encounter_discharge_contexts
83
+ }
84
+ }
85
+ }
86
+ test from: :crd_v221_service_request_optional_fields_validation
87
+ end
88
+
89
+ group do
90
+ title 'Responses'
91
+
92
+ test from: :crd_v221_service_response_validation
93
+ test from: :crd_v221_external_reference_card_validation
94
+ test from: :crd_v221_launch_smart_app_card_validation
95
+ test from: :crd_v221_valid_instructions_card_received
96
+ test from: :crd_v221_coverage_info_system_action_validation
97
+ test from: :crd_v221_coverage_information_card_absence
98
+ test from: :crd_v221_request_form_completion_response_validation
99
+ test from: :crd_v221_create_or_update_coverage_info_response_validation
100
+ test from: :crd_v221_coverage_info_configuration
101
+ test from: :crd_v221_unknown_configuration
102
+ test from: :crd_v221_unknown_context
103
+ test from: :crd_v221_unknown_cds_hooks_elements
104
+ end
105
+ end
106
+ end
107
+ end