davinci_crd_test_kit 0.12.2 → 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 +59 -2
  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 +308 -101
  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 -75
  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 -41
  277. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -39
  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 -41
  280. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -60
  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 -44
  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 -185
  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,75 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../../cross_suite/suggestion_actions_validation'
3
+ require_relative '../../server_hook_helper'
4
+ require_relative '../../../cross_suite/cards_identification'
5
+ require_relative '../../../cross_suite/cards_validation'
6
+
7
+ module DaVinciCRDTestKit
8
+ module V221
9
+ class CreateOrUpdateCoverageInfoResponseValidationTest < Inferno::Test
10
+ include DaVinciCRDTestKit::ServerTestHelper
11
+ include DaVinciCRDTestKit::SuggestionActionsValidation
12
+ include DaVinciCRDTestKit::ServerHookHelper
13
+ include DaVinciCRDTestKit::CardsIdentification
14
+ include DaVinciCRDTestKit::CardsValidation
15
+
16
+ title 'Create or Update Coverage Information cards and system actions are valid'
17
+ id :crd_v221_create_or_update_coverage_info_response_validation
18
+ description %(
19
+ This test validates the Create or Update Coverage Information cards or system actions received from the
20
+ 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).
21
+
22
+ - **Checking for Presence:**
23
+ The test first checks if any Create or Update Coverage Information cards or system actions are present in
24
+ the returned valid cards or valid system actions.
25
+ - **For cards**: it ensures there are cards with a `suggestions` array containing a single suggestion,
26
+ and the `actions` array of that suggestion has one `create` or `update` action for the `Coverage` resource.
27
+ - **For system actions**: it checks for the presence of `create` or `update` actions for the `Coverage`
28
+ resource.
29
+
30
+ - **Validating:**
31
+ If any Create or Update Coverage Information cards or system actions are found, each `Coverage` resource is
32
+ validated against the base FHIR Coverage resource.
33
+
34
+ If no Create or Update Coverage Information cards or system actions are received, the test is skipped.
35
+ )
36
+
37
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-71'
38
+
39
+ optional
40
+ input :valid_cards_with_suggestions, :valid_system_actions
41
+
42
+ run do
43
+ parsed_cards = parse_json(valid_cards_with_suggestions)
44
+ parsed_actions = parse_json(valid_system_actions)
45
+
46
+ create_or_update_coverage_info_cards = parsed_cards.select do |card|
47
+ create_or_update_coverage_card_response_type?(card)
48
+ end
49
+ create_or_update_coverage_info_actions = parsed_actions.select do |action|
50
+ create_or_update_coverage_action_response_type?(action)
51
+ end
52
+
53
+ skip_msg = "#{tested_hook_name} hook response does not contain any Create or Update Coverage Information " \
54
+ 'cards or system actions.'
55
+ skip_if create_or_update_coverage_info_cards.blank? && create_or_update_coverage_info_actions.blank?, skip_msg
56
+
57
+ if create_or_update_coverage_info_actions.present?
58
+ actions_check(create_or_update_coverage_info_actions, ig_version: 'v221')
59
+ end
60
+
61
+ if create_or_update_coverage_info_cards.present?
62
+ create_or_update_coverage_info_cards.each do |card|
63
+ actions_check(card['suggestions'].first['actions'].select do |action|
64
+ create_or_update_coverage_action_response_type?(action)
65
+ end, ig_version: 'v221')
66
+
67
+ create_or_update_coverage_check(card)
68
+ end
69
+ end
70
+
71
+ no_error_validation('Some Create or Update Coverage Information received are not valid.')
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/cards_identification'
4
+ require_relative '../../../cross_suite/cards_validation'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V221
8
+ class ExternalReferenceCardValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+ include DaVinciCRDTestKit::CardsIdentification
12
+ include DaVinciCRDTestKit::CardsValidation
13
+
14
+ title 'External Reference cards are valid'
15
+ id :crd_v221_external_reference_card_validation
16
+ description %(
17
+ This test verifies the presence of valid External Reference cards within the list of valid cards
18
+ returned by the CRD service.
19
+ As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference),
20
+ External Reference cards must contain links with the type set to `absolute`.
21
+ This test checks for the presence of any External Reference cards by verifying:
22
+ - The presence of a `links` array within each card.
23
+ - That every link in the `links` array of a card is of type `absolute`.
24
+ )
25
+
26
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-22'
27
+
28
+ input :valid_cards_with_links
29
+ optional
30
+
31
+ run do
32
+ parsed_cards = parse_json(valid_cards_with_links)
33
+ external_reference_cards = parsed_cards.select { |card| external_reference_response_type?(card) }
34
+
35
+ skip_if external_reference_cards.blank?,
36
+ "#{tested_hook_name} hook response does not contain any External Reference cards."
37
+
38
+ external_reference_cards.each do |card|
39
+ external_reference_card_check(card)
40
+ end
41
+
42
+ assert messages.blank?,
43
+ 'Not all External Reference cards were valid. See messages for more information.'
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,91 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../../cross_suite/suggestion_actions_validation'
3
+ require_relative '../../server_hook_helper'
4
+ require_relative '../../../cross_suite/cards_identification'
5
+ require_relative '../../../cross_suite/cards_validation'
6
+
7
+ module DaVinciCRDTestKit
8
+ module V221
9
+ class FormCompletionResponseValidationTest < Inferno::Test
10
+ include DaVinciCRDTestKit::ServerTestHelper
11
+ include DaVinciCRDTestKit::SuggestionActionsValidation
12
+ include DaVinciCRDTestKit::ServerHookHelper
13
+ include DaVinciCRDTestKit::CardsIdentification
14
+ include DaVinciCRDTestKit::CardsValidation
15
+
16
+ title 'Request Form Completion cards and system actions are valid'
17
+ id :crd_v221_request_form_completion_response_validation
18
+ description %(
19
+ This test validates the Request Form Completion cards or system actions received from the CRD service,
20
+ 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).
21
+
22
+ - **Checking for Presence:**
23
+ The test begins by verifying whether any Request Form Completion cards or system actions are present.
24
+ - **For cards:** It ensures that there are cards with `suggestions` containing `create` actions
25
+ for the `Task` resource, specifically:
26
+ - The `Task` must have a `code` of `complete-questionnaire`.
27
+ - The `Task` should include an input of type `text` (`Task.input.type.text`) labeled as `questionnaire`
28
+ and associated with a valid canonical URL (`Task.input.valueCanonical`).
29
+ - **For system actions:** It checks for the presence of `create` actions for the `Task` resource with
30
+ the characteristics described above.
31
+
32
+ - **Validating:**
33
+ If any Request Form Completion cards or system actions are found, the test proceeds to validate them.
34
+ Each `Task` resource is validated against the [CRD Questionnaire Task
35
+ profile](http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-taskquestionnaire).
36
+ Additionally, if any actions for the creation of a `Questionnaire` are
37
+ found, the test verifies that they include the
38
+ `davinci-crd.if-none-exist` extension.
39
+
40
+ If no Request Form Completion cards or system actions are received, the test is skipped.
41
+ )
42
+
43
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@dev-20',
44
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-62',
45
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-65'
46
+
47
+ optional
48
+ input :valid_cards_with_suggestions, :valid_system_actions
49
+
50
+ run do
51
+ parsed_cards = parse_json(valid_cards_with_suggestions)
52
+ parsed_actions = parse_json(valid_system_actions)
53
+
54
+ form_completion_cards = parsed_cards.select { |card| form_completion_card_response_type?(card) }
55
+ form_completion_actions = parsed_actions.select { |action| form_completion_action_response_type?(action) }
56
+
57
+ skip_if form_completion_cards.blank? && form_completion_actions.blank?,
58
+ "#{tested_hook_name} hook response does not contain any Request Form Completion cards " \
59
+ 'or system actions.'
60
+
61
+ actions_check(form_completion_actions, ig_version: 'v221') if form_completion_actions.present?
62
+
63
+ if form_completion_cards.present?
64
+ form_completion_cards.each do |card|
65
+ actions =
66
+ card['suggestions']
67
+ .flat_map { |suggestion| suggestion['actions'] }
68
+ .compact
69
+ .select { |action| form_completion_action_response_type? action }
70
+
71
+ actions_check(actions, ig_version: 'v221')
72
+
73
+ form_completion_check(card)
74
+ end
75
+ end
76
+
77
+ questionnaire_create_actions =
78
+ parsed_actions.select { |action| create_questionnaire_action_response_type?(action) } +
79
+ form_completion_cards
80
+ .flat_map { |card| card['suggestions'] }
81
+ .flat_map { |suggestion| suggestion['actions'] }
82
+ .compact
83
+ .select { |action| create_questionnaire_action_response_type?(action) }
84
+
85
+ questionnaire_create_actions.each { |action| questionnaire_creation_check(action) }
86
+
87
+ no_error_validation('Some Request Form Completion received are not valid.')
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,137 @@
1
+ module DaVinciCRDTestKit
2
+ module V221
3
+ module HookRequestResourceResolution
4
+ def mock_ehr_bundle_resource
5
+ @mock_ehr_bundle_resource ||= JSON.parse(mock_ehr_bundle) if mock_ehr_bundle.present?
6
+ rescue JSON::ParserError
7
+ nil
8
+ end
9
+
10
+ def matching_request_for_action(action)
11
+ requests.find do |request|
12
+ response = JSON.parse(request.response_body)
13
+ request.status == 200 && Array(response['systemActions']).any? { |candidate| candidate == action }
14
+ rescue JSON::ParserError
15
+ false
16
+ end
17
+ end
18
+
19
+ # Resolve the original resource being updated by a systemAction.
20
+ # - appointment-book: look in context.appointments; if the action targets a ServiceRequest,
21
+ # follow the Appointment basedOn reference and resolve that from prefetch or mock EHR data
22
+ # - order-sign/order-select: look in context.draftOrders
23
+ # - other hooks: resolve from prefetch or mock EHR data because context may carry only ids/references
24
+ def find_action_source_resource(action, request)
25
+ action_resource = action['resource']
26
+ return unless action_resource.is_a?(Hash)
27
+
28
+ target_type = action_resource['resourceType']
29
+ target_id = action_resource['id']
30
+ request_body = parse_request_body(request)
31
+ return unless target_type.present? && target_id.present? && request_body
32
+
33
+ hook_context_resource(request_body, target_type, target_id) ||
34
+ fallback_source_resource(request_body, target_type, target_id)
35
+ end
36
+
37
+ def find_appointment_book_resource(request_body, target_type, target_id)
38
+ appointments_bundle = request_body.dig('context', 'appointments')
39
+ find_resource_in_bundle(appointments_bundle, target_type, target_id) ||
40
+ appointment_book_service_request(request_body, appointments_bundle, target_id)
41
+ end
42
+
43
+ def find_draft_orders_resource(request_body, target_type, target_id)
44
+ draft_orders_bundle = request_body.dig('context', 'draftOrders')
45
+ find_resource_in_bundle(draft_orders_bundle, target_type, target_id)
46
+ end
47
+
48
+ def fallback_source_resource(request_body, target_type, target_id)
49
+ find_resource_in_prefetch(request_body, target_type, target_id) ||
50
+ find_resource_in_bundle(mock_ehr_bundle_resource, target_type, target_id)
51
+ end
52
+
53
+ def hook_context_resource(request_body, target_type, target_id)
54
+ case tested_hook_name
55
+ when 'appointment-book'
56
+ find_appointment_book_resource(request_body, target_type, target_id)
57
+ when 'order-sign', 'order-select'
58
+ find_draft_orders_resource(request_body, target_type, target_id)
59
+ end
60
+ end
61
+
62
+ def appointment_book_service_request(request_body, appointments_bundle_hash, target_id)
63
+ target_type = 'ServiceRequest'
64
+ appointments_bundle = parse_bundle(appointments_bundle_hash)
65
+ appointment = (appointments_bundle&.entry || [])
66
+ .filter_map(&:resource)
67
+ .find { |candidate| appointment_based_on_matches_target?(candidate, target_type, target_id) }
68
+ return unless appointment
69
+
70
+ find_resource_in_prefetch(request_body, target_type, target_id) ||
71
+ find_resource_in_bundle(mock_ehr_bundle_resource, target_type, target_id)
72
+ end
73
+
74
+ def appointment_based_on_matches_target?(appointment, target_type, target_id)
75
+ Array(appointment.basedOn).any? do |reference|
76
+ reference_parts(reference.reference) == [target_type, target_id]
77
+ end
78
+ end
79
+
80
+ def find_resource_in_prefetch(request_body, target_type, target_id)
81
+ Array(request_body['prefetch']&.values).each do |prefetched_value|
82
+ if prefetched_value.is_a?(Hash) &&
83
+ prefetched_value['resourceType'] == target_type &&
84
+ prefetched_value['id'] == target_id
85
+ return FHIR.from_contents(prefetched_value.to_json)
86
+ end
87
+
88
+ resource = find_resource_in_bundle(prefetched_value, target_type, target_id)
89
+ return resource if resource
90
+ end
91
+
92
+ nil
93
+ end
94
+
95
+ def find_resource_by_reference(request_body, reference)
96
+ target_type, target_id = reference_parts(reference)
97
+ return unless target_type.present? && target_id.present?
98
+
99
+ find_resource_in_prefetch(request_body, target_type, target_id) ||
100
+ find_resource_in_bundle(mock_ehr_bundle_resource, target_type, target_id)
101
+ end
102
+
103
+ def find_resource_in_bundle(bundle_hash, target_type, target_id)
104
+ bundle = parse_bundle(bundle_hash)
105
+ return unless bundle&.entry
106
+
107
+ bundle.entry
108
+ .filter_map(&:resource)
109
+ .find { |resource| resource.resourceType == target_type && resource.id == target_id }
110
+ end
111
+
112
+ def reference_parts(reference)
113
+ return if reference.blank?
114
+
115
+ parts = reference.split('/')
116
+ return unless parts.length >= 2
117
+
118
+ [parts[-2], parts[-1]]
119
+ end
120
+
121
+ def parse_bundle(bundle_hash)
122
+ bundle = FHIR.from_contents(bundle_hash.to_json)
123
+ bundle if bundle.is_a?(FHIR::Bundle)
124
+ rescue StandardError
125
+ nil
126
+ end
127
+
128
+ def parse_request_body(request)
129
+ return unless request&.request_body.present?
130
+
131
+ JSON.parse(request.request_body)
132
+ rescue JSON::ParserError
133
+ nil
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,32 @@
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 V221
7
+ class InstructionsCardReceivedTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerTestHelper
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::CardsIdentification
11
+
12
+ title 'Instructions cards are valid'
13
+ id :crd_v221_valid_instructions_card_received
14
+ description %(
15
+ This test validates that an [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions)
16
+ card was received. It does so by:
17
+ - Checking for the presence of a valid card that does not contain the `links` field and the `suggestions` field.
18
+ )
19
+
20
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-24'
21
+
22
+ input :valid_cards
23
+ optional
24
+
25
+ run do
26
+ parsed_cards = parse_json(valid_cards)
27
+ instructions_card = parsed_cards.find { |card| instructions_response_type?(card) }
28
+ assert instructions_card, "#{tested_hook_name} hook response did not contain an Instructions card."
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,49 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/cards_identification'
4
+ require_relative '../../../cross_suite/cards_validation'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V221
8
+ class LaunchSmartAppCardValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+ include DaVinciCRDTestKit::CardsIdentification
12
+ include DaVinciCRDTestKit::CardsValidation
13
+
14
+ title 'Launch SMART Application cards are valid'
15
+ id :crd_v221_launch_smart_app_card_validation
16
+ description %(
17
+ This test verifies the presence of valid Launch SMART Application cards within the list of valid cards
18
+ returned by the CRD service.
19
+ As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application),
20
+ Launch SMART Application cards must contain links with the type set to `smart`.
21
+ This test checks for the presence of any Launch SMART Application cards by verifying:
22
+ - The existence of a `links` array within each card.
23
+ - That every link in the `links` array of a card is of type `smart`.
24
+
25
+ The test will be skipped if no Launch SMART Application cards are found within the returned valid cards.
26
+ )
27
+
28
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-72'
29
+
30
+ optional
31
+ input :valid_cards_with_links
32
+
33
+ run do
34
+ parsed_cards = parse_json(valid_cards_with_links)
35
+ launch_smart_app_cards = parsed_cards.select { |card| launch_smart_app_response_type?(card) }
36
+
37
+ skip_if launch_smart_app_cards.blank?,
38
+ "#{tested_hook_name} hook response does not contain any Launch SMART App cards."
39
+
40
+ launch_smart_app_cards.each do |card|
41
+ smart_app_card_check(card)
42
+ end
43
+
44
+ assert messages.blank?,
45
+ 'Not all Launch SMART App cards were valid. See messages for more information.'
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,38 @@
1
+ require_relative 'all_responses_include_coverage_information_test'
2
+ require_relative 'hook_request_resource_resolution'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class OrderDispatchCoverageInformationTest < AllResponsesIncludeCoverageInformationTest
7
+ include HookRequestResourceResolution
8
+
9
+ id :crd_v221_order_dispatch_coverage_information
10
+
11
+ input :invoked_hook
12
+
13
+ input :mock_ehr_bundle
14
+
15
+ def order_resources(hook_call_body)
16
+ references = hook_call_body.dig('context', 'dispatchedOrders')
17
+ resources = []
18
+ unmatched_references = []
19
+
20
+ Array(references).each do |reference|
21
+ resource = find_resource_by_reference(hook_call_body, reference)
22
+
23
+ if resource.present?
24
+ resources << resource
25
+ else
26
+ unmatched_references << reference
27
+ end
28
+ end
29
+
30
+ skip_if unmatched_references.present?,
31
+ 'The following `dispatchedOrders` are not included in the Mock EHR Data input or prefetch: ' \
32
+ "#{unmatched_references.join(', ')}"
33
+
34
+ resources
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,54 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../../cross_suite/suggestion_actions_validation'
3
+ require_relative '../../server_hook_helper'
4
+ require_relative '../../../cross_suite/cards_identification'
5
+ require_relative '../../../cross_suite/cards_validation'
6
+
7
+ module DaVinciCRDTestKit
8
+ module V221
9
+ class ProposeAlternateRequestCardValidationTest < Inferno::Test
10
+ include DaVinciCRDTestKit::ServerTestHelper
11
+ include DaVinciCRDTestKit::SuggestionActionsValidation
12
+ include DaVinciCRDTestKit::ServerHookHelper
13
+ include DaVinciCRDTestKit::CardsIdentification
14
+ include DaVinciCRDTestKit::CardsValidation
15
+
16
+ title 'Propose Alternate Request cards are valid'
17
+ id :crd_v221_propose_alternate_request_card_validation
18
+ description %(
19
+ This test validates that all [Propose Alternate Request](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#propose-alternate-request)
20
+ cards received are valid. It checks for the presence of a card's suggestion
21
+ with a single action with `Action.type` of `update` or a card with at least
22
+ two actions, one with `Action.type` of `delete` and the other with
23
+ `Action.type` of `create`.
24
+ )
25
+ optional
26
+
27
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-55',
28
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-56'
29
+
30
+ input :valid_cards_with_suggestions, :contexts
31
+
32
+ run do
33
+ parsed_cards = parse_json(valid_cards_with_suggestions)
34
+ parsed_contexts = parse_json(contexts)
35
+ proposed_alternate_cards = parsed_cards.filter do |card|
36
+ propose_alternative_request_response_type?(card)
37
+ end
38
+
39
+ skip_if proposed_alternate_cards.blank?,
40
+ "#{tested_hook_name} hook response does not contain a Propose Alternate Request card."
41
+
42
+ proposed_alternate_cards.each do |card|
43
+ card['suggestions'].each do |suggestion|
44
+ actions_check(suggestion['actions'], parsed_contexts, ig_version: 'v221')
45
+ end
46
+
47
+ propose_alternate_request_check(card)
48
+ end
49
+
50
+ no_error_validation('Some Propose Alternate Request cards are not valid.')
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,97 @@
1
+ require_relative '../../../cross_suite/cards_validation'
2
+ require_relative '../../../cross_suite/response_logical_model_validation'
3
+ require_relative '../../server_hook_helper'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class ServiceResponseValidationTest < Inferno::Test
8
+ include DaVinciCRDTestKit::CardsValidation
9
+ include DaVinciCRDTestKit::ResponseLogicalModelValidation
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+
12
+ title 'Service responses contain valid cards and systemActions'
13
+ id :crd_v221_service_response_validation
14
+ description %(
15
+ As per the [CDS Hooks spec section on CDS Service
16
+ Response](https://cds-hooks.hl7.org/2.0/#cds-service-response), a
17
+ successful server's response to a service request must be a JSON object
18
+ containing a `cards` array and optionally a `systemActions` array.
19
+
20
+ Each card must contain the following required fields: `summary`, `indicator`, and `source`.
21
+ The required fields must have a valid data structure.
22
+ )
23
+
24
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-4',
25
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-5',
26
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-13',
27
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-22',
28
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-24',
29
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-56'
30
+
31
+ input :invoked_hook
32
+ output :valid_cards, :valid_system_actions
33
+
34
+ SYSTEM_ACTIONS_HOOK_NAMES = ['appointment-book', 'order-sign', 'order-dispatch'].freeze
35
+
36
+ def valid_cards
37
+ @valid_cards ||= []
38
+ end
39
+
40
+ def valid_system_actions
41
+ @valid_system_actions ||= []
42
+ end
43
+
44
+ def system_actions_check(system_actions)
45
+ system_actions.each do |action|
46
+ current_error_count = messages.count { |msg| msg[:type] == 'error' }
47
+ action_fields_validation(action, ig_version: 'v221')
48
+ valid_system_actions << action if current_error_count == messages.count { |msg| msg[:type] == 'error' }
49
+ end
50
+ end
51
+
52
+ def perform_system_actions_validation(system_actions, response_index)
53
+ if SYSTEM_ACTIONS_HOOK_NAMES.include?(invoked_hook) && system_actions.nil?
54
+ msg = "Server response #{response_index + 1} did not have the `systemActions` field, " \
55
+ "which must be present for the `#{invoked_hook}` hook."
56
+ add_message('error', msg)
57
+ end
58
+ return if system_actions.nil?
59
+
60
+ unless system_actions.is_a?(Array)
61
+ add_message('error', "`systemActions` of server response #{response_index + 1} is not an array.")
62
+ return
63
+ end
64
+ system_actions_check(system_actions)
65
+ end
66
+
67
+ run do
68
+ load_tagged_requests(tested_hook_name)
69
+ skip_if requests.blank?, "No #{tested_hook_name} request was made in a previous test as expected."
70
+ successful_requests = requests.select { |request| request.status == 200 }
71
+ skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
72
+
73
+ info do
74
+ unsuccessful_count = (requests - successful_requests).length
75
+ assert unsuccessful_count.zero?, "#{unsuccessful_count} out of #{requests.length} requests were unsuccessful"
76
+ end
77
+
78
+ successful_requests.each_with_index do |request, index|
79
+ service_response = JSON.parse(request.response_body)
80
+ perform_cards_validation(service_response['cards'], service_response['systemActions'].present?, 'v221', index)
81
+
82
+ perform_system_actions_validation(service_response['systemActions'], index)
83
+
84
+ # perform_response_logical_model_validation(service_response['cards'], service_response['systemActions'],
85
+ # index)
86
+ rescue JSON::ParserError
87
+ add_message('error', "Invalid JSON: server response #{index + 1} is not valid JSON.")
88
+ end
89
+
90
+ output valid_system_actions: valid_system_actions.to_json
91
+ output valid_cards: valid_cards.to_json
92
+
93
+ no_error_validation('Some service responses are not valid. Check messages for issues found.')
94
+ end
95
+ end
96
+ end
97
+ end