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,136 @@
1
+ require_relative '../client_urls'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class OrderSignReceiveRequestTest < Inferno::Test
6
+ include ClientURLs
7
+
8
+ id :crd_v201_order_sign_request
9
+ title 'Request received for order-sign hook'
10
+ description %(
11
+ This test waits for multiple incoming [order-sign](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
12
+ hook requests and responds to the client with the response types selected as an input. This hook is a 'primary'
13
+ hook, meaning that CRD servers SHALL, at minimum, return a [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-ext-coverage-information.html)
14
+ system action for these hooks, even if the response indicates that further information is needed or that the
15
+ level of detail provided is insufficient to determine coverage.
16
+
17
+ For more details on how Inferno's simulated CDS Service behave during hook invocation see the
18
+ [simulated CRD server](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details#crd-server-simulation)
19
+ documentation.
20
+ )
21
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@218', 'hl7.fhir.us.davinci-crd_2.0.1@225',
22
+ 'hl7.fhir.us.davinci-crd_2.0.1@243', 'hl7.fhir.us.davinci-crd_2.0.1@244',
23
+ 'hl7.fhir.us.davinci-crd_2.0.1@245', 'cds-hooks_2.0@15'
24
+
25
+ config options: { accepts_multiple_requests: true }
26
+
27
+ input :cds_jwt_iss,
28
+ title: 'CRD JWT Issuer',
29
+ description: %(
30
+ Value of the `iss` claim that must be sent on the Bearer token in the `Authorization`
31
+ header of all requests. Run or re-run the **Client Registration** group to set or
32
+ change this value.
33
+ ),
34
+ locked: true
35
+ input :order_sign_response_approach,
36
+ title: 'Response generation approach for order-sign',
37
+ description: %(
38
+ Determines how Inferno will generate response for order-sign
39
+ hook invocations.
40
+ ),
41
+ type: 'radio',
42
+ default: 'mocked',
43
+ options: {
44
+ list_options: [
45
+ {
46
+ label: 'Create simple mocks based on selected response types',
47
+ value: 'mocked'
48
+ },
49
+ {
50
+ label: 'Generate responses based on a tester-provided template',
51
+ value: 'custom'
52
+ }
53
+ ]
54
+ }
55
+ input :order_sign_selected_response_types,
56
+ title: 'Response types to return from order-sign hook requests',
57
+ description: %(
58
+ Select the CRD response types that the simulated Inferno CRD server will [mock](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#mocked-responses)
59
+ when responding to hook invocations. If no types are selected, Inferno will mock and return
60
+ a [Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
61
+ response for this primary hook.
62
+ ),
63
+ type: 'checkbox',
64
+ default: ['coverage_information', 'external_reference', 'instructions'],
65
+ optional: true,
66
+ options: {
67
+ list_options: [
68
+ {
69
+ label: 'External Reference',
70
+ value: 'external_reference'
71
+ },
72
+ {
73
+ label: 'Instructions',
74
+ value: 'instructions'
75
+ },
76
+ {
77
+ label: 'Coverage Information',
78
+ value: 'coverage_information'
79
+ },
80
+ {
81
+ label: 'Request Form Completion',
82
+ value: 'request_form_completion'
83
+ },
84
+ {
85
+ label: 'Create/Update Coverage Information',
86
+ value: 'create_update_coverage_info'
87
+ },
88
+ {
89
+ label: 'Launch SMART Application',
90
+ value: 'launch_smart_app'
91
+ },
92
+ {
93
+ label: 'Propose Alternate Request',
94
+ value: 'propose_alternate_request'
95
+ },
96
+ {
97
+ label: 'Additional Orders as Companions/Prerequisites',
98
+ value: 'companions_prerequisites'
99
+ }
100
+ ]
101
+ },
102
+ enable_when: { input_name: 'order_sign_response_approach', value: 'mocked' }
103
+ input :order_sign_custom_response_template,
104
+ title: 'Custom response template for order-sign hook requests',
105
+ description: %(
106
+ Provide a [custom response template](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#tester-directed-custom-responses)
107
+ in JSON form for Inferno to use when responding to hook invocations.
108
+ ),
109
+ type: 'textarea',
110
+ optional: true,
111
+ enable_when: { input_name: 'order_sign_response_approach', value: 'custom' }
112
+ output :continuation_url
113
+
114
+ run do
115
+ identifier = cds_jwt_iss
116
+ continuation_url = "#{resume_pass_url}?token=#{identifier}"
117
+ output(continuation_url:)
118
+
119
+ wait(
120
+ identifier:,
121
+ message: %(
122
+ **Order Sign CDS Service Test**:
123
+
124
+ Invoke the order-sign hook and send requests to:
125
+
126
+ `#{order_sign_url}`
127
+
128
+ Inferno will process the requests and return CDS cards if successful.
129
+
130
+ [Click here](#{continuation_url}) when you have finished submitting requests.
131
+ )
132
+ )
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,93 @@
1
+ require_relative '../../../cross_suite/cards_identification'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class ClientCardMustSupportCoverageInformationTest < Inferno::Test
6
+ include CardsIdentification
7
+
8
+ title 'Coverage Information Action Support'
9
+ id :crd_v201_client_card_must_support_coverage_information
10
+ description <<~DESCRIPTION
11
+ Checks that the client demonstrated support for the [Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
12
+ action type. At least one hook invocation performed during this test session must have returned a Coverage Information action.
13
+ Additionally, all [coverage-information extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-ext-coverage-information.html)
14
+ must support elements must be demonstrated across all the returned actions.
15
+
16
+ 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)
17
+ and/or the hook requests made by the client during the Hooks tests such that Coverage Information actions are returned
18
+ that cover the full scope of the coverage-information extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-ext-coverage-information.html)
19
+ and support for them is demonstrated.
20
+ DESCRIPTION
21
+
22
+ ALL_HOOKS = [
23
+ APPOINTMENT_BOOK_TAG,
24
+ ENCOUNTER_START_TAG,
25
+ ENCOUNTER_DISCHARGE_TAG,
26
+ ORDER_DISPATCH_TAG,
27
+ ORDER_SELECT_TAG,
28
+ ORDER_SIGN_TAG
29
+ ].freeze
30
+
31
+ def metadata
32
+ @metadata ||= YAML.load_file(
33
+ File.join(__dir__, '..', '..', '..', 'cross_suite', 'coverage-information_stu201_metadata.yml')
34
+ )
35
+ end
36
+
37
+ def configured_hook_name
38
+ config.options[:hook_name]
39
+ end
40
+
41
+ def crd_test_group
42
+ config.options[:crd_test_group]
43
+ end
44
+
45
+ def tags_to_load(hook_name)
46
+ crd_test_group.present? ? [hook_name, crd_test_group] : [hook_name]
47
+ end
48
+
49
+ def requests_to_analyze
50
+ if configured_hook_name.present?
51
+ load_requests_for_tags(tags_to_load(configured_hook_name))
52
+ else
53
+ ALL_HOOKS.each_with_object([]) do |hook_name, request_list|
54
+ request_list.concat(load_requests_for_tags(tags_to_load(hook_name)))
55
+ end
56
+ end
57
+ end
58
+
59
+ def load_requests_for_tags(tags_to_load)
60
+ load_tagged_requests(*tags_to_load)
61
+ end
62
+
63
+ class MustSupportMetadataHolder
64
+ attr_accessor :metadata
65
+
66
+ def initialize(metadata)
67
+ self.metadata = metadata
68
+ end
69
+
70
+ def must_supports
71
+ @must_supports ||= {
72
+ extensions: metadata[:must_supports][:extensions] || [],
73
+ slices: metadata[:must_supports][:slices] || [],
74
+ elements: metadata[:must_supports][:elements] || []
75
+ }
76
+ end
77
+ end
78
+
79
+ run do
80
+ loaded_requests = requests_to_analyze
81
+
82
+ sorted_cards = sorted_cards_from_requests(loaded_requests)
83
+
84
+ assert sorted_cards['actions'][COVERAGE_INFORMATION_RESPONSE_TYPE].present?,
85
+ 'Coverage Information action support not demonstrated.'
86
+
87
+ coverage_information_extensions = extract_coverage_information_extensions(sorted_cards)
88
+ assert_must_support_elements_present(coverage_information_extensions, COVERAGE_INFO_EXT_URL,
89
+ metadata: MustSupportMetadataHolder.new(metadata))
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,62 @@
1
+ require_relative '../../../cross_suite/cards_identification'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class ClientCardMustSupportExternalReferenceTest < Inferno::Test
6
+ include CardsIdentification
7
+
8
+ title 'External Reference Card Support'
9
+ id :crd_v201_client_card_must_support_external_reference
10
+ description <<~DESCRIPTION
11
+ Checks that the client demonstrated support for the [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference)
12
+ card type. At least one hook invocation performed during this test session must have returned an External Reference card.
13
+
14
+ 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)
15
+ and/or the hook requests made by the client during the Hooks tests such that an External Reference card is returned and support for it is demonstrated.
16
+ DESCRIPTION
17
+
18
+ ALL_HOOKS = [
19
+ APPOINTMENT_BOOK_TAG,
20
+ ENCOUNTER_START_TAG,
21
+ ENCOUNTER_DISCHARGE_TAG,
22
+ ORDER_DISPATCH_TAG,
23
+ ORDER_SELECT_TAG,
24
+ ORDER_SIGN_TAG
25
+ ].freeze
26
+
27
+ def configured_hook_name
28
+ config.options[:hook_name]
29
+ end
30
+
31
+ def crd_test_group
32
+ config.options[:crd_test_group]
33
+ end
34
+
35
+ def tags_to_load(hook_name)
36
+ crd_test_group.present? ? [hook_name, crd_test_group] : [hook_name]
37
+ end
38
+
39
+ def requests_to_analyze
40
+ if configured_hook_name.present?
41
+ load_requests_for_tags(tags_to_load(configured_hook_name))
42
+ else
43
+ ALL_HOOKS.each_with_object([]) do |hook_name, request_list|
44
+ request_list.concat(load_requests_for_tags(tags_to_load(hook_name)))
45
+ end
46
+ end
47
+ end
48
+
49
+ def load_requests_for_tags(tags_to_load)
50
+ load_tagged_requests(*tags_to_load)
51
+ end
52
+
53
+ run do
54
+ loaded_requests = requests_to_analyze
55
+ sorted_cards = sorted_cards_from_requests(loaded_requests)
56
+
57
+ assert sorted_cards['cards'][EXTERNAL_REFERENCE_RESPONSE_TYPE].present?,
58
+ 'External Reference card support not demonstrated.'
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,62 @@
1
+ require_relative '../../../cross_suite/cards_identification'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class ClientCardMustSupportInstructionsTest < Inferno::Test
6
+ include CardsIdentification
7
+
8
+ title 'Instructions Card Support'
9
+ id :crd_v201_client_card_must_support_instructions
10
+ description <<~DESCRIPTION
11
+ Checks that the client demonstrated support for the [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference)
12
+ card type. At least one hook invocation performed during this test session must have returned an Instructions card.
13
+
14
+ 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)
15
+ and/or the hook requests made by the client during the Hooks tests such that an Instructions card is returned and support for it is demonstrated.
16
+ DESCRIPTION
17
+
18
+ ALL_HOOKS = [
19
+ APPOINTMENT_BOOK_TAG,
20
+ ENCOUNTER_START_TAG,
21
+ ENCOUNTER_DISCHARGE_TAG,
22
+ ORDER_DISPATCH_TAG,
23
+ ORDER_SELECT_TAG,
24
+ ORDER_SIGN_TAG
25
+ ].freeze
26
+
27
+ def configured_hook_name
28
+ config.options[:hook_name]
29
+ end
30
+
31
+ def crd_test_group
32
+ config.options[:crd_test_group]
33
+ end
34
+
35
+ def tags_to_load(hook_name)
36
+ crd_test_group.present? ? [hook_name, crd_test_group] : [hook_name]
37
+ end
38
+
39
+ def requests_to_analyze
40
+ if configured_hook_name.present?
41
+ load_requests_for_tags(tags_to_load(configured_hook_name))
42
+ else
43
+ ALL_HOOKS.each_with_object([]) do |hook_name, request_list|
44
+ request_list.concat(load_requests_for_tags(tags_to_load(hook_name)))
45
+ end
46
+ end
47
+ end
48
+
49
+ def load_requests_for_tags(tags_to_load)
50
+ load_tagged_requests(*tags_to_load)
51
+ end
52
+
53
+ run do
54
+ loaded_requests = requests_to_analyze
55
+ sorted_cards = sorted_cards_from_requests(loaded_requests)
56
+
57
+ assert sorted_cards['cards'][INSTRUCTIONS_RESPONSE_TYPE].present?,
58
+ 'Instructions card support not demonstrated.'
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,94 @@
1
+ require 'jwt'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class CRDClientRegistrationVerification < Inferno::Test
6
+ include ClientURLs
7
+
8
+ id :crd_v201_client_registration_verification
9
+ title 'Verify CRD Client Registration'
10
+ description %(
11
+ During this test, Inferno will verify that the CRD client registration details
12
+ provided are conformant.
13
+ )
14
+
15
+ verifies_requirements 'cds-hooks_2.0@174', 'cds-hooks_2.0@197'
16
+
17
+ input :cds_jwt_iss,
18
+ title: 'CRD JWT Issuer',
19
+ description: %(
20
+ The `iss` claim of the JWT in the Authorization header sent by the CRD client under test on
21
+ all CRD requests. This value will be used to associate incoming requests with this test
22
+ session and any requests that use a different `iss` value will not be recognized.
23
+ ),
24
+ type: 'text'
25
+ input :cds_jwk_set,
26
+ title: 'CRD JSON Web Key Set (JWKS)',
27
+ type: 'textarea',
28
+ description: %(
29
+ The CRD client's JWK Set containing it's public key. May be either
30
+ a publicly accessible url containing the JWKS, or the raw JWKS.
31
+ The client suite may be run without this input, but it is required
32
+ for the tests to pass.
33
+ ),
34
+ optional: true
35
+
36
+ run do
37
+ assert cds_jwk_set.present?, 'Provide a jwk set in the **CRD JSON Web Key Set (JWKS)** input.'
38
+
39
+ jwks_warnings = []
40
+ parsed_jwk_set = jwk_set(cds_jwk_set, jwks_warnings)
41
+ jwks_warnings.each { |warning| add_message('warning', warning) }
42
+
43
+ assert parsed_jwk_set.length.positive?, 'JWKS content does not include any valid keys.'
44
+
45
+ assert messages.none? { |msg| msg[:type] == 'error' }, 'Invalid key set provided. See Messages for details.'
46
+ end
47
+
48
+ def jwk_set(jku, warning_messages = []) # rubocop:disable Metrics/CyclomaticComplexity
49
+ jwk_set = JWT::JWK::Set.new
50
+
51
+ if jku.blank?
52
+ warning_messages << 'No key set input.'
53
+ return jwk_set
54
+ end
55
+
56
+ jwk_body = # try as raw jwk set
57
+ begin
58
+ JSON.parse(jku)
59
+ rescue JSON::ParserError
60
+ nil
61
+ end
62
+
63
+ if jwk_body.blank?
64
+ retrieved = Faraday.get(jku) # try as url pointing to a jwk set
65
+ jwk_body =
66
+ begin
67
+ JSON.parse(retrieved.body)
68
+ rescue JSON::ParserError
69
+ warning_messages << "Failed to fetch valid json from jwks uri #{jku}."
70
+ nil
71
+ end
72
+ else
73
+ warning_messages << 'Providing the JWK Set directly is strongly discouraged.'
74
+ end
75
+
76
+ return jwk_set if jwk_body.blank?
77
+
78
+ jwk_body['keys']&.each_with_index do |key_hash, index|
79
+ parsed_key =
80
+ begin
81
+ JWT::JWK.new(key_hash)
82
+ rescue JWT::JWKError => e
83
+ id = key_hash['kid'] | index
84
+ warning_messages << "Key #{id} invalid: #{e}"
85
+ nil
86
+ end
87
+ jwk_set << parsed_key unless parsed_key.blank?
88
+ end
89
+
90
+ jwk_set
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,40 @@
1
+ module DaVinciCRDTestKit
2
+ module V201
3
+ class CRDClientServiceRegistrationAttestation < Inferno::Test
4
+ include ClientURLs
5
+
6
+ id :crd_v201_client_service_registration_attestation
7
+ title 'Attest to the registration of the Inferno Service by the CRD client'
8
+ description %(
9
+ During this test, the tester will confirm that Inferno has been registered as a
10
+ trusted CRD server that can access the CRD client's FHIR Server.
11
+ )
12
+
13
+ verifies_requirements 'cds-hooks_2.0@174'
14
+
15
+ output :attest_true_url
16
+ output :attest_false_url
17
+
18
+ run do
19
+ identifier = SecureRandom.hex(32)
20
+ attest_true_url = "#{resume_pass_url}?token=#{identifier}"
21
+ attest_false_url = "#{resume_fail_url}?token=#{identifier}"
22
+ output(attest_true_url:)
23
+ output(attest_false_url:)
24
+ wait(
25
+ identifier:,
26
+ message: <<~MESSAGE
27
+ **Registration of Inferno as a trusted CRD server**:
28
+
29
+ I attest that Inferno has been registered as a trusted CRD server that is allowed to access
30
+ data stored on the CRD client's FHIR Server.
31
+
32
+ [Click here](#{attest_true_url}) if the above statement is **true**.
33
+
34
+ [Click here](#{attest_false_url}) if the above statement is **false**.
35
+ MESSAGE
36
+ )
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,86 @@
1
+ require_relative '../../../cross_suite/tags'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class HookRequestFetchedDataTest < Inferno::Test
6
+ id :crd_v201_hook_request_fetched_data
7
+ title 'Minimum resource dataset was accessible during the hook invocation'
8
+ description %(
9
+ Clients must make a set of data related to the request available to the CRD server via either prefetch
10
+ as a part of the hook invocation or via FHIR API during server processing of the hook call. According
11
+ to the IG, the minimal data set includes:
12
+ - Patient
13
+ - Relevant Coverage
14
+ - Authoring Practitioner
15
+ - Authoring Organization
16
+ - Requested performing Practitioner (if specified)
17
+ - Requested performing Organization (if specified)
18
+ - Requested Location (if specified)
19
+ - Associated Medication (if any)
20
+ - Associated Device (if any)
21
+
22
+ When it receives a hook invocation, Inferno analyzes the hook request to determine what resources it
23
+ needs access to and requests those that are not provided as a part of the prefetched data. All data
24
+ is requested via the read interaction except for Coverages which requires a search interaction.
25
+
26
+ This test checks that those requests were successful, demonstrating that the system can provide access
27
+ to this required information.
28
+
29
+ For more details on what Inferno's simulated CDS Service fetches during hook invocation and
30
+ how the client must respond to pass this test, see the
31
+ [Data Fetching During Hook Invocations](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details#data-fetching-during-hook-invocations)
32
+ documentation.
33
+ )
34
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@43', 'hl7.fhir.us.davinci-crd_2.0.1@323'
35
+
36
+ def hook_name
37
+ config.options[:hook_name]
38
+ end
39
+
40
+ def crd_test_group
41
+ config.options[:crd_test_group]
42
+ end
43
+
44
+ def tags_to_load
45
+ crd_test_group.present? ? [hook_name, crd_test_group] : [hook_name]
46
+ end
47
+
48
+ def no_error_validation(message)
49
+ assert messages.none? { |msg| msg[:type] == 'error' }, message
50
+ end
51
+
52
+ run do
53
+ hook_requests = load_tagged_requests(*tags_to_load)
54
+
55
+ hook_requests.each do |hook_request|
56
+ request_body = JSON.parse(hook_request.request_body)
57
+ hook_instance = request_body['hookInstance']
58
+
59
+ if request_body.dig('fhirAuthorization', 'access_token').blank?
60
+ add_message(:error, "Access token not provided for FHIR data access on hook instance `#{hook_instance}`.")
61
+ end
62
+
63
+ failed_data_fetches =
64
+ load_tagged_requests(TagMethods.hook_instance_data_fetch_tag(hook_instance)).reject do |fetch|
65
+ fetch.status.to_s.starts_with?('2')
66
+ end
67
+
68
+ next unless failed_data_fetches.present?
69
+
70
+ server = "#{request_body['fhirServer'].chomp('/')}/"
71
+ failed_data_fetches.each do |request|
72
+ reference = request.url.starts_with?(server) ? request.url[server.length..] : request.url
73
+ if reference.starts_with?('Coverage')
74
+ add_message(:error,
75
+ "Failed to perform Coverage search `#{reference}` for hook instance `#{hook_instance}`.")
76
+ else
77
+ add_message(:error, "Failed to read reference `#{reference}` for hook instance `#{hook_instance}`.")
78
+ end
79
+ end
80
+ end
81
+
82
+ no_error_validation('Inferno could not fetch some required data during the hook invocations.')
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,63 @@
1
+ require_relative '../../client_hook_request_validation'
2
+ require_relative '../client_urls'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V201
6
+ class HookRequestOptionalFieldsTest < Inferno::Test
7
+ include ClientHookRequestValidation
8
+ include ClientURLs
9
+
10
+ id :crd_v201_hook_request_optional_fields
11
+ title 'Hook request optional fields are valid'
12
+ description %(
13
+ Under the [CDS hooks HTTP Request section](https://cds-hooks.hl7.org/2.0/#http-request_1), the specification
14
+ requires that a CDS service request SHALL include a JSON POST body which MAY contain the following
15
+ optional input fields:
16
+ * `fhirServer` - *URL*
17
+ * `fhirAuthorization` - *object*
18
+ * `prefetch` - *object*
19
+
20
+ This test checks that the optional fields that are present are of the correct type. This test
21
+ will not fail if the hook request does not contain an optional field, it only produces an informational message.
22
+ If the client provides its FHIR server URL in the `fhirServer` field, and it's authorization token in the
23
+ `fhirAuthorization` field object, they will be produced as an output from this test to be used in
24
+ subsequent tests.
25
+ )
26
+
27
+ verifies_requirements 'cds-hooks_2.0@1', 'cds-hooks_2.0@3', 'cds-hooks_2.0@20', 'cds-hooks_2.0@21',
28
+ 'cds-hooks_2.0@23', 'cds-hooks_2.0@65', 'cds-hooks_2.0@66', 'cds-hooks_2.0@67',
29
+ 'cds-hooks_2.0@68', 'cds-hooks_2.0@69', 'cds-hooks_2.0@70'
30
+
31
+ def hook_name
32
+ config.options[:hook_name]
33
+ end
34
+
35
+ output :client_fhir_server
36
+ output :client_access_token,
37
+ optional: true
38
+
39
+ run do
40
+ load_tagged_requests(hook_name)
41
+ skip_if requests.empty?, "No #{hook_name} requests were made in a previous test as expected."
42
+ client_fhir_server = nil
43
+ requests.each_with_index do |request, index|
44
+ @request_number = index + 1
45
+ request_body = json_parse(request.request_body)
46
+ if request_body.blank?
47
+ add_message('error', "#{request_number}Hook request body cannot be empty.")
48
+ next
49
+ end
50
+
51
+ fhir_server_info = hook_request_optional_fields_check(request_body, ig_version: 'v201')
52
+ client_fhir_server ||= fhir_server_info
53
+ end
54
+
55
+ unless client_fhir_server.nil?
56
+ output client_fhir_server: client_fhir_server[:fhir_server_uri],
57
+ client_access_token: client_fhir_server[:fhir_access_token]
58
+ end
59
+ no_error_validation('Some service requests contain invalid optional fields.')
60
+ end
61
+ end
62
+ end
63
+ end