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
@@ -1,118 +0,0 @@
1
- require_relative '../server_hook_request_validation'
2
- require_relative '../test_helper'
3
-
4
- module DaVinciCRDTestKit
5
- class CoverageInformationSystemActionValidationTest < Inferno::Test
6
- include DaVinciCRDTestKit::ServerHookRequestValidation
7
- include DaVinciCRDTestKit::TestHelper
8
-
9
- title 'All Coverage Information system actions received are valid'
10
- id :crd_coverage_info_system_action_validation
11
- description %(
12
- This test validates all [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
13
- system actions received. It verifies the following for each action:
14
- - The action type is `update`.
15
- - The resource within the action conforms its respective FHIR profile.
16
-
17
- Additionally, the test examines the `coverage-info` extensions within the resource to ensure that:
18
- - Entries referencing differing coverage have distinct `coverage-assertion-ids` and `satisfied-pa-ids`
19
- (if present).
20
- - Entries referencing the same coverage have the same `coverage-assertion-ids` and `satisfied-pa-ids`
21
- (if present).
22
- )
23
- input :coverage_info
24
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@264', 'hl7.fhir.us.davinci-crd_2.0.1@265'
25
-
26
- def find_extension_value(extension, url, *properties)
27
- found_extension = extension.extension.find { |ext| ext.url == url }
28
- return nil unless found_extension
29
-
30
- properties.reduce(found_extension) do |current, prop|
31
- return current unless current.respond_to?(prop)
32
-
33
- current.send(prop)
34
- end
35
- end
36
-
37
- def extract_and_group_coverage_info(resource)
38
- resource.extension.each_with_object({}) do |extension, grouped_extensions|
39
- next unless extension.url == 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information'
40
-
41
- coverage_key = find_extension_value(extension, 'coverage', 'valueReference', 'reference')
42
- grouped_extensions[coverage_key] ||= []
43
- grouped_extensions[coverage_key] << extension
44
- end
45
- end
46
-
47
- # For the same coverage, ensure coverage-assertion-ids and satisfied-pa-ids are the same.
48
- # For different coverages, ensure coverage-assertion-ids and satisfied-pa-ids are distinct.
49
- def multiple_extensions_conformance_check(grouped_coverage_info, resource)
50
- resource_ref = "#{resource.resourceType}/#{resource.id}"
51
- assertion_ids_across_coverages = Set.new
52
- pa_ids_across_coverages = Set.new
53
-
54
- grouped_coverage_info.each do |coverage, extensions|
55
- coverage_assertion_ids = collect_extensions_id(extensions, 'coverage-assertion-id', 'valueString').uniq
56
- satisfied_pa_ids = collect_extensions_id(extensions, 'satisfied-pa-id', 'valueString').uniq.compact
57
- assert coverage_assertion_ids.length == 1,
58
- same_coverage_conformance_error_msg(resource_ref, coverage, 'coverage-assertion-ids')
59
-
60
- assert satisfied_pa_ids.length <= 1,
61
- same_coverage_conformance_error_msg(resource_ref, coverage, 'satisfied-pa-ids')
62
-
63
- assertion_id = coverage_assertion_ids.first
64
- assert !assertion_ids_across_coverages.include?(assertion_id),
65
- different_coverage_conformance_error_msg(resource_ref, 'coverage-assertion-ids')
66
- assertion_ids_across_coverages.add(assertion_id)
67
- pa_id = satisfied_pa_ids.first
68
- next unless pa_id
69
-
70
- assert !pa_ids_across_coverages.include?(pa_id),
71
- different_coverage_conformance_error_msg(resource_ref, 'satisfied-pa-ids')
72
- pa_ids_across_coverages.add(pa_id)
73
- end
74
- end
75
-
76
- def collect_extensions_id(extensions, url, *properties)
77
- extensions.map do |extension|
78
- find_extension_value(extension, url, *properties)
79
- end
80
- end
81
-
82
- def same_coverage_conformance_error_msg(resource_ref, coverage, id_name)
83
- "#{resource_ref}: extension has multiple repetitions of coverage `#{coverage}` with different #{id_name}."
84
- end
85
-
86
- def different_coverage_conformance_error_msg(resource_ref, id_name)
87
- "#{resource_ref}: extensions referencing differing coverage SHALL have distinct #{id_name}."
88
- end
89
-
90
- def coverage_info_system_action_check(coverage_info_system_action)
91
- type = coverage_info_system_action['type']
92
- assert type, '`type` field is missing.'
93
- assert type == 'update', "`type` must be `update`, but was `#{type}`"
94
-
95
- resource = FHIR.from_contents(coverage_info_system_action['resource'].to_json)
96
- profile_url = structure_definition_map[resource.resourceType]
97
- assert_valid_resource(resource:, profile_url:)
98
-
99
- grouped_coverage_info = extract_and_group_coverage_info(resource)
100
- multiple_extensions_conformance_check(grouped_coverage_info, resource)
101
- end
102
-
103
- run do
104
- parsed_coverage_info = parse_json(coverage_info)
105
- error_messages = []
106
- parsed_coverage_info.each do |action|
107
- coverage_info_system_action_check(action)
108
- rescue Inferno::Exceptions::AssertionException => e
109
- error_messages << "Coverage Info system action `#{action}`: #{e.message}"
110
- end
111
-
112
- error_messages.each do |msg|
113
- messages << { type: 'error', message: msg }
114
- end
115
- assert error_messages.empty?, 'Some Coverage Info system actions are not valid.'
116
- end
117
- end
118
- end
@@ -1,71 +0,0 @@
1
- require_relative '../test_helper'
2
- require_relative '../suggestion_actions_validation'
3
- require_relative '../server_hook_helper'
4
-
5
- module DaVinciCRDTestKit
6
- class CreateOrUpdateCoverageInfoResponseValidationTest < Inferno::Test
7
- include DaVinciCRDTestKit::TestHelper
8
- include DaVinciCRDTestKit::SuggestionActionsValidation
9
- include DaVinciCRDTestKit::ServerHookHelper
10
-
11
- title 'Valid Create or Update Coverage Information cards or system actions received'
12
- id :crd_create_or_update_coverage_info_response_validation
13
- description %(
14
- This test validates the Create or Update Coverage Information cards or system actions received from the
15
- CRD service, as per the specifications outlined in the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information).
16
-
17
- - **Checking for Presence:**
18
- The test first checks if any Create or Update Coverage Information cards or system actions are present in
19
- the returned valid cards or valid system actions.
20
- - **For cards**: it ensures there are cards with a `suggestions` array containing a single suggestion,
21
- and the `actions` array of that suggestion has one `create` or `update` action for the `Coverage` resource.
22
- - **For system actions**: it checks for the presence of `create` or `update` actions for the `Coverage`
23
- resource.
24
-
25
- - **Validating:**
26
- If any Create or Update Coverage Information cards or system actions are found, each `Coverage` resource is
27
- validated against the base FHIR Coverage resource.
28
-
29
- If no Create or Update Coverage Information cards or system actions are received, the test is skipped.
30
- )
31
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@306'
32
- optional
33
- input :valid_cards_with_suggestions, :valid_system_actions
34
-
35
- def coverage_actions(actions)
36
- return [] if actions.nil?
37
-
38
- valid_types = ['create', 'update']
39
- actions.filter do |action|
40
- valid_types.include?(action['type']) && action_resource_type_check(action, ['Coverage'])
41
- end
42
- end
43
-
44
- def create_or_update_coverage_info_card?(card)
45
- card['suggestions'].one? && coverage_actions(card['suggestions'].first['actions']).one?
46
- end
47
-
48
- run do
49
- parsed_cards = parse_json(valid_cards_with_suggestions)
50
- parsed_actions = parse_json(valid_system_actions)
51
-
52
- create_or_update_coverage_info_cards = parsed_cards.filter { |card| create_or_update_coverage_info_card?(card) }
53
- create_or_update_coverage_info_actions = coverage_actions(parsed_actions)
54
-
55
- skip_msg = "#{tested_hook_name} hook response does not contain any Create or Update Coverage Information " \
56
- 'cards or system actions.'
57
- skip_if create_or_update_coverage_info_cards.blank? && create_or_update_coverage_info_actions.blank?, skip_msg
58
-
59
- actions_check(create_or_update_coverage_info_actions) if create_or_update_coverage_info_actions.present?
60
-
61
- if create_or_update_coverage_info_cards.present?
62
- create_or_update_coverage_info_cards.each do |card|
63
- actions = card['suggestions'].first['actions']
64
- actions_check(coverage_actions(actions))
65
- end
66
- end
67
-
68
- no_error_validation('Some Create or Update Coverage Information received are not valid.')
69
- end
70
- end
71
- end
@@ -1,88 +0,0 @@
1
- module DaVinciCRDTestKit
2
- class DiscoveryEndpointTest < Inferno::Test
3
- title 'Server returns a discovery response'
4
- id :crd_discovery_endpoint_test
5
- description %(
6
- A CDS Service provider must expose its discovery endpoint at `{baseURL}/cds-services`
7
- as specified in the [CDS Hooks Specification](https://cds-hooks.hl7.org/2.0/#discovery).
8
-
9
- This test checks that the server responds to a GET request at the following endpoint:
10
-
11
- `GET {baseURL}/cds-services`
12
-
13
- It does this by checking that the server responds with an HTTP OK 200 status code
14
- and that the body of the response is a valid JSON object. This test does not
15
- inspect the structure and content of the response body to see if it contains the required information.
16
- It only checks to see if the RESTful interaction is supported and returns a valid JSON object.
17
- )
18
-
19
- input_order :base_url, :authentication_required, :encryption_method, :jwks_kid
20
- input :base_url
21
- input :authentication_required,
22
- title: 'Discovery endpoint requires authentication?',
23
- type: 'radio',
24
- default: 'no',
25
- options: {
26
- list_options: [
27
- {
28
- label: 'No',
29
- value: 'no'
30
- },
31
- {
32
- label: 'Yes',
33
- value: 'yes'
34
- }
35
- ]
36
- }
37
- input :encryption_method,
38
- title: 'JWT Signing Algorithm',
39
- description: <<~DESCRIPTION,
40
- CDS Hooks recommends ES384 and RS384 for JWT signature verification.
41
- Select which method to use.
42
- DESCRIPTION
43
- type: 'radio',
44
- default: 'ES384',
45
- options: {
46
- list_options: [
47
- {
48
- label: 'ES384',
49
- value: 'ES384'
50
- },
51
- {
52
- label: 'RS384',
53
- value: 'RS384'
54
- }
55
- ]
56
- }
57
- input :jwks_kid,
58
- title: 'CDS Services JWKS kid',
59
- description: <<~DESCRIPTION,
60
- The key ID of the JWKS private key to use for signing the JWTs when invoking a CDS service endpoint
61
- requiring authentication.
62
- Defaults to the first JWK in the list if no kid is supplied.
63
- DESCRIPTION
64
- optional: true
65
- output :cds_services
66
-
67
- run do
68
- discovery_url = "#{base_url.chomp('/')}/cds-services"
69
- headers = { 'Accept' => 'application/json' }
70
-
71
- if authentication_required == 'yes'
72
- token = JwtHelper.build(
73
- aud: discovery_url,
74
- iss: inferno_base_url,
75
- jku: "#{inferno_base_url}/jwks.json",
76
- kid: jwks_kid,
77
- encryption_method:
78
- )
79
- headers['Authorization'] = "Bearer #{token}"
80
- end
81
- get(discovery_url, headers:, tags: [DISCOVERY_TAG])
82
- assert_response_status(200)
83
- assert_valid_json(request.response_body)
84
-
85
- output cds_services: request.response_body
86
- end
87
- end
88
- end
@@ -1,65 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module DaVinciCRDTestKit
4
- class DiscoveryServicesValidationTest < Inferno::Test
5
- include DaVinciCRDTestKit::TestHelper
6
-
7
- title 'Discovery response contains valid services'
8
- id :crd_discovery_services_validation
9
- description %(
10
- As per the [CDS Hooks Spec](https://cds-hooks.hl7.org/2.0/#response),
11
- the response to the discovery endpoint SHALL be an object containing
12
- a list of CDS services. If your CDS server hosts no CDS services,
13
- the discovery endpoint should return a 200 HTTP response with
14
- an empty array of services.
15
-
16
- Each CDS service must contain the following required fields:
17
- `hook`, `description`, and `id`.
18
-
19
- This test checks for the presence of the required fields and
20
- validates that they are of the correct type.
21
-
22
- The test will be skipped if the server hosts no CDS services.
23
- )
24
-
25
- input :cds_services
26
- output :appointment_book_service_ids, :encounter_start_service_ids, :encounter_discharge_service_ids,
27
- :order_dispatch_service_ids, :order_select_service_ids, :order_sign_service_ids
28
-
29
- def required_fields
30
- {
31
- 'hook' => String,
32
- 'description' => String,
33
- 'id' => String
34
- }
35
- end
36
-
37
- run do
38
- object = parse_json(cds_services)
39
- assert object['services'], 'Discovery response did not contain `services`'
40
-
41
- services = object['services']
42
- assert services.is_a?(Array), 'Services field of the CDS Discovery response object is not an array.'
43
- skip_if services.empty?, 'Server hosts no CDS Services.'
44
-
45
- service_hooks_to_ids = services.each_with_object({}) do |service, hash|
46
- hash[service['hook']] ||= []
47
- hash[service['hook']] << service['id'] if service['id']
48
- end
49
-
50
- output appointment_book_service_ids: service_hooks_to_ids['appointment-book']&.join(', '),
51
- encounter_start_service_ids: service_hooks_to_ids['encounter-start']&.join(', '),
52
- encounter_discharge_service_ids: service_hooks_to_ids['encounter-discharge']&.join(', '),
53
- order_dispatch_service_ids: service_hooks_to_ids['order-dispatch']&.join(', '),
54
- order_select_service_ids: service_hooks_to_ids['order-select']&.join(', '),
55
- order_sign_service_ids: service_hooks_to_ids['order-sign']&.join(', ')
56
-
57
- services.each do |service|
58
- required_fields.each do |field, type|
59
- assert(service[field], "Service `#{service}` did not contain required field: `#{field}`")
60
- assert(service[field].is_a?(type), "Service `#{service}`: field `#{field}` is not of type #{type}")
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,28 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module DaVinciCRDTestKit
4
- class ExternalReferenceCardAcrossHooksValidationTest < Inferno::Test
5
- include DaVinciCRDTestKit::TestHelper
6
-
7
- title 'Valid External Reference cards received across all hooks'
8
- id :crd_external_reference_card_across_hooks_validation
9
- description %(
10
- This test verifies the presence of valid External Reference returned by CRD services across all hooks invoked.
11
- As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference),
12
- External Reference cards must contain links with the type set to `absolute`.
13
- This test checks for the presence of any External Reference cards by verifying:
14
- - The presence of a `links` array within each card.
15
- - That every link in the `links` array of a card is of type `absolute`.
16
-
17
- The test will be skipped if no valid External Reference cards are returned across all hooks.
18
- )
19
-
20
- run do
21
- verify_at_least_one_test_passes(
22
- self.class.parent.parent.groups,
23
- 'crd_external_reference_card_validation',
24
- 'None of the hooks invoked returned an External Reference card.'
25
- )
26
- end
27
- end
28
- end
@@ -1,36 +0,0 @@
1
- require_relative '../test_helper'
2
- require_relative '../server_hook_helper'
3
-
4
- module DaVinciCRDTestKit
5
- class ExternalReferenceCardValidationTest < Inferno::Test
6
- include DaVinciCRDTestKit::TestHelper
7
- include DaVinciCRDTestKit::ServerHookHelper
8
-
9
- title 'Valid External Reference cards received'
10
- id :crd_external_reference_card_validation
11
- description %(
12
- This test verifies the presence of valid External Reference cards within the list of valid cards
13
- returned by the CRD service.
14
- As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference),
15
- External Reference cards must contain links with the type set to `absolute`.
16
- This test checks for the presence of any External Reference cards by verifying:
17
- - The presence of a `links` array within each card.
18
- - That every link in the `links` array of a card is of type `absolute`.
19
- )
20
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@258', 'hl7.fhir.us.davinci-crd_2.0.1@259'
21
-
22
- input :valid_cards_with_links
23
- optional
24
-
25
- run do
26
- parsed_cards = parse_json(valid_cards_with_links)
27
- external_reference_cards = parsed_cards.select do |card|
28
- links = card['links']
29
- links.present? && links.all? { |link| link['type'] == 'absolute' }
30
- end
31
-
32
- assert external_reference_cards.present?,
33
- "#{tested_hook_name} hook response did not contain an External Reference card."
34
- end
35
- end
36
- end
@@ -1,78 +0,0 @@
1
- require_relative '../test_helper'
2
- require_relative '../suggestion_actions_validation'
3
- require_relative '../server_hook_helper'
4
-
5
- module DaVinciCRDTestKit
6
- class FormCompletionResponseValidationTest < Inferno::Test
7
- include DaVinciCRDTestKit::TestHelper
8
- include DaVinciCRDTestKit::SuggestionActionsValidation
9
- include DaVinciCRDTestKit::ServerHookHelper
10
-
11
- title 'Valid Request Form Completion cards or system actions received'
12
- id :crd_request_form_completion_response_validation
13
- description %(
14
- This test validates the Request Form Completion cards or system actions received from the CRD service,
15
- as per the specifications outlined in the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion).
16
-
17
- - **Checking for Presence:**
18
- The test begins by verifying whether any Request Form Completion cards or system actions are present.
19
- - **For cards:** It ensures that there are cards with `suggestions` containing `create` actions
20
- for the `Task` resource, specifically:
21
- - The `Task` must have a `code` of `complete-questionnaire`.
22
- - The `Task` should include an input of type `text` (`Task.input.type.text`) labeled as `questionnaire`
23
- and associated with a valid canonical URL (`Task.input.valueCanonical`).
24
- - **For system actions:** It checks for the presence of `create` actions for the `Task` resource with
25
- the characteristics described above.
26
-
27
- - **Validating:**
28
- If any Request Form Completion cards or system actions are found, the test proceeds to validate them.
29
- Each `Task` resource is validated against the [CRD Questionnaire Task profile](http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-taskquestionnaire).
30
-
31
- If no Request Form Completion cards or system actions are received, the test is skipped.
32
- )
33
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@299'
34
- optional
35
- input :valid_cards_with_suggestions, :valid_system_actions
36
-
37
- def task_actions(actions)
38
- actions&.select { |action| action['type'] == 'create' && action_resource_type_check(action, ['Task']) }
39
- end
40
-
41
- def task_questionnaire?(task_action)
42
- task = FHIR.from_contents(task_action['resource'].to_json)
43
- task.code.coding.any? { |code| code.code == 'complete-questionnaire' } &&
44
- task.input.any? { |input| input.type.text == 'questionnaire' && valid_url?(input.valueCanonical) }
45
- end
46
-
47
- def request_form_completion_card?(card)
48
- card['suggestions'].all? do |suggestion|
49
- actions = suggestion['actions']
50
- task_actions = task_actions(actions)
51
- task_actions.present? && task_actions.all? { |action| task_questionnaire?(action) }
52
- end
53
- end
54
-
55
- run do
56
- parsed_cards = parse_json(valid_cards_with_suggestions)
57
- parsed_actions = parse_json(valid_system_actions)
58
-
59
- form_completion_cards = parsed_cards.filter { |card| request_form_completion_card?(card) }
60
- form_completion_actions = task_actions(parsed_actions).select { |action| task_questionnaire?(action) }
61
-
62
- skip_if form_completion_cards.blank? && form_completion_actions.blank?,
63
- "#{tested_hook_name} hook response does not contain any Request Form Completion cards or system actions."
64
-
65
- actions_check(form_completion_actions) if form_completion_actions.present?
66
-
67
- if form_completion_cards.present?
68
- form_completion_cards.each do |card|
69
- card['suggestions'].each do |suggestion|
70
- actions_check(task_actions(suggestion['actions']))
71
- end
72
- end
73
- end
74
-
75
- no_error_validation('Some Request Form Completion received are not valid.')
76
- end
77
- end
78
- end
@@ -1,25 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- module DaVinciCRDTestKit
4
- class InstructionsCardReceivedAcrossHooksTest < Inferno::Test
5
- include DaVinciCRDTestKit::TestHelper
6
-
7
- title 'Valid Instructions cards received across all hooks'
8
- id :crd_valid_instructions_card_received_across_hooks
9
- description %(
10
- This test validates that a valid [Instructions card](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions)
11
- was received across all hooks responses.
12
-
13
- The test will be skipped if no valid Instructions cards are returned across all hooks.
14
- )
15
-
16
- run do
17
- verify_at_least_one_test_passes(
18
- self.class.parent.parent.groups,
19
- 'crd_valid_instructions_card_received',
20
- 'None of the hooks invoked returned a valid Instructions card.',
21
- 'across_hooks'
22
- )
23
- end
24
- end
25
- end
@@ -1,26 +0,0 @@
1
- require_relative '../test_helper'
2
- require_relative '../server_hook_helper'
3
-
4
- module DaVinciCRDTestKit
5
- class InstructionsCardReceivedTest < Inferno::Test
6
- include DaVinciCRDTestKit::TestHelper
7
- include DaVinciCRDTestKit::ServerHookHelper
8
-
9
- title 'Valid Instructions cards received'
10
- id :crd_valid_instructions_card_received
11
- description %(
12
- This test validates that an [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions)
13
- card was received. It does so by:
14
- - Checking for the presence of a valid card that does not contain the `links` field and the `suggestions` field.
15
- )
16
-
17
- input :valid_cards
18
- optional
19
-
20
- run do
21
- parsed_cards = parse_json(valid_cards)
22
- instructions_card = parsed_cards.find { |card| card['links'].blank? && card['suggestions'].blank? }
23
- assert instructions_card, "#{tested_hook_name} hook response did not contain an Instructions card."
24
- end
25
- end
26
- end
@@ -1,38 +0,0 @@
1
- require_relative '../test_helper'
2
- require_relative '../server_hook_helper'
3
-
4
- module DaVinciCRDTestKit
5
- class LaunchSmartAppCardValidationTest < Inferno::Test
6
- include DaVinciCRDTestKit::TestHelper
7
- include DaVinciCRDTestKit::ServerHookHelper
8
-
9
- title 'Valid Launch SMART Application cards received'
10
- id :crd_launch_smart_app_card_validation
11
- description %(
12
- This test verifies the presence of valid Launch SMART Application cards within the list of valid cards
13
- returned by the CRD service.
14
- As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application),
15
- Launch SMART Application cards must contain links with the type set to `smart`.
16
- This test checks for the presence of any Launch SMART Application cards by verifying:
17
- - The existence of a `links` array within each card.
18
- - That every link in the `links` array of a card is of type `smart`.
19
-
20
- The test will be skipped if no Launch SMART Application cards are found within the returned valid cards.
21
- )
22
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@258'
23
-
24
- optional
25
- input :valid_cards_with_links
26
-
27
- run do
28
- parsed_cards = parse_json(valid_cards_with_links)
29
- external_reference_cards = parsed_cards.select do |card|
30
- links = card['links']
31
- links.present? && links.all? { |link| link['type'] == 'smart' }
32
- end
33
-
34
- skip_if external_reference_cards.blank?,
35
- "#{tested_hook_name} hook response does not contain any Launch SMART App cards."
36
- end
37
- end
38
- end
@@ -1,63 +0,0 @@
1
- require_relative '../test_helper'
2
- require_relative '../suggestion_actions_validation'
3
- require_relative '../server_hook_helper'
4
-
5
- module DaVinciCRDTestKit
6
- class ProposeAlternateRequestCardValidationTest < Inferno::Test
7
- include DaVinciCRDTestKit::TestHelper
8
- include DaVinciCRDTestKit::SuggestionActionsValidation
9
- include DaVinciCRDTestKit::ServerHookHelper
10
-
11
- title 'Valid Propose Alternate Request cards received'
12
- id :crd_propose_alternate_request_card_validation
13
- description %(
14
- This test validates that all [Propose Alternate Request](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#propose-alternate-request)
15
- cards received are valid. It checks for the presence of a card's suggestion
16
- with a single action with `Action.type` of `update` or a card with at least
17
- two actions, one with `Action.type` of `delete` and the other with
18
- `Action.type` of `create`.
19
- )
20
- optional
21
- input :valid_cards_with_suggestions, :contexts
22
-
23
- EXPECTED_RESOURCE_TYPES = %w[
24
- Device DeviceRequest Encounter Medication
25
- MedicationRequest NutritionOrder ServiceRequest
26
- VisionPrescription
27
- ].freeze
28
-
29
- def check_action_type(actions, action_type)
30
- actions&.any? do |action|
31
- action['type'] == action_type && action_resource_type_check(action, EXPECTED_RESOURCE_TYPES)
32
- end
33
- end
34
-
35
- def propose_alternate_request_card?(card)
36
- card['suggestions'].any? do |suggestion|
37
- actions = suggestion['actions']
38
- has_update = check_action_type(actions, 'update')
39
- has_delete = check_action_type(actions, 'delete')
40
- has_create = check_action_type(actions, 'create')
41
-
42
- has_update || (has_delete && has_create)
43
- end
44
- end
45
-
46
- run do
47
- parsed_cards = parse_json(valid_cards_with_suggestions)
48
- parsed_contexts = parse_json(contexts)
49
- proposed_alternate_cards = parsed_cards.filter { |card| propose_alternate_request_card?(card) }
50
-
51
- skip_if proposed_alternate_cards.blank?,
52
- "#{tested_hook_name} hook response does not contain a Propose Alternate Request card."
53
-
54
- proposed_alternate_cards.each do |card|
55
- card['suggestions'].each do |suggestion|
56
- actions_check(suggestion['actions'], parsed_contexts)
57
- end
58
- end
59
-
60
- no_error_validation('Some Proposed Alternate Request cards are not valid.')
61
- end
62
- end
63
- end