davinci_crd_test_kit 0.13.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_crd_client_suite.json.erb +20 -14
  3. data/config/presets/inferno_crd_client_suite_prefetch_subset_v221.json.erb +125 -0
  4. data/config/presets/inferno_crd_client_suite_v221.json.erb +188 -0
  5. data/config/presets/inferno_crd_server_suite.json.erb +58 -1
  6. data/config/presets/inferno_crd_server_suite_v221.json.erb +94 -0
  7. data/config/presets/ri_crd_request_generator.json_v221.json.erb +13 -0
  8. data/config/presets/ri_crd_server.json.erb +19 -19
  9. data/lib/davinci_crd_test_kit/client/client_base_urls.rb +80 -0
  10. data/lib/davinci_crd_test_kit/{client_hook_request_validation.rb → client/client_hook_request_validation.rb} +1 -1
  11. data/lib/davinci_crd_test_kit/client/crd_client_options.rb +30 -0
  12. data/lib/davinci_crd_test_kit/client/endpoints/cds_services_discovery_handler.rb +34 -0
  13. data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +342 -0
  14. data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +410 -0
  15. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +239 -0
  16. data/lib/davinci_crd_test_kit/{mock_service_response.rb → client/endpoints/mock_service_response.rb} +165 -59
  17. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/companions_prerequisites.json +1 -0
  18. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/create_update_coverage_information.json +3 -2
  19. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/external_reference.json +1 -1
  20. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +1 -1
  21. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
  22. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
  23. data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
  24. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
  33. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
  34. data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
  38. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
  39. data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
  40. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
  41. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
  42. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
  43. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
  44. data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
  45. data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
  46. data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
  47. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
  48. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
  49. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
  50. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
  51. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
  52. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
  53. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
  54. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
  55. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
  56. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
  57. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
  58. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
  59. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
  60. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
  61. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
  62. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
  63. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
  64. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
  65. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +109 -0
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +102 -0
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +101 -0
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +84 -0
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +107 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +108 -0
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +113 -0
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +33 -0
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +234 -0
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +54 -0
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +108 -0
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
  105. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
  106. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +133 -0
  107. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
  108. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
  109. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
  110. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +75 -0
  111. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
  112. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
  113. data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
  114. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +321 -0
  115. data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
  116. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
  117. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
  118. data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
  119. data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
  120. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
  121. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +476 -0
  122. data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
  123. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
  124. data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
  125. data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
  126. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +203 -0
  127. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +435 -0
  128. data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
  129. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +46 -0
  130. data/lib/davinci_crd_test_kit/metadata.rb +10 -44
  131. data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
  132. data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -0
  133. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  134. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +742 -65
  135. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
  136. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
  137. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
  138. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
  139. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
  140. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  141. data/lib/davinci_crd_test_kit/server/endpoints/jwk_set_endpoint_handler.rb +13 -0
  142. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
  143. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
  144. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
  145. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
  146. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
  147. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
  148. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
  149. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
  150. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
  151. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
  152. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_no_special_requests.rb +17 -0
  153. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
  154. data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
  155. data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
  156. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +183 -0
  157. data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
  158. data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +3 -3
  159. data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
  160. data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
  161. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
  162. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
  163. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
  164. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
  165. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
  166. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
  167. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
  168. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
  169. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
  170. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
  171. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
  172. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
  173. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
  174. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
  175. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
  176. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
  177. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
  178. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
  179. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
  180. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
  181. data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
  182. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
  183. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
  184. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
  185. data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
  186. data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
  187. data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
  188. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
  189. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
  190. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
  191. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
  192. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
  193. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
  194. data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
  195. data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
  196. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
  197. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  198. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  199. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
  200. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
  201. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  202. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
  203. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
  204. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
  205. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
  206. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
  207. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
  208. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
  209. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
  210. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
  211. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
  212. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
  213. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
  214. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
  215. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
  216. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
  217. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
  218. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
  219. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
  220. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
  221. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
  222. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
  223. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
  224. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
  225. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +118 -0
  226. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
  227. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
  228. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
  229. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
  230. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_standard_prefetch_expressions_test.rb +166 -0
  231. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
  232. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
  233. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
  234. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
  235. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
  236. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +121 -0
  237. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +94 -0
  238. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +71 -0
  239. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +107 -0
  240. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +107 -0
  241. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
  242. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +121 -0
  243. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +115 -0
  244. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +132 -0
  245. data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
  246. data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
  247. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_response_group.rb +23 -0
  248. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
  249. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
  250. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
  251. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
  252. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
  253. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
  254. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +31 -0
  255. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
  256. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +40 -0
  257. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +41 -0
  258. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +109 -0
  259. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
  260. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
  261. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
  262. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +130 -0
  263. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +119 -0
  264. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +89 -0
  265. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +126 -0
  266. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +174 -0
  267. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +83 -0
  268. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +88 -0
  269. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
  270. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +81 -0
  271. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +63 -0
  272. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
  273. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
  274. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
  275. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
  276. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
  277. data/lib/davinci_crd_test_kit/version.rb +2 -2
  278. data/lib/davinci_crd_test_kit.rb +4 -2
  279. metadata +307 -93
  280. data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
  281. data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -74
  282. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
  283. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
  284. data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
  285. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
  286. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
  287. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -42
  288. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -40
  289. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
  290. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -42
  291. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -61
  292. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
  293. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
  294. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
  295. data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
  296. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
  297. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
  298. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
  299. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
  300. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
  301. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
  302. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
  303. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
  304. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
  305. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
  306. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
  307. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -48
  308. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
  309. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
  310. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -193
  311. data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
  312. data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
  313. data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
  314. data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
  315. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
  316. data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
  317. data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
  318. data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
  319. data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
  320. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
  321. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
  322. data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
  323. data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
  324. data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
  325. data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
  326. data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
  327. data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
  328. data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
  329. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
  330. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
  331. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
  332. data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
  333. data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
  334. data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
  335. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
  336. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
  337. data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
  338. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
  339. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
  340. data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
  341. data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
  342. data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
  343. data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
  344. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
  345. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
  346. data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
  347. data/lib/davinci_crd_test_kit/tags.rb +0 -10
  348. data/lib/davinci_crd_test_kit/urls.rb +0 -52
  349. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
  350. /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
  351. /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
@@ -0,0 +1,202 @@
1
+
2
+ {
3
+ "services": [
4
+ {
5
+ "hook": "appointment-book",
6
+ "title": "Appointment Booking CDS Service",
7
+ "description": "A simulated CDS Service that is invoked when user of a CRD client books a future appointment for a patient",
8
+ "id": "appointment-book-service",
9
+ "prefetch" : {
10
+ "patient": "Patient/{{context.patientId}}",
11
+ "encounter": "Encounter/{{context.encounterId}}",
12
+ "coverage": "Coverage?patient={{context.patientId}}&status=active",
13
+ "deviceRequests" : "DeviceRequest?_id={{context.appointments.entry.resource.basedOn.extension('http://hl7.org/fhir/StructureDefinition/alternate-reference').value.resolve().ofType(DeviceRequest).id}}",
14
+ "serviceRequests" : "ServiceRequest?_id={{context.appointments.entry.resource.basedOn.resolve().ofType(ServiceRequest).id}}",
15
+ "medicationRequests" : "MedicationRequest?_id={{context.appointments.entry.resource.basedOn.extension('http://hl7.org/fhir/StructureDefinition/alternate-reference').value.resolve().ofType(MedicationRequest).id}}",
16
+ "devices": "Device?_id={{%deviceRequests.entry.resource.code.resolve().id}}",
17
+ "medications": "Medication?_id={{%medicationRequests.entry.resource.medication.resolve().id}}",
18
+ "practitionerRoles" : "PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|context.appointments.entry.resource.participant.actor.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id}}",
19
+ "practitioners" : "Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|context.appointments.entry.resource.participant.actor.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id}}",
20
+ "organizations" : "Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|%medicationRequests.entry.resource.dispenseRequest.performer.resolve().ofType(Organization).id|%serviceRequests.entry.resource.performer.resolve().ofType(Organization).id}}",
21
+ "locations" : "Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|context.appointments.entry.resource.participant.actor.resolve().ofType(Location).id|%serviceRequests.entry.resource.locationReference.resolve().ofType(Location).id}}"
22
+ },
23
+ "extension" : {
24
+ "davinci-crd.version" : [
25
+ "2.2",
26
+ "2.0"
27
+ ],
28
+ "davinci-crd.configuration-options" : [
29
+ {
30
+ "code" : "coverage-info",
31
+ "type" : "boolean",
32
+ "name" : "Coverage Information",
33
+ "description" : "Information related to the patient's coverage, including whether a service is covered, requires prior authorization, is approved without seeking prior authorization, and/or requires additional documentation or data collection",
34
+ "default" : true
35
+ }
36
+ ]
37
+ }
38
+ },
39
+ {
40
+ "hook": "encounter-start",
41
+ "title": "Encounter Start CDS Service",
42
+ "description": "A simulated CDS Service that is invoked when the user is initiating a new encounter.",
43
+ "id": "encounter-start-service",
44
+ "prefetch" : {
45
+ "patient": "Patient/{{context.patientId}}",
46
+ "encounter": "Encounter/{{context.encounterId}}",
47
+ "coverage": "Coverage?patient={{context.patientId}}&status=active",
48
+ "practitionerRoles" : "PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id}}",
49
+ "practitioners" : "Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id}}",
50
+ "organizations" : "Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id}}",
51
+ "locations" : "Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id}}"
52
+ },
53
+ "extension" : {
54
+ "davinci-crd.version" : [
55
+ "2.2",
56
+ "2.0"
57
+ ],
58
+ "davinci-crd.configuration-options" : [
59
+ {
60
+ "code" : "coverage-info",
61
+ "type" : "boolean",
62
+ "name" : "Coverage Information",
63
+ "description" : "Information related to the patient's coverage, including whether a service is covered, requires prior authorization, is approved without seeking prior authorization, and/or requires additional documentation or data collection",
64
+ "default" : true
65
+ }
66
+ ]
67
+ }
68
+ },
69
+ {
70
+ "hook": "encounter-discharge",
71
+ "title": "Encounter Disharge CDS Service Example",
72
+ "description": "A simulated CDS Service that is invoked when the user is performing the discharge process for an encounter - typically an inpatient encounter.",
73
+ "id": "encounter-discharge-service",
74
+ "prefetch" : {
75
+ "patient": "Patient/{{context.patientId}}",
76
+ "encounter": "Encounter/{{context.encounterId}}",
77
+ "coverage": "Coverage?patient={{context.patientId}}&status=active",
78
+ "practitionerRoles" : "PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id}}",
79
+ "practitioners" : "Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id}}",
80
+ "organizations" : "Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id}}",
81
+ "locations" : "Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id}}"
82
+ },
83
+ "extension" : {
84
+ "davinci-crd.version" : [
85
+ "2.2",
86
+ "2.0"
87
+ ],
88
+ "davinci-crd.configuration-options" : [
89
+ {
90
+ "code" : "coverage-info",
91
+ "type" : "boolean",
92
+ "name" : "Coverage Information",
93
+ "description" : "Information related to the patient's coverage, including whether a service is covered, requires prior authorization, is approved without seeking prior authorization, and/or requires additional documentation or data collection",
94
+ "default" : true
95
+ }
96
+ ]
97
+ }
98
+ },
99
+ {
100
+ "hook": "order-dispatch",
101
+ "title": "Order Dispatch CDS Service Example",
102
+ "description": "A simulated CDS Service that fires when a practitioner is selecting a candidate performer for a pre-existing order that was not tied to a specific performer",
103
+ "id": "order-dispatch-service",
104
+ "prefetch": {
105
+ "patient": "Patient/{{context.patientId}}",
106
+ "encounter": "Encounter/{{context.encounterId}}",
107
+ "coverage": "Coverage?patient={{context.patientId}}&status=active",
108
+ "communicationRequests": "CommunicationRequest?_id={{context.dispatchedOrders.resolve().ofType(CommunicationRequest).id}}",
109
+ "deviceRequests": "DeviceRequest?_id={{context.dispatchedOrders.resolve().ofType(DeviceRequest).id}}",
110
+ "medicationRequests": "MedicationRequest?_id={{context.dispatchedOrders.resolve().ofType(MedicationRequest).id}}",
111
+ "nutritionOrders": "NutritionOrder?_id={{context.dispatchedOrders.resolve().ofType(NutritionOrder).id}}",
112
+ "serviceRequests": "ServiceRequest?_id={{context.dispatchedOrders.resolve().ofType(ServiceRequest).id}}",
113
+ "visionPrescriptions": "VisionPrescription?_id={{context.dispatchedOrders.resolve().ofType(VisionPrescription).id}}",
114
+ "devices": "Device?_id={{%deviceRequests.entry.resource.code.resolve().id}}",
115
+ "medications": "Medication?_id={{%medicationRequests.entry.resource.medication.resolve().id}}",
116
+ "practitionerRoles": "PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.sender.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.recipient.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%nutritionOrders.entry.resource.orderer.resolve().ofType(PractitionerRole).id|%visionPrescriptions.entry.resource.prescriber.resolve().ofType(PractitionerRole).id}}",
117
+ "practitioners": "Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.sender.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.recipient.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%nutritionOrders.entry.resource.orderer.resolve().ofType(Practitioner).id|%visionPrescriptions.entry.resource.prescriber.resolve().ofType(Practitioner).id}}",
118
+ "organizations": "Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|%communicationRequests.entry.resource.recipient.resolve().ofType(Organization).id|%communicationRequests.entry.resource.sender.resolve().ofType(Organization).id|%medicationRequests.entry.resource.dispenseRequest.performer.resolve().id|%serviceRequests.entry.resource.performer.resolve().ofType(Organization).id}}",
119
+ "locations": "Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|%serviceRequests.entry.resource.locationReference.resolve().id}}"
120
+ },
121
+ "extension" : {
122
+ "davinci-crd.version" : [
123
+ "2.2",
124
+ "2.0"
125
+ ],
126
+ "davinci-crd.configuration-options" : [
127
+ {
128
+ "code" : "coverage-info",
129
+ "type" : "boolean",
130
+ "name" : "Coverage Information",
131
+ "description" : "Information related to the patient's coverage, including whether a service is covered, requires prior authorization, is approved without seeking prior authorization, and/or requires additional documentation or data collection",
132
+ "default" : true
133
+ }
134
+ ]
135
+ }
136
+ },
137
+ {
138
+ "hook": "order-select",
139
+ "title": "Order Select CDS Service",
140
+ "description": "A simulated CDS Service that fires when a clinician selects one or more orders to place for a patient",
141
+ "id": "order-select-service",
142
+ "prefetch": {
143
+ "patient": "Patient/{{context.patientId}}",
144
+ "encounter": "Encounter/{{context.encounterId}}",
145
+ "coverage": "Coverage?patient={{context.patientId}}&status=active",
146
+ "devices": "Device?_id={{context.draftOrders.entry.resource.ofType(DeviceRequest).code.resolve().id}}",
147
+ "medications": "Medication?_id={{context.draftOrders.entry.resource.ofType(MedicationRequest).medication.resolve().id}}",
148
+ "practitionerRoles": "PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.sender.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.recipient.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.requester.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.performer.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.orderer.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.prescriber.resolve().ofType(PractitionerRole).id}}",
149
+ "practitioners": "Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.sender.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.recipient.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.requester.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.performer.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.orderer.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.prescriber.resolve().ofType(Practitioner).id}}",
150
+ "organizations": "Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|context.draftOrders.entry.resource.dispenseRequest.performer.resolve().id|context.draftOrders.entry.resource.sender.resolve().ofType(Organization).id|context.draftOrders.entry.resource.recipient.resolve().ofType(Organization).id|context.draftOrders.entry.resource.performer.resolve().ofType(Organization).id}}",
151
+ "locations": "Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|context.draftOrders.entry.resource.locationReference.resolve().id}}"
152
+ },
153
+ "extension" : {
154
+ "davinci-crd.version" : [
155
+ "2.2",
156
+ "2.0"
157
+ ],
158
+ "davinci-crd.configuration-options" : [
159
+ {
160
+ "code" : "coverage-info",
161
+ "type" : "boolean",
162
+ "name" : "Coverage Information",
163
+ "description" : "Information related to the patient's coverage, including whether a service is covered, requires prior authorization, is approved without seeking prior authorization, and/or requires additional documentation or data collection",
164
+ "default" : true
165
+ }
166
+ ]
167
+ }
168
+ },
169
+ {
170
+ "hook": "order-sign",
171
+ "title": "Order Sign CDS Service",
172
+ "description": "A simulated CDS Service that fires when a clinician is ready to sign one or more orders for a patient",
173
+ "id": "order-sign-service",
174
+ "prefetch": {
175
+ "patient": "Patient/{{context.patientId}}",
176
+ "encounter": "Encounter/{{context.encounterId}}",
177
+ "coverage": "Coverage?patient={{context.patientId}}&status=active",
178
+ "devices": "Device?_id={{context.draftOrders.entry.resource.ofType(DeviceRequest).code.resolve().id}}",
179
+ "medications": "Medication?_id={{context.draftOrders.entry.resource.ofType(MedicationRequest).medication.resolve().id}}",
180
+ "practitionerRoles": "PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.sender.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.recipient.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.requester.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.performer.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.orderer.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.prescriber.resolve().ofType(PractitionerRole).id}}",
181
+ "practitioners": "Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.sender.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.recipient.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.requester.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.performer.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.orderer.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.prescriber.resolve().ofType(Practitioner).id}}",
182
+ "organizations": "Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|context.draftOrders.entry.resource.dispenseRequest.performer.resolve().id|context.draftOrders.entry.resource.sender.resolve().ofType(Organization).id|context.draftOrders.entry.resource.recipient.resolve().ofType(Organization).id|context.draftOrders.entry.resource.performer.resolve().ofType(Organization).id}}",
183
+ "locations": "Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|context.draftOrders.entry.resource.locationReference.resolve().id}}"
184
+ },
185
+ "extension" : {
186
+ "davinci-crd.version" : [
187
+ "2.2",
188
+ "2.0"
189
+ ],
190
+ "davinci-crd.configuration-options" : [
191
+ {
192
+ "code" : "coverage-info",
193
+ "type" : "boolean",
194
+ "name" : "Coverage Information",
195
+ "description" : "Information related to the patient's coverage, including whether a service is covered, requires prior authorization, is approved without seeking prior authorization, and/or requires additional documentation or data collection",
196
+ "default" : true
197
+ }
198
+ ]
199
+ }
200
+ }
201
+ ]
202
+ }
@@ -0,0 +1,109 @@
1
+ require_relative 'invocation/appointment_book_receive_request_test'
2
+ require_relative 'auth/decode_auth_token_test'
3
+ require_relative 'auth/retrieve_jwks_test'
4
+ require_relative 'auth/token_header_test'
5
+ require_relative 'auth/token_payload_test'
6
+ require_relative 'verify_request/hook_request_conformance_test'
7
+ require_relative 'verify_request/hook_request_requested_version_test'
8
+ require_relative 'verify_request/hook_request_prefetch_profiles_test'
9
+ require_relative 'verify_request/hook_request_prefetch_complete_test'
10
+ require_relative 'verify_request/hook_request_granted_scopes_test'
11
+ require_relative 'verify_request/hook_request_secured_transport_test'
12
+ require_relative 'verify_request/hook_request_coverage_verification_test'
13
+ require_relative 'verify_request/hook_request_data_fetch_verification_test'
14
+ require_relative 'verify_response/inferno_response_validation'
15
+ require_relative 'verify_response/client_display_cards_attest'
16
+ require_relative 'verify_response/hook_response_support_coverage_information_test'
17
+ require_relative 'client_urls'
18
+
19
+ module DaVinciCRDTestKit
20
+ module V221
21
+ class ClientAppointmentBookGroup < Inferno::TestGroup
22
+ title 'appointment-book'
23
+ id :crd_v221_client_appointment_book
24
+ description <<~DESCRIPTION
25
+ The [appointment-book](https://cds-hooks.hl7.org/hooks/STU1/appointment-book.html) hook is invoked when
26
+ the user is scheduling one or more future encounters/visits for the patient.
27
+ The CRD IG places [additional constraints on the use of the appintment-book hook](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/hooks.html#appointment-book),
28
+ including the profiles that resources in each request must conform to.
29
+
30
+ Inferno's simulated `appointment-book` hook endpoints are available at:
31
+ - Complete Prefetch: `#{ClientURLs.base_url}#{APPOINTMENT_BOOK_PATH}`
32
+ - Subset Prefetch: `#{ClientURLs.base_url}#{APPOINTMENT_BOOK_PREFETCH_SUBSET_PATH}`
33
+ DESCRIPTION
34
+ run_as_group
35
+
36
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-A'
37
+
38
+ input_order :appointment_book_response_approach,
39
+ :appointment_book_selected_response_types,
40
+ :appointment_book_custom_response_template
41
+
42
+ config(
43
+ inputs: {
44
+ auth_token_headers_json: { name: :appointment_book_auth_token_headers_json },
45
+ auth_tokens: { name: :appointment_book_auth_tokens },
46
+ auth_tokens_jwk_json: { name: :appointment_book_auth_tokens_jwk_json },
47
+ client_access_token: { name: :appointment_book_client_access_token },
48
+ client_fhir_server: { name: :appointment_book_client_fhir_server },
49
+ crd_jwks_keys_json: { name: :appointment_book_crd_jwks_keys_json },
50
+ custom_response_template: { name: :appointment_book_custom_response_template },
51
+ selected_response_types: { name: :appointment_book_selected_response_types }
52
+ },
53
+ outputs: {
54
+ auth_token_headers_json: { name: :appointment_book_auth_token_headers_json },
55
+ auth_token_payloads_json: { name: :appointment_book_auth_token_payloads_json },
56
+ auth_tokens: { name: :appointment_book_auth_tokens },
57
+ auth_tokens_jwk_json: { name: :appointment_book_auth_tokens_jwk_json },
58
+ client_access_token: { name: :appointment_book_client_access_token },
59
+ client_fhir_server: { name: :appointment_book_client_fhir_server },
60
+ crd_jwks_keys_json: { name: :appointment_book_crd_jwks_keys_json }
61
+ },
62
+ options: {
63
+ hook_name: 'appointment-book'
64
+ }
65
+ )
66
+
67
+ group do
68
+ title 'Interaction'
69
+ test from: :crd_v221_appointment_book_request
70
+ end
71
+
72
+ group do
73
+ title 'Authorization'
74
+ test from: :crd_v221_decode_auth_token
75
+ test from: :crd_v221_retrieve_jwks
76
+ test from: :crd_v221_token_header
77
+ test from: :crd_v221_token_payload
78
+ end
79
+
80
+ group do
81
+ title 'Requests'
82
+ test from: :crd_v221_hook_request_conformance do
83
+ verifies_requirements(*HookRequestConformanceTest.verifies_requirements,
84
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-24',
85
+ 'hl7.fhir.us.davinci-crd_2.2.1@prof-1',
86
+ 'hl7.fhir.us.davinci-crd_2.2.1@prof-2')
87
+ end
88
+ test from: :crd_v221_hook_request_requested_version
89
+ test from: :crd_v221_hook_request_prefetch_profiles
90
+ test from: :crd_v221_hook_request_prefetch_complete
91
+ test from: :crd_v221_hook_request_coverage_verification
92
+ test from: :crd_v221_hook_data_fetch_verification
93
+ test from: :crd_v221_hook_request_granted_scopes
94
+ test from: :crd_v221_hook_request_secured_transport
95
+ end
96
+
97
+ group do
98
+ title 'Response Handling'
99
+
100
+ test from: :crd_v221_inferno_response_validation
101
+ test from: :crd_v221_card_display_attest_test
102
+ test from: :crd_v221_client_hook_response_support_coverage_information do
103
+ title 'Client supports the Coverage Information response type on the appointment-book hook'
104
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-26'
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'cross_hook/client_card_must_support_coverage_information_test'
2
+ require_relative 'cross_hook/client_location_address_propagation_test'
3
+ require_relative 'cross_hook/client_fhirpath_collection_as_comma_delimited_string_test'
4
+ require_relative 'cross_hook/client_hook_instances_unique_test'
5
+ require_relative 'cross_hook/client_prefetch_complete_and_subset_test'
6
+
7
+ module DaVinciCRDTestKit
8
+ module V221
9
+ class ClientCrossHookGroup < Inferno::TestGroup
10
+ title 'Cross Hook'
11
+ id :crd_v221_client_cross_hook
12
+ description <<~DESCRIPTION
13
+ This group checks CRD requirements that pertain across all hooks
14
+ rather than a specific one.
15
+
16
+ These tests must be run after the tests in the "Hooks" group are run.
17
+ DESCRIPTION
18
+
19
+ run_as_group
20
+
21
+ test from: :crd_v221_client_card_must_support_coverage_information
22
+ test from: :crd_v221_client_location_address_propagation
23
+ test from: :crd_v221_client_fhir_path_collection_as_comma_delimited_string
24
+ test from: :crd_v221_client_hook_instances_unique
25
+ test from: :crd_v221_client_prefetch_complete_and_subset
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,102 @@
1
+ require_relative 'invocation/encounter_discharge_receive_request_test'
2
+ require_relative 'auth/decode_auth_token_test'
3
+ require_relative 'auth/retrieve_jwks_test'
4
+ require_relative 'auth/token_header_test'
5
+ require_relative 'auth/token_payload_test'
6
+ require_relative 'verify_request/hook_request_conformance_test'
7
+ require_relative 'verify_request/hook_request_requested_version_test'
8
+ require_relative 'verify_request/hook_request_prefetch_profiles_test'
9
+ require_relative 'verify_request/hook_request_prefetch_complete_test'
10
+ require_relative 'verify_request/hook_request_granted_scopes_test'
11
+ require_relative 'verify_request/hook_request_secured_transport_test'
12
+ require_relative 'verify_request/hook_request_coverage_verification_test'
13
+ require_relative 'verify_request/hook_request_data_fetch_verification_test'
14
+ require_relative 'verify_response/inferno_response_validation'
15
+ require_relative 'verify_response/client_display_cards_attest'
16
+
17
+ module DaVinciCRDTestKit
18
+ module V221
19
+ class ClientEncounterDischargeGroup < Inferno::TestGroup
20
+ title 'encounter-discharge'
21
+ id :crd_v221_client_encounter_discharge
22
+ description <<~DESCRIPTION
23
+ The [encounter-discharge](https://cds-hooks.hl7.org/hooks/STU1/encounter-discharge.html) hook is
24
+ invoked when the user is performing the discharge process for an encounter where
25
+ the notion of 'discharge' is relevant - typically an inpatient encounter.
26
+ The CRD IG places [additional constraints on the use of the encounter-discharge hook](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/hooks.html#encounter-discharge),
27
+ including the profiles that resources in each request must conform to.
28
+
29
+ Inferno's simulated `encounter-discharge` hook endpoints are available at:
30
+ - Complete Prefetch: `#{ClientURLs.base_url}#{ENCOUNTER_DISCHARGE_PATH}`
31
+ - Subset Prefetch: `#{ClientURLs.base_url}#{ENCOUNTER_DISCHARGE_PREFETCH_SUBSET_PATH}`
32
+ DESCRIPTION
33
+ run_as_group
34
+
35
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-A'
36
+
37
+ input_order :encounter_discharge_response_approach,
38
+ :encounter_discharge_selected_response_types,
39
+ :encounter_discharge_custom_response_template
40
+
41
+ config(
42
+ inputs: {
43
+ auth_token_headers_json: { name: :encounter_discharge_auth_token_headers_json },
44
+ auth_tokens: { name: :encounter_discharge_auth_tokens },
45
+ auth_tokens_jwk_json: { name: :encounter_discharge_auth_tokens_jwk_json },
46
+ client_access_token: { name: :encounter_discharge_client_access_token },
47
+ client_fhir_server: { name: :encounter_discharge_client_fhir_server },
48
+ crd_jwks_keys_json: { name: :encounter_discharge_crd_jwks_keys_json },
49
+ custom_response_template: { name: :encounter_discharge_custom_response_template },
50
+ selected_response_types: { name: :encounter_discharge_selected_response_types }
51
+ },
52
+ outputs: {
53
+ auth_token_headers_json: { name: :encounter_discharge_auth_token_headers_json },
54
+ auth_token_payloads_json: { name: :encounter_discharge_auth_token_payloads_json },
55
+ auth_tokens: { name: :encounter_discharge_auth_tokens },
56
+ auth_tokens_jwk_json: { name: :encounter_discharge_auth_tokens_jwk_json },
57
+ client_access_token: { name: :encounter_discharge_client_access_token },
58
+ client_fhir_server: { name: :encounter_discharge_client_fhir_server },
59
+ crd_jwks_keys_json: { name: :encounter_discharge_crd_jwks_keys_json }
60
+ },
61
+ options: {
62
+ hook_name: 'encounter-discharge'
63
+ }
64
+ )
65
+
66
+ group do
67
+ title 'Interaction'
68
+ test from: :crd_v221_encounter_discharge_request
69
+ end
70
+
71
+ group do
72
+ title 'Authorization'
73
+ test from: :crd_v221_decode_auth_token
74
+ test from: :crd_v221_retrieve_jwks
75
+ test from: :crd_v221_token_header
76
+ test from: :crd_v221_token_payload
77
+ end
78
+
79
+ group do
80
+ title 'Requests'
81
+ test from: :crd_v221_hook_request_conformance do
82
+ verifies_requirements(*HookRequestConformanceTest.verifies_requirements,
83
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-27')
84
+ end
85
+ test from: :crd_v221_hook_request_requested_version
86
+ test from: :crd_v221_hook_request_prefetch_profiles
87
+ test from: :crd_v221_hook_request_prefetch_complete
88
+ test from: :crd_v221_hook_request_coverage_verification
89
+ test from: :crd_v221_hook_data_fetch_verification
90
+ test from: :crd_v221_hook_request_granted_scopes
91
+ test from: :crd_v221_hook_request_secured_transport
92
+ end
93
+
94
+ group do
95
+ title 'Response Handling'
96
+
97
+ test from: :crd_v221_inferno_response_validation
98
+ test from: :crd_v221_card_display_attest_test
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,101 @@
1
+ require_relative 'invocation/encounter_start_receive_request_test'
2
+ require_relative 'auth/decode_auth_token_test'
3
+ require_relative 'auth/retrieve_jwks_test'
4
+ require_relative 'auth/token_header_test'
5
+ require_relative 'auth/token_payload_test'
6
+ require_relative 'verify_request/hook_request_conformance_test'
7
+ require_relative 'verify_request/hook_request_requested_version_test'
8
+ require_relative 'verify_request/hook_request_prefetch_profiles_test'
9
+ require_relative 'verify_request/hook_request_prefetch_complete_test'
10
+ require_relative 'verify_request/hook_request_granted_scopes_test'
11
+ require_relative 'verify_request/hook_request_secured_transport_test'
12
+ require_relative 'verify_request/hook_request_coverage_verification_test'
13
+ require_relative 'verify_request/hook_request_data_fetch_verification_test'
14
+ require_relative 'verify_response/inferno_response_validation'
15
+ require_relative 'verify_response/client_display_cards_attest'
16
+
17
+ module DaVinciCRDTestKit
18
+ module V221
19
+ class ClientEncounterStartGroup < Inferno::TestGroup
20
+ title 'encounter-start'
21
+ id :crd_v221_client_encounter_start
22
+ description <<~DESCRIPTION
23
+ The [encounter-start](https://cds-hooks.hl7.org/hooks/STU1/encounter-start.html) hook is invoked
24
+ when the user is initiating a new encounter. The CRD IG places [additional constraints on the use
25
+ of the encounter-start hook](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/hooks.html#encounter-start),
26
+ including the profiles that resources in each request must conform to.
27
+
28
+ Inferno's simulated `encounter-start` hook endpoints are available at:
29
+ - Complete Prefetch: `#{ClientURLs.base_url}#{ENCOUNTER_START_PATH}`
30
+ - Subset Prefetch: `#{ClientURLs.base_url}#{ENCOUNTER_START_PREFETCH_SUBSET_PATH}`
31
+ DESCRIPTION
32
+ run_as_group
33
+
34
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-A'
35
+
36
+ input_order :encounter_start_response_approach,
37
+ :encounter_start_selected_response_types,
38
+ :encounter_start_custom_response_template
39
+
40
+ config(
41
+ inputs: {
42
+ auth_token_headers_json: { name: :encounter_start_auth_token_headers_json },
43
+ auth_tokens: { name: :encounter_start_auth_tokens },
44
+ auth_tokens_jwk_json: { name: :encounter_start_auth_tokens_jwk_json },
45
+ client_access_token: { name: :encounter_start_client_access_token },
46
+ client_fhir_server: { name: :encounter_start_client_fhir_server },
47
+ crd_jwks_keys_json: { name: :encounter_start_crd_jwks_keys_json },
48
+ custom_response_template: { name: :encounter_start_custom_response_template },
49
+ selected_response_types: { name: :encounter_start_selected_response_types }
50
+ },
51
+ outputs: {
52
+ auth_token_headers_json: { name: :encounter_start_auth_token_headers_json },
53
+ auth_token_payloads_json: { name: :encounter_start_auth_token_payloads_json },
54
+ auth_tokens: { name: :encounter_start_auth_tokens },
55
+ auth_tokens_jwk_json: { name: :encounter_start_auth_tokens_jwk_json },
56
+ client_access_token: { name: :encounter_start_client_access_token },
57
+ client_fhir_server: { name: :encounter_start_client_fhir_server },
58
+ crd_jwks_keys_json: { name: :encounter_start_crd_jwks_keys_json }
59
+ },
60
+ options: {
61
+ hook_name: 'encounter-start'
62
+ }
63
+ )
64
+
65
+ group do
66
+ title 'Interaction'
67
+ test from: :crd_v221_encounter_start_request
68
+ end
69
+
70
+ group do
71
+ title 'Authorization'
72
+ test from: :crd_v221_decode_auth_token
73
+ test from: :crd_v221_retrieve_jwks
74
+ test from: :crd_v221_token_header
75
+ test from: :crd_v221_token_payload
76
+ end
77
+
78
+ group do
79
+ title 'Requests'
80
+ test from: :crd_v221_hook_request_conformance do
81
+ verifies_requirements(*HookRequestConformanceTest.verifies_requirements,
82
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-29')
83
+ end
84
+ test from: :crd_v221_hook_request_requested_version
85
+ test from: :crd_v221_hook_request_prefetch_profiles
86
+ test from: :crd_v221_hook_request_prefetch_complete
87
+ test from: :crd_v221_hook_request_coverage_verification
88
+ test from: :crd_v221_hook_data_fetch_verification
89
+ test from: :crd_v221_hook_request_granted_scopes
90
+ test from: :crd_v221_hook_request_secured_transport
91
+ end
92
+
93
+ group do
94
+ title 'Response Handling'
95
+
96
+ test from: :crd_v221_inferno_response_validation
97
+ test from: :crd_v221_card_display_attest_test
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,88 @@
1
+ require 'us_core_test_kit'
2
+ require_relative '../crd_client_options'
3
+ require_relative 'api/client_crd_update_verification_group'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class ClientFHIRAPIGroup < Inferno::TestGroup
8
+ title 'FHIR API'
9
+ description <<~DESCRIPTION
10
+ CRD client systems are responsible for returning data requested by the CRD server needed to provide decision support.
11
+ This group contains tests that verify the required 'server' FHIR API capabilities.
12
+ These 'server' capabilities are based on the US Core Server Capability Statement for the US Core version chosen
13
+ when initiating the test session:
14
+ - [US Core 3.1.1 Server Capability Statement](http://hl7.org/fhir/us/core/STU3.1.1/CapabilityStatement-us-core-server.html)
15
+ - [US Core 6.1.0 Server Capability Statement](http://hl7.org/fhir/us/core/STU6.1/CapabilityStatement-us-core-server.html)
16
+ - [US Core 7.0.0 Server Capability Statement](http://hl7.org/fhir/us/core/STU7/CapabilityStatement-us-core-server.html)
17
+ DESCRIPTION
18
+ id :crd_v221_client_fhir_api
19
+
20
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@conf-1'
21
+
22
+ input_instructions %(
23
+ The location of and an access token for the client's FHIR server are expected to come in
24
+ the CDS Hooks request. The following information will be auto-populated from
25
+ the body of the latest hook invocation made during this session:
26
+ - The URL of the CRD client FHIR server from the `fhirServer` field.
27
+ - The OAuth Access Token from the `fhirAuthorization.access_token` field.
28
+
29
+ If that access token will not be long-lived enough to perform
30
+ a full test of the US Core FHIR API, provide an updated token and/or refresh
31
+ token with Client ID and token endpoint so that Inferno can perform these tests.
32
+ )
33
+
34
+ input :url,
35
+ title: 'FHIR Endpoint',
36
+ description: %(
37
+ URL of the CRD client FHIR server.
38
+ ),
39
+ locked: true
40
+ input :smart_auth_info,
41
+ title: 'OAuth Credentials',
42
+ type: 'auth_info'
43
+
44
+ group from: :'us_core_v311-us_core_v311_fhir_api' do
45
+ description %(
46
+ This test group verifies that the CRD client can respond to queries as required by the
47
+ [US Core 3.1.1 Server Capability Statement](http://hl7.org/fhir/us/core/STU3.1.1/CapabilityStatement-us-core-server.html).
48
+
49
+ Note: these tests do not look for crd-specific data and so only verify conformance against
50
+ US Core profiles. The hook tests take the CRD-specific profiles into account.
51
+ )
52
+ required_suite_options CRDClientOptions::US_CORE_3_REQUIREMENT
53
+
54
+ group from: :crd_v221_client_update_verification,
55
+ id: :crd_v221_us_core_311_client_update_verification
56
+ reorder :crd_v221_us_core_311_client_update_verification, 1
57
+ end
58
+ group from: :'us_core_v610-us_core_v610_fhir_api' do
59
+ description %(
60
+ This test group verifies that the CRD client can respond to queries as required by the
61
+ [US Core 6.1.0 Server Capability Statement](http://hl7.org/fhir/us/core/STU6.1/CapabilityStatement-us-core-server.html).
62
+
63
+ Note: these tests do not look for crd-specific data and so only verify conformance against
64
+ US Core profiles. The hook tests take the CRD-specific profiles into account.
65
+ )
66
+ required_suite_options CRDClientOptions::US_CORE_6_REQUIREMENT
67
+
68
+ group from: :crd_v221_client_update_verification,
69
+ id: :crd_v221_us_core_610_client_update_verification
70
+ reorder :crd_v221_us_core_610_client_update_verification, 1
71
+ end
72
+ group from: :'us_core_v700-us_core_v700_fhir_api' do
73
+ description %(
74
+ This test group verifies that the CRD client can respond to queries as required by the
75
+ [US Core 7.0.0 Server Capability Statement](http://hl7.org/fhir/us/core/STU7/CapabilityStatement-us-core-server.html).
76
+
77
+ Note: these tests do not look for crd-specific data and so only verify conformance against
78
+ US Core profiles. The hook tests take the CRD-specific profiles into account.
79
+ )
80
+ required_suite_options CRDClientOptions::US_CORE_7_REQUIREMENT
81
+
82
+ group from: :crd_v221_client_update_verification,
83
+ id: :crd_v221_us_core_700_client_update_verification
84
+ reorder :crd_v221_us_core_700_client_update_verification, 1
85
+ end
86
+ end
87
+ end
88
+ end