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,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,102 @@
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
+
18
+ module DaVinciCRDTestKit
19
+ module V221
20
+ class ClientAppointmentBookGroup < Inferno::TestGroup
21
+ title 'appointment-book'
22
+ id :crd_v221_client_appointment_book
23
+ description <<~DESCRIPTION
24
+ The [appointment-book](https://cds-hooks.hl7.org/hooks/STU1/appointment-book.html) hook is invoked when
25
+ the user is scheduling one or more future encounters/visits for the patient.
26
+ 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),
27
+ including the profiles that resources in each request must conform to.
28
+ DESCRIPTION
29
+ run_as_group
30
+
31
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-A'
32
+
33
+ input_order :cds_jwt_iss, :cds_jwk_set
34
+
35
+ config(
36
+ inputs: {
37
+ auth_token_headers_json: { name: :appointment_book_auth_token_headers_json },
38
+ auth_tokens: { name: :appointment_book_auth_tokens },
39
+ auth_tokens_jwk_json: { name: :appointment_book_auth_tokens_jwk_json },
40
+ client_access_token: { name: :appointment_book_client_access_token },
41
+ client_fhir_server: { name: :appointment_book_client_fhir_server },
42
+ crd_jwks_keys_json: { name: :appointment_book_crd_jwks_keys_json },
43
+ custom_response_template: { name: :appointment_book_custom_response_template },
44
+ selected_response_types: { name: :appointment_book_selected_response_types }
45
+ },
46
+ outputs: {
47
+ auth_token_headers_json: { name: :appointment_book_auth_token_headers_json },
48
+ auth_token_payloads_json: { name: :appointment_book_auth_token_payloads_json },
49
+ auth_tokens: { name: :appointment_book_auth_tokens },
50
+ auth_tokens_jwk_json: { name: :appointment_book_auth_tokens_jwk_json },
51
+ client_access_token: { name: :appointment_book_client_access_token },
52
+ client_fhir_server: { name: :appointment_book_client_fhir_server },
53
+ crd_jwks_keys_json: { name: :appointment_book_crd_jwks_keys_json }
54
+ },
55
+ options: {
56
+ hook_name: 'appointment-book'
57
+ }
58
+ )
59
+
60
+ group do
61
+ title 'Interaction'
62
+ test from: :crd_v221_appointment_book_request
63
+ end
64
+
65
+ group do
66
+ title 'Authorization'
67
+ test from: :crd_v221_decode_auth_token
68
+ test from: :crd_v221_retrieve_jwks
69
+ test from: :crd_v221_token_header
70
+ test from: :crd_v221_token_payload
71
+ end
72
+
73
+ group do
74
+ title 'Requests'
75
+ test from: :crd_v221_hook_request_conformance do
76
+ verifies_requirements(*HookRequestConformanceTest.verifies_requirements,
77
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-24',
78
+ 'hl7.fhir.us.davinci-crd_2.2.1@prof-1',
79
+ 'hl7.fhir.us.davinci-crd_2.2.1@prof-2')
80
+ end
81
+ test from: :crd_v221_hook_request_requested_version
82
+ test from: :crd_v221_hook_request_prefetch_profiles
83
+ test from: :crd_v221_hook_request_prefetch_complete
84
+ test from: :crd_v221_hook_request_coverage_verification
85
+ test from: :crd_v221_hook_data_fetch_verification
86
+ test from: :crd_v221_hook_request_granted_scopes
87
+ test from: :crd_v221_hook_request_secured_transport
88
+ end
89
+
90
+ group do
91
+ title 'Response Handling'
92
+
93
+ test from: :crd_v221_inferno_response_validation
94
+ test from: :crd_v221_card_display_attest_test
95
+ test from: :crd_v221_client_hook_response_support_coverage_information do
96
+ title 'Client supports the Coverage Information response type on the appointment-book hook'
97
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-26'
98
+ end
99
+ end
100
+ end
101
+ end
102
+ 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,96 @@
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
+ DESCRIPTION
29
+ run_as_group
30
+
31
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-A'
32
+
33
+ input_order :cds_jwt_iss, :cds_jwk_set
34
+
35
+ config(
36
+ inputs: {
37
+ auth_token_headers_json: { name: :encounter_discharge_auth_token_headers_json },
38
+ auth_tokens: { name: :encounter_discharge_auth_tokens },
39
+ auth_tokens_jwk_json: { name: :encounter_discharge_auth_tokens_jwk_json },
40
+ client_access_token: { name: :encounter_discharge_client_access_token },
41
+ client_fhir_server: { name: :encounter_discharge_client_fhir_server },
42
+ crd_jwks_keys_json: { name: :encounter_discharge_crd_jwks_keys_json },
43
+ custom_response_template: { name: :encounter_discharge_custom_response_template },
44
+ selected_response_types: { name: :encounter_discharge_selected_response_types }
45
+ },
46
+ outputs: {
47
+ auth_token_headers_json: { name: :encounter_discharge_auth_token_headers_json },
48
+ auth_token_payloads_json: { name: :encounter_discharge_auth_token_payloads_json },
49
+ auth_tokens: { name: :encounter_discharge_auth_tokens },
50
+ auth_tokens_jwk_json: { name: :encounter_discharge_auth_tokens_jwk_json },
51
+ client_access_token: { name: :encounter_discharge_client_access_token },
52
+ client_fhir_server: { name: :encounter_discharge_client_fhir_server },
53
+ crd_jwks_keys_json: { name: :encounter_discharge_crd_jwks_keys_json }
54
+ },
55
+ options: {
56
+ hook_name: 'encounter-discharge'
57
+ }
58
+ )
59
+
60
+ group do
61
+ title 'Interaction'
62
+ test from: :crd_v221_encounter_discharge_request
63
+ end
64
+
65
+ group do
66
+ title 'Authorization'
67
+ test from: :crd_v221_decode_auth_token
68
+ test from: :crd_v221_retrieve_jwks
69
+ test from: :crd_v221_token_header
70
+ test from: :crd_v221_token_payload
71
+ end
72
+
73
+ group do
74
+ title 'Requests'
75
+ test from: :crd_v221_hook_request_conformance do
76
+ verifies_requirements(*HookRequestConformanceTest.verifies_requirements,
77
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-27')
78
+ end
79
+ test from: :crd_v221_hook_request_requested_version
80
+ test from: :crd_v221_hook_request_prefetch_profiles
81
+ test from: :crd_v221_hook_request_prefetch_complete
82
+ test from: :crd_v221_hook_request_coverage_verification
83
+ test from: :crd_v221_hook_data_fetch_verification
84
+ test from: :crd_v221_hook_request_granted_scopes
85
+ test from: :crd_v221_hook_request_secured_transport
86
+ end
87
+
88
+ group do
89
+ title 'Response Handling'
90
+
91
+ test from: :crd_v221_inferno_response_validation
92
+ test from: :crd_v221_card_display_attest_test
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,95 @@
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
+ DESCRIPTION
28
+ run_as_group
29
+
30
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-2-A'
31
+
32
+ input_order :cds_jwt_iss, :cds_jwk_set
33
+
34
+ config(
35
+ inputs: {
36
+ auth_token_headers_json: { name: :encounter_start_auth_token_headers_json },
37
+ auth_tokens: { name: :encounter_start_auth_tokens },
38
+ auth_tokens_jwk_json: { name: :encounter_start_auth_tokens_jwk_json },
39
+ client_access_token: { name: :encounter_start_client_access_token },
40
+ client_fhir_server: { name: :encounter_start_client_fhir_server },
41
+ crd_jwks_keys_json: { name: :encounter_start_crd_jwks_keys_json },
42
+ custom_response_template: { name: :encounter_start_custom_response_template },
43
+ selected_response_types: { name: :encounter_start_selected_response_types }
44
+ },
45
+ outputs: {
46
+ auth_token_headers_json: { name: :encounter_start_auth_token_headers_json },
47
+ auth_token_payloads_json: { name: :encounter_start_auth_token_payloads_json },
48
+ auth_tokens: { name: :encounter_start_auth_tokens },
49
+ auth_tokens_jwk_json: { name: :encounter_start_auth_tokens_jwk_json },
50
+ client_access_token: { name: :encounter_start_client_access_token },
51
+ client_fhir_server: { name: :encounter_start_client_fhir_server },
52
+ crd_jwks_keys_json: { name: :encounter_start_crd_jwks_keys_json }
53
+ },
54
+ options: {
55
+ hook_name: 'encounter-start'
56
+ }
57
+ )
58
+
59
+ group do
60
+ title 'Interaction'
61
+ test from: :crd_v221_encounter_start_request
62
+ end
63
+
64
+ group do
65
+ title 'Authorization'
66
+ test from: :crd_v221_decode_auth_token
67
+ test from: :crd_v221_retrieve_jwks
68
+ test from: :crd_v221_token_header
69
+ test from: :crd_v221_token_payload
70
+ end
71
+
72
+ group do
73
+ title 'Requests'
74
+ test from: :crd_v221_hook_request_conformance do
75
+ verifies_requirements(*HookRequestConformanceTest.verifies_requirements,
76
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-29')
77
+ end
78
+ test from: :crd_v221_hook_request_requested_version
79
+ test from: :crd_v221_hook_request_prefetch_profiles
80
+ test from: :crd_v221_hook_request_prefetch_complete
81
+ test from: :crd_v221_hook_request_coverage_verification
82
+ test from: :crd_v221_hook_data_fetch_verification
83
+ test from: :crd_v221_hook_request_granted_scopes
84
+ test from: :crd_v221_hook_request_secured_transport
85
+ end
86
+
87
+ group do
88
+ title 'Response Handling'
89
+
90
+ test from: :crd_v221_inferno_response_validation
91
+ test from: :crd_v221_card_display_attest_test
92
+ end
93
+ end
94
+ end
95
+ 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