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,216 @@
1
+ require_relative '../../cross_suite/tags'
2
+ require_relative 'interaction/server_invoke_hook_test'
3
+ require_relative 'verify_request/service_request_required_fields_validation_test'
4
+ require_relative 'verify_request/service_request_optional_fields_validation_test'
5
+ require_relative 'verify_request/service_request_context_validation_test'
6
+ require_relative 'verify_response/service_response_validation_test'
7
+ require_relative 'verify_response/card_optional_fields_validation_test'
8
+ require_relative 'verify_response/external_reference_card_validation_test'
9
+ require_relative 'verify_response/launch_smart_app_card_validation_test'
10
+ require_relative 'verify_response/instructions_card_received_test'
11
+ require_relative 'verify_response/coverage_information_system_action_received_test'
12
+ require_relative 'verify_response/coverage_information_system_action_validation_test'
13
+ require_relative 'verify_response/propose_alternate_request_card_validation_test'
14
+ require_relative 'verify_response/additional_orders_validation_test'
15
+ require_relative 'verify_response/form_completion_response_validation_test'
16
+ require_relative 'verify_response/create_or_update_coverage_info_response_validation_test'
17
+
18
+ module DaVinciCRDTestKit
19
+ module V201
20
+ class ServerOrderSignGroup < Inferno::TestGroup
21
+ title 'order-sign'
22
+ id :crd_v201_server_order_sign
23
+ description %(
24
+ This group of tests invokes the order-sign hook and ensures that
25
+ the user-provided requests are valid as per the requirements described
26
+ in the [CRD IG section on order-sign hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
27
+ and the [CDS Hooks specification section on order-sign context](https://cds-hooks.hl7.org/hooks/order-sign/2023SepSTU1Ballot/order-sign/).
28
+ It also ensures that the contents of the server's response are valid as per the requirements described in
29
+ the [CRD IG section on order-sign hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
30
+ and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
31
+
32
+ The [CRD IG section on order-sign hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
33
+ states that "servers SHALL, at minimum, support returning and processing the Coverage Information
34
+ system action for all invocations of this hook."
35
+
36
+ This group includes tests to validate the following CRD response types:
37
+ - [additional orders as companions/prerequisites](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#identify-additional-orders-as-companionsprerequisites-for-current-order)\
38
+ - optional
39
+ - [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
40
+ - [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
41
+ - optional
42
+ - [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
43
+ - [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions) - optional
44
+ - [Launch SMART application](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application) -
45
+ optional
46
+ - [Propose alternate request](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#propose-alternate-request) -
47
+ optional
48
+ - [Request form completion](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion) -
49
+ optional
50
+ )
51
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@164', 'hl7.fhir.us.davinci-crd_2.0.1@168',
52
+ 'hl7.fhir.us.davinci-crd_2.0.1@217', 'hl7.fhir.us.davinci-crd_2.0.1@226'
53
+
54
+ config options: { hook_name: ORDER_SIGN_TAG }
55
+ run_as_group
56
+
57
+ group do
58
+ title 'Make Hook Requests'
59
+
60
+ test from: :crd_v201_server_invoke_hook_test,
61
+ config: {
62
+ inputs: {
63
+ service_ids: {
64
+ name: :order_sign_service_ids,
65
+ title: 'Service id for the service that implements the `order-sign` hook'
66
+ },
67
+ service_request_bodies: {
68
+ name: :order_sign_request_bodies,
69
+ title: 'Request body or bodies for invoking the `order-sign` hook'
70
+ }
71
+ }
72
+ }
73
+ end
74
+
75
+ group do
76
+ title 'Verify Requests'
77
+
78
+ test from: :crd_v201_service_request_required_fields_validation,
79
+ config: {
80
+ outputs: {
81
+ contexts: {
82
+ name: :order_sign_contexts
83
+ }
84
+ }
85
+ }
86
+ test from: :crd_v201_service_request_context_validation,
87
+ config: {
88
+ inputs: {
89
+ contexts: {
90
+ name: :order_sign_contexts
91
+ }
92
+ }
93
+ }
94
+ test from: :crd_v201_service_request_optional_fields_validation
95
+ end
96
+
97
+ group do
98
+ title 'Verify Responses'
99
+
100
+ test from: :crd_v201_service_response_validation,
101
+ config: {
102
+ outputs: {
103
+ valid_cards: {
104
+ name: :order_sign_valid_cards
105
+ },
106
+ valid_system_actions: {
107
+ name: :order_sign_valid_system_actions
108
+ }
109
+ }
110
+ }
111
+ test from: :crd_v201_card_optional_fields_validation,
112
+ config: {
113
+ inputs: {
114
+ valid_cards: {
115
+ name: :order_sign_valid_cards
116
+ }
117
+ },
118
+ outputs: {
119
+ valid_cards_with_links: {
120
+ name: :order_sign_valid_cards_with_links
121
+ },
122
+ valid_cards_with_suggestions: {
123
+ name: :order_sign_valid_cards_with_suggestions
124
+ }
125
+ }
126
+ }
127
+ test from: :crd_v201_external_reference_card_validation,
128
+ config: {
129
+ inputs: {
130
+ valid_cards_with_links: {
131
+ name: :order_sign_valid_cards_with_links
132
+ }
133
+ }
134
+ }
135
+ test from: :crd_v201_launch_smart_app_card_validation,
136
+ config: {
137
+ inputs: {
138
+ valid_cards_with_links: {
139
+ name: :order_sign_valid_cards_with_links
140
+ }
141
+ }
142
+ }
143
+ test from: :crd_v201_valid_instructions_card_received,
144
+ config: {
145
+ inputs: {
146
+ valid_cards: {
147
+ name: :order_sign_valid_cards
148
+ }
149
+ }
150
+ }
151
+ test from: :crd_v201_coverage_info_system_action_received,
152
+ config: {
153
+ inputs: {
154
+ valid_system_actions: {
155
+ name: :order_sign_valid_system_actions
156
+ }
157
+ },
158
+ outputs: {
159
+ coverage_info: {
160
+ name: :order_sign_coverage_info
161
+ }
162
+ }
163
+ }
164
+ test from: :crd_v201_coverage_info_system_action_validation,
165
+ config: {
166
+ inputs: {
167
+ coverage_info: {
168
+ name: :order_sign_coverage_info
169
+ }
170
+ }
171
+ }
172
+ test from: :crd_v201_propose_alternate_request_card_validation,
173
+ config: {
174
+ inputs: {
175
+ valid_cards_with_suggestions: {
176
+ name: :order_sign_valid_cards_with_suggestions
177
+ },
178
+ contexts: {
179
+ name: :order_sign_contexts
180
+ }
181
+ }
182
+ }
183
+ test from: :crd_v201_additional_orders_card_validation,
184
+ config: {
185
+ inputs: {
186
+ valid_cards_with_suggestions: {
187
+ name: :order_sign_valid_cards_with_suggestions
188
+ }
189
+ }
190
+ }
191
+ test from: :crd_v201_request_form_completion_response_validation,
192
+ config: {
193
+ inputs: {
194
+ valid_system_actions: {
195
+ name: :order_sign_valid_system_actions
196
+ },
197
+ valid_cards_with_suggestions: {
198
+ name: :order_sign_valid_cards_with_suggestions
199
+ }
200
+ }
201
+ }
202
+ test from: :crd_v201_create_or_update_coverage_info_response_validation,
203
+ config: {
204
+ inputs: {
205
+ valid_system_actions: {
206
+ name: :order_sign_valid_system_actions
207
+ },
208
+ valid_cards_with_suggestions: {
209
+ name: :order_sign_valid_cards_with_suggestions
210
+ }
211
+ }
212
+ }
213
+ end
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'must_support/external_reference_card_across_hooks_validation_test'
2
+ require_relative 'must_support/instructions_card_received_across_hooks_test'
3
+ require_relative 'must_support/coverage_information_system_action_across_hooks_validation_test'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V201
7
+ class ServerRequiredCardResponseValidationGroup < Inferno::TestGroup
8
+ title 'Required Card Response Validation'
9
+ description %(
10
+ This group contains tests to verify the presence and validity of required response types
11
+ across all hooks invoked. As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#potential-crd-response-types),
12
+ CRD Servers SHALL, at minimum, demonstrate an ability to return the following response types:
13
+ - Coverage Information System Action
14
+ - External Reference Card
15
+ - Instructions Card
16
+ )
17
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@247', 'hl7.fhir.us.davinci-crd_2.0.1@248',
18
+ 'hl7.fhir.us.davinci-crd_2.0.1@249'
19
+
20
+ id :crd_v201_server_required_card_response_validation
21
+ run_as_group
22
+
23
+ test from: :crd_v201_external_reference_card_across_hooks_validation
24
+ test from: :crd_v201_valid_instructions_card_received_across_hooks
25
+ test from: :crd_v201_coverage_info_system_action_across_hooks_validation
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../server_base_urls'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V201
5
+ module ServerURLs
6
+ include ServerBaseURLs
7
+
8
+ def suite_id
9
+ DaVinciCRDTestKit::V201::CRDServerSuite.id
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../../server_hook_request_validation'
2
+ require_relative '../../server_test_helper'
3
+ require_relative '../../server_hook_helper'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V201
7
+ class ServiceRequestContextValidationTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerHookRequestValidation
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+
12
+ title 'All service requests contain valid context'
13
+ id :crd_v201_service_request_context_validation
14
+ description %(
15
+ This test verifies that all service requests `context` field is valid and contains all the
16
+ required fields.
17
+ )
18
+ input :contexts, :invoked_hook
19
+
20
+ run do
21
+ parsed_contexts = parse_json(contexts)
22
+ parsed_contexts.each do |context|
23
+ hook_request_context_check(context, invoked_hook, ig_version: 'v201')
24
+ end
25
+
26
+ no_error_validation('Some contexts are not valid.')
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ require_relative '../../server_hook_request_validation'
2
+ require_relative '../../server_hook_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V201
6
+ class ServiceRequestOptionalFieldsValidationTest < Inferno::Test
7
+ include DaVinciCRDTestKit::ServerHookRequestValidation
8
+ include DaVinciCRDTestKit::ServerHookHelper
9
+
10
+ title 'All service requests contain optional fields'
11
+ id :crd_v201_service_request_optional_fields_validation
12
+ description %(
13
+ This optional test reviews the user-submitted CRD service requests for the presence of optional fields:
14
+ `fhirAuthorization` and `prefetch`.
15
+
16
+ The test will not fail if these optional fields are missing from a service request; instead, it generates an
17
+ informational message.
18
+ )
19
+ optional
20
+
21
+ run do
22
+ load_tagged_requests(tested_hook_name)
23
+ skip_if requests.empty?, "No #{tested_hook_name} request was made in a previous test as expected."
24
+
25
+ requests.each_with_index do |request, index|
26
+ @request_number = index + 1
27
+ request_body = json_parse(request.request_body)
28
+ if request_body.blank?
29
+ add_message('error', "#{request_number}Hook request body cannot be empty.")
30
+ next
31
+ end
32
+
33
+ hook_request_optional_fields_check(request_body, ig_version: 'v201')
34
+ end
35
+ no_error_validation('Some service requests have invalid optional fields.')
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../server_hook_request_validation'
2
+ require_relative '../../server_hook_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V201
6
+ class ServiceRequestRequiredFieldsValidationTest < Inferno::Test
7
+ include DaVinciCRDTestKit::ServerHookRequestValidation
8
+ include DaVinciCRDTestKit::ServerHookHelper
9
+
10
+ title 'All service requests contain required fields'
11
+ id :crd_v201_service_request_required_fields_validation
12
+ description %(
13
+ This test validates all CRD service requests provided by the user, ensuring each includes all required fields
14
+ specified in the [CDS Hooks spec section on Calling a CDS Service](https://cds-hooks.hl7.org/2.0/#calling-a-cds-service):
15
+ `hook`, `hookInstance`, and `context`. Furthermore, the test checks for the conditional presence of the
16
+ `fhirServer` field if `fhirAuthorization` is included.
17
+ )
18
+ input :invoked_hook
19
+ output :contexts
20
+
21
+ run do
22
+ load_tagged_requests(tested_hook_name)
23
+ skip_if requests.empty?, "No #{tested_hook_name} request was made in a previous test as expected."
24
+ contexts = []
25
+ requests.each_with_index do |request, index|
26
+ @request_number = index + 1
27
+ request_body = json_parse(request.request_body)
28
+ next if request_body.blank?
29
+
30
+ contexts << request_body['context'] if request_body['context'].is_a?(Hash)
31
+ hook_request_required_fields_check(request_body, invoked_hook, ig_version: 'v201')
32
+ end
33
+
34
+ output contexts: contexts.to_json
35
+
36
+ no_error_validation('Some service requests made are not valid.')
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,59 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/suggestion_actions_validation'
4
+ require_relative '../../../cross_suite/cards_identification'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V201
8
+ class AdditionalOrdersValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::SuggestionActionsValidation
11
+ include DaVinciCRDTestKit::ServerHookHelper
12
+ include DaVinciCRDTestKit::CardsIdentification
13
+
14
+ title 'Valid Additional Orders as companions/prerequisites cards received'
15
+ id :crd_v201_additional_orders_card_validation
16
+ description %(
17
+ This test validates that an [Additional Orders as companions/prerequisites](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#identify-additional-orders-as-companionsprerequisites-for-current-order)
18
+ card was received. It does so by:
19
+ - Filtering cards with the following criteria:
20
+ - For each suggestion in the card's suggestions array, all actions have a type of 'create'
21
+ and the action's resource type is one of the expected types: CommunicationRequest, Device,
22
+ DeviceRequest, Medication, MedicationRequest, NutritionOrder, ServiceRequest, or VisionPrescription.
23
+ - Then, for each valid Additional Orders card retrieved, verifying that each action within the
24
+ card's suggestions complies with their respective profiles as specified in the
25
+ [CRD IG section on Additional Orders as companions/prerequisites](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#identify-additional-orders-as-companionsprerequisites-for-current-order):
26
+ - [crd-profile-communicationrequest](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-communicationrequest.html)
27
+ - [crd-profile-device](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-device.html)
28
+ - [crd-profile-deviceRequest](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-devicerequest.html)
29
+ - [us-core-medication](http://hl7.org/fhir/us/core/STU3.1.1/StructureDefinition-us-core-medication.html)
30
+ - [crd-profile-medicationRequest](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-medicationrequest.html)
31
+ - [crd-profile-nutritionOrder](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-nutritionorder.html)
32
+ - [crd-profile-serviceRequest](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-servicerequest.html)
33
+ - [crd-profile-visionPrescription](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-visionprescription.html).
34
+
35
+ The test will skip if no Additional Orders cards are found.
36
+ )
37
+
38
+ optional
39
+ input :valid_cards_with_suggestions
40
+
41
+ run do
42
+ parsed_cards = parse_json(valid_cards_with_suggestions)
43
+ additional_orders_cards = parsed_cards.filter do |card|
44
+ additional_orders_response_type?(card)
45
+ end
46
+ skip_if additional_orders_cards.blank?,
47
+ "#{tested_hook_name} hook response does not include Additional Orders as companion/prerequisite cards."
48
+
49
+ additional_orders_cards.each do |card|
50
+ card['suggestions'].each do |suggestion|
51
+ actions_check(suggestion['actions'], ig_version: 'v201')
52
+ end
53
+ end
54
+
55
+ no_error_validation('Some companions/prerequisites Additional Order cards are not valid.')
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_request_validation'
3
+ require_relative '../../../cross_suite/cards_validation'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V201
7
+ class CardOptionalFieldsValidationTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerTestHelper
9
+ include DaVinciCRDTestKit::ServerHookRequestValidation
10
+ include DaVinciCRDTestKit::CardsValidation
11
+
12
+ title 'Cards contain valid optional fields'
13
+ id :crd_v201_card_optional_fields_validation
14
+ description %(
15
+ This test checks for the presence and validity of optional fields in a card,
16
+ but only if the card's required fields are valid. As specified in the
17
+ [CDS Hooks specification section on Card Attributes](https://cds-hooks.hl7.org/2.0/#card-attributes),
18
+ the optional fields include `uuid`, `detail`, `suggestions`, `overrideReasons`, and `links`.
19
+
20
+ Additionally, the test validates the presence of the conditional field `selectionBehavior`
21
+ only if the `suggestions` field is present.
22
+ )
23
+ optional
24
+ input :valid_cards
25
+ output :valid_cards_with_links, :valid_cards_with_suggestions
26
+
27
+ def cards_with_suggestions
28
+ @cards_with_suggestions ||= []
29
+ end
30
+
31
+ def cards_with_links
32
+ @cards_with_links ||= []
33
+ end
34
+
35
+ run do
36
+ parsed_cards = parse_json(valid_cards)
37
+ parsed_cards.each do |card|
38
+ if valid_card_with_optionals?(card, 'v201')
39
+ cards_with_links << card if card['links']
40
+ cards_with_suggestions << card if card['suggestions']
41
+ end
42
+ end
43
+
44
+ output valid_cards_with_links: cards_with_links.to_json
45
+ output valid_cards_with_suggestions: cards_with_suggestions.to_json
46
+
47
+ no_error_validation('Some cards with valid required fields have invalid optional fields.')
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,65 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/cards_identification'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V201
7
+ class CoverageInformationSystemActionReceivedTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerTestHelper
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::CardsIdentification
11
+
12
+ title 'Coverage Information system action was received'
13
+ id :crd_v201_coverage_info_system_action_received
14
+ description %(
15
+ This test validates that a [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
16
+ system action was returned. It does so by:
17
+ - First checking for the presence of actions with a `resource` element of the following types:
18
+ - For `appointment-book`: Appointment
19
+ - For `order-sign` or `order-dispatch`: DeviceRequest, MedicationRequest, NutritionOrder,
20
+ ServiceRequest, or VisionPrescription
21
+ - Then, among the target actions, checking if their resource has the [coverage-information extension](http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information).
22
+ )
23
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@272', 'hl7.fhir.us.davinci-crd_2.0.1@273',
24
+ 'hl7.fhir.us.davinci-crd_2.0.1@274', 'hl7.fhir.us.davinci-crd_2.0.1@275',
25
+ 'hl7.fhir.us.davinci-crd_2.0.1@276', 'hl7.fhir.us.davinci-crd_2.0.1@277'
26
+
27
+ input :valid_system_actions, :invoked_hook
28
+ output :coverage_info
29
+
30
+ def resources_by_hook
31
+ shared_resources = [
32
+ 'DeviceRequest', 'MedicationRequest', 'NutritionOrder',
33
+ 'ServiceRequest', 'VisionPrescription'
34
+ ]
35
+ {
36
+ 'appointment-book' => ['Appointment'],
37
+ 'order-sign' => shared_resources,
38
+ 'order-dispatch' => shared_resources,
39
+ 'order-select' => shared_resources,
40
+ 'encounter-start' => ['Encounter'],
41
+ 'encounter-discharge' => ['Encounter']
42
+ }
43
+ end
44
+
45
+ run do
46
+ parsed_actions = parse_json(valid_system_actions)
47
+ target_resources = resources_by_hook[invoked_hook]
48
+
49
+ target_actions = parsed_actions.select do |action|
50
+ resource = FHIR.from_contents(action['resource'].to_json)
51
+ target_resources.include?(resource&.resourceType)
52
+ end
53
+
54
+ coverage_info_system_actions = target_actions.select do |action|
55
+ coverage_information_response_type?(action)
56
+ end
57
+
58
+ assert coverage_info_system_actions.present?,
59
+ "Coverage Information system action was not returned in the #{tested_hook_name} hook response."
60
+
61
+ output coverage_info: coverage_info_system_actions.to_json
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,120 @@
1
+ require_relative '../../server_hook_request_validation'
2
+ require_relative '../../server_test_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V201
6
+ class CoverageInformationSystemActionValidationTest < Inferno::Test
7
+ include DaVinciCRDTestKit::ServerHookRequestValidation
8
+ include DaVinciCRDTestKit::ServerTestHelper
9
+
10
+ title 'All Coverage Information system actions received are valid'
11
+ id :crd_v201_coverage_info_system_action_validation
12
+ description %(
13
+ This test validates all [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
14
+ system actions received. It verifies the following for each action:
15
+ - The action type is `update`.
16
+ - The resource within the action conforms its respective FHIR profile.
17
+
18
+ Additionally, the test examines the `coverage-info` extensions within the resource to ensure that:
19
+ - Entries referencing differing coverage have distinct `coverage-assertion-ids` and `satisfied-pa-ids`
20
+ (if present).
21
+ - Entries referencing the same coverage have the same `coverage-assertion-ids` and `satisfied-pa-ids`
22
+ (if present).
23
+ )
24
+ input :coverage_info
25
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@264', 'hl7.fhir.us.davinci-crd_2.0.1@265'
26
+
27
+ def find_extension_value(extension, url, *properties)
28
+ found_extension = extension.extension.find { |ext| ext.url == url }
29
+ return nil unless found_extension
30
+
31
+ properties.reduce(found_extension) do |current, prop|
32
+ return current unless current.respond_to?(prop)
33
+
34
+ current.send(prop)
35
+ end
36
+ end
37
+
38
+ def extract_and_group_coverage_info(resource)
39
+ resource.extension.each_with_object({}) do |extension, grouped_extensions|
40
+ next unless extension.url == 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information'
41
+
42
+ coverage_key = find_extension_value(extension, 'coverage', 'valueReference', 'reference')
43
+ grouped_extensions[coverage_key] ||= []
44
+ grouped_extensions[coverage_key] << extension
45
+ end
46
+ end
47
+
48
+ # For the same coverage, ensure coverage-assertion-ids and satisfied-pa-ids are the same.
49
+ # For different coverages, ensure coverage-assertion-ids and satisfied-pa-ids are distinct.
50
+ def multiple_extensions_conformance_check(grouped_coverage_info, resource)
51
+ resource_ref = "#{resource.resourceType}/#{resource.id}"
52
+ assertion_ids_across_coverages = Set.new
53
+ pa_ids_across_coverages = Set.new
54
+
55
+ grouped_coverage_info.each do |coverage, extensions|
56
+ coverage_assertion_ids = collect_extensions_id(extensions, 'coverage-assertion-id', 'valueString').uniq
57
+ satisfied_pa_ids = collect_extensions_id(extensions, 'satisfied-pa-id', 'valueString').uniq.compact
58
+ assert coverage_assertion_ids.length == 1,
59
+ same_coverage_conformance_error_msg(resource_ref, coverage, 'coverage-assertion-ids')
60
+
61
+ assert satisfied_pa_ids.length <= 1,
62
+ same_coverage_conformance_error_msg(resource_ref, coverage, 'satisfied-pa-ids')
63
+
64
+ assertion_id = coverage_assertion_ids.first
65
+ assert !assertion_ids_across_coverages.include?(assertion_id),
66
+ different_coverage_conformance_error_msg(resource_ref, 'coverage-assertion-ids')
67
+ assertion_ids_across_coverages.add(assertion_id)
68
+ pa_id = satisfied_pa_ids.first
69
+ next unless pa_id
70
+
71
+ assert !pa_ids_across_coverages.include?(pa_id),
72
+ different_coverage_conformance_error_msg(resource_ref, 'satisfied-pa-ids')
73
+ pa_ids_across_coverages.add(pa_id)
74
+ end
75
+ end
76
+
77
+ def collect_extensions_id(extensions, url, *properties)
78
+ extensions.map do |extension|
79
+ find_extension_value(extension, url, *properties)
80
+ end
81
+ end
82
+
83
+ def same_coverage_conformance_error_msg(resource_ref, coverage, id_name)
84
+ "#{resource_ref}: extension has multiple repetitions of coverage `#{coverage}` with different #{id_name}."
85
+ end
86
+
87
+ def different_coverage_conformance_error_msg(resource_ref, id_name)
88
+ "#{resource_ref}: extensions referencing differing coverage SHALL have distinct #{id_name}."
89
+ end
90
+
91
+ def coverage_info_system_action_check(coverage_info_system_action)
92
+ type = coverage_info_system_action['type']
93
+ assert type, '`type` field is missing.'
94
+ assert type == 'update', "`type` must be `update`, but was `#{type}`"
95
+
96
+ resource = FHIR.from_contents(coverage_info_system_action['resource'].to_json)
97
+ profile_url = structure_definition_map('v201')[resource.resourceType]
98
+ assert_valid_resource(resource:, profile_url:)
99
+
100
+ grouped_coverage_info = extract_and_group_coverage_info(resource)
101
+ multiple_extensions_conformance_check(grouped_coverage_info, resource)
102
+ end
103
+
104
+ run do
105
+ parsed_coverage_info = parse_json(coverage_info)
106
+ error_messages = []
107
+ parsed_coverage_info.each do |action|
108
+ coverage_info_system_action_check(action)
109
+ rescue Inferno::Exceptions::AssertionException => e
110
+ error_messages << "Coverage Info system action `#{action}`: #{e.message}"
111
+ end
112
+
113
+ error_messages.each do |msg|
114
+ messages << { type: 'error', message: msg }
115
+ end
116
+ assert error_messages.empty?, 'Some Coverage Info system actions are not valid.'
117
+ end
118
+ end
119
+ end
120
+ end