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,5 @@
1
+ ---
2
+ :resource: Device
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-device
4
+ :profile_name: CRD Device
5
+ :profile_version: 2.0.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: DeviceRequest
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-devicerequest
4
+ :profile_name: CRD DeviceRequest
5
+ :profile_version: 2.0.1
@@ -0,0 +1,7 @@
1
+ ---
2
+ :resource: Encounter
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-encounter
4
+ :profile_name: CRD Encounter
5
+ :profile_version: 2.0.1
6
+ :include_params:
7
+ - Encounter:location
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Location
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-location
4
+ :profile_name: CRD Location
5
+ :profile_version: 2.0.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: MedicationRequest
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-medicationrequest
4
+ :profile_name: CRD MedicationRequest
5
+ :profile_version: 2.0.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: NutritionOrder
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-nutritionorder
4
+ :profile_name: CRD NutritionOrder
5
+ :profile_version: 2.0.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Organization
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-organization
4
+ :profile_name: CRD Organization
5
+ :profile_version: 2.0.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Patient
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-patient
4
+ :profile_name: CRD Patient
5
+ :profile_version: 2.0.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Practitioner
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-practitioner
4
+ :profile_name: CRD Practitioner
5
+ :profile_version: 2.0.1
@@ -0,0 +1,40 @@
1
+ ---
2
+ :resource: PractitionerRole
3
+ :profile_url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitionerrole
4
+ :profile_name: US Core PractitionerRole
5
+ :profile_version: 3.1.1
6
+ :search_definitions:
7
+ :_id:
8
+ :paths:
9
+ - id
10
+ :full_paths:
11
+ - PractitionerRole.id
12
+ :type: http://hl7.org/fhirpath/System.String
13
+ :specialty:
14
+ :paths:
15
+ - specialty
16
+ :full_paths:
17
+ - PractitionerRole.specialty
18
+ :type: CodeableConcept
19
+ :organization:
20
+ :paths:
21
+ - organization
22
+ :full_paths:
23
+ - PractitionerRole.organization
24
+ :type: Reference
25
+ :practitioner:
26
+ :paths:
27
+ - practitioner
28
+ :full_paths:
29
+ - PractitionerRole.practitioner
30
+ :type: Reference
31
+ :chain:
32
+ - :chain: identifier
33
+ :expectation: SHALL
34
+ - :chain: name
35
+ :expectation: SHALL
36
+ :include_params:
37
+ - PractitionerRole:endpoint
38
+ - PractitionerRole:practitioner
39
+ :revincludes:
40
+ - Provenance:target
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: ServiceRequest
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-servicerequest
4
+ :profile_name: CRD ServiceRequest
5
+ :profile_version: 2.0.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Task
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-taskquestionnaire
4
+ :profile_name: CRD Questionnaire Task
5
+ :profile_version: 2.0.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: VisionPrescription
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-visionprescription
4
+ :profile_name: CRD VisionPrescription
5
+ :profile_version: 2.0.1
@@ -0,0 +1,99 @@
1
+ require_relative '../jwt_helper'
2
+ require_relative '../endpoints/jwk_set_endpoint_handler'
3
+ require_relative 'server_discovery_group'
4
+ require_relative 'server_demonstrate_hook_response_group'
5
+ require_relative 'server_hooks_group'
6
+ require_relative 'server_urls'
7
+ require_relative '../endpoints/mock_ehr_endpoints'
8
+
9
+ module DaVinciCRDTestKit
10
+ module V201
11
+ class CRDServerSuite < Inferno::TestSuite
12
+ include ServerURLs
13
+
14
+ id :crd_server
15
+ title 'Da Vinci CRD Server v2.0.1 Test Suite'
16
+ description <<~DESCRIPTION
17
+ The Da Vinci CRD Server Test Suite tests the conformance of server systems
18
+ to [version 2.0.1 of the Da Vinci Coverage Requirements Discovery (CRD)
19
+ Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2).
20
+
21
+ For details on the design and use of these tests, see the wiki including
22
+ - [Suite Details](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Server-Details)
23
+ for a high-level description of the test
24
+ organization, including its components and limitations.
25
+ - [Testing Instructions](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Server-Instructions)
26
+ for a step-by-step guide to execution of these
27
+ tests against a CRD server, including [instructions for a demonstration execution](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Server-Instructions#demonstration-execution)
28
+ against the [public reference implementation](https://crd.davinci.hl7.org/).
29
+ DESCRIPTION
30
+
31
+ suite_summary <<~SUMMARY
32
+ The Da Vinci CRD Server Test Suite tests the conformance of server systems
33
+ to [version 2.0.1 of the Da Vinci Coverage Requirements Discovery (CRD)
34
+ Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2).
35
+ SUMMARY
36
+
37
+ links [
38
+ {
39
+ label: 'Report Issue',
40
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit/issues'
41
+ },
42
+ {
43
+ label: 'Open Source',
44
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit'
45
+ },
46
+ {
47
+ label: 'Download',
48
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit/releases'
49
+ }
50
+ ]
51
+
52
+ requirement_sets(
53
+ {
54
+ identifier: 'hl7.fhir.us.davinci-crd_2.0.1',
55
+ title: 'Da Vinci Coverage Requirements Discovery (CRD) v2.0.1',
56
+ actor: 'Server'
57
+ }
58
+ )
59
+
60
+ input :base_url,
61
+ title: 'CRD server base URL'
62
+
63
+ fhir_resource_validator do
64
+ igs('hl7.fhir.us.davinci-crd#2.0.1')
65
+
66
+ validation_context do
67
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
68
+ end
69
+
70
+ exclude_message do |message|
71
+ # extension definition issue present in 2.0.1 but corrected in later versions
72
+ message.message.match?(%r{The extension http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information is not allowed to be used at this point \(allowed = e:QuestionnaireResponse, e:Encounter, e:NutritionOrder, e:CommunicationRequest, e:DeviceRequest, e:ServiceRequest, e:MedicationRequest; this element is \[Appointment\]\)}) # rubocop:disable Layout/LineLength
73
+ end
74
+ end
75
+
76
+ US_CORE_3_METADATA_PATTERN = File.join(
77
+ Gem::Specification.find_by_name('us_core_test_kit').gem_dir,
78
+ 'lib', 'us_core_test_kit', 'generated', 'v3.1.1', '*', 'metadata.yml'
79
+ )
80
+ CRD_V201_METADATA_PATTERN = File.join(__dir__, 'crd_metadata', '*.yml')
81
+ include(MockEHREndpoints.with do
82
+ Dir.glob([US_CORE_3_METADATA_PATTERN, CRD_V201_METADATA_PATTERN])
83
+ end)
84
+
85
+ route :get, '/jwks.json', JWKSetEndpointHandler
86
+ resume_test_route :get, RESUME_PASS_PATH do |request|
87
+ request.query_parameters['token']
88
+ end
89
+ resume_test_route :get, RESUME_FAIL_PATH, result: 'fail' do |request|
90
+ request.query_parameters['token']
91
+ end
92
+ group from: :crd_v201_server_discovery_group
93
+
94
+ group from: :crd_v201_server_demonstrate_hook_response
95
+
96
+ group from: :crd_v201_server_hooks
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,90 @@
1
+ module DaVinciCRDTestKit
2
+ module V201
3
+ class DiscoveryEndpointTest < Inferno::Test
4
+ title 'Server returns a discovery response'
5
+ id :crd_v201_discovery_endpoint_test
6
+ description %(
7
+ A CDS Service provider must expose its discovery endpoint at `{baseURL}/cds-services`
8
+ as specified in the [CDS Hooks Specification](https://cds-hooks.hl7.org/2.0/#discovery).
9
+
10
+ This test checks that the server responds to a GET request at the following endpoint:
11
+
12
+ `GET {baseURL}/cds-services`
13
+
14
+ It does this by checking that the server responds with an HTTP OK 200 status code
15
+ and that the body of the response is a valid JSON object. This test does not
16
+ inspect the structure and content of the response body to see if it contains the required information.
17
+ It only checks to see if the RESTful interaction is supported and returns a valid JSON object.
18
+ )
19
+
20
+ input_order :base_url, :authentication_required, :encryption_method, :jwks_kid
21
+ input :base_url
22
+ input :authentication_required,
23
+ title: 'Discovery endpoint requires authentication?',
24
+ type: 'radio',
25
+ default: 'no',
26
+ options: {
27
+ list_options: [
28
+ {
29
+ label: 'No',
30
+ value: 'no'
31
+ },
32
+ {
33
+ label: 'Yes',
34
+ value: 'yes'
35
+ }
36
+ ]
37
+ }
38
+ input :encryption_method,
39
+ title: 'JWT Signing Algorithm',
40
+ description: <<~DESCRIPTION,
41
+ CDS Hooks recommends ES384 and RS384 for JWT signature verification.
42
+ Select which method to use.
43
+ DESCRIPTION
44
+ type: 'radio',
45
+ default: 'ES384',
46
+ options: {
47
+ list_options: [
48
+ {
49
+ label: 'ES384',
50
+ value: 'ES384'
51
+ },
52
+ {
53
+ label: 'RS384',
54
+ value: 'RS384'
55
+ }
56
+ ]
57
+ }
58
+ input :jwks_kid,
59
+ title: 'CDS Services JWKS kid',
60
+ description: <<~DESCRIPTION,
61
+ The key ID of the JWKS private key to use for signing the JWTs when invoking a CDS service endpoint
62
+ requiring authentication.
63
+ Defaults to the first JWK in the list if no kid is supplied.
64
+ DESCRIPTION
65
+ optional: true
66
+ output :cds_services
67
+
68
+ run do
69
+ discovery_url = "#{base_url.chomp('/')}/cds-services"
70
+ headers = { 'Accept' => 'application/json' }
71
+
72
+ if authentication_required == 'yes'
73
+ token = JwtHelper.build(
74
+ aud: discovery_url,
75
+ iss: inferno_base_url,
76
+ jku: "#{inferno_base_url}/jwks.json",
77
+ kid: jwks_kid,
78
+ encryption_method:
79
+ )
80
+ headers['Authorization'] = "Bearer #{token}"
81
+ end
82
+ get(discovery_url, headers:, tags: [DISCOVERY_TAG])
83
+ assert_response_status(200)
84
+ assert_valid_json(request.response_body)
85
+
86
+ output cds_services: request.response_body
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,67 @@
1
+ require_relative '../../server_test_helper'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class DiscoveryServicesValidationTest < Inferno::Test
6
+ include DaVinciCRDTestKit::ServerTestHelper
7
+
8
+ title 'Discovery response contains valid services'
9
+ id :crd_v201_discovery_services_validation
10
+ description %(
11
+ As per the [CDS Hooks Spec](https://cds-hooks.hl7.org/2.0/#response),
12
+ the response to the discovery endpoint SHALL be an object containing
13
+ a list of CDS services. If your CDS server hosts no CDS services,
14
+ the discovery endpoint should return a 200 HTTP response with
15
+ an empty array of services.
16
+
17
+ Each CDS service must contain the following required fields:
18
+ `hook`, `description`, and `id`.
19
+
20
+ This test checks for the presence of the required fields and
21
+ validates that they are of the correct type.
22
+
23
+ The test will be skipped if the server hosts no CDS services.
24
+ )
25
+
26
+ input :cds_services
27
+ output :appointment_book_service_ids, :encounter_start_service_ids, :encounter_discharge_service_ids,
28
+ :order_dispatch_service_ids, :order_select_service_ids, :order_sign_service_ids
29
+
30
+ def required_fields
31
+ {
32
+ 'hook' => String,
33
+ 'description' => String,
34
+ 'id' => String
35
+ }
36
+ end
37
+
38
+ run do
39
+ object = parse_json(cds_services)
40
+ assert object['services'], 'Discovery response did not contain `services`'
41
+
42
+ services = object['services']
43
+ assert services.is_a?(Array), 'Services field of the CDS Discovery response object is not an array.'
44
+ skip_if services.empty?, 'Server hosts no CDS Services.'
45
+
46
+ service_hooks_to_ids = services.each_with_object({}) do |service, hash|
47
+ hash[service['hook']] ||= []
48
+ hash[service['hook']] << service['id'] if service['id']
49
+ end
50
+
51
+ output appointment_book_service_ids: service_hooks_to_ids['appointment-book']&.join(', '),
52
+ encounter_start_service_ids: service_hooks_to_ids['encounter-start']&.join(', '),
53
+ encounter_discharge_service_ids: service_hooks_to_ids['encounter-discharge']&.join(', '),
54
+ order_dispatch_service_ids: service_hooks_to_ids['order-dispatch']&.join(', '),
55
+ order_select_service_ids: service_hooks_to_ids['order-select']&.join(', '),
56
+ order_sign_service_ids: service_hooks_to_ids['order-sign']&.join(', ')
57
+
58
+ services.each do |service|
59
+ required_fields.each do |field, type|
60
+ assert(service[field], "Service `#{service}` did not contain required field: `#{field}`")
61
+ assert(service[field].is_a?(type), "Service `#{service}`: field `#{field}` is not of type #{type}")
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,12 @@
1
+ require_relative '../server_urls'
2
+ require_relative '../../server_abstract_invoke_hook_test'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V201
6
+ class ServerInvokeHookTest < ServerAbstractInvokeHookTest
7
+ include ServerURLs
8
+
9
+ id :crd_v201_server_invoke_hook_test
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,34 @@
1
+ require_relative '../../server_test_helper'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class CoverageInformationSystemActionAcrossHooksValidationTest < Inferno::Test
6
+ include DaVinciCRDTestKit::ServerTestHelper
7
+
8
+ title 'Valid Coverage Information system actions received across all hooks'
9
+ id :crd_v201_coverage_info_system_action_across_hooks_validation
10
+ description %(
11
+ This test verifies the presence of valid [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
12
+ system action returned by CRD services across all hooks invoked. It verifies the following for each action:
13
+ - The action type is `update`.
14
+ - The resource within the action conforms its respective FHIR profile.
15
+
16
+ Additionally, the test examines the `coverage-info` extensions within the resource to ensure that:
17
+ - Entries referencing differing coverage have distinct `coverage-assertion-ids` and `satisfied-pa-ids`
18
+ (if present).
19
+ - Entries referencing the same coverage have the same `coverage-assertion-ids` and `satisfied-pa-ids`
20
+ (if present).
21
+
22
+ The test will be skipped if no valid Coverage Information system actions are returned across all hooks.
23
+ )
24
+
25
+ run do
26
+ verify_at_least_one_test_passes(
27
+ self.class.parent.parent.groups,
28
+ 'crd_v201_coverage_info_system_action_validation',
29
+ 'None of the hooks invoked returned valid Coverage Info system actions.'
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../../server_test_helper'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class ExternalReferenceCardAcrossHooksValidationTest < Inferno::Test
6
+ include DaVinciCRDTestKit::ServerTestHelper
7
+
8
+ title 'Valid External Reference cards received across all hooks'
9
+ id :crd_v201_external_reference_card_across_hooks_validation
10
+ description %(
11
+ This test verifies the presence of valid External Reference returned by CRD services across all hooks invoked.
12
+ As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference),
13
+ External Reference cards must contain links with the type set to `absolute`.
14
+ This test checks for the presence of any External Reference cards by verifying:
15
+ - The presence of a `links` array within each card.
16
+ - That every link in the `links` array of a card is of type `absolute`.
17
+
18
+ The test will be skipped if no valid External Reference cards are returned across all hooks.
19
+ )
20
+
21
+ run do
22
+ verify_at_least_one_test_passes(
23
+ self.class.parent.parent.groups,
24
+ 'crd_v201_external_reference_card_validation',
25
+ 'None of the hooks invoked returned an External Reference card.'
26
+ )
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../server_test_helper'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ class InstructionsCardReceivedAcrossHooksTest < Inferno::Test
6
+ include DaVinciCRDTestKit::ServerTestHelper
7
+
8
+ title 'Valid Instructions cards received across all hooks'
9
+ id :crd_v201_valid_instructions_card_received_across_hooks
10
+ description %(
11
+ This test validates that a valid [Instructions card](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions)
12
+ was received across all hooks responses.
13
+
14
+ The test will be skipped if no valid Instructions cards are returned across all hooks.
15
+ )
16
+
17
+ run do
18
+ verify_at_least_one_test_passes(
19
+ self.class.parent.parent.groups,
20
+ 'crd_v201_valid_instructions_card_received',
21
+ 'None of the hooks invoked returned a valid Instructions card.',
22
+ 'across_hooks'
23
+ )
24
+ end
25
+ end
26
+ end
27
+ end