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,83 @@
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 InstructionsCardReceivedTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+ include DaVinciCRDTestKit::CardsIdentification
12
+ include DaVinciCRDTestKit::ResponseLogicalModelValidation
13
+
14
+ title 'Instructions cards are valid'
15
+ id :crd_v221_valid_instructions_card_received
16
+ description %(
17
+ This test validates that an
18
+ [Instructions](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#instructions-response-type)
19
+ card was received. It does so by:
20
+ - Checking for the presence of a valid card that does not contain the
21
+ `links` field and the `suggestions` field.
22
+
23
+ The test will be skipped if no Instructions cards are found within the
24
+ returned valid cards.
25
+ )
26
+
27
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-24'
28
+
29
+ input :invoked_hook
30
+
31
+ optional
32
+
33
+ def body_has_no_cards?(body)
34
+ !body.is_a?(Hash) ||
35
+ body['cards'].blank? ||
36
+ !body['cards'].is_a?(Array) ||
37
+ !body['cards'].all?(Hash)
38
+ end
39
+
40
+ def instructions_cards(request)
41
+ return [] if request.status != 200
42
+
43
+ response_body = JSON.parse(request.response_body)
44
+
45
+ return [] if body_has_no_cards?(response_body)
46
+
47
+ response_body['cards'].select { |card| instructions_response_type? card }
48
+ rescue JSON::ParserError
49
+ []
50
+ end
51
+
52
+ run do
53
+ load_tagged_requests(tested_hook_name)
54
+
55
+ instructions_count = 0
56
+
57
+ successful_requests = requests.select { |request| request.status == 200 }
58
+
59
+ skip_if successful_requests.blank?,
60
+ 'No successful hook responses were received'
61
+
62
+ requests.each_with_index do |request, index|
63
+ cards = instructions_cards(request)
64
+
65
+ instructions_count += cards.length
66
+
67
+ perform_response_logical_model_validation(
68
+ cards,
69
+ nil,
70
+ request.request_body,
71
+ index,
72
+ '2.2.1'
73
+ )
74
+ end
75
+
76
+ skip_if instructions_count.zero?,
77
+ "#{tested_hook_name} hook responses do not contain any Instructions cards."
78
+
79
+ no_error_validation('Not all Instructions cards were valid. See messages for more information.')
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,88 @@
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 LaunchSmartAppCardValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+ include DaVinciCRDTestKit::CardsIdentification
12
+ include DaVinciCRDTestKit::ResponseLogicalModelValidation
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
18
+ within the CRD service responses.
19
+
20
+ As per the [Da Vinci CRD Implementation
21
+ Guide](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#launch-smart-application-response-type),
22
+ Launch SMART Application cards must contain links with the type set to
23
+ `smart`. This test checks for the presence of any Launch SMART
24
+ Application cards by verifying:
25
+ - The existence of a `links` array within each card.
26
+ - That every link in the `links` array of a card is of type `smart`.
27
+
28
+ The test will be skipped if no Launch SMART Application cards are found
29
+ within the returned valid cards.
30
+ )
31
+
32
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-72'
33
+
34
+ input :invoked_hook
35
+
36
+ optional
37
+
38
+ def body_has_no_cards?(body)
39
+ !body.is_a?(Hash) ||
40
+ body['cards'].blank? ||
41
+ !body['cards'].is_a?(Array) ||
42
+ !body['cards'].all?(Hash)
43
+ end
44
+
45
+ def launch_smart_app_cards(request)
46
+ return [] if request.status != 200
47
+
48
+ response_body = JSON.parse(request.response_body)
49
+
50
+ return [] if body_has_no_cards?(response_body)
51
+
52
+ response_body['cards'].select { |card| launch_smart_app_response_type? card }
53
+ rescue JSON::ParserError
54
+ []
55
+ end
56
+
57
+ run do
58
+ load_tagged_requests(tested_hook_name)
59
+
60
+ launch_smart_app_count = 0
61
+
62
+ successful_requests = requests.select { |request| request.status == 200 }
63
+
64
+ skip_if successful_requests.blank?,
65
+ 'No successful hook responses were received'
66
+
67
+ requests.each_with_index do |request, index|
68
+ cards = launch_smart_app_cards(request)
69
+
70
+ launch_smart_app_count += cards.length
71
+
72
+ perform_response_logical_model_validation(
73
+ cards,
74
+ nil,
75
+ request.request_body,
76
+ index,
77
+ '2.2.1'
78
+ )
79
+ end
80
+
81
+ skip_if launch_smart_app_count.zero?,
82
+ "#{tested_hook_name} hook responses do not contain any Launch SMART App cards."
83
+
84
+ no_error_validation('Not all Launch SMART App cards were valid. See messages for more information.')
85
+ end
86
+ end
87
+ end
88
+ 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,81 @@
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 ProposeAlternateRequestCardValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+ include DaVinciCRDTestKit::CardsIdentification
12
+ include DaVinciCRDTestKit::ResponseLogicalModelValidation
13
+
14
+ title 'Propose Alternate Request cards are valid'
15
+ id :crd_v221_propose_alternate_request_card_validation
16
+ description %( This test validates that all [Propose Alternate
17
+ Request](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#propose-alternate-request-response-type)
18
+ cards received are valid. It checks for the presence of a card's
19
+ suggestion with a single action with `Action.type` of `update` or a card
20
+ with at least two actions, one with `Action.type` of `delete` and the
21
+ other with `Action.type` of `create`.
22
+ )
23
+ optional
24
+
25
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-3',
26
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-55',
27
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-56'
28
+
29
+ input :invoked_hook
30
+
31
+ def body_has_no_cards?(body)
32
+ !body.is_a?(Hash) ||
33
+ body['cards'].blank? ||
34
+ !body['cards'].is_a?(Array) ||
35
+ !body['cards'].all?(Hash)
36
+ end
37
+
38
+ def alternate_request_cards(request)
39
+ return [] if request.status != 200
40
+
41
+ response_body = JSON.parse(request.response_body)
42
+
43
+ return [] if body_has_no_cards?(response_body)
44
+
45
+ response_body['cards'].select { |card| propose_alternative_request_response_type? card }
46
+ rescue JSON::ParserError
47
+ []
48
+ end
49
+
50
+ run do
51
+ load_tagged_requests(tested_hook_name)
52
+
53
+ alternate_request_count = 0
54
+
55
+ successful_requests = requests.select { |request| request.status == 200 }
56
+
57
+ skip_if successful_requests.blank?,
58
+ 'No successful hook responses were received'
59
+
60
+ requests.each_with_index do |request, index|
61
+ cards = alternate_request_cards(request)
62
+
63
+ alternate_request_count += cards.length
64
+
65
+ perform_response_logical_model_validation(
66
+ cards,
67
+ nil,
68
+ request.request_body,
69
+ index,
70
+ '2.2.1'
71
+ )
72
+ end
73
+
74
+ skip_if alternate_request_count.zero?,
75
+ "#{tested_hook_name} hook responses do not contain any Propose Alternate Request cards."
76
+
77
+ no_error_validation('Not all Propose Alternate Request cards were valid. See messages for more information')
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,63 @@
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
+ This test validates the responses against the [CRD v2.2.1 logical
16
+ models](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/artifacts.html#4).
17
+
18
+ This test implements [corrections to errors in the logical
19
+ models](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Logical-Model-Validation-Changes).
20
+ )
21
+
22
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-4',
23
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-5',
24
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-13'
25
+
26
+ input :invoked_hook
27
+
28
+ run do
29
+ load_tagged_requests(tested_hook_name)
30
+
31
+ skip_if requests.blank?, "No #{tested_hook_name} request was made in a previous test as expected."
32
+
33
+ successful_requests = requests.select { |request| request.status == 200 }
34
+
35
+ skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
36
+
37
+ info do
38
+ unsuccessful_count = (requests - successful_requests).length
39
+
40
+ assert unsuccessful_count.zero?, "#{unsuccessful_count} out of #{requests.length} requests were unsuccessful"
41
+ end
42
+
43
+ successful_requests.each_with_index do |request, index|
44
+ service_response = JSON.parse(request.response_body)
45
+
46
+ conforms_to_logical_model?(
47
+ service_response,
48
+ 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/CRDHooksResponseBase|2.2.1',
49
+ message_prefix: "Request #{index}: "
50
+ )
51
+ rescue JSON::ParserError
52
+ add_message('error', "Invalid JSON: server response #{index + 1} is not valid JSON.")
53
+ end
54
+
55
+ messages.reject! do |message|
56
+ message[:type] == 'error' && message[:message].end_with?('Resource requires an id, but none is present')
57
+ end
58
+
59
+ no_error_validation('Some service responses are not valid. Check messages for issues found.')
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,78 @@
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 UnknownCDSHooksElementsTest < Inferno::Test
8
+ include DaVinciCRDTestKit::CardsIdentification
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::V221::ServerURLs
11
+
12
+ title 'Server ignores unknown CDS Hooks elements'
13
+ id :crd_v221_unknown_cds_hooks_elements
14
+ description %(
15
+ If a request resulted in a successful response with a coverage
16
+ information system action, a follow-up request is made with an element
17
+ with a random key and value added to the CDS hooks request. This test
18
+ verifes that this follow-up request also resulted in a successful
19
+ response with a coverage information system action to verify that
20
+ unknown CDS Hooks elements are ignored.
21
+ )
22
+
23
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@found-33'
24
+
25
+ def primary_hook?
26
+ ['appointment-book', 'order-sign', 'order-dispatch'].include? tested_hook_name
27
+ end
28
+
29
+ def parsed_body(json)
30
+ JSON.parse(json)
31
+ rescue JSON::ParserError
32
+ nil
33
+ end
34
+
35
+ run do
36
+ load_tagged_requests(tested_hook_name, UNKNOWN_ELEMENT_TAG)
37
+
38
+ if requests.empty?
39
+ message = "No successful #{tested_hook_name} response contained a coverage-info action."
40
+ if primary_hook?
41
+ skip message
42
+ else
43
+ omit message
44
+ end
45
+ end
46
+
47
+ requests.each do |request|
48
+ unless request.status == 200
49
+ add_message(
50
+ 'error',
51
+ "Server request returned HTTP #{request.status} for a request with an unknown CDS Hooks element; " \
52
+ 'expected HTTP 200.'
53
+ )
54
+ next
55
+ end
56
+
57
+ response_body = parsed_body(request.response_body)
58
+ unless response_body.is_a?(Hash)
59
+ add_message('error', 'Server response to a request with an unknown CDS Hooks element was not valid JSON.')
60
+ next
61
+ end
62
+
63
+ next if coverage_info_system_action_response?(response_body)
64
+
65
+ add_message(
66
+ 'error',
67
+ 'Server response to a request with an unknown CDS Hooks element did not contain ' \
68
+ 'a coverage information system action.'
69
+ )
70
+ end
71
+
72
+ assert_no_error_messages(
73
+ 'Responses to requests with an unknown CDS Hooks element were not valid. Check messages for details.'
74
+ )
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,78 @@
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 UnknownConfigurationTest < Inferno::Test
8
+ include DaVinciCRDTestKit::CardsIdentification
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::V221::ServerURLs
11
+
12
+ title 'Server ignores unknown configuration information'
13
+ id :crd_v221_unknown_configuration
14
+ description %(
15
+ If a request resulted in a successful response with a coverage
16
+ information system action, a follow-up request is made with a random
17
+ configuration key set to `true`. This test verifes that this follow-up
18
+ request also resulted in a successful response with a coverage
19
+ information system action to verify that unknown configuration values
20
+ are ignored.
21
+ )
22
+
23
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@dev-17'
24
+
25
+ def primary_hook?
26
+ ['appointment-book', 'order-sign', 'order-dispatch'].include? tested_hook_name
27
+ end
28
+
29
+ def parsed_body(json)
30
+ JSON.parse(json)
31
+ rescue JSON::ParserError
32
+ nil
33
+ end
34
+
35
+ run do
36
+ load_tagged_requests(tested_hook_name, UNKNOWN_CONFIGURATION_TAG)
37
+
38
+ if requests.empty?
39
+ message = "No successful #{tested_hook_name} response contained a coverage-info action."
40
+ if primary_hook?
41
+ skip message
42
+ else
43
+ omit message
44
+ end
45
+ end
46
+
47
+ requests.each do |request|
48
+ unless request.status == 200
49
+ add_message(
50
+ 'error',
51
+ "Server request returned HTTP #{request.status} for a request with an unknown configuration option; " \
52
+ 'expected HTTP 200.'
53
+ )
54
+ next
55
+ end
56
+
57
+ response_body = parsed_body(request.response_body)
58
+ unless response_body.is_a?(Hash)
59
+ add_message('error', 'Server response to a request with an unknown configuration value was not valid JSON.')
60
+ next
61
+ end
62
+
63
+ next if coverage_info_system_action_response?(response_body)
64
+
65
+ add_message(
66
+ 'error',
67
+ 'Server response to a request with an unknown configuration value did not contain ' \
68
+ 'a coverage information system action.'
69
+ )
70
+ end
71
+
72
+ assert_no_error_messages(
73
+ 'Responses to requests with unknown configuration were not valid. Check messages for details.'
74
+ )
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,78 @@
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 UnknownContextTest < Inferno::Test
8
+ include DaVinciCRDTestKit::CardsIdentification
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::V221::ServerURLs
11
+
12
+ title 'Server ignores unknown context information'
13
+ id :crd_v221_unknown_context
14
+ description %(
15
+ If a request resulted in a successful response with a coverage
16
+ information system action, a follow-up request is made with a random
17
+ context key set to a random value. This test verifes that this follow-up
18
+ request also resulted in a successful response with a coverage
19
+ information system action to verify that unknown context values are
20
+ ignored.
21
+ )
22
+
23
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-23'
24
+
25
+ def primary_hook?
26
+ ['appointment-book', 'order-sign', 'order-dispatch'].include? tested_hook_name
27
+ end
28
+
29
+ def parsed_body(json)
30
+ JSON.parse(json)
31
+ rescue JSON::ParserError
32
+ nil
33
+ end
34
+
35
+ run do
36
+ load_tagged_requests(tested_hook_name, UNKNOWN_CONTEXT_TAG)
37
+
38
+ if requests.empty?
39
+ message = "No successful #{tested_hook_name} response contained a coverage-info action."
40
+ if primary_hook?
41
+ skip message
42
+ else
43
+ omit message
44
+ end
45
+ end
46
+
47
+ requests.each do |request|
48
+ unless request.status == 200
49
+ add_message(
50
+ 'error',
51
+ "Server request returned HTTP #{request.status} for a request with an unknown context option; " \
52
+ 'expected HTTP 200.'
53
+ )
54
+ next
55
+ end
56
+
57
+ response_body = parsed_body(request.response_body)
58
+ unless response_body.is_a?(Hash)
59
+ add_message('error', 'Server response to a request with an unknown context element was not valid JSON.')
60
+ next
61
+ end
62
+
63
+ next if coverage_info_system_action_response?(response_body)
64
+
65
+ add_message(
66
+ 'error',
67
+ 'Server response to a request with an unknown context element did not contain ' \
68
+ 'a coverage information system action.'
69
+ )
70
+ end
71
+
72
+ assert_no_error_messages(
73
+ 'Responses to requests with unknown context were not valid. Check messages for details.'
74
+ )
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,43 @@
1
+ require_relative '../../server_hook_helper'
2
+ require_relative '../../../cross_suite/tags'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class VerifyResponseWithoutBillingOptionsTest < Inferno::Test
7
+ include DaVinciCRDTestKit::ServerHookHelper
8
+
9
+ title 'Server does not require the billing-options extension'
10
+ id :verify_response_without_billing_options
11
+ description <<~DESCRIPTION
12
+ The IG states that, "CRD servers **SHALL NOT** depend on the
13
+ billing-options extension being present in order to provide a response."
14
+
15
+ This test verifies that a successful response was received for a request
16
+ without any billing-options extensions.
17
+ DESCRIPTION
18
+
19
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@billopt-2'
20
+
21
+ BILLING_OPTIONS_URL = 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-billing-options'.freeze
22
+
23
+ run do
24
+ ALL_HOOK_TAGS.each do |tag|
25
+ load_tagged_requests(tag)
26
+ end
27
+
28
+ skip_if requests.blank?, 'No requests were made in a previous test as expected.'
29
+
30
+ successful_requests = requests.select { |request| request.status == 200 }
31
+ skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
32
+
33
+ requests_without_billing_options =
34
+ successful_requests.reject { |request| request.request_body.include? BILLING_OPTIONS_URL }
35
+
36
+ skip_if requests_without_billing_options.blank?,
37
+ 'All successful requests included the billing options extension. ' \
38
+ 'Provide service call inputs which do not include the billing options extension ' \
39
+ 'to verify that the server does not require the extension.'
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,44 @@
1
+ require_relative '../../server_hook_helper'
2
+ require_relative '../../../cross_suite/tags'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class VerifyResponseWithoutConfigurationTest < Inferno::Test
7
+ include DaVinciCRDTestKit::ServerHookHelper
8
+
9
+ title 'Server does not require configuration options'
10
+ id :verify_response_without_configuration
11
+ description <<~DESCRIPTION
12
+ The IG states that, "CRD Servers SHALL NOT require the inclusion of
13
+ configuration information in a hook call (i.e. no hook invocation is
14
+ permitted to fail because configuration information was not included)."
15
+
16
+ This test verifies that a successful response was received for a request
17
+ without any configuration options.
18
+ DESCRIPTION
19
+
20
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@dev-15'
21
+
22
+ CONFIGURATION_KEY = 'davinci-crd.configuration'.freeze
23
+
24
+ run do
25
+ ALL_HOOK_TAGS.each do |tag|
26
+ load_tagged_requests(tag)
27
+ end
28
+
29
+ skip_if requests.blank?, 'No requests were made in a previous test as expected.'
30
+
31
+ successful_requests = requests.select { |request| request.status == 200 }
32
+ skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
33
+
34
+ requests_without_configuration_options =
35
+ successful_requests.reject { |request| request.request_body.include? CONFIGURATION_KEY }
36
+
37
+ skip_if requests_without_configuration_options.blank?,
38
+ 'All successful requests included configuration options. ' \
39
+ 'Provide service call inputs which do not include any configuration options ' \
40
+ 'to verify that the server does not require them.'
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,4 +1,4 @@
1
1
  module DaVinciCRDTestKit
2
- VERSION = '0.13.0'.freeze
3
- LAST_UPDATED = '2025-07-22'.freeze # TODO: update next release
2
+ VERSION = '0.14.1'.freeze
3
+ LAST_UPDATED = '2026-07-13'.freeze # TODO: update next release
4
4
  end