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,234 @@
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
+ These tests are a **DRAFT** intended to allow CRD implementers to perform
27
+ preliminary checks of their implementations against the CRD IG requirements and
28
+ [provide feedback](https://github.com/inferno-framework/davinci-crd-test-kit/issues) on the tests.
29
+ Future versions of these tests may validate other requirements and may change how these are tested.
30
+
31
+ Detailed information about this test suite can be found in the
32
+ [client section](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details) of the
33
+ [CRD Test Kit Wiki](https://github.com/inferno-framework/davinci-crd-test-kit/wiki), including:
34
+ - [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),
35
+ - [Minimal](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Instructions-v2.2.1#quick-start)
36
+ and [complete](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Instructions-v2.2.1#additional-testing-options)
37
+ instructions for executing against a client system, and
38
+ - How to [interpret test results](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Instructions-v2.2.1#interpreting-results).
39
+ DESCRIPTION
40
+
41
+ suite_summary <<~SUMMARY
42
+ The Da Vinci CRD Client v2.2.1 Test Suite tests the conformance of client systems
43
+ to [version 2.2.1 of the Da Vinci Coverage Requirements Discovery (CRD)
44
+ Implementation Guide](https://hl7.org/fhir/us/davinci-crd/2.2.1).
45
+ SUMMARY
46
+
47
+ links [
48
+ {
49
+ label: 'Implementation Guide',
50
+ url: 'https://hl7.org/fhir/us/davinci-crd/2.2.1'
51
+ },
52
+ {
53
+ label: 'Report Issue',
54
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit/issues'
55
+ },
56
+ {
57
+ label: 'Open Source',
58
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit'
59
+ },
60
+ {
61
+ label: 'Download',
62
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit/releases'
63
+ }
64
+ ]
65
+
66
+ requirement_sets(
67
+ {
68
+ identifier: 'hl7.fhir.us.davinci-crd_2.2.1',
69
+ title: 'Da Vinci Coverage Requirements Discovery (CRD) v2.2.1',
70
+ actor: 'CRD Client'
71
+ },
72
+ {
73
+ identifier: 'cds-hooks_3.0.0-ballot',
74
+ title: 'CDS Hooks 3.0.0-ballot',
75
+ actor: 'Client'
76
+ },
77
+ {
78
+ identifier: 'cds-hooks-library_1.0.1',
79
+ title: 'CDS Hooks Library',
80
+ actor: 'Client',
81
+ requirements: 'referenced'
82
+ },
83
+ {
84
+ identifier: 'hl7.fhir.us.core_3.1.1',
85
+ title: 'US Core Implementation Guide v3.1.1',
86
+ actor: 'Server',
87
+ suite_options: {
88
+ us_core_version: CRDClientOptions::US_CORE_3
89
+ }
90
+ },
91
+ {
92
+ identifier: 'hl7.fhir.us.core_6.1.0',
93
+ title: 'US Core Implementation Guide v6.1.0',
94
+ actor: 'Server',
95
+ suite_options: {
96
+ us_core_version: CRDClientOptions::US_CORE_6
97
+ }
98
+ },
99
+ {
100
+ identifier: 'hl7.fhir.us.core_7.0.0',
101
+ title: 'US Core Implementation Guide v7.0.0',
102
+ actor: 'Server',
103
+ suite_options: {
104
+ us_core_version: CRDClientOptions::US_CORE_7
105
+ }
106
+ }
107
+ )
108
+
109
+ verifies_requirements 'cds-hooks_3.0.0-ballot@1', # use of json for everything verified across the whole suite
110
+ 'cds-hooks_3.0.0-ballot@15', # use of POST verified by suite endpoint setup
111
+ 'cds-hooks_3.0.0-ballot@208', # use of CORS endpoints defined in the suite
112
+ 'hl7.fhir.us.davinci-crd_2.2.1@impl-3' # suite verifies system interactions
113
+
114
+ CRD_MESSAGE_FILTERS = [
115
+ /\A\S+: \S+: URL value '.*' does not resolve/,
116
+ %r{This element is not allowed by the profile http://hl7\.org/fhir/tools/StructureDefinition/CDSHooksExtensions\|1\.1\.2},
117
+ /CDSHooksRequest.extension: Unrecognized property/,
118
+ /No definition could be found for URL value/
119
+ ].freeze
120
+
121
+ US_CORE_3_MESSAGE_FILTERS = CRD_MESSAGE_FILTERS +
122
+ USCoreTestKit::USCoreV311::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
123
+
124
+ US_CORE_6_MESSAGE_FILTERS = CRD_MESSAGE_FILTERS +
125
+ USCoreTestKit::USCoreV610::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
126
+
127
+ US_CORE_7_MESSAGE_FILTERS = CRD_MESSAGE_FILTERS +
128
+ USCoreTestKit::USCoreV700::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
129
+
130
+ fhir_resource_validator required_suite_options: { us_core_version: CRDClientOptions::US_CORE_3 } do
131
+ igs('hl7.fhir.us.davinci-crd#2.2.1')
132
+
133
+ validation_context do
134
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
135
+ end
136
+
137
+ exclude_message do |message|
138
+ US_CORE_3_MESSAGE_FILTERS.any? { |match_template| message.message.match?(match_template) }
139
+ end
140
+ end
141
+
142
+ fhir_resource_validator required_suite_options: { us_core_version: CRDClientOptions::US_CORE_6 } do
143
+ igs('hl7.fhir.us.davinci-crd#2.2.1')
144
+
145
+ validation_context do
146
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
147
+ end
148
+
149
+ exclude_message do |message|
150
+ US_CORE_6_MESSAGE_FILTERS.any? do |match_template|
151
+ message.message.match?(match_template)
152
+ end
153
+ end
154
+ end
155
+
156
+ fhir_resource_validator required_suite_options: { us_core_version: CRDClientOptions::US_CORE_7 } do
157
+ igs('hl7.fhir.us.davinci-crd#2.2.1')
158
+
159
+ validation_context do
160
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
161
+ end
162
+
163
+ exclude_message do |message|
164
+ US_CORE_7_MESSAGE_FILTERS.any? do |match_template|
165
+ message.message.match?(match_template)
166
+ end
167
+ end
168
+ end
169
+
170
+ suite_option :us_core_version,
171
+ title: 'US Core Version',
172
+ list_options: [
173
+ {
174
+ label: 'US Core 3.1.1',
175
+ value: CRDClientOptions::US_CORE_3
176
+ },
177
+ {
178
+ label: 'US Core 6.1.0',
179
+ value: CRDClientOptions::US_CORE_6
180
+ },
181
+ {
182
+ label: 'US Core 7.0.0',
183
+ value: CRDClientOptions::US_CORE_7
184
+ }
185
+ ]
186
+
187
+ def self.extract_token_from_query_params(request)
188
+ request.query_parameters['token']
189
+ end
190
+
191
+ route :get, DISCOVERY_PATH, CDSServicesDiscoveryHandler
192
+ route :get, PREFETCH_DISCOVERY_PATH, CDSServicesDiscoveryHandler
193
+
194
+ allow_cors APPOINTMENT_BOOK_PATH, ENCOUNTER_START_PATH, ENCOUNTER_DISCHARGE_PATH, ORDER_DISPATCH_PATH,
195
+ ORDER_SELECT_PATH, ORDER_SIGN_PATH, DISCOVERY_PATH
196
+ suite_endpoint :post, APPOINTMENT_BOOK_PATH, HookRequestEndpoint
197
+ suite_endpoint :post, ENCOUNTER_START_PATH, HookRequestEndpoint
198
+ suite_endpoint :post, ENCOUNTER_DISCHARGE_PATH, HookRequestEndpoint
199
+ suite_endpoint :post, ORDER_DISPATCH_PATH, HookRequestEndpoint
200
+ suite_endpoint :post, ORDER_SELECT_PATH, HookRequestEndpoint
201
+ suite_endpoint :post, ORDER_SIGN_PATH, HookRequestEndpoint
202
+
203
+ allow_cors APPOINTMENT_BOOK_PREFETCH_SUBSET_PATH, ENCOUNTER_START_PREFETCH_SUBSET_PATH,
204
+ ENCOUNTER_DISCHARGE_PREFETCH_SUBSET_PATH, ORDER_DISPATCH_PREFETCH_SUBSET_PATH,
205
+ ORDER_SELECT_PREFETCH_SUBSET_PATH, ORDER_SIGN_PREFETCH_SUBSET_PATH,
206
+ PREFETCH_DISCOVERY_PATH
207
+ suite_endpoint :post, APPOINTMENT_BOOK_PREFETCH_SUBSET_PATH, HookRequestEndpoint
208
+ suite_endpoint :post, ENCOUNTER_START_PREFETCH_SUBSET_PATH, HookRequestEndpoint
209
+ suite_endpoint :post, ENCOUNTER_DISCHARGE_PREFETCH_SUBSET_PATH, HookRequestEndpoint
210
+ suite_endpoint :post, ORDER_DISPATCH_PREFETCH_SUBSET_PATH, HookRequestEndpoint
211
+ suite_endpoint :post, ORDER_SELECT_PREFETCH_SUBSET_PATH, HookRequestEndpoint
212
+ suite_endpoint :post, ORDER_SIGN_PREFETCH_SUBSET_PATH, HookRequestEndpoint
213
+
214
+ resume_test_route :get, RESUME_PASS_PATH do |request|
215
+ CRDClientSuite.extract_token_from_query_params(request)
216
+ end
217
+ resume_test_route :get, RESUME_FAIL_PATH, result: 'fail' do |request|
218
+ CRDClientSuite.extract_token_from_query_params(request)
219
+ end
220
+
221
+ group do
222
+ id :crd_v221_client_hook_invocation
223
+ title 'Hook Invocation'
224
+
225
+ group from: :crd_v221_client_registration
226
+ group from: :crd_v221_client_hooks
227
+ group from: :crd_v221_client_cross_hook
228
+ group from: :crd_v221_client_long_running_hook
229
+ end
230
+
231
+ group from: :crd_v221_client_fhir_api
232
+ end
233
+ end
234
+ 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