davinci_crd_test_kit 0.12.2 → 0.14.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 (341) 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 +124 -0
  5. data/config/presets/inferno_crd_server_suite.json.erb +59 -2
  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 +233 -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}/launch_smart_app.json +8 -1
  20. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
  21. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
  22. data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
  23. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
  24. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
  33. data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
  34. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
  38. data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
  39. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
  40. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
  41. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
  42. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
  43. data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
  44. data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
  45. data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
  46. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
  47. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
  48. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
  49. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
  50. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
  51. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
  52. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
  53. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
  54. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
  55. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
  56. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
  57. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
  58. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
  59. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
  60. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
  61. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
  62. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
  63. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
  64. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
  65. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +102 -0
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +96 -0
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +95 -0
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +64 -0
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +101 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +102 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +107 -0
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +27 -0
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +229 -0
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +49 -0
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +107 -0
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
  105. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +127 -0
  106. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
  107. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
  108. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
  109. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +74 -0
  110. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
  111. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
  112. data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
  113. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +312 -0
  114. data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
  115. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
  116. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
  117. data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
  118. data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
  119. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
  120. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +462 -0
  121. data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
  122. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
  123. data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
  124. data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
  125. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +202 -0
  126. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +274 -0
  127. data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
  128. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +42 -0
  129. data/lib/davinci_crd_test_kit/metadata.rb +10 -44
  130. data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
  131. data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -0
  132. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  133. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +742 -65
  134. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
  135. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
  136. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
  137. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
  138. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
  139. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  140. data/lib/davinci_crd_test_kit/server/endpoints/jwk_set_endpoint_handler.rb +13 -0
  141. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
  142. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
  143. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
  144. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
  145. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
  146. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
  147. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
  148. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
  149. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
  150. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
  151. data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
  152. data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
  153. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +165 -0
  154. data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
  155. data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +1 -1
  156. data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
  157. data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
  158. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
  159. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
  160. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
  161. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
  162. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
  163. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
  164. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
  165. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
  166. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
  167. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
  168. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
  169. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
  170. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
  171. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
  172. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
  173. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
  174. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
  175. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
  176. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
  177. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
  178. data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
  179. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
  180. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
  181. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
  182. data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
  183. data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
  184. data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
  185. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
  186. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
  187. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
  188. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
  189. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
  190. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
  191. data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
  192. data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
  193. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
  194. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  195. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  196. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
  197. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
  198. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  199. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
  200. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
  201. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
  202. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
  203. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
  204. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
  205. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
  206. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
  207. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
  208. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
  209. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
  210. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
  211. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
  212. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
  213. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
  214. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
  215. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
  216. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
  217. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
  218. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
  219. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
  220. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
  221. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
  222. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +115 -0
  223. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
  224. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
  225. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
  226. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
  227. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
  228. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
  229. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
  230. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
  231. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +213 -0
  232. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +93 -0
  233. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +69 -0
  234. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +194 -0
  235. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +194 -0
  236. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
  237. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +214 -0
  238. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +219 -0
  239. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +241 -0
  240. data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
  241. data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
  242. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +30 -0
  243. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
  244. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  245. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  246. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +66 -0
  247. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
  248. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +57 -0
  249. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
  250. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  251. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +184 -0
  252. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +75 -0
  253. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +47 -0
  254. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +91 -0
  255. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +137 -0
  256. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +32 -0
  257. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +49 -0
  258. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
  259. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +54 -0
  260. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +97 -0
  261. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
  262. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
  263. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
  264. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
  265. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
  266. data/lib/davinci_crd_test_kit/version.rb +2 -2
  267. data/lib/davinci_crd_test_kit.rb +4 -2
  268. metadata +308 -101
  269. data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
  270. data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -75
  271. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
  272. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
  273. data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
  274. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
  275. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
  276. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -41
  277. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -39
  278. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
  279. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -41
  280. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -60
  281. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
  282. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
  283. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
  284. data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
  285. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
  286. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
  287. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
  288. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
  289. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
  290. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
  291. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
  292. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
  293. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
  294. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
  295. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
  296. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -44
  297. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
  298. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
  299. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -185
  300. data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
  301. data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
  302. data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
  303. data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
  304. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
  305. data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
  306. data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
  307. data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
  308. data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
  309. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
  310. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
  311. data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
  312. data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
  313. data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
  314. data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
  315. data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
  316. data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
  317. data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
  318. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
  319. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
  320. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
  321. data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
  322. data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
  323. data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
  324. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
  325. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
  326. data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
  327. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
  328. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
  329. data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
  330. data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
  331. data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
  332. data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
  333. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
  334. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
  335. data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
  336. data/lib/davinci_crd_test_kit/tags.rb +0 -10
  337. data/lib/davinci_crd_test_kit/urls.rb +0 -52
  338. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/external_reference.json +0 -0
  339. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
  340. /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
  341. /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
@@ -0,0 +1,229 @@
1
+ require_relative 'client_fhir_api_group'
2
+ require_relative 'client_hooks_group'
3
+ require_relative 'client_cross_hook_group'
4
+ require_relative 'client_registration_group'
5
+ require_relative 'client_long_running_hook_group'
6
+ require_relative '../endpoints/cds_services_discovery_handler'
7
+ require_relative '../../cross_suite/tags'
8
+ require_relative 'client_urls'
9
+ require_relative '../crd_client_options'
10
+ require_relative '../endpoints/hook_request_endpoint'
11
+ require_relative '../../ext/inferno_core/runnable'
12
+ require 'us_core_test_kit/generated/v3.1.1/us_core_test_suite'
13
+ require 'us_core_test_kit/generated/v6.1.0/us_core_test_suite'
14
+ require 'us_core_test_kit/generated/v7.0.0/us_core_test_suite'
15
+
16
+ module DaVinciCRDTestKit
17
+ module V221
18
+ class CRDClientSuite < Inferno::TestSuite
19
+ id :crd_client_v221
20
+ title 'Da Vinci CRD Client v2.2.1 Test Suite'
21
+ description <<~DESCRIPTION
22
+ The Da Vinci CRD Client v2.2.1 Test Suite tests the conformance of systems to the
23
+ capabilities of a CRD client as described in [version 2.2.1](https://hl7.org/fhir/us/davinci-crd/2.2.1)
24
+ of the Da Vinci Coverage Requirements Discovery (CRD) Implementation Guide.
25
+
26
+ Detailed information about this test suite can be found in the
27
+ [client section](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details) of the
28
+ [CRD Test Kit Wiki](https://github.com/inferno-framework/davinci-crd-test-kit/wiki), including:
29
+ - [What testers need to successfully execute these tests](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Instructions-v2.2.1#pre-execution-setup-and-required-information),
30
+ - [Minimal](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Instructions-v2.2.1#quick-start)
31
+ and [complete](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Instructions-v2.2.1#additional-testing-options)
32
+ instructions for executing against a client system, and
33
+ - How to [interpret test results](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Instructions-v2.2.1#interpreting-results).
34
+ DESCRIPTION
35
+
36
+ suite_summary <<~SUMMARY
37
+ The Da Vinci CRD Client v2.2.1 Test Suite tests the conformance of client systems
38
+ to [version 2.2.1 of the Da Vinci Coverage Requirements Discovery (CRD)
39
+ Implementation Guide](https://hl7.org/fhir/us/davinci-crd/2.2.1).
40
+ SUMMARY
41
+
42
+ links [
43
+ {
44
+ label: 'Implementation Guide',
45
+ url: 'https://hl7.org/fhir/us/davinci-crd/2.2.1'
46
+ },
47
+ {
48
+ label: 'Report Issue',
49
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit/issues'
50
+ },
51
+ {
52
+ label: 'Open Source',
53
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit'
54
+ },
55
+ {
56
+ label: 'Download',
57
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit/releases'
58
+ }
59
+ ]
60
+
61
+ requirement_sets(
62
+ {
63
+ identifier: 'hl7.fhir.us.davinci-crd_2.2.1',
64
+ title: 'Da Vinci Coverage Requirements Discovery (CRD) v2.2.1',
65
+ actor: 'CRD Client'
66
+ },
67
+ {
68
+ identifier: 'cds-hooks_3.0.0-ballot',
69
+ title: 'CDS Hooks 3.0.0-ballot',
70
+ actor: 'Client'
71
+ },
72
+ {
73
+ identifier: 'cds-hooks-library_1.0.1',
74
+ title: 'CDS Hooks Library',
75
+ actor: 'Client',
76
+ requirements: 'referenced'
77
+ },
78
+ {
79
+ identifier: 'hl7.fhir.us.core_3.1.1',
80
+ title: 'US Core Implementation Guide v3.1.1',
81
+ actor: 'Server',
82
+ suite_options: {
83
+ us_core_version: CRDClientOptions::US_CORE_3
84
+ }
85
+ },
86
+ {
87
+ identifier: 'hl7.fhir.us.core_6.1.0',
88
+ title: 'US Core Implementation Guide v6.1.0',
89
+ actor: 'Server',
90
+ suite_options: {
91
+ us_core_version: CRDClientOptions::US_CORE_6
92
+ }
93
+ },
94
+ {
95
+ identifier: 'hl7.fhir.us.core_7.0.0',
96
+ title: 'US Core Implementation Guide v7.0.0',
97
+ actor: 'Server',
98
+ suite_options: {
99
+ us_core_version: CRDClientOptions::US_CORE_7
100
+ }
101
+ }
102
+ )
103
+
104
+ verifies_requirements 'cds-hooks_3.0.0-ballot@1', # use of json for everything verified across the whole suite
105
+ 'cds-hooks_3.0.0-ballot@15', # use of POST verified by suite endpoint setup
106
+ 'cds-hooks_3.0.0-ballot@208', # use of CORS endpoints defined in the suite
107
+ 'hl7.fhir.us.davinci-crd_2.2.1@impl-3' # suite verifies system interactions
108
+
109
+ CRD_MESSAGE_FILTERS = [
110
+ /\A\S+: \S+: URL value '.*' does not resolve/,
111
+ %r{This element is not allowed by the profile http://hl7\.org/fhir/tools/StructureDefinition/CDSHooksExtensions\|1\.1\.2},
112
+ /CDSHooksRequest.extension: Unrecognized property/,
113
+ /No definition could be found for URL value/
114
+ ].freeze
115
+
116
+ US_CORE_3_MESSAGE_FILTERS = CRD_MESSAGE_FILTERS +
117
+ USCoreTestKit::USCoreV311::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
118
+
119
+ US_CORE_6_MESSAGE_FILTERS = CRD_MESSAGE_FILTERS +
120
+ USCoreTestKit::USCoreV610::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
121
+
122
+ US_CORE_7_MESSAGE_FILTERS = CRD_MESSAGE_FILTERS +
123
+ USCoreTestKit::USCoreV700::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
124
+
125
+ fhir_resource_validator required_suite_options: { us_core_version: CRDClientOptions::US_CORE_3 } do
126
+ igs('hl7.fhir.us.davinci-crd#2.2.1')
127
+
128
+ validation_context do
129
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
130
+ end
131
+
132
+ exclude_message do |message|
133
+ US_CORE_3_MESSAGE_FILTERS.any? { |match_template| message.message.match?(match_template) }
134
+ end
135
+ end
136
+
137
+ fhir_resource_validator required_suite_options: { us_core_version: CRDClientOptions::US_CORE_6 } do
138
+ igs('hl7.fhir.us.davinci-crd#2.2.1')
139
+
140
+ validation_context do
141
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
142
+ end
143
+
144
+ exclude_message do |message|
145
+ US_CORE_6_MESSAGE_FILTERS.any? do |match_template|
146
+ message.message.match?(match_template)
147
+ end
148
+ end
149
+ end
150
+
151
+ fhir_resource_validator required_suite_options: { us_core_version: CRDClientOptions::US_CORE_7 } do
152
+ igs('hl7.fhir.us.davinci-crd#2.2.1')
153
+
154
+ validation_context do
155
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
156
+ end
157
+
158
+ exclude_message do |message|
159
+ US_CORE_7_MESSAGE_FILTERS.any? do |match_template|
160
+ message.message.match?(match_template)
161
+ end
162
+ end
163
+ end
164
+
165
+ suite_option :us_core_version,
166
+ title: 'US Core Version',
167
+ list_options: [
168
+ {
169
+ label: 'US Core 3.1.1',
170
+ value: CRDClientOptions::US_CORE_3
171
+ },
172
+ {
173
+ label: 'US Core 6.1.0',
174
+ value: CRDClientOptions::US_CORE_6
175
+ },
176
+ {
177
+ label: 'US Core 7.0.0',
178
+ value: CRDClientOptions::US_CORE_7
179
+ }
180
+ ]
181
+
182
+ def self.extract_token_from_query_params(request)
183
+ request.query_parameters['token']
184
+ end
185
+
186
+ route :get, DISCOVERY_PATH, CDSServicesDiscoveryHandler
187
+ route :get, PREFETCH_DISCOVERY_PATH, CDSServicesDiscoveryHandler
188
+
189
+ allow_cors APPOINTMENT_BOOK_PATH, ENCOUNTER_START_PATH, ENCOUNTER_DISCHARGE_PATH, ORDER_DISPATCH_PATH,
190
+ ORDER_SELECT_PATH, ORDER_SIGN_PATH, DISCOVERY_PATH
191
+ suite_endpoint :post, APPOINTMENT_BOOK_PATH, HookRequestEndpoint
192
+ suite_endpoint :post, ENCOUNTER_START_PATH, HookRequestEndpoint
193
+ suite_endpoint :post, ENCOUNTER_DISCHARGE_PATH, HookRequestEndpoint
194
+ suite_endpoint :post, ORDER_DISPATCH_PATH, HookRequestEndpoint
195
+ suite_endpoint :post, ORDER_SELECT_PATH, HookRequestEndpoint
196
+ suite_endpoint :post, ORDER_SIGN_PATH, HookRequestEndpoint
197
+
198
+ allow_cors APPOINTMENT_BOOK_PREFETCH_SUBSET_PATH, ENCOUNTER_START_PREFETCH_SUBSET_PATH,
199
+ ENCOUNTER_DISCHARGE_PREFETCH_SUBSET_PATH, ORDER_DISPATCH_PREFETCH_SUBSET_PATH,
200
+ ORDER_SELECT_PREFETCH_SUBSET_PATH, ORDER_SIGN_PREFETCH_SUBSET_PATH,
201
+ PREFETCH_DISCOVERY_PATH
202
+ suite_endpoint :post, APPOINTMENT_BOOK_PREFETCH_SUBSET_PATH, HookRequestEndpoint
203
+ suite_endpoint :post, ENCOUNTER_START_PREFETCH_SUBSET_PATH, HookRequestEndpoint
204
+ suite_endpoint :post, ENCOUNTER_DISCHARGE_PREFETCH_SUBSET_PATH, HookRequestEndpoint
205
+ suite_endpoint :post, ORDER_DISPATCH_PREFETCH_SUBSET_PATH, HookRequestEndpoint
206
+ suite_endpoint :post, ORDER_SELECT_PREFETCH_SUBSET_PATH, HookRequestEndpoint
207
+ suite_endpoint :post, ORDER_SIGN_PREFETCH_SUBSET_PATH, HookRequestEndpoint
208
+
209
+ resume_test_route :get, RESUME_PASS_PATH do |request|
210
+ CRDClientSuite.extract_token_from_query_params(request)
211
+ end
212
+ resume_test_route :get, RESUME_FAIL_PATH, result: 'fail' do |request|
213
+ CRDClientSuite.extract_token_from_query_params(request)
214
+ end
215
+
216
+ group do
217
+ id :crd_v221_client_hook_invocation
218
+ title 'Hook Invocation'
219
+
220
+ group from: :crd_v221_client_registration
221
+ group from: :crd_v221_client_hooks
222
+ group from: :crd_v221_client_cross_hook
223
+ group from: :crd_v221_client_long_running_hook
224
+ end
225
+
226
+ group from: :crd_v221_client_fhir_api
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,63 @@
1
+ require_relative '../../../cross_suite/cards_identification'
2
+ require_relative '../../tagged_request_load_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ClientCardMustSupportCoverageInformationTest < Inferno::Test
7
+ include CardsIdentification
8
+ include TaggedRequestLoadHelper
9
+
10
+ title 'Client supports the Coverage Information response type'
11
+ id :crd_v221_client_card_must_support_coverage_information
12
+ description <<~DESCRIPTION
13
+ During this test, Inferno will verify that the client demonstrated support for the [Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information)
14
+ response type for this hook. At least one hook invocation received during this group must have returned a Coverage Information action.
15
+ Additionally, all [coverage-information extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/StructureDefinition-ext-coverage-information.html)
16
+ must support elements must be demonstrated across all the returned actions.
17
+
18
+ If this test fails, adjust the [cards returned by Inferno's simulated CRD server](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses)
19
+ and/or the hook requests made by the client during the Hooks tests such that Coverage Information actions are returned
20
+ that cover the full scope of the [coverage-information extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/StructureDefinition-ext-coverage-information.html)
21
+ and support for them is demonstrated.
22
+ DESCRIPTION
23
+
24
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-14'
25
+
26
+ def metadata
27
+ @metadata ||= YAML.load_file(
28
+ File.join(__dir__, '..', '..', '..', 'cross_suite', 'coverage-information_stu221_metadata.yml')
29
+ )
30
+ end
31
+
32
+ class MustSupportMetadataHolder
33
+ attr_accessor :metadata
34
+
35
+ def initialize(metadata)
36
+ self.metadata = metadata
37
+ end
38
+
39
+ def must_supports
40
+ @must_supports ||= {
41
+ extensions: metadata[:must_supports][:extensions] || [],
42
+ slices: metadata[:must_supports][:slices] || [],
43
+ elements: metadata[:must_supports][:elements] || []
44
+ }
45
+ end
46
+ end
47
+
48
+ run do
49
+ loaded_requests = requests_to_analyze
50
+ skip_if loaded_requests.blank?, 'No hook requests received.'
51
+
52
+ sorted_cards = sorted_cards_from_requests(loaded_requests)
53
+
54
+ assert sorted_cards['actions'][COVERAGE_INFORMATION_RESPONSE_TYPE].present?,
55
+ 'Support for the Coverage Information response type not demonstrated.'
56
+
57
+ coverage_information_extensions = extract_coverage_information_extensions(sorted_cards)
58
+ assert_must_support_elements_present(coverage_information_extensions, COVERAGE_INFO_EXT_URL,
59
+ metadata: MustSupportMetadataHolder.new(metadata))
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,60 @@
1
+ module DaVinciCRDTestKit
2
+ module V221
3
+ class ClientFHIRPathCollectionAsCommaDelimitedStringTest < Inferno::Test
4
+ title 'Client correctly interprets collections when substituting FHIRPath results in prefetch templates'
5
+ id :crd_v221_client_fhir_path_collection_as_comma_delimited_string
6
+ description <<~DESCRIPTION
7
+ The CDS Hooks specification requires that when a FHIRPath token in A
8
+ prefetch template resolves to a collection of datatypes (e.g., resource ids),
9
+ then the collection gets turned into a comma-delimited string when instantiating
10
+ the prefetch template.
11
+
12
+ During this test, Inferno will verify that during a previously-run hook test,
13
+ there was at least one instance of a prefetch template that has a
14
+ token which Inferno expects to result in a collection with multiple unique members.
15
+ Note that this does not test whether the client correctly
16
+ handles the collection, which is checked by the
17
+ "Hook requests include the requested prefetch data" test.
18
+
19
+ This test relies on the evaluation performed by the "Hook requests include the
20
+ requested prefetch data" test present in each hook-specific "Requests" group. One of these groups
21
+ must have been run and resulted in a "Hook requests include the requested prefetch data"
22
+ test that outputs "demonstrates_fhirpath_collection_as_comma_delimited_string" as true.
23
+ DESCRIPTION
24
+
25
+ verifies_requirements 'cds-hooks_3.0.0-ballot@239', 'cds-hooks_3.0.0-ballot@242'
26
+
27
+ run do
28
+ completeness_tests = find_completeness_tests
29
+ pass_if completeness_tests_demonstrate_collection_token_substitution?(completeness_tests)
30
+
31
+ skip 'No prefetch template requiring FHIRPath collection token substitution demonstrated. ' \
32
+ 'Perform more complex hook requests and re-run.'
33
+ end
34
+
35
+ def find_completeness_tests
36
+ hooks_group = self.class.parent.parent.groups.find do |group|
37
+ group.id.to_s.include?('crd_v221_client_hooks')
38
+ end
39
+ hooks_group.groups.map do |group|
40
+ group.groups.flat_map(&:tests).find do |test|
41
+ test.id.to_s.include?('crd_v221_hook_request_prefetch_complete')
42
+ end
43
+ end.compact
44
+ end
45
+
46
+ def completeness_tests_demonstrate_collection_token_substitution?(prefetch_completeness_tests)
47
+ results_repo = Inferno::Repositories::Results.new
48
+ results = results_repo.current_results_for_test_session_and_runnables(test_session_id,
49
+ prefetch_completeness_tests)
50
+
51
+ results.any? do |result|
52
+ result.outputs.any? do |output|
53
+ output['name'] == 'demonstrates_fhirpath_collection_as_comma_delimited_string' &&
54
+ output['value'] == 'true'
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,45 @@
1
+ require_relative '../../tagged_request_load_helper'
2
+ require_relative '../../multi_request_message_helper'
3
+ require_relative '../../../cross_suite/tags'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class ClientHookInstancesUniqueTest < Inferno::Test
8
+ include TaggedRequestLoadHelper
9
+ include MultiRequestMessageHelper
10
+
11
+ title 'Client does not reuse hookInstance values'
12
+ id :crd_v221_client_hook_instances_unique
13
+ description <<~DESCRIPTION
14
+ The CDS Hooks specification requires that the `hookInstance` field of each hook
15
+ request be globally unique so that it can be used for tracking
16
+ and auditing.
17
+
18
+ During this test, Inferno will check that across all hook invocations performed during these
19
+ tests, the `hookInstance` field was never reused.
20
+ DESCRIPTION
21
+
22
+ verifies_requirements 'cds-hooks_3.0.0-ballot@25'
23
+
24
+ config(
25
+ options: {
26
+ crd_test_group: DUPLICATED_HOOK_INSTANCE_TAG
27
+ }
28
+ )
29
+
30
+ run do
31
+ duplicated_hook_instance_requests = load_hook_requests
32
+ reused_values = duplicated_hook_instance_requests.map.with_index do |request, request_index|
33
+ request_body = parse_json_request_entity(request.request_body, 'Request body', request_index)
34
+ next nil unless request_body.present?
35
+
36
+ request_body['hookInstance']
37
+ end.compact.uniq
38
+ reused_values.each { |hook_instance| load_tagged_requests(TagMethods.hook_instance_tag(hook_instance)) }
39
+
40
+ assert duplicated_hook_instance_requests.blank?,
41
+ "Inferno received hook requests that re-used `hookInstance` values: #{reused_values.join(', ')}"
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,135 @@
1
+ require_relative '../../../cross_suite/tags'
2
+ require_relative '../../tagged_request_load_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ClientLocationAddressPropagationTest < Inferno::Test
7
+ include TaggedRequestLoadHelper
8
+
9
+ title 'Client propagates addresses to child Location resources'
10
+ id :crd_v221_client_location_address_propagation
11
+ description <<~DESCRIPTION
12
+ The CRD IG requires that ([prof-13](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/StructureDefinition-profile-location.html#ci-c-prof-13))
13
+ > If a Location is a fine-grained location such as a bed or room,
14
+ > the address SHALL be propagated from the higher-level location it is part of.
15
+
16
+ During this test, Inferno will verify that for all locations provided as a prefetched resource
17
+ and their parents (via the `partOf` element), if the Location has a parent Location (`partOf`) and
18
+ that parent Location's `address` element is populated, then the child Location's `address` element
19
+ must also be populated. The test will not verify the details of the address because Inferno cannot
20
+ easily determine whether a particular location is "fine-grained" so as to need the same address.
21
+ By requiring just population, this check allows for refinement of the address in the child
22
+ in addition to straight propagation.
23
+ DESCRIPTION
24
+
25
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@prof-13'
26
+
27
+ run do
28
+ skip_if loaded_requests.blank?, 'No hook requests received.'
29
+ pass_if prefetched_location_hash.blank?, 'No Location resources in use, so verification not needed.'
30
+
31
+ prefetched_location_hash.each_value do |location|
32
+ check_location_address_propagation(location)
33
+ end
34
+
35
+ assert_no_error_messages('Address propagation issues found. See Messages for details.')
36
+ end
37
+
38
+ # checks that the location has an address if a parent also has an address
39
+ def check_location_address_propagation(location, root_id = location.id)
40
+ return if location.address.present?
41
+ return unless location.partOf.present? && location.partOf.reference.present?
42
+
43
+ parent = prefetched_location_hash[location.partOf.reference]
44
+ parent = fetched_location_hash[location.partOf.reference] unless parent.present?
45
+ if parent.present?
46
+ check_location_conformance(parent, root_id)
47
+ if parent.address.present?
48
+ add_message('error', "Address missing on prefetched 'Location/#{root_id}': " \
49
+ "parent 'Location/#{parent.id}' has an address.")
50
+ else
51
+ check_location_address_propagation(parent, root_id)
52
+ end
53
+ else
54
+ add_message('error', "Unable to check address propagation prefetched 'Location/#{root_id}': " \
55
+ "`partOf` reference '#{location.partOf.reference}' could not be fetched.")
56
+ end
57
+
58
+ nil
59
+ end
60
+
61
+ # skip profile check if in the prefetch hash (done elsewhere) or already checked
62
+ def check_location_conformance(location, root_id)
63
+ key = "Location/#{location.id}"
64
+ return if prefetched_location_hash.key?(key) || fetched_locations_checked_for_conformance.key?(key)
65
+
66
+ fetched_locations_checked_for_conformance[key] = location
67
+ validator_response_details = []
68
+ return if resource_is_valid?(resource: location, profile_url: 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-location|2.2.1',
69
+ add_messages_to_runnable: false, validator_response_details:)
70
+
71
+ message_prefix = "Parent of prefetched 'Location/#{root_id}'"
72
+ add_message('error', "Location/#{location.id}: #{message_prefix} does not conform to the CRD Location profile.")
73
+ validator_response_details.each { |issue| add_message(issue.severity, "(#{message_prefix}) #{issue.message}") }
74
+ end
75
+
76
+ def fetched_locations_checked_for_conformance
77
+ @fetched_locations_checked_for_conformance ||= {}
78
+ end
79
+
80
+ def loaded_requests
81
+ @loaded_requests ||= requests_to_analyze
82
+ end
83
+
84
+ def prefetched_location_hash
85
+ @prefetched_location_hash ||= build_prefetched_locations_hash
86
+ end
87
+
88
+ def build_prefetched_locations_hash
89
+ loaded_requests.each_with_object({}) do |request, location_hash|
90
+ request_body = JSON.parse(request.request_body)
91
+ next unless request_body.is_a?(Hash)
92
+
93
+ prefetched_location_bundle = extract_prefetched_location_bundle(request_body)
94
+ next unless prefetched_location_bundle.present?
95
+
96
+ prefetched_location_bundle.entry.each do |entry|
97
+ add_location_to_hash(entry.resource, location_hash)
98
+ end
99
+ rescue JSON::ParserError
100
+ next
101
+ end
102
+ end
103
+
104
+ def extract_prefetched_location_bundle(request_body)
105
+ locations_data = request_body.dig('prefetch', 'locations') || request_body.dig('prefetch', 'locs')
106
+ locations = FHIR.from_contents(locations_data.to_json) if locations_data.present?
107
+ return locations if locations.is_a?(FHIR::Bundle)
108
+ return nil unless locations.is_a?(FHIR::Location)
109
+
110
+ FHIR::Bundle.new({ entry: [FHIR::Bundle::Entry.new({ resource: locations })] })
111
+ end
112
+
113
+ def fetched_location_hash
114
+ @fetched_location_hash ||= build_fetched_locations_hash
115
+ end
116
+
117
+ def build_fetched_locations_hash
118
+ load_tagged_requests(PARENT_LOCATION_FETCH_TAG, DATA_FETCH_TAG).each_with_object({}) do |request, location_hash|
119
+ add_location_to_hash(FHIR.from_contents(request.response_body), location_hash)
120
+ rescue JSON::ParserError
121
+ next
122
+ end
123
+ end
124
+
125
+ def add_location_to_hash(location, location_hash)
126
+ return unless location.is_a?(FHIR::Location) && location.id.present?
127
+
128
+ relative_reference = "#{location.resourceType}/#{location.id}"
129
+ return if location_hash.key?(relative_reference)
130
+
131
+ location_hash[relative_reference] = location
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,103 @@
1
+ require_relative '../../tagged_request_load_helper'
2
+ require_relative '../client_urls'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ClientPrefetchCompleteAndSubsetTest < Inferno::Test
7
+ include TaggedRequestLoadHelper
8
+
9
+ title 'Client can provide both the complete standard prefetch data set and a subset'
10
+ id :crd_v221_client_prefetch_complete_and_subset
11
+ description <<~DESCRIPTION
12
+ The CRD IG requires clients to be able to prefetch a standard set of resources that
13
+ payers are expected to need to evaluate coverage requirements. They are also
14
+ required to be able to prefetch a subset of these standard prefetch requirements
15
+ if a payer requests fewer in their service discovery responses because the payer
16
+ does not always need the complete set of standard prefetch resources to evaluate
17
+ coverage.
18
+
19
+ During this test, Inferno will verify that the client has demonstrated requests
20
+ - made against both of Inferno's simulated CRD servers,
21
+ one of which requests the all standard prefetch resources while the
22
+ other requests only a subset.
23
+ - which demonstrate the capability to distinguish the difference between
24
+ the two prefetch sets.
25
+
26
+ The CRD server that requests only a subset of the standard prefetch data does not request
27
+ resources referenced from the following elements. Request made to each Inferno service
28
+ endpoint with one of these elements populated with a reference to a resource not referenced
29
+ elsewhere will demonstrate the required capability.
30
+ - On an `appointment-book` hook request, an Appointment with a participant entry that
31
+ references a Practitioner or PractitionerRole resource in its actor element
32
+ - On an `encounter-start` or `encounter-discharge` hook request, an Encounter with a
33
+ referenced Location via the `location` element or referenced Organization via the
34
+ `serviceProvider` element.
35
+ - On an `order-select`, `order-sign`, or `order-dispatch` hook request, one of the following order resources:
36
+ - A CommunicationRequest, DeviceRequest, MedicationRequest, or ServiceRequest that references a Practitioner or PractitionerRole resource in its `requester` element, or
37
+ - A NutritionOrder that references a Practitioner or PractitionerRole resource in its `orderer` element
38
+ - A VisionPrescription that references a Practitioner or PractitionerRole resource in its `prescriber` element
39
+
40
+ This test relies on the evaluation performed by the "Hook requests include the
41
+ requested prefetch data" tests present in each hook-specific "Requests" group. One of these groups must
42
+ have been run and resulted in a "Hook requests include the
43
+ requested prefetch data" test that outputs
44
+ "demonstrates_prefetch_subset_distinct_from_complete" and
45
+ "demonstrates_prefetch_complete_distinct_from_subset" as true (does not have to be the
46
+ same test).
47
+ DESCRIPTION
48
+
49
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@found-25-A', 'hl7.fhir.us.davinci-crd_2.2.1@found-25-B'
50
+
51
+ run do
52
+ subset_prefetch_requests, complete_prefetch_requests =
53
+ requests_to_analyze.partition { |request| request.url.include?(PREFETCH_SUBSET_PREFIX) }
54
+ completeness_tests = find_completeness_tests
55
+ check_for_demonstration(subset_prefetch_requests, completeness_tests, :subset)
56
+ check_for_demonstration(complete_prefetch_requests, completeness_tests, :complete)
57
+
58
+ skip_if error_messages?,
59
+ 'The client did not demonstrate both complete and subset prefetch capability. See Messages for details.'
60
+ end
61
+
62
+ def find_completeness_tests
63
+ hooks_group = self.class.parent.parent.groups.find do |group|
64
+ group.id.to_s.include?('crd_v221_client_hooks')
65
+ end
66
+ hooks_group.groups.map do |group|
67
+ group.groups.flat_map(&:tests).find do |test|
68
+ test.id.to_s.include?('crd_v221_hook_request_prefetch_complete')
69
+ end
70
+ end.compact
71
+ end
72
+
73
+ def check_for_demonstration(requests, completeness_tests, target_name)
74
+ unless requests.present?
75
+ add_message('error', "No requests made to the service endpoint requesting #{target_name} prefetch data.")
76
+ return
77
+ end
78
+
79
+ results_repo = Inferno::Repositories::Results.new
80
+ results = results_repo.current_results_for_test_session_and_runnables(test_session_id,
81
+ completeness_tests)
82
+ output_name =
83
+ if target_name == :subset
84
+ 'demonstrates_prefetch_subset_distinct_from_complete'
85
+ else
86
+ 'demonstrates_prefetch_complete_distinct_from_subset'
87
+ end
88
+
89
+ demonstrated = results.any? do |result|
90
+ result.outputs.any? do |output|
91
+ output['name'] == output_name &&
92
+ output['value'] == 'true'
93
+ end
94
+ end
95
+
96
+ return if demonstrated
97
+
98
+ add_message('error', "Requests made to the service endpoint requesting #{target_name} prefetch data " \
99
+ 'did not demonstrate a difference between the two levels of prefetch data.')
100
+ end
101
+ end
102
+ end
103
+ end