davinci_crd_test_kit 0.13.0 → 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 +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 +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 +297 -93
  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 -74
  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 -42
  277. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -40
  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 -42
  280. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -61
  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 -48
  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 -193
  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,165 @@
1
+ require_relative '../client_urls'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V221
5
+ class OrderSelectReceiveRequestTest < Inferno::Test
6
+ include ClientURLs
7
+
8
+ id :crd_v221_order_select_request
9
+ title 'Client invokes the order-select hook'
10
+ description %(
11
+ During this test, Inferno will wait while the client makes one or more [order-select](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/hooks.html#order-select)
12
+ hook requests against Inferno's simulated CRD servers. Inferno will respond
13
+ based on the response configuration provided when running the test.
14
+ For more details on how Inferno's simulated CRD servers behave during
15
+ hook invocation see the [simulated CRD server](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details#crd-server-simulation)
16
+ documentation.
17
+
18
+ Inferno will pause and wait for inbound requests until told explicitly to continue
19
+ by the tester by clicking on the link in the "User Action Required" dialog (NOTE: after
20
+ 5 minutes the test will become inactive and unresponsive to anything except cancelation).
21
+ )
22
+
23
+ config options: { accepts_multiple_requests: true }
24
+
25
+ input :cds_jwt_iss,
26
+ title: 'CRD JWT Issuer',
27
+ description: %(
28
+ Value of the `iss` claim that must be present in the JWT used to authorize the client's hook
29
+ request sent as the Bearer token in the `Authorization` header.
30
+ Run or re-run the "Registration" group to set or change this value.
31
+ ),
32
+ locked: true
33
+ input :order_select_response_approach,
34
+ title: 'Response generation approach for order-select',
35
+ description: %(
36
+ Determines how Inferno will generate response for order-select
37
+ hook invocations.
38
+ ),
39
+ type: 'radio',
40
+ default: 'mocked',
41
+ options: {
42
+ list_options: [
43
+ {
44
+ label: 'Create simple mocks based on selected response types',
45
+ value: 'mocked'
46
+ },
47
+ {
48
+ label: 'Generate responses based on a tester-provided template',
49
+ value: 'custom'
50
+ }
51
+ ]
52
+ }
53
+ input :order_select_selected_response_types,
54
+ title: 'Response types to return from order-select hook requests',
55
+ description: %(
56
+ 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)
57
+ when responding to hook invocations. If no types are selected, Inferno will mock and return
58
+ an [Instructions](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#instructions-response-type)
59
+ response for this secondary hook.
60
+ ),
61
+ type: 'checkbox',
62
+ default: ['coverage_information', 'external_reference', 'instructions'],
63
+ optional: true,
64
+ options: {
65
+ list_options: [
66
+ {
67
+ label: 'External Reference',
68
+ value: 'external_reference'
69
+ },
70
+ {
71
+ label: 'Instructions',
72
+ value: 'instructions'
73
+ },
74
+ {
75
+ label: 'Coverage Information',
76
+ value: 'coverage_information'
77
+ },
78
+ {
79
+ label: 'Request Form Completion',
80
+ value: 'request_form_completion'
81
+ },
82
+ {
83
+ label: 'Create/Update Coverage Information',
84
+ value: 'create_update_coverage_info'
85
+ },
86
+ {
87
+ label: 'Launch SMART Application',
88
+ value: 'launch_smart_app'
89
+ },
90
+ {
91
+ label: 'Propose Alternate Request',
92
+ value: 'propose_alternate_request'
93
+ },
94
+ {
95
+ label: 'Additional Orders as Companions/Prerequisites',
96
+ value: 'companions_prerequisites'
97
+ }
98
+ ]
99
+ },
100
+ enable_when: { input_name: 'order_select_response_approach', value: 'mocked' }
101
+ input :order_select_custom_response_template,
102
+ title: 'Custom response template for order-select hook requests',
103
+ description: %(
104
+ Provide a [custom response template](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#tester-directed-custom-responses)
105
+ in JSON form for Inferno to use when responding to hook invocations.
106
+ ),
107
+ type: 'textarea',
108
+ optional: true,
109
+ enable_when: { input_name: 'order_select_response_approach', value: 'custom' }
110
+ output :continuation_url
111
+
112
+ def configured_response_details
113
+ if order_select_response_approach == 'custom'
114
+ # rubocop:disable Layout/LineLength
115
+ 'When responding, Inferno will evaluate the provided [custom response template](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#tester-directed-custom-responses) ' \
116
+ 'from the **Custom response template for order-select hook requests** input ' \
117
+ 'against the incoming request to create a response.'
118
+ # rubocop:enable Layout/LineLength
119
+
120
+ else
121
+ # rubocop:disable Layout/LineLength
122
+ 'When responding, Inferno will [mock](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#mocked-responses) ' \
123
+ 'the following response types using the incoming request: ' \
124
+ "\n - #{selected_response_types_string}"
125
+ # rubocop:enable Layout/LineLength
126
+ end
127
+ end
128
+
129
+ def selected_response_types_string
130
+ if order_select_selected_response_types.present?
131
+ order_select_selected_response_types.join("\n - ")
132
+ else
133
+ 'Instructions' # secondary hook default
134
+ end
135
+ end
136
+
137
+ run do
138
+ identifier = cds_jwt_iss
139
+ continuation_url = "#{resume_pass_url}?token=#{identifier}"
140
+ output(continuation_url:)
141
+
142
+ wait(
143
+ identifier:,
144
+ message: %(
145
+ **Invoke the `order-select` hook**:
146
+
147
+ Invoke the order-select hook by sending requests to
148
+ one or both of the two Inferno simulated CRD servers:
149
+
150
+ - Complete Prefetch: `#{order_select_url}`
151
+ - Subset Prefetch: `#{order_select_prefetch_subset_url}`
152
+
153
+ For Inferno to recognize these requests and associate them with this session,
154
+ the authentication JWT sent as a Bearer token in the Authorization header
155
+ must have `#{cds_jwt_iss}` as the `iss` claim in the JWT payload.
156
+
157
+ #{configured_response_details}
158
+
159
+ [Click here](#{continuation_url}) when you have finished submitting requests.
160
+ )
161
+ )
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,165 @@
1
+ require_relative '../client_urls'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V221
5
+ class OrderSignReceiveRequestTest < Inferno::Test
6
+ include ClientURLs
7
+
8
+ id :crd_v221_order_sign_request
9
+ title 'Client invokes the order-sign hook'
10
+ description %(
11
+ During this test, Inferno will wait while the client makes one or more [order-sign](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/hooks.html#order-sign)
12
+ hook requests against Inferno's simulated CRD servers. Inferno will respond
13
+ based on the response configuration provided when running the test.
14
+ For more details on how Inferno's simulated CRD servers behave during
15
+ hook invocation see the [simulated CRD server](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details#crd-server-simulation)
16
+ documentation.
17
+
18
+ Inferno will pause and wait for inbound requests until told explicitly to continue
19
+ by the tester by clicking on the link in the "User Action Required" dialog (NOTE: after
20
+ 5 minutes the test will become inactive and unresponsive to anything except cancelation).
21
+ )
22
+
23
+ config options: { accepts_multiple_requests: true }
24
+
25
+ input :cds_jwt_iss,
26
+ title: 'CRD JWT Issuer',
27
+ description: %(
28
+ Value of the `iss` claim that must be present in the JWT used to authorize the client's hook
29
+ request sent as the Bearer token in the `Authorization` header.
30
+ Run or re-run the "Registration" group to set or change this value.
31
+ ),
32
+ locked: true
33
+ input :order_sign_response_approach,
34
+ title: 'Response generation approach for order-sign',
35
+ description: %(
36
+ Determines how Inferno will generate response for order-sign
37
+ hook invocations.
38
+ ),
39
+ type: 'radio',
40
+ default: 'mocked',
41
+ options: {
42
+ list_options: [
43
+ {
44
+ label: 'Create simple mocks based on selected response types',
45
+ value: 'mocked'
46
+ },
47
+ {
48
+ label: 'Generate responses based on a tester-provided template',
49
+ value: 'custom'
50
+ }
51
+ ]
52
+ }
53
+ input :order_sign_selected_response_types,
54
+ title: 'Response types to return from order-sign hook requests',
55
+ description: %(
56
+ 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)
57
+ when responding to hook invocations. If no types are selected, Inferno will mock and return
58
+ a [Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
59
+ response for this primary hook.
60
+ ),
61
+ type: 'checkbox',
62
+ default: ['coverage_information', 'external_reference', 'instructions'],
63
+ optional: true,
64
+ options: {
65
+ list_options: [
66
+ {
67
+ label: 'External Reference',
68
+ value: 'external_reference'
69
+ },
70
+ {
71
+ label: 'Instructions',
72
+ value: 'instructions'
73
+ },
74
+ {
75
+ label: 'Coverage Information',
76
+ value: 'coverage_information'
77
+ },
78
+ {
79
+ label: 'Request Form Completion',
80
+ value: 'request_form_completion'
81
+ },
82
+ {
83
+ label: 'Create/Update Coverage Information',
84
+ value: 'create_update_coverage_info'
85
+ },
86
+ {
87
+ label: 'Launch SMART Application',
88
+ value: 'launch_smart_app'
89
+ },
90
+ {
91
+ label: 'Propose Alternate Request',
92
+ value: 'propose_alternate_request'
93
+ },
94
+ {
95
+ label: 'Additional Orders as Companions/Prerequisites',
96
+ value: 'companions_prerequisites'
97
+ }
98
+ ]
99
+ },
100
+ enable_when: { input_name: 'order_sign_response_approach', value: 'mocked' }
101
+ input :order_sign_custom_response_template,
102
+ title: 'Custom response template for order-sign hook requests',
103
+ description: %(
104
+ Provide a [custom response template](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#tester-directed-custom-responses)
105
+ in JSON form for Inferno to use when responding to hook invocations.
106
+ ),
107
+ type: 'textarea',
108
+ optional: true,
109
+ enable_when: { input_name: 'order_sign_response_approach', value: 'custom' }
110
+ output :continuation_url
111
+
112
+ def configured_response_details
113
+ if order_sign_response_approach == 'custom'
114
+ # rubocop:disable Layout/LineLength
115
+ 'When responding, Inferno will evaluate the provided [custom response template](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#tester-directed-custom-responses) ' \
116
+ 'from the **Custom response template for order-sign hook requests** input ' \
117
+ 'against the incoming request to create a response.'
118
+ # rubocop:enable Layout/LineLength
119
+
120
+ else
121
+ # rubocop:disable Layout/LineLength
122
+ 'When responding, Inferno will [mock](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#mocked-responses) ' \
123
+ 'the following response types using the incoming request: ' \
124
+ "\n - #{selected_response_types_string}"
125
+ # rubocop:enable Layout/LineLength
126
+ end
127
+ end
128
+
129
+ def selected_response_types_string
130
+ if order_sign_selected_response_types.present?
131
+ order_sign_selected_response_types.join("\n - ")
132
+ else
133
+ 'Coverage Information' # primary hook default
134
+ end
135
+ end
136
+
137
+ run do
138
+ identifier = cds_jwt_iss
139
+ continuation_url = "#{resume_pass_url}?token=#{identifier}"
140
+ output(continuation_url:)
141
+
142
+ wait(
143
+ identifier:,
144
+ message: %(
145
+ **Invoke the `order-sign` hook**:
146
+
147
+ Invoke the order-sign hook by sending requests to
148
+ one or both of the two Inferno simulated CRD servers:
149
+
150
+ - Complete Prefetch: `#{order_sign_url}`
151
+ - Subset Prefetch: `#{order_sign_prefetch_subset_url}`
152
+
153
+ For Inferno to recognize these requests and associate them with this session,
154
+ the authentication JWT sent as a Bearer token in the Authorization header
155
+ must have `#{cds_jwt_iss}` as the `iss` claim in the JWT payload.
156
+
157
+ #{configured_response_details}
158
+
159
+ [Click here](#{continuation_url}) when you have finished submitting requests.
160
+ )
161
+ )
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,64 @@
1
+ require_relative '../client_urls'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V221
5
+ class ClientLongRunningReceiveRequestTest < Inferno::Test
6
+ include ClientURLs
7
+
8
+ id :crd_v221_client_long_running_receive_request
9
+ title 'Client invokes any hook'
10
+ description %(
11
+ During this test, Inferno will wait while the client makes a single hook requests of any type.
12
+ Inferno will return a [mocked response](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#mocked-responses)
13
+ but only after pausing for a configured amount of time, which must be 5 seconds or longer. The details
14
+ of the request and its response do not matter for the purposes of this test and they will not be
15
+ evaluated, checked for conformance, or included in cross-hook evaluations. The test will automatically
16
+ continue after Inferno receives a hook request, the configured pause time has elapsed,
17
+ and a response has been returned.
18
+ )
19
+ config options: { accepts_multiple_requests: true }
20
+
21
+ input :cds_jwt_iss,
22
+ title: 'CRD JWT Issuer',
23
+ description: %(
24
+ Value of the `iss` claim that must be present in the JWT used to authorize the client's hook
25
+ request sent as the Bearer token in the `Authorization` header.
26
+ Run or re-run the "Registration" group to set or change this value.
27
+ ),
28
+ locked: true
29
+ input :long_running_pause_time,
30
+ title: 'Long-running Request Pause Time',
31
+ description: %(
32
+ Time in seconds to wait before returning a response to a hook invocation
33
+ made when testing a long-running request. Must be at least 5 seconds,
34
+ which is the minimum threshold for a long-running response as defined by CRD.
35
+ ),
36
+ default: '5'
37
+
38
+ run do
39
+ verify_long_running_pause_time_input
40
+
41
+ identifier = cds_jwt_iss
42
+ wait(
43
+ identifier:,
44
+ message: %(
45
+ **Long Running Hook Request Test**:
46
+
47
+ Invoke any supported hook. This test will
48
+ automatically continue once Inferno has received a request, paused
49
+ for #{long_running_pause_time.to_i} seconds, and returned a response.
50
+
51
+ Users must have the option to continue
52
+ their workflow before Inferno's response is returned. Testers will be asked to
53
+ attest that this was demonstrated in the next test.
54
+ )
55
+ )
56
+ end
57
+
58
+ def verify_long_running_pause_time_input
59
+ assert long_running_pause_time.to_i >= 5,
60
+ 'The **Long-running Request Pause Time** input must be at least 5 seconds.'
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,49 @@
1
+ require_relative '../client_urls'
2
+ require_relative '../../tagged_request_load_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ClientSkipLongRunningAttestationTest < Inferno::Test
7
+ include ClientURLs
8
+ include DaVinciCRDTestKit::TaggedRequestLoadHelper
9
+
10
+ id :crd_v221_client_skip_long_running_attestation_test
11
+ title 'Client allows the user to continue their workflow during long-running requests (Attestation)'
12
+ description %(
13
+ During this test, the tester will confirm that the client system allowed
14
+ its user to continue with their workflow while the sytem was waiting for the previous
15
+ long-running hook request to return.
16
+ )
17
+
18
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@found-6'
19
+
20
+ output :attest_true_url
21
+ output :attest_false_url
22
+
23
+ run do
24
+ long_running_requests = load_hook_requests
25
+ skip_if long_running_requests.blank?, 'Long-running requests not demonstrated: ' \
26
+ 'no hook requests sent during the previous wait.'
27
+
28
+ identifier = SecureRandom.hex(32)
29
+ attest_true_url = "#{resume_pass_url}?token=#{identifier}"
30
+ attest_false_url = "#{resume_fail_url}?token=#{identifier}"
31
+ output(attest_true_url:)
32
+ output(attest_false_url:)
33
+ wait(
34
+ identifier:,
35
+ message: <<~MESSAGE
36
+ **Long Running Request Attestation**:
37
+
38
+ I attest that the user had the option to continue their workflow
39
+ while waiting for the long-running hook request to return a response:
40
+
41
+ [Click here](#{attest_true_url}) if the above statement is **true**.
42
+
43
+ [Click here](#{attest_false_url}) if the above statement is **false**.
44
+ MESSAGE
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,161 @@
1
+ require 'jwt'
2
+ require_relative '../client_urls'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class CRDClientRegistrationVerification < Inferno::Test
7
+ include ClientURLs
8
+
9
+ id :crd_v221_client_registration_verification
10
+ title 'CRD client registers with Inferno'
11
+ description %(
12
+ In order to register with and be able to make hook requests against Inferno's
13
+ simulated CRD servers, the tester must provide the `iss` (issuer) claim in
14
+ the payload of the JWT sent in the Authorization header of hook requests
15
+ made by the client against Inferno. This information is used to
16
+ associate inbound requests to Inferno's simulated CRD servers with this session.
17
+ Requests made without a JWT or with a different `iss` value will not appear in this
18
+ session or be analyzed.
19
+
20
+ Inferno also requires some additional information to verify conformant client behavior.
21
+ This information is not needed to execute the tests, but the tests will not completely
22
+ pass without it:
23
+ - A JSON Web Key Set (JWKS) containing the key used to sign the JWT sent in the Authorization
24
+ header for use in signature validation. It can be provided either as a URL where it is
25
+ publicly hosted (preferred) or the raw JWKS as JSON.
26
+ - A FHIR Organization id associated with each of Inferno's two simulated CRD servers,
27
+ one at `#{ClientURLs.discovery_url}` requesting the [complete standard prefetch data set](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/foundation.html#standard-prefetch),
28
+ and the other at `#{ClientURLs.prefetch_subset_discovery_url}` requesting a subset of that data set.
29
+ These are used to verify that the prefetched coverage is linked to the correct payer for the invoked
30
+ service.
31
+
32
+ During this test, registration information provided will be checked for conformance
33
+ with these requirements.
34
+ )
35
+
36
+ verifies_requirements 'cds-hooks_3.0.0-ballot@199'
37
+
38
+ input :cds_jwt_iss,
39
+ title: 'CRD JWT Issuer',
40
+ description: %(
41
+ Value of the `iss` claim that will be sent in the JWT used to authorize the client's hook
42
+ request sent as the Bearer token in the `Authorization` header.
43
+ This value will be used to associate incoming requests with this test
44
+ session and any requests that use a different `iss` value will not be recognized.
45
+ ),
46
+ type: 'text'
47
+ input :cds_jwk_set,
48
+ title: 'CRD JSON Web Key Set (JWKS)',
49
+ type: 'textarea',
50
+ description: %(
51
+ The CRD client's JWK Set containing it's public key. May be either
52
+ a publicly accessible url containing the JWKS, or the raw JWKS.
53
+ The client suite may be run without this input, but it is required
54
+ for the tests to pass.
55
+ ),
56
+ optional: true
57
+ input :complete_prefetch_service_organization_id,
58
+ title: 'Complete Prefetch Service Organization id',
59
+ description: %(
60
+ The FHIR Organization id associated with Inferno's simulated
61
+ complete prefetch CRD server. This Organization must be referenced as the
62
+ payer on Coverages in hook requests made to services described by the
63
+ `#{ClientURLs.discovery_url}` discovery endpoint.
64
+ The client suite may be run without this input, but it is required
65
+ for the tests to pass.
66
+ ),
67
+ type: 'text',
68
+ optional: true
69
+ input :subset_prefetch_service_organization_id,
70
+ title: 'Subset Prefetch Service Organization id',
71
+ description: %(
72
+ The FHIR Organization id associated with Inferno's simulated
73
+ subset prefetch CRD server. This Organization must be referenced
74
+ payer on Coverages in hook requests made to services described by the
75
+ `#{ClientURLs.prefetch_subset_discovery_url}` discovery endpoint.
76
+ The client suite may be run without this input, but it is required
77
+ for the tests to pass.
78
+ ),
79
+ type: 'text',
80
+ optional: true
81
+
82
+ run do
83
+ if cds_jwk_set.present?
84
+ check_jwks
85
+ else
86
+ add_message('error', 'Provide a jwk set in the **CRD JSON Web Key Set (JWKS)** input.')
87
+ end
88
+
89
+ unless complete_prefetch_service_organization_id.present?
90
+ add_message('error', 'Provide an Organization id associated with the Complete Prefetch Service ' \
91
+ "at endpoint #{discovery_url}")
92
+ end
93
+
94
+ unless subset_prefetch_service_organization_id.present?
95
+ add_message('error', 'Provide an Organization id associated with the Subset Prefetch Service ' \
96
+ "at endpoint #{prefetch_subset_discovery_url}")
97
+ end
98
+
99
+ unless complete_prefetch_service_organization_id.present? && subset_prefetch_service_organization_id.present? &&
100
+ complete_prefetch_service_organization_id != subset_prefetch_service_organization_id
101
+ add_message('error', 'Each Inferno CRD service must be assigned a unique Organization id.')
102
+ end
103
+
104
+ assert_no_error_messages 'Invalid registration information provided. See Messages for details.'
105
+ end
106
+
107
+ def check_jwks
108
+ jwks_warnings = []
109
+ parsed_jwk_set = jwk_set(cds_jwk_set, jwks_warnings)
110
+ jwks_warnings.each { |warning| add_message('warning', warning) }
111
+
112
+ add_message('error', 'JWKS content does not include any valid keys.') unless parsed_jwk_set.length.positive?
113
+ end
114
+
115
+ def jwk_set(jku, warning_messages = []) # rubocop:disable Metrics/CyclomaticComplexity
116
+ jwk_set = JWT::JWK::Set.new
117
+
118
+ if jku.blank?
119
+ warning_messages << 'No key set input.'
120
+ return jwk_set
121
+ end
122
+
123
+ jwk_body = # try as raw jwk set
124
+ begin
125
+ JSON.parse(jku)
126
+ rescue JSON::ParserError
127
+ nil
128
+ end
129
+
130
+ if jwk_body.blank?
131
+ retrieved = Faraday.get(jku) # try as url pointing to a jwk set
132
+ jwk_body =
133
+ begin
134
+ JSON.parse(retrieved.body)
135
+ rescue JSON::ParserError
136
+ warning_messages << "Failed to fetch valid json from jwks uri #{jku}."
137
+ nil
138
+ end
139
+ else
140
+ warning_messages << 'Providing the JWK Set directly is strongly discouraged.'
141
+ end
142
+
143
+ return jwk_set if jwk_body.blank?
144
+
145
+ jwk_body['keys']&.each_with_index do |key_hash, index|
146
+ parsed_key =
147
+ begin
148
+ JWT::JWK.new(key_hash)
149
+ rescue JWT::JWKError => e
150
+ id = key_hash['kid'] | index
151
+ warning_messages << "Key #{id} invalid: #{e}"
152
+ nil
153
+ end
154
+ jwk_set << parsed_key unless parsed_key.blank?
155
+ end
156
+
157
+ jwk_set
158
+ end
159
+ end
160
+ end
161
+ end