davinci_crd_test_kit 0.13.0 → 0.14.1

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 (351) 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 +188 -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 +239 -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}/external_reference.json +1 -1
  20. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +1 -1
  21. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
  22. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
  23. data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
  24. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
  33. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
  34. data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
  38. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
  39. data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
  40. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
  41. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
  42. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
  43. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
  44. data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
  45. data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
  46. data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
  47. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
  48. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
  49. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
  50. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
  51. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
  52. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
  53. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
  54. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
  55. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
  56. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
  57. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
  58. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
  59. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
  60. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
  61. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
  62. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
  63. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
  64. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
  65. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +109 -0
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +102 -0
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +101 -0
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +84 -0
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +107 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +108 -0
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +113 -0
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +33 -0
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +234 -0
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +54 -0
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +108 -0
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
  105. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
  106. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +133 -0
  107. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
  108. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
  109. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
  110. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +75 -0
  111. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
  112. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
  113. data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
  114. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +321 -0
  115. data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
  116. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
  117. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
  118. data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
  119. data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
  120. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
  121. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +476 -0
  122. data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
  123. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
  124. data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
  125. data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
  126. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +203 -0
  127. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +435 -0
  128. data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
  129. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +46 -0
  130. data/lib/davinci_crd_test_kit/metadata.rb +10 -44
  131. data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
  132. data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -0
  133. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  134. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +742 -65
  135. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
  136. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
  137. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
  138. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
  139. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
  140. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  141. data/lib/davinci_crd_test_kit/server/endpoints/jwk_set_endpoint_handler.rb +13 -0
  142. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
  143. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
  144. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
  145. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
  146. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
  147. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
  148. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
  149. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
  150. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
  151. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
  152. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_no_special_requests.rb +17 -0
  153. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
  154. data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
  155. data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
  156. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +183 -0
  157. data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
  158. data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +3 -3
  159. data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
  160. data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
  161. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
  162. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
  163. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
  164. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
  165. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
  166. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
  167. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
  168. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
  169. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
  170. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
  171. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
  172. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
  173. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
  174. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
  175. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
  176. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
  177. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
  178. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
  179. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
  180. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
  181. data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
  182. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
  183. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
  184. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
  185. data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
  186. data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
  187. data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
  188. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
  189. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
  190. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
  191. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
  192. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
  193. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
  194. data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
  195. data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
  196. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
  197. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  198. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  199. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
  200. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
  201. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  202. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
  203. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
  204. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
  205. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
  206. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
  207. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
  208. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
  209. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
  210. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
  211. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
  212. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
  213. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
  214. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
  215. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
  216. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
  217. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
  218. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
  219. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
  220. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
  221. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
  222. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
  223. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
  224. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
  225. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +118 -0
  226. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
  227. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
  228. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
  229. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
  230. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_standard_prefetch_expressions_test.rb +166 -0
  231. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
  232. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
  233. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
  234. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
  235. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
  236. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +121 -0
  237. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +94 -0
  238. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +71 -0
  239. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +107 -0
  240. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +107 -0
  241. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
  242. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +121 -0
  243. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +115 -0
  244. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +132 -0
  245. data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
  246. data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
  247. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_response_group.rb +23 -0
  248. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
  249. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
  250. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
  251. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
  252. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
  253. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
  254. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +31 -0
  255. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
  256. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +40 -0
  257. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +41 -0
  258. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +109 -0
  259. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
  260. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
  261. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
  262. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +130 -0
  263. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +119 -0
  264. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +89 -0
  265. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +126 -0
  266. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +174 -0
  267. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +83 -0
  268. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +88 -0
  269. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
  270. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +81 -0
  271. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +63 -0
  272. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
  273. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
  274. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
  275. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
  276. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
  277. data/lib/davinci_crd_test_kit/version.rb +2 -2
  278. data/lib/davinci_crd_test_kit.rb +4 -2
  279. metadata +307 -93
  280. data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
  281. data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -74
  282. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
  283. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
  284. data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
  285. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
  286. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
  287. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -42
  288. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -40
  289. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
  290. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -42
  291. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -61
  292. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
  293. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
  294. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
  295. data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
  296. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
  297. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
  298. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
  299. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
  300. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
  301. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
  302. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
  303. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
  304. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
  305. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
  306. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
  307. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -48
  308. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
  309. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
  310. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -193
  311. data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
  312. data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
  313. data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
  314. data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
  315. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
  316. data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
  317. data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
  318. data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
  319. data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
  320. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
  321. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
  322. data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
  323. data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
  324. data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
  325. data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
  326. data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
  327. data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
  328. data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
  329. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
  330. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
  331. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
  332. data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
  333. data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
  334. data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
  335. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
  336. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
  337. data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
  338. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
  339. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
  340. data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
  341. data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
  342. data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
  343. data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
  344. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
  345. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
  346. data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
  347. data/lib/davinci_crd_test_kit/tags.rb +0 -10
  348. data/lib/davinci_crd_test_kit/urls.rb +0 -52
  349. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
  350. /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
  351. /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
@@ -0,0 +1,120 @@
1
+ require_relative '../../resource_extractor'
2
+ require_relative '../../server_hook_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ServiceRequestNoCustomExtensionsTest < Inferno::Test
7
+ include DaVinciCRDTestKit::ResourceExtractor
8
+ include DaVinciCRDTestKit::ServerHookHelper
9
+
10
+ US_CORE_EXTENSION_URLS = [
11
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex',
12
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-direct',
13
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity',
14
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race',
15
+ 'http://hl7.org/fhir/us/core/StructureDefinition/uscdi-requirement',
16
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-extension-questionnaire-uri',
17
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-genderIdentity',
18
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-jurisdiction',
19
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-sex',
20
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-tribal-affiliation',
21
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-medication-adherence',
22
+ 'http://hl7.org/fhir/StructureDefinition/condition-assertedDate'
23
+ ].freeze
24
+
25
+ CRD_EXTENSION_URLS = [
26
+ 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information',
27
+ 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-billing-options',
28
+ 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-request-category',
29
+ 'http://hl7.org/fhir/StructureDefinition/codeOptions',
30
+ 'http://hl7.org/fhir/StructureDefinition/alternate-reference',
31
+ 'http://hl7.org/fhir/5.0/StructureDefinition/extension-CommunicationRequest.payload.content',
32
+ 'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.requestedPeriod',
33
+ 'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.requestedPerformer',
34
+ 'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.performer',
35
+ 'http://hl7.org/fhir/StructureDefinition/request-doNotPerform',
36
+ 'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.input.value',
37
+ 'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.output.value',
38
+ 'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.statusReason'
39
+ ].freeze
40
+
41
+ HREX_EXTENSION_URLS = [
42
+ 'http://hl7.org/fhir/us/davinci-hrex/StructureDefinition/extension-CoverageDavinciWellknownLocation'
43
+ ].freeze
44
+
45
+ VALID_EXTENSION_URLS = (US_CORE_EXTENSION_URLS + CRD_EXTENSION_URLS + HREX_EXTENSION_URLS).freeze
46
+
47
+ title 'Server does not require custom extensions'
48
+ id :crd_v221_service_request_no_custom_extensions
49
+ description %(
50
+ This test verifies that the server is capable of responding to a client
51
+ without the use of any custom extensions. It inspects each successful
52
+ hook call, and if it finds one which doesn't use any extensions not
53
+ defined by US Core, CRD, or HREX it passes.
54
+ )
55
+
56
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@conf-7',
57
+ 'hl7.fhir.us.davinci-crd_2.2.1@hook-22'
58
+
59
+ run do
60
+ ALL_HOOK_TAGS.each do |tag|
61
+ load_tagged_requests(tag)
62
+ end
63
+
64
+ skip_if requests.blank?, 'No requests were made in a previous test as expected.'
65
+
66
+ successful_requests = requests.select { |request| request.status == 200 }
67
+
68
+ skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
69
+
70
+ embedded_resources =
71
+ successful_requests
72
+ .map { |request| resources_from_request(request) }
73
+ .reject(&:blank?)
74
+
75
+ skip_if embedded_resources.blank?,
76
+ 'No embedded FHIR resources were found in successful hook requests.'
77
+
78
+ request_with_no_custom_extensions =
79
+ embedded_resources.any? { |resources| resources.all? { |resource| no_custom_extensions? resource } }
80
+
81
+ pass_if request_with_no_custom_extensions
82
+
83
+ custom_extensions_string =
84
+ embedded_resources
85
+ .flatten
86
+ .flat_map { |resource| custom_extensions(resource) }
87
+ .uniq
88
+ .map { |extension| "\n- `#{extension}`" }
89
+ .join
90
+
91
+ skip 'No requests were made without custom extensions. The following custom extensions were found: ' \
92
+ "#{custom_extensions_string}"
93
+ end
94
+
95
+ def no_custom_extensions?(resource)
96
+ resource.each_element do |value, _metadata, path|
97
+ next unless value.is_a? FHIR::Extension
98
+
99
+ next if path.scan('extension').length > 1
100
+
101
+ return false unless VALID_EXTENSION_URLS.include? value.url
102
+ end
103
+
104
+ true
105
+ end
106
+
107
+ def custom_extensions(resource)
108
+ [].tap do |custom_extensions|
109
+ resource.each_element do |value, _metadata, path|
110
+ next unless value.is_a? FHIR::Extension
111
+
112
+ next if path.scan('extension').length > 1
113
+
114
+ custom_extensions << value.url unless VALID_EXTENSION_URLS.include? value.url
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../server_hook_request_validation'
2
+ require_relative '../../server_hook_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ServiceRequestOptionalFieldsValidationTest < Inferno::Test
7
+ include DaVinciCRDTestKit::ServerHookRequestValidation
8
+ include DaVinciCRDTestKit::ServerHookHelper
9
+
10
+ title 'Service request optional fields are valid'
11
+ id :crd_v221_service_request_optional_fields_validation
12
+ description %(
13
+ This optional test reviews the user-submitted CRD service requests for the presence of optional fields:
14
+ `fhirAuthorization` and `prefetch`.
15
+
16
+ The test will not fail if these optional fields are missing from a service request; instead, it generates an
17
+ informational message.
18
+ )
19
+ optional
20
+ simulation_verification
21
+
22
+ run do
23
+ load_tagged_requests(tested_hook_name)
24
+ skip_if requests.empty?, "No #{tested_hook_name} request was made in a previous test as expected."
25
+
26
+ requests.each_with_index do |request, index|
27
+ @request_number = index + 1
28
+ request_body = json_parse(request.request_body)
29
+ if request_body.blank?
30
+ add_message('error', "#{request_number}Hook request body cannot be empty.")
31
+ next
32
+ end
33
+
34
+ hook_request_optional_fields_check(request_body, ig_version: 'v221')
35
+ end
36
+ no_error_validation('Some service requests have invalid optional fields.')
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,41 @@
1
+ require_relative '../../server_hook_request_validation'
2
+ require_relative '../../server_hook_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class ServiceRequestRequiredFieldsValidationTest < Inferno::Test
7
+ include DaVinciCRDTestKit::ServerHookRequestValidation
8
+ include DaVinciCRDTestKit::ServerHookHelper
9
+
10
+ title 'Service requests contain required fields'
11
+ id :crd_v221_service_request_required_fields_validation
12
+ description %(
13
+ This test validates all CRD service requests provided by the user, ensuring each includes all required fields
14
+ specified in the [CDS Hooks spec section on Calling a CDS Service](https://cds-hooks.hl7.org/2.0/#calling-a-cds-service):
15
+ `hook`, `hookInstance`, and `context`. Furthermore, the test checks for the conditional presence of the
16
+ `fhirServer` field if `fhirAuthorization` is included.
17
+ )
18
+ input :invoked_hook
19
+ output :contexts
20
+ simulation_verification
21
+
22
+ run do
23
+ load_tagged_requests(tested_hook_name)
24
+ skip_if requests.empty?, "No #{tested_hook_name} request was made in a previous test as expected."
25
+ contexts = []
26
+ requests.each_with_index do |request, index|
27
+ @request_number = index + 1
28
+ request_body = json_parse(request.request_body)
29
+ next if request_body.blank?
30
+
31
+ contexts << request_body['context'] if request_body['context'].is_a?(Hash)
32
+ hook_request_required_fields_check(request_body, invoked_hook, ig_version: 'v221')
33
+ end
34
+
35
+ output contexts: contexts.to_json
36
+
37
+ no_error_validation('Some service requests made are not valid.')
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,109 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/cards_identification'
4
+ require_relative '../../../cross_suite/response_logical_model_validation'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V221
8
+ class AdditionalOrdersValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+ include DaVinciCRDTestKit::CardsIdentification
12
+ include DaVinciCRDTestKit::ResponseLogicalModelValidation
13
+
14
+ title 'Additional Orders cards are valid'
15
+ id :crd_v221_additional_orders_card_validation
16
+ description %(
17
+ This test validates that an [Identify Additional
18
+ Orders](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#identify-additional-orders-response-type)
19
+ card was received. It does so by:
20
+ - Filtering cards with the following criteria:
21
+ - For each suggestion in the card's suggestions array, all actions
22
+ have a type of 'create' and the action's resource type is one of the
23
+ expected types: CommunicationRequest, Device, DeviceRequest,
24
+ Medication, MedicationRequest, NutritionOrder, ServiceRequest, or
25
+ VisionPrescription.
26
+ - Then, for each valid Additional Orders card retrieved, verifying that
27
+ each action within the card's suggestions complies with their
28
+ respective profiles as specified in the [CRD IG section on Identify
29
+ Additional
30
+ Orders](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#identify-additional-orders-response-type):
31
+ -
32
+ [crd-profile-communicationrequest](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-communicationrequest.html)
33
+ -
34
+ [crd-profile-device](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-device.html)
35
+ -
36
+ [crd-profile-deviceRequest](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-devicerequest.html)
37
+ -
38
+ [us-core-medication](http://hl7.org/fhir/us/core/STU3.1.1/StructureDefinition-us-core-medication.html)
39
+ -
40
+ [crd-profile-medicationRequest](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-medicationrequest.html)
41
+ -
42
+ [crd-profile-nutritionOrder](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-nutritionorder.html)
43
+ -
44
+ [crd-profile-serviceRequest](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-servicerequest.html)
45
+ -
46
+ [crd-profile-visionPrescription](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-visionprescription.html).
47
+
48
+ The test will skip if no Identify Additional Orders cards are found.
49
+ )
50
+
51
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-3',
52
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-57',
53
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-58'
54
+
55
+ input :invoked_hook
56
+
57
+ optional
58
+
59
+ def body_has_no_cards?(body)
60
+ !body.is_a?(Hash) ||
61
+ body['cards'].blank? ||
62
+ !body['cards'].is_a?(Array) ||
63
+ !body['cards'].all?(Hash)
64
+ end
65
+
66
+ def additional_orders_cards(request)
67
+ return [] if request.status != 200
68
+
69
+ response_body = JSON.parse(request.response_body)
70
+
71
+ return [] if body_has_no_cards?(response_body)
72
+
73
+ response_body['cards'].select { |card| additional_orders_response_type? card }
74
+ rescue JSON::ParserError
75
+ []
76
+ end
77
+
78
+ run do
79
+ load_tagged_requests(tested_hook_name)
80
+
81
+ additional_orders_count = 0
82
+
83
+ successful_requests = requests.select { |request| request.status == 200 }
84
+
85
+ skip_if successful_requests.blank?,
86
+ 'No successful hook responses were received'
87
+
88
+ requests.each_with_index do |request, index|
89
+ cards = additional_orders_cards(request)
90
+
91
+ additional_orders_count += cards.length
92
+
93
+ perform_response_logical_model_validation(
94
+ cards,
95
+ nil,
96
+ request.request_body,
97
+ index,
98
+ '2.2.1'
99
+ )
100
+ end
101
+
102
+ skip_if additional_orders_count.zero?,
103
+ "#{tested_hook_name} hook responses do not contain any Additional Orders cards."
104
+
105
+ no_error_validation('Not all Additional Orders cards were valid. See messages for more information.')
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,123 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/cards_identification'
4
+ require_relative '../../../cross_suite/profiles_and_resource_types'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V221
8
+ class AllResponsesIncludeCoverageInformationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+ include DaVinciCRDTestKit::CardsIdentification
12
+
13
+ title 'Hook responses include Coverage Information system actions'
14
+ id :crd_v221_all_responses_include_coverage_information
15
+ description %(
16
+ This test validates that a [Coverage
17
+ Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
18
+ system action was returned for every hook call, unless the resource
19
+ which is the focus of the hook call already includes a
20
+ [coverage-information
21
+ extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/StructureDefinition-ext-coverage-information.html).
22
+ It does so by:
23
+ - First checking for the presence of actions with a `resource` element
24
+ of the following types:
25
+ - For `appointment-book`: Appointment
26
+ - For `order-sign` or `order-dispatch`: CommunicationRequest,
27
+ DeviceRequest, MedicationRequest, NutritionOrder, ServiceRequest, or
28
+ VisionPrescription
29
+ - Then, checking whether each resource contains the coverage-information extension
30
+ - Finally verifying that the response to each hook call where the
31
+ resource did not contain a coverage-information extension includes
32
+ coverage information system action
33
+ )
34
+
35
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-16',
36
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-28'
37
+
38
+ input :invoked_hook
39
+
40
+ def target_resources
41
+ {
42
+ 'appointment-book' => ['Appointment'],
43
+ 'order-sign' => ProfilesAndResourceTypes::ORDER_RESOURCE_TYPES,
44
+ 'order-dispatch' => ProfilesAndResourceTypes::ORDER_RESOURCE_TYPES,
45
+ 'order-select' => ProfilesAndResourceTypes::ORDER_RESOURCE_TYPES,
46
+ 'encounter-start' => ['Encounter'],
47
+ 'encounter-discharge' => ['Encounter']
48
+ }[tested_hook_name]
49
+ end
50
+
51
+ def hook_bundle_field_name
52
+ {
53
+ 'appointment-book' => 'appointments',
54
+ 'order-sign' => 'draftOrders'
55
+ }[tested_hook_name]
56
+ end
57
+
58
+ def resources_contain_coverage_information_extension?(resources)
59
+ resources.all? do |resource|
60
+ resource.extension&.any? do |extension|
61
+ extension.url == 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information'
62
+ end
63
+ end
64
+ end
65
+
66
+ def order_resources(hook_call_body)
67
+ bundle = FHIR::Bundle.new(hook_call_body.dig('context', hook_bundle_field_name))
68
+ bundle.entry.map(&:resource).select { |resource| target_resources.include? resource.resourceType }
69
+ end
70
+
71
+ run do
72
+ successful_hook_calls_without_coverage_information = 0
73
+ coverage_information_system_actions_received = 0
74
+
75
+ load_tagged_requests(tested_hook_name)
76
+
77
+ requests.each do |request|
78
+ next if request.status != 200
79
+
80
+ hook_call_body = JSON.parse(request.request_body)
81
+
82
+ # TODO: handle when default value for coverage-info is false
83
+ next if hook_call_body.dig('extension', 'davinci-crd.configuration', 'coverage-info') == false
84
+
85
+ resources = order_resources(hook_call_body)
86
+
87
+ next if resources_contain_coverage_information_extension?(resources)
88
+
89
+ successful_hook_calls_without_coverage_information += 1
90
+
91
+ hook_call_response = JSON.parse(request.response_body)
92
+
93
+ system_actions = hook_call_response['systemActions']
94
+
95
+ next if system_actions.blank?
96
+
97
+ system_actions_resources =
98
+ system_actions
99
+ .select { |action| action['type'] == 'update' }
100
+ .select { |action| target_resources.include? action['resource']['resourceType'] }
101
+ .map { |action| FHIR.from_contents(action['resource'].to_json) }
102
+
103
+ next unless resources_contain_coverage_information_extension?(system_actions_resources)
104
+
105
+ coverage_information_system_actions_received += 1
106
+ rescue JSON::ParserError => e
107
+ warning(e.message)
108
+ next
109
+ end
110
+
111
+ skip_if successful_hook_calls_without_coverage_information.zero?,
112
+ 'No successful hook calls were made with resources which did not already ' \
113
+ 'contain a coverage-information extension.'
114
+
115
+ assert successful_hook_calls_without_coverage_information == coverage_information_system_actions_received,
116
+ "#{successful_hook_calls_without_coverage_information} successful hook calls " \
117
+ 'without a coverage-information extension were made, but only ' \
118
+ "#{coverage_information_system_actions_received} of the responses contained " \
119
+ 'a coverage information system action.'
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,83 @@
1
+ require_relative '../../../cross_suite/cards_identification'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../server_urls'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class CoverageInfoConfigurationTest < Inferno::Test
8
+ include DaVinciCRDTestKit::CardsIdentification
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::V221::ServerURLs
11
+
12
+ title 'Coverage Information configuration option suppresses coverage-info responses'
13
+ id :crd_v221_coverage_info_configuration
14
+ description %(
15
+ This test checks follow-up hook requests made with
16
+ `extension.davinci-crd.configuration.coverage-info` set to `false` after prior successful hook requests
17
+ returned coverage-info content.
18
+
19
+ CRD Servers SHALL behave in the manner prescribed by supported configuration information received from
20
+ the CRD Client. When `coverage-info` is `false`, responses must not include coverage-info cards or
21
+ coverage-information/form-completion system actions.
22
+ )
23
+
24
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@dev-14',
25
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-28'
26
+
27
+ def coverage_info_message(cards, actions)
28
+ card_summaries = cards.map { |card| card['summary'] }.compact
29
+ action_descriptions = actions.map { |action| action['description'] }.compact
30
+
31
+ 'Coverage-info disabled server response included coverage-info content despite ' \
32
+ "`#{COVERAGE_INFO_CONFIGURATION_CODE}` being set to `false`. " \
33
+ "Cards: #{card_summaries.join(', ')}. System actions: #{action_descriptions.join(', ')}."
34
+ end
35
+
36
+ def primary_hook?
37
+ ['appointment-book', 'order-sign', 'order-dispatch'].include? tested_hook_name
38
+ end
39
+
40
+ def parsed_body(json)
41
+ JSON.parse(json)
42
+ rescue JSON::ParserError
43
+ nil
44
+ end
45
+
46
+ run do
47
+ load_tagged_requests(tested_hook_name, COVERAGE_INFO_DISABLED_TAG)
48
+
49
+ if requests.empty?
50
+ message = "No successful #{tested_hook_name} response contained coverage-info content to suppress."
51
+ if primary_hook?
52
+ skip message
53
+ else
54
+ omit message
55
+ end
56
+ end
57
+
58
+ requests.each do |request|
59
+ unless request.status == 200
60
+ add_message(
61
+ 'error',
62
+ "Coverage-info disabled server request returned HTTP #{request.status}; expected HTTP 200."
63
+ )
64
+ next
65
+ end
66
+
67
+ response_body = parsed_body(request.response_body)
68
+ unless response_body.is_a?(Hash)
69
+ add_message('error', 'Coverage-info disabled server response was not valid JSON.')
70
+ next
71
+ end
72
+
73
+ cards, actions = coverage_info_content(response_body)
74
+ next if cards.empty? && actions.empty?
75
+
76
+ add_message('error', coverage_info_message(cards, actions))
77
+ end
78
+
79
+ assert_no_error_messages('Coverage-info configuration responses were not valid. Check messages for details.')
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,76 @@
1
+ require_relative '../../server_hook_helper'
2
+ require_relative '../../../cross_suite/cards_identification'
3
+ require_relative 'hook_request_resource_resolution'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class CoverageInformationCardAbsenceTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerHookHelper
9
+ include DaVinciCRDTestKit::CardsIdentification
10
+ include HookRequestResourceResolution
11
+
12
+ title 'Hook responses do not include Coverage Information cards'
13
+ id :crd_v221_coverage_information_card_absence
14
+ description %(
15
+ This test verifies that the server does not return the
16
+ [Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
17
+ response type as a CDS Hooks card. Coverage Information responses must be returned as `systemActions`
18
+ that update resources with the `coverage-information` extension (inclusion of systemActions is verified in a
19
+ previous test).
20
+ )
21
+
22
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-25'
23
+
24
+ input :mock_ehr_bundle, optional: true
25
+
26
+ def coverage_information_card_message(response_index, card)
27
+ identifier = card['uuid'].present? ? "uuid `#{card['uuid']}`" : 'no uuid'
28
+
29
+ "Server response #{response_index + 1} included a card with #{identifier} and a suggestion action that only " \
30
+ 'adds or modifies the coverage-information extension. Coverage Information must be returned as a ' \
31
+ 'systemAction, not as a card.'
32
+ end
33
+
34
+ def coverage_information_card_response_type?(card, request)
35
+ Array(card['suggestions']).any? do |suggestion|
36
+ Array(suggestion['actions']).any? do |action|
37
+ coverage_information_card_action?(action, request)
38
+ end
39
+ end
40
+ end
41
+
42
+ def coverage_information_card_action?(action, request)
43
+ return false unless coverage_information_response_type?(action)
44
+ return false unless action['type'] == 'update'
45
+
46
+ source_resource = find_action_source_resource(action, request)
47
+ return coverage_information_extension_only_payload?(action['resource']) unless source_resource
48
+
49
+ only_coverage_information_changed?(source_resource.to_hash, action['resource'])
50
+ end
51
+
52
+ run do
53
+ load_tagged_requests(tested_hook_name)
54
+ skip_if requests.blank?, "No #{tested_hook_name} request was made in a previous test as expected."
55
+
56
+ successful_requests = requests.select { |request| request.status == 200 }
57
+ skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
58
+
59
+ successful_requests.each_with_index do |request, index|
60
+ response_body = JSON.parse(request.response_body)
61
+ cards = response_body['cards'].is_a?(Array) ? response_body['cards'] : []
62
+
63
+ cards.select { |card| coverage_information_card_response_type?(card, request) }.each do |card|
64
+ add_message('error', coverage_information_card_message(index, card))
65
+ end
66
+ rescue JSON::ParserError
67
+ add_message('error', "Invalid JSON: server response #{index + 1} is not valid JSON.")
68
+ end
69
+
70
+ assert_no_error_messages(
71
+ 'Service response(s) included Coverage Information cards. Check messages for details.'
72
+ )
73
+ end
74
+ end
75
+ end
76
+ end