davinci_crd_test_kit 0.12.2 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_crd_client_suite.json.erb +20 -14
  3. data/config/presets/inferno_crd_client_suite_prefetch_subset_v221.json.erb +125 -0
  4. data/config/presets/inferno_crd_client_suite_v221.json.erb +124 -0
  5. data/config/presets/inferno_crd_server_suite.json.erb +59 -2
  6. data/config/presets/inferno_crd_server_suite_v221.json.erb +94 -0
  7. data/config/presets/ri_crd_request_generator.json_v221.json.erb +13 -0
  8. data/config/presets/ri_crd_server.json.erb +19 -19
  9. data/lib/davinci_crd_test_kit/client/client_base_urls.rb +80 -0
  10. data/lib/davinci_crd_test_kit/{client_hook_request_validation.rb → client/client_hook_request_validation.rb} +1 -1
  11. data/lib/davinci_crd_test_kit/client/crd_client_options.rb +30 -0
  12. data/lib/davinci_crd_test_kit/client/endpoints/cds_services_discovery_handler.rb +34 -0
  13. data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +342 -0
  14. data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +410 -0
  15. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +233 -0
  16. data/lib/davinci_crd_test_kit/{mock_service_response.rb → client/endpoints/mock_service_response.rb} +165 -59
  17. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/companions_prerequisites.json +1 -0
  18. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/create_update_coverage_information.json +3 -2
  19. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +8 -1
  20. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
  21. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
  22. data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
  23. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
  24. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
  33. data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
  34. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
  38. data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
  39. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
  40. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
  41. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
  42. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
  43. data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
  44. data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
  45. data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
  46. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
  47. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
  48. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
  49. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
  50. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
  51. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
  52. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
  53. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
  54. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
  55. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
  56. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
  57. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
  58. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
  59. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
  60. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
  61. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
  62. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
  63. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
  64. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
  65. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +102 -0
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +96 -0
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +95 -0
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +64 -0
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +101 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +102 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +107 -0
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +27 -0
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +229 -0
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +49 -0
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +107 -0
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
  105. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +127 -0
  106. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
  107. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
  108. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
  109. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +74 -0
  110. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
  111. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
  112. data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
  113. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +312 -0
  114. data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
  115. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
  116. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
  117. data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
  118. data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
  119. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
  120. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +462 -0
  121. data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
  122. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
  123. data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
  124. data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
  125. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +202 -0
  126. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +274 -0
  127. data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
  128. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +42 -0
  129. data/lib/davinci_crd_test_kit/metadata.rb +10 -44
  130. data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
  131. data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -0
  132. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  133. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +742 -65
  134. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
  135. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
  136. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
  137. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
  138. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
  139. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  140. data/lib/davinci_crd_test_kit/server/endpoints/jwk_set_endpoint_handler.rb +13 -0
  141. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
  142. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
  143. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
  144. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
  145. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
  146. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
  147. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
  148. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
  149. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
  150. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
  151. data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
  152. data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
  153. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +165 -0
  154. data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
  155. data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +1 -1
  156. data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
  157. data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
  158. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
  159. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
  160. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
  161. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
  162. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
  163. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
  164. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
  165. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
  166. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
  167. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
  168. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
  169. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
  170. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
  171. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
  172. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
  173. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
  174. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
  175. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
  176. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
  177. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
  178. data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
  179. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
  180. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
  181. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
  182. data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
  183. data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
  184. data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
  185. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
  186. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
  187. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
  188. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
  189. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
  190. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
  191. data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
  192. data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
  193. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
  194. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  195. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  196. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
  197. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
  198. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  199. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
  200. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
  201. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
  202. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
  203. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
  204. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
  205. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
  206. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
  207. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
  208. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
  209. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
  210. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
  211. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
  212. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
  213. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
  214. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
  215. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
  216. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
  217. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
  218. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
  219. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
  220. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
  221. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
  222. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +115 -0
  223. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
  224. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
  225. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
  226. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
  227. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
  228. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
  229. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
  230. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
  231. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +213 -0
  232. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +93 -0
  233. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +69 -0
  234. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +194 -0
  235. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +194 -0
  236. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
  237. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +214 -0
  238. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +219 -0
  239. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +241 -0
  240. data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
  241. data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
  242. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +30 -0
  243. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
  244. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  245. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  246. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +66 -0
  247. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
  248. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +57 -0
  249. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
  250. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  251. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +184 -0
  252. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +75 -0
  253. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +47 -0
  254. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +91 -0
  255. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +137 -0
  256. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +32 -0
  257. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +49 -0
  258. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
  259. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +54 -0
  260. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +97 -0
  261. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
  262. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
  263. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
  264. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
  265. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
  266. data/lib/davinci_crd_test_kit/version.rb +2 -2
  267. data/lib/davinci_crd_test_kit.rb +4 -2
  268. metadata +308 -101
  269. data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
  270. data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -75
  271. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
  272. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
  273. data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
  274. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
  275. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
  276. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -41
  277. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -39
  278. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
  279. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -41
  280. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -60
  281. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
  282. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
  283. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
  284. data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
  285. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
  286. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
  287. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
  288. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
  289. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
  290. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
  291. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
  292. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
  293. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
  294. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
  295. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
  296. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -44
  297. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
  298. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
  299. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -185
  300. data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
  301. data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
  302. data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
  303. data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
  304. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
  305. data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
  306. data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
  307. data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
  308. data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
  309. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
  310. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
  311. data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
  312. data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
  313. data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
  314. data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
  315. data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
  316. data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
  317. data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
  318. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
  319. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
  320. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
  321. data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
  322. data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
  323. data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
  324. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
  325. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
  326. data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
  327. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
  328. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
  329. data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
  330. data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
  331. data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
  332. data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
  333. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
  334. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
  335. data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
  336. data/lib/davinci_crd_test_kit/tags.rb +0 -10
  337. data/lib/davinci_crd_test_kit/urls.rb +0 -52
  338. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/external_reference.json +0 -0
  339. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
  340. /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
  341. /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
@@ -1,232 +0,0 @@
1
- module DaVinciCRDTestKit
2
- class ClientFHIRApiSearchTest < Inferno::Test
3
- id :crd_client_fhir_api_search_test
4
- title 'Search Interaction'
5
- description %(
6
- Verify that the CRD client supports the specified search interaction for the given resource. The capabilities
7
- required by each resource can be found here: https://hl7.org/fhir/us/davinci-crd/CapabilityStatement-crd-client.html#resourcesSummary1
8
- )
9
-
10
- input :search_param_values,
11
- optional: true
12
-
13
- attr_accessor :successful_search
14
-
15
- def resource_type
16
- config.options[:resource_type]
17
- end
18
-
19
- def search_type
20
- config.options[:search_type]
21
- end
22
-
23
- def include_searches
24
- ['organization_include', 'practitioner_include', 'location_include']
25
- end
26
-
27
- def reference_search_parameters
28
- ['organization', 'practitioner', 'patient']
29
- end
30
-
31
- def bad_resource_id_message(expected_id, actual_id)
32
- "Expected resource to have id: `#{expected_id}`, but found `#{actual_id}`"
33
- end
34
-
35
- def perform_fhir_search(search_params, tags)
36
- fhir_search(resource_type, params: search_params, tags:)
37
- assert_response_status(200)
38
- assert_resource_type(:bundle)
39
- resource
40
- end
41
-
42
- def status_search_result_check(bundle, status)
43
- return if bundle.entry.empty?
44
-
45
- self.successful_search = true
46
-
47
- bundle.entry
48
- .reject { |entry| entry&.resource&.resourceType == 'OperationOutcome' }
49
- .map(&:resource)
50
- .each do |resource|
51
- assert_resource_type(resource_type, resource:)
52
- assert(resource.status == status, %(
53
- Each #{resource_type} resource in search result bundle should have a status of `#{status}`, instead got:
54
- `#{resource.status}` for resource with id: `#{resource.id}`
55
- ))
56
- end
57
- end
58
-
59
- def check_id_search_result_entry(bundle_entry, search_id, entry_resource_type)
60
- assert_resource_type(entry_resource_type, resource: bundle_entry)
61
-
62
- assert bundle_entry.id.present?, "Expected id field in returned #{entry_resource_type} resource"
63
-
64
- assert bundle_entry.id == search_id,
65
- bad_resource_id_message(search_id, bundle_entry.id)
66
- end
67
-
68
- def id_search_result_check(bundle, search_id)
69
- warning do
70
- assert bundle.entry.any?,
71
- "Search result bundle is empty for #{resource_type} _id search with an id of `#{search_id}`"
72
- end
73
- return if bundle.entry.empty?
74
-
75
- self.successful_search = true
76
-
77
- bundle.entry
78
- .reject { |entry| entry&.resource&.resourceType == 'OperationOutcome' }
79
- .map(&:resource)
80
- .each do |resource|
81
- check_id_search_result_entry(resource, search_id, resource_type)
82
- end
83
- end
84
-
85
- def check_include_reference(base_resource_entry, include_resource_id, include_resource_type)
86
- base_resource_references = Array.wrap(get_reference_field(include_resource_type, base_resource_entry)).compact
87
-
88
- assert(base_resource_references.present?, %(
89
- #{resource_type} resource with id #{base_resource_entry.id} did not include the field that references a
90
- #{include_resource_type} resource}
91
- ))
92
-
93
- base_resource_reference_match_found = base_resource_references.any? do |base_resource_reference|
94
- base_resource_reference.reference_id == include_resource_id
95
- end
96
-
97
- assert(base_resource_reference_match_found, %(
98
- The #{resource_type} resource in search result bundle with id #{base_resource_entry.id} did not have a
99
- #{include_resource_type} reference with an id of `#{include_resource_id}`.`
100
- ))
101
- end
102
-
103
- def include_search_result_check(bundle, search_id, included_resource_type) # rubocop:disable Metrics/CyclomaticComplexity
104
- warning do
105
- assert bundle.entry.any?,
106
- "Search result bundle is empty for #{resource_type} _include #{search_type} search with an id
107
- of `#{search_id}`"
108
- end
109
- return if bundle.entry.empty?
110
-
111
- self.successful_search = true
112
-
113
- base_resource_entry_list = bundle.entry.select do |entry|
114
- entry.resource&.resourceType == resource_type
115
- end
116
-
117
- assert(base_resource_entry_list.length == 1, %(
118
- The #{included_resource_type} _include search for #{resource_type} resource with id #{search_id}
119
- should include exactly 1 #{resource_type} resource, instead got #{base_resource_entry_list.length}.
120
- ))
121
-
122
- base_resource_entry = base_resource_entry_list.first.resource
123
-
124
- bundle.entry
125
- .map(&:resource)
126
- .each do |resource|
127
- entry_resource_type = resource.resourceType
128
-
129
- if entry_resource_type == resource_type
130
- check_id_search_result_entry(resource, search_id, entry_resource_type)
131
- elsif entry_resource_type != 'OperationOutcome'
132
- entry_resource_type = included_resource_type.capitalize
133
- assert_resource_type(entry_resource_type, resource:)
134
-
135
- included_resource_id = resource.id
136
- assert included_resource_id.present?, "Expected id field in returned #{entry_resource_type} resource"
137
- check_include_reference(base_resource_entry, included_resource_id, included_resource_type)
138
- end
139
- end
140
- end
141
-
142
- def get_reference_field(reference_type, entry)
143
- case reference_type
144
- when 'patient'
145
- entry.beneficiary
146
- when 'practitioner'
147
- entry.practitioner
148
- when 'organization'
149
- if resource_type == 'Encounter'
150
- entry.serviceProvider
151
- else
152
- entry.organization
153
- end
154
- when 'location'
155
- locations = entry.location
156
- locations.map(&:location)
157
- end
158
- end
159
-
160
- def reference_search_result_check(bundle, reference_id, reference_type)
161
- warning do
162
- assert bundle.entry.any?, %(
163
- Search result bundle is empty for #{resource_type} #{reference_type} search with a #{reference_type} id
164
- `#{reference_id}`
165
- )
166
- end
167
- return if bundle.entry.empty?
168
-
169
- self.successful_search = true
170
-
171
- bundle.entry
172
- .reject { |entry| entry&.resource&.resourceType == 'OperationOutcome' }
173
- .map(&:resource)
174
- .each do |resource|
175
- assert_resource_type(resource_type, resource:)
176
-
177
- entry_reference_field = get_reference_field(reference_type, resource)
178
- assert(
179
- entry_reference_field.present?,
180
- %(
181
- #{resource_type} resource with id #{resource.id} did not include the field that references
182
- a #{reference_type} resource
183
- )
184
- )
185
-
186
- entry_reference_id = entry_reference_field.reference_id
187
- assert(
188
- entry_reference_id == reference_id,
189
- %(
190
- The #{resource_type} resource in search result bundle with id #{resource.id} should have a
191
- #{reference_type} reference with an id of `#{reference_id}`, instead got: `#{entry_reference_id}`
192
- )
193
- )
194
- end
195
- end
196
-
197
- run do
198
- if search_type == 'status'
199
- coverage_status = ['active', 'cancelled', 'draft', 'entered-in-error']
200
- coverage_status.each do |status|
201
- bundle = perform_fhir_search({ status: }, [resource_type, 'status_search'])
202
- status_search_result_check(bundle, status)
203
- end
204
- else
205
- skip_if search_param_values.blank?, 'No search parameters passed in, skipping test.'
206
-
207
- search_id_list = search_param_values.split(',').map(&:strip)
208
- search_id_list.each do |search_id|
209
- if search_type == '_id'
210
- bundle = perform_fhir_search({ _id: search_id }, [resource_type, 'id_search'])
211
- id_search_result_check(bundle, search_id)
212
- elsif reference_search_parameters.include?(search_type)
213
- search_params = {}
214
- search_params[search_type] = search_id
215
- bundle = perform_fhir_search(search_params, [resource_type, "#{search_type}_search"])
216
- reference_search_result_check(bundle, search_id, search_type)
217
- elsif include_searches.include?(search_type)
218
- include_resource_type = search_type.gsub('_include', '')
219
- bundle = perform_fhir_search({ _id: search_id, _include: "#{resource_type}:#{include_resource_type}" },
220
- [resource_type, "include_#{include_resource_type}_search"])
221
- include_search_result_check(bundle, search_id, include_resource_type)
222
- else
223
- raise StandardError,
224
- 'Passed in search_type does not match to any of the search types handled by this search test.'
225
- end
226
- end
227
- end
228
- skip_if !successful_search,
229
- 'No resources returned in any of the search result bundles.'
230
- end
231
- end
232
- end
@@ -1,41 +0,0 @@
1
- module DaVinciCRDTestKit
2
- class ClientFHIRApiUpdateTest < Inferno::Test
3
- id :crd_client_fhir_api_update_test
4
- title 'Update Interaction'
5
- description %(
6
- Verify that the CRD client supports the update interaction for the given resource. The capabilities required by
7
- each resource can be found here: https://hl7.org/fhir/us/davinci-crd/CapabilityStatement-crd-client.html#resourcesSummary1
8
- )
9
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@74'
10
-
11
- input :update_resources,
12
- type: 'textarea',
13
- description:
14
- 'Provide a list of resources to update. e.g., [json_resource_1, json_resource_2]'
15
-
16
- def resource_type
17
- config.options[:resource_type]
18
- end
19
-
20
- run do
21
- assert_valid_json(update_resources)
22
- update_resources_list = JSON.parse(update_resources)
23
- skip_if(!update_resources_list.is_a?(Array), 'Resources to update not inputted in list format, skipping test.')
24
-
25
- valid_update_resources =
26
- update_resources_list
27
- .compact_blank
28
- .map { |resource| FHIR.from_contents(resource.to_json) }
29
- .select { |resource| resource.resourceType == resource_type }
30
- .select { |resource| resource_is_valid?(resource:) }
31
-
32
- skip_if(valid_update_resources.blank?,
33
- %(No valid #{resource_type} resources were provided to send in Update requests, skipping test.))
34
-
35
- valid_update_resources.each do |update_resource|
36
- fhir_update(update_resource, update_resource.id)
37
- assert_response_status([200, 201])
38
- end
39
- end
40
- end
41
- end
@@ -1,60 +0,0 @@
1
- module DaVinciCRDTestKit
2
- class ClientFHIRApiValidationTest < Inferno::Test
3
- id :crd_client_fhir_api_validation_test
4
- title 'FHIR Resource Validation'
5
- description %(
6
- Verify that the given resources returned from the previous client API interactions are valid resources. Each
7
- resource is validated against its corresponding [CRD resource profile](https://hl7.org/fhir/us/davinci-crd/STU2/artifacts.html).
8
- )
9
-
10
- def resource_type
11
- config.options[:resource_type]
12
- end
13
-
14
- def structure_definition_map
15
- {
16
- 'Practitioner' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-practitioner',
17
- 'PractitionerRole' => 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitionerrole',
18
- 'Patient' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-patient',
19
- 'Encounter' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-encounter',
20
- 'Coverage' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-coverage',
21
- 'Device' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-device',
22
- 'Location' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-location',
23
- 'Organization' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-organization'
24
- }.freeze
25
- end
26
-
27
- def profile_url
28
- structure_definition_map[resource_type]
29
- end
30
-
31
- run do
32
- load_tagged_requests(resource_type)
33
- skip_if requests.empty?, 'No FHIR api requests were made'
34
-
35
- requests.keep_if { |req| req.status == 200 }
36
- skip_if(requests.blank?,
37
- 'There were no successful FHIR API requests made in previous tests to use in validation.')
38
-
39
- validated_resources =
40
- requests
41
- .map(&:resource)
42
- .compact
43
- .flat_map { |resource| resource.is_a?(FHIR::Bundle) ? resource.entry.map(&:resource) : resource }
44
- .select { |resource| resource.resourceType == resource_type }
45
- .uniq { |resource| resource.to_reference.reference }
46
- .each { |resource| resource_is_valid?(resource:, profile_url:) }
47
-
48
- skip_if(validated_resources.blank?,
49
- %(No #{resource_type} resources were returned from any of the FHIR API requests made in previous tests
50
- that could be validated.))
51
-
52
- validation_error_count = messages.count { |msg| msg[:type] == 'error' }
53
- assert(validation_error_count.zero?,
54
- %(#{validation_error_count}/#{validated_resources.length} #{resource_type} resources returned from previous
55
- test's FHIR API requests failed validation.))
56
-
57
- skip_if validated_resources.blank?, 'No FHIR resources were made in previous tests that could be validated.'
58
- end
59
- end
60
- end
@@ -1,79 +0,0 @@
1
- require_relative 'order_dispatch_receive_request_test'
2
- require_relative 'client_display_cards_attest'
3
- require_relative 'decode_auth_token_test'
4
- require_relative 'hook_request_optional_fields_test'
5
- require_relative 'hook_request_required_fields_test'
6
- require_relative 'hook_request_valid_context_test'
7
- require_relative 'hook_request_valid_prefetch_test'
8
- require_relative 'retrieve_jwks_test'
9
- require_relative 'submitted_response_validation'
10
- require_relative 'token_header_test'
11
- require_relative 'token_payload_test'
12
-
13
- module DaVinciCRDTestKit
14
- class ClientOrderDispatchGroup < Inferno::TestGroup
15
- title 'order-dispatch'
16
- id :crd_client_order_dispatch
17
- description <<~DESCRIPTION
18
- The order-dispatch hook fires when a practitioner is selecting a candidate performer for a pre-existing order
19
- that was not tied to a specific performer. These tests are based on the following criteria:
20
- * [CRD IG requirements for this hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-dispatch),
21
- which includes the profiles that are expected to be used for the resources resolved to by `context`
22
- FHIR ID fields
23
- * Specific [order-dispatch `context` requirements](https://cds-hooks.hl7.org/hooks/order-dispatch/2023SepSTU1Ballot/order-dispatch/)
24
- defined in the CDS Hooks specification
25
-
26
- This version of the CRD implementation guide refers to version 1.0 of the hook.
27
- DESCRIPTION
28
-
29
- run_as_group
30
-
31
- input_order :cds_jwt_iss, :cds_jwk_set
32
-
33
- config(
34
- inputs: {
35
- auth_token_headers_json: { name: :order_dispatch_auth_token_headers_json },
36
- auth_tokens: { name: :order_dispatch_auth_tokens },
37
- auth_tokens_jwk_json: { name: :order_dispatch_auth_tokens_jwk_json },
38
- client_access_token: { name: :order_dispatch_client_access_token },
39
- client_fhir_server: { name: :order_dispatch_client_fhir_server },
40
- crd_jwks_keys_json: { name: :order_dispatch_crd_jwks_keys_json },
41
- custom_response: { name: :order_dispatch_custom_response },
42
- selected_response_types: { name: :order_dispatch_selected_response_types }
43
- },
44
- outputs: {
45
- auth_token_headers_json: { name: :order_dispatch_auth_token_headers_json },
46
- auth_token_payloads_json: { name: :order_dispatch_auth_token_payloads_json },
47
- auth_tokens: { name: :order_dispatch_auth_tokens },
48
- auth_tokens_jwk_json: { name: :order_dispatch_auth_tokens_jwk_json },
49
- client_access_token: { name: :order_dispatch_client_access_token },
50
- client_fhir_server: { name: :order_dispatch_client_fhir_server },
51
- crd_jwks_json: { name: :order_dispatch_crd_jwks_json },
52
- crd_jwks_keys_json: { name: :order_dispatch_crd_jwks_keys_json }
53
- },
54
- options: {
55
- hook_name: 'order-dispatch',
56
- hook_path: ORDER_DISPATCH_PATH
57
- }
58
- )
59
-
60
- test from: :crd_submitted_response_validation
61
- test from: :crd_order_dispatch_request
62
- test from: :crd_decode_auth_token
63
- test from: :crd_retrieve_jwks
64
- test from: :crd_token_header
65
- test from: :crd_token_payload
66
- test from: :crd_hook_request_required_fields
67
- test from: :crd_hook_request_optional_fields
68
- test from: :crd_hook_request_valid_context do
69
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@284', 'hl7.fhir.us.davinci-crd_2.0.1@285',
70
- 'hl7.fhir.us.davinci-crd_2.0.1@286', 'hl7.fhir.us.davinci-crd_2.0.1@287',
71
- 'hl7.fhir.us.davinci-crd_2.0.1@288', 'hl7.fhir.us.davinci-crd_2.0.1@289',
72
- 'hl7.fhir.us.davinci-crd_2.0.1@290', 'hl7.fhir.us.davinci-crd_2.0.1@291',
73
- 'hl7.fhir.us.davinci-crd_2.0.1@292', 'hl7.fhir.us.davinci-crd_2.0.1@293',
74
- 'hl7.fhir.us.davinci-crd_2.0.1@294', 'hl7.fhir.us.davinci-crd_2.0.1@295'
75
- end
76
- test from: :crd_hook_request_valid_prefetch
77
- test from: :crd_card_display_attest_test
78
- end
79
- end
@@ -1,82 +0,0 @@
1
- require_relative 'order_select_receive_request_test'
2
- require_relative 'client_display_cards_attest'
3
- require_relative 'decode_auth_token_test'
4
- require_relative 'hook_request_optional_fields_test'
5
- require_relative 'hook_request_required_fields_test'
6
- require_relative 'hook_request_valid_context_test'
7
- require_relative 'hook_request_valid_prefetch_test'
8
- require_relative 'retrieve_jwks_test'
9
- require_relative 'submitted_response_validation'
10
- require_relative 'token_header_test'
11
- require_relative 'token_payload_test'
12
-
13
- module DaVinciCRDTestKit
14
- class ClientOrderSelectGroup < Inferno::TestGroup
15
- title 'order-select'
16
- id :crd_client_order_select
17
- description <<~DESCRIPTION
18
- The order-select hook fires when a clinician selects one or more orders to place for a patient,
19
- (including orders for medications, procedures, labs and other orders). If supported by the CDS Client, this
20
- hook may also be invoked each time the clinician selects a detail regarding the order. These tests are based on
21
- the following criteria:
22
- * [CRD IG requirements for this hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-selecte),
23
- which includes the profiles that are expected to be used for the resources resolved to by `context`
24
- FHIR ID fields
25
- * Specific [order-select `context` requirements](https://cds-hooks.hl7.org/hooks/order-select/2023SepSTU1Ballot/order-select/)
26
- defined in the CDS Hooks specification
27
-
28
- This version of the CRD implementation guide refers to version 1.0 of the hook.
29
- DESCRIPTION
30
-
31
- run_as_group
32
-
33
- input_order :cds_jwt_iss, :cds_jwk_set
34
-
35
- config(
36
- inputs: {
37
- auth_token_headers_json: { name: :order_select_auth_token_headers_json },
38
- auth_tokens: { name: :order_select_auth_tokens },
39
- auth_tokens_jwk_json: { name: :order_select_auth_tokens_jwk_json },
40
- client_access_token: { name: :order_select_client_access_token },
41
- client_fhir_server: { name: :order_select_client_fhir_server },
42
- crd_jwks_keys_json: { name: :order_select_crd_jwks_keys_json },
43
- custom_response: { name: :order_select_custom_response },
44
- selected_response_types: { name: :order_select_selected_response_types }
45
- },
46
- outputs: {
47
- auth_token_headers_json: { name: :order_select_auth_token_headers_json },
48
- auth_token_payloads_json: { name: :order_select_auth_token_payloads_json },
49
- auth_tokens: { name: :order_select_auth_tokens },
50
- auth_tokens_jwk_json: { name: :order_select_auth_tokens_jwk_json },
51
- client_access_token: { name: :order_select_client_access_token },
52
- client_fhir_server: { name: :order_select_client_fhir_server },
53
- crd_jwks_json: { name: :order_select_crd_jwks_json },
54
- crd_jwks_keys_json: { name: :order_select_crd_jwks_keys_json }
55
- },
56
- options: {
57
- hook_name: 'order-select',
58
- hook_path: ORDER_SELECT_PATH
59
- }
60
- )
61
-
62
- test from: :crd_submitted_response_validation
63
- test from: :crd_order_select_request
64
- test from: :crd_decode_auth_token
65
- test from: :crd_retrieve_jwks
66
- test from: :crd_token_header
67
- test from: :crd_token_payload
68
- test from: :crd_hook_request_required_fields
69
- test from: :crd_hook_request_optional_fields
70
- test from: :crd_hook_request_valid_context do
71
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@71', 'hl7.fhir.us.davinci-crd_2.0.1@284',
72
- 'hl7.fhir.us.davinci-crd_2.0.1@285', 'hl7.fhir.us.davinci-crd_2.0.1@286',
73
- 'hl7.fhir.us.davinci-crd_2.0.1@287', 'hl7.fhir.us.davinci-crd_2.0.1@288',
74
- 'hl7.fhir.us.davinci-crd_2.0.1@289', 'hl7.fhir.us.davinci-crd_2.0.1@290',
75
- 'hl7.fhir.us.davinci-crd_2.0.1@291', 'hl7.fhir.us.davinci-crd_2.0.1@292',
76
- 'hl7.fhir.us.davinci-crd_2.0.1@293', 'hl7.fhir.us.davinci-crd_2.0.1@294',
77
- 'hl7.fhir.us.davinci-crd_2.0.1@295'
78
- end
79
- test from: :crd_hook_request_valid_prefetch
80
- test from: :crd_card_display_attest_test
81
- end
82
- end
@@ -1,81 +0,0 @@
1
- require_relative 'order_sign_receive_request_test'
2
- require_relative 'client_display_cards_attest'
3
- require_relative 'decode_auth_token_test'
4
- require_relative 'hook_request_optional_fields_test'
5
- require_relative 'hook_request_required_fields_test'
6
- require_relative 'hook_request_valid_context_test'
7
- require_relative 'hook_request_valid_prefetch_test'
8
- require_relative 'retrieve_jwks_test'
9
- require_relative 'submitted_response_validation'
10
- require_relative 'token_header_test'
11
- require_relative 'token_payload_test'
12
-
13
- module DaVinciCRDTestKit
14
- class ClientOrderSignGroup < Inferno::TestGroup
15
- title 'order-sign'
16
- id :crd_client_order_sign
17
- description <<~DESCRIPTION
18
- The order-sign hook fires when a clinician is ready to sign one or more orders for a patient, (including orders
19
- for medications, procedures, labs and other orders). These tests are based on the following criteria:
20
- * [CRD IG requirements for this hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign),
21
- which includes the profiles that are expected to be used for the resources resolved to by `context`
22
- FHIR ID fields
23
- * Specific [order-sign `context` requirements](https://cds-hooks.org/hooks/order-sign/)
24
- defined in the CDS Hooks specification
25
-
26
- This version of the CRD implementation guide refers to version 1.1 of the hook which, at the time of publication,
27
- was not available as a snapshot. Therefore the preceding link refers to the CDS hooks current build.
28
- DESCRIPTION
29
-
30
- run_as_group
31
-
32
- input_order :cds_jwt_iss, :cds_jwk_set
33
-
34
- config(
35
- inputs: {
36
- auth_token_headers_json: { name: :order_sign_auth_token_headers_json },
37
- auth_tokens: { name: :order_sign_auth_tokens },
38
- auth_tokens_jwk_json: { name: :order_sign_auth_tokens_jwk_json },
39
- client_access_token: { name: :order_sign_client_access_token },
40
- client_fhir_server: { name: :order_sign_client_fhir_server },
41
- crd_jwks_keys_json: { name: :order_sign_crd_jwks_keys_json },
42
- custom_response: { name: :order_sign_custom_response },
43
- selected_response_types: { name: :order_sign_selected_response_types }
44
- },
45
- outputs: {
46
- auth_token_headers_json: { name: :order_sign_auth_token_headers_json },
47
- auth_token_payloads_json: { name: :order_sign_auth_token_payloads_json },
48
- auth_tokens: { name: :order_sign_auth_tokens },
49
- auth_tokens_jwk_json: { name: :order_sign_auth_tokens_jwk_json },
50
- client_access_token: { name: :order_sign_client_access_token },
51
- client_fhir_server: { name: :order_sign_client_fhir_server },
52
- crd_jwks_json: { name: :order_sign_crd_jwks_json },
53
- crd_jwks_keys_json: { name: :order_sign_crd_jwks_keys_json }
54
- },
55
- options: {
56
- hook_name: 'order-sign',
57
- hook_path: ORDER_SIGN_PATH
58
- }
59
- )
60
-
61
- test from: :crd_submitted_response_validation
62
- test from: :crd_order_sign_request
63
- test from: :crd_decode_auth_token
64
- test from: :crd_retrieve_jwks
65
- test from: :crd_token_header
66
- test from: :crd_token_payload
67
- test from: :crd_hook_request_required_fields
68
- test from: :crd_hook_request_optional_fields
69
- test from: :crd_hook_request_valid_context do
70
- verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@71', 'hl7.fhir.us.davinci-crd_2.0.1@284',
71
- 'hl7.fhir.us.davinci-crd_2.0.1@285', 'hl7.fhir.us.davinci-crd_2.0.1@286',
72
- 'hl7.fhir.us.davinci-crd_2.0.1@287', 'hl7.fhir.us.davinci-crd_2.0.1@288',
73
- 'hl7.fhir.us.davinci-crd_2.0.1@289', 'hl7.fhir.us.davinci-crd_2.0.1@290',
74
- 'hl7.fhir.us.davinci-crd_2.0.1@291', 'hl7.fhir.us.davinci-crd_2.0.1@292',
75
- 'hl7.fhir.us.davinci-crd_2.0.1@293', 'hl7.fhir.us.davinci-crd_2.0.1@294',
76
- 'hl7.fhir.us.davinci-crd_2.0.1@295'
77
- end
78
- test from: :crd_hook_request_valid_prefetch
79
- test from: :crd_card_display_attest_test
80
- end
81
- end
@@ -1,88 +0,0 @@
1
- require 'jwt'
2
-
3
- module DaVinciCRDTestKit
4
- class CRDClientRegistrationVerification < Inferno::Test
5
- include URLs
6
-
7
- id :crd_client_registration_verification
8
- title 'Verify CRD Client Registration'
9
- description %(
10
- During this test, Inferno will verify that the CRD Client registration details
11
- provided are conformant.
12
- )
13
- input :cds_jwt_iss,
14
- title: 'CRD JWT Issuer',
15
- description: %(
16
- The `iss` claim of the JWT in the Authorization header sent by the CRD client under test on
17
- all CRD requests. This value will be used to associate incoming requests with this test
18
- session and any requests that use a different `iss` value will not be recognized.
19
- ),
20
- type: 'text'
21
- input :cds_jwk_set,
22
- title: 'CRD JSON Web Key Set (JWKS)',
23
- type: 'textarea',
24
- description: %(
25
- The CRD client's JWK Set containing it's public key. May be either
26
- a publicly accessible url containing the JWKS, or the raw JWKS.
27
- This input is required for these tests to pass.
28
- ),
29
- optional: true
30
-
31
- run do
32
- assert cds_jwk_set.present?, 'Provide a jwk set in the **CRD JSON Web Key Set (JWKS)** input.'
33
-
34
- jwks_warnings = []
35
- parsed_jwk_set = jwk_set(cds_jwk_set, jwks_warnings)
36
- jwks_warnings.each { |warning| add_message('warning', warning) }
37
-
38
- assert parsed_jwk_set.length.positive?, 'JWKS content does not include any valid keys.'
39
-
40
- assert messages.none? { |msg| msg[:type] == 'error' }, 'Invalid key set provided. See messages for details'
41
- end
42
-
43
- def jwk_set(jku, warning_messages = []) # rubocop:disable Metrics/CyclomaticComplexity
44
- jwk_set = JWT::JWK::Set.new
45
-
46
- if jku.blank?
47
- warning_messages << 'No key set input.'
48
- return jwk_set
49
- end
50
-
51
- jwk_body = # try as raw jwk set
52
- begin
53
- JSON.parse(jku)
54
- rescue JSON::ParserError
55
- nil
56
- end
57
-
58
- if jwk_body.blank?
59
- retrieved = Faraday.get(jku) # try as url pointing to a jwk set
60
- jwk_body =
61
- begin
62
- JSON.parse(retrieved.body)
63
- rescue JSON::ParserError
64
- warning_messages << "Failed to fetch valid json from jwks uri #{jku}."
65
- nil
66
- end
67
- else
68
- warning_messages << 'Providing the JWK Set directly is strongly discouraged.'
69
- end
70
-
71
- return jwk_set if jwk_body.blank?
72
-
73
- jwk_body['keys']&.each_with_index do |key_hash, index|
74
- parsed_key =
75
- begin
76
- JWT::JWK.new(key_hash)
77
- rescue JWT::JWKError => e
78
- id = key_hash['kid'] | index
79
- warning_messages << "Key #{id} invalid: #{e}"
80
- nil
81
- end
82
- jwk_set << parsed_key unless parsed_key.blank?
83
- end
84
-
85
- jwk_set
86
- end
87
- end
88
- end