davinci_crd_test_kit 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_crd_client_suite.json.erb +20 -14
  3. data/config/presets/inferno_crd_client_suite_prefetch_subset_v221.json.erb +125 -0
  4. data/config/presets/inferno_crd_client_suite_v221.json.erb +124 -0
  5. data/config/presets/inferno_crd_server_suite.json.erb +58 -1
  6. data/config/presets/inferno_crd_server_suite_v221.json.erb +94 -0
  7. data/config/presets/ri_crd_request_generator.json_v221.json.erb +13 -0
  8. data/config/presets/ri_crd_server.json.erb +19 -19
  9. data/lib/davinci_crd_test_kit/client/client_base_urls.rb +80 -0
  10. data/lib/davinci_crd_test_kit/{client_hook_request_validation.rb → client/client_hook_request_validation.rb} +1 -1
  11. data/lib/davinci_crd_test_kit/client/crd_client_options.rb +30 -0
  12. data/lib/davinci_crd_test_kit/client/endpoints/cds_services_discovery_handler.rb +34 -0
  13. data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +342 -0
  14. data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +410 -0
  15. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +233 -0
  16. data/lib/davinci_crd_test_kit/{mock_service_response.rb → client/endpoints/mock_service_response.rb} +165 -59
  17. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/companions_prerequisites.json +1 -0
  18. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/create_update_coverage_information.json +3 -2
  19. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +8 -1
  20. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
  21. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
  22. data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
  23. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
  24. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
  33. data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
  34. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
  38. data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
  39. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
  40. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
  41. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
  42. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
  43. data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
  44. data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
  45. data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
  46. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
  47. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
  48. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
  49. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
  50. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
  51. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
  52. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
  53. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
  54. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
  55. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
  56. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
  57. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
  58. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
  59. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
  60. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
  61. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
  62. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
  63. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
  64. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
  65. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +102 -0
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +96 -0
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +95 -0
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +64 -0
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +101 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +102 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +107 -0
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +27 -0
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +229 -0
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +49 -0
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +107 -0
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
  105. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +127 -0
  106. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
  107. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
  108. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
  109. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +74 -0
  110. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
  111. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
  112. data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
  113. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +312 -0
  114. data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
  115. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
  116. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
  117. data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
  118. data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
  119. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
  120. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +462 -0
  121. data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
  122. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
  123. data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
  124. data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
  125. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +202 -0
  126. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +274 -0
  127. data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
  128. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +42 -0
  129. data/lib/davinci_crd_test_kit/metadata.rb +10 -44
  130. data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
  131. data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -0
  132. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  133. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +742 -65
  134. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
  135. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
  136. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
  137. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
  138. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
  139. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  140. data/lib/davinci_crd_test_kit/server/endpoints/jwk_set_endpoint_handler.rb +13 -0
  141. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
  142. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
  143. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
  144. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
  145. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
  146. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
  147. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
  148. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
  149. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
  150. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
  151. data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
  152. data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
  153. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +165 -0
  154. data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
  155. data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +1 -1
  156. data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
  157. data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
  158. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
  159. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
  160. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
  161. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
  162. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
  163. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
  164. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
  165. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
  166. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
  167. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
  168. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
  169. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
  170. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
  171. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
  172. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
  173. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
  174. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
  175. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
  176. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
  177. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
  178. data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
  179. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
  180. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
  181. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
  182. data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
  183. data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
  184. data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
  185. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
  186. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
  187. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
  188. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
  189. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
  190. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
  191. data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
  192. data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
  193. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
  194. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  195. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  196. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
  197. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
  198. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  199. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
  200. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
  201. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
  202. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
  203. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
  204. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
  205. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
  206. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
  207. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
  208. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
  209. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
  210. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
  211. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
  212. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
  213. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
  214. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
  215. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
  216. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
  217. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
  218. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
  219. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
  220. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
  221. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
  222. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +115 -0
  223. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
  224. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
  225. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
  226. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
  227. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
  228. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
  229. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
  230. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
  231. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +213 -0
  232. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +93 -0
  233. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +69 -0
  234. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +194 -0
  235. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +194 -0
  236. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
  237. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +214 -0
  238. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +219 -0
  239. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +241 -0
  240. data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
  241. data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
  242. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +30 -0
  243. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
  244. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  245. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  246. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +66 -0
  247. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
  248. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +57 -0
  249. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
  250. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  251. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +184 -0
  252. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +75 -0
  253. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +47 -0
  254. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +91 -0
  255. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +137 -0
  256. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +32 -0
  257. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +49 -0
  258. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
  259. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +54 -0
  260. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +97 -0
  261. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
  262. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
  263. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
  264. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
  265. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
  266. data/lib/davinci_crd_test_kit/version.rb +2 -2
  267. data/lib/davinci_crd_test_kit.rb +4 -2
  268. metadata +297 -93
  269. data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
  270. data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -74
  271. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
  272. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
  273. data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
  274. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
  275. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
  276. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -42
  277. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -40
  278. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
  279. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -42
  280. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -61
  281. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
  282. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
  283. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
  284. data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
  285. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
  286. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
  287. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
  288. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
  289. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
  290. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
  291. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
  292. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
  293. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
  294. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
  295. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
  296. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -48
  297. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
  298. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
  299. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -193
  300. data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
  301. data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
  302. data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
  303. data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
  304. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
  305. data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
  306. data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
  307. data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
  308. data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
  309. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
  310. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
  311. data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
  312. data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
  313. data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
  314. data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
  315. data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
  316. data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
  317. data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
  318. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
  319. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
  320. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
  321. data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
  322. data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
  323. data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
  324. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
  325. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
  326. data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
  327. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
  328. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
  329. data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
  330. data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
  331. data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
  332. data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
  333. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
  334. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
  335. data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
  336. data/lib/davinci_crd_test_kit/tags.rb +0 -10
  337. data/lib/davinci_crd_test_kit/urls.rb +0 -52
  338. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/external_reference.json +0 -0
  339. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
  340. /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
  341. /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
@@ -0,0 +1,70 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../../cross_suite/suggestion_actions_validation'
3
+ require_relative '../../server_hook_helper'
4
+ require_relative '../../../cross_suite/cards_identification'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V201
8
+ class CreateOrUpdateCoverageInfoResponseValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::SuggestionActionsValidation
11
+ include DaVinciCRDTestKit::ServerHookHelper
12
+ include DaVinciCRDTestKit::CardsIdentification
13
+
14
+ title 'Valid Create or Update Coverage Information cards or system actions received'
15
+ id :crd_v201_create_or_update_coverage_info_response_validation
16
+ description %(
17
+ This test validates the Create or Update Coverage Information cards or system actions received from the
18
+ CRD service, as per the specifications outlined in the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information).
19
+
20
+ - **Checking for Presence:**
21
+ The test first checks if any Create or Update Coverage Information cards or system actions are present in
22
+ the returned valid cards or valid system actions.
23
+ - **For cards**: it ensures there are cards with a `suggestions` array containing a single suggestion,
24
+ and the `actions` array of that suggestion has one `create` or `update` action for the `Coverage` resource.
25
+ - **For system actions**: it checks for the presence of `create` or `update` actions for the `Coverage`
26
+ resource.
27
+
28
+ - **Validating:**
29
+ If any Create or Update Coverage Information cards or system actions are found, each `Coverage` resource is
30
+ validated against the base FHIR Coverage resource.
31
+
32
+ If no Create or Update Coverage Information cards or system actions are received, the test is skipped.
33
+ )
34
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@306'
35
+ optional
36
+ input :valid_cards_with_suggestions, :valid_system_actions
37
+
38
+ run do
39
+ parsed_cards = parse_json(valid_cards_with_suggestions)
40
+ parsed_actions = parse_json(valid_system_actions)
41
+
42
+ create_or_update_coverage_info_cards = parsed_cards.select do |card|
43
+ create_or_update_coverage_card_response_type?(card)
44
+ end
45
+ create_or_update_coverage_info_actions = parsed_actions.select do |action|
46
+ create_or_update_coverage_action_response_type?(action)
47
+ end
48
+
49
+ skip_msg = "#{tested_hook_name} hook response does not contain any Create or Update Coverage Information " \
50
+ 'cards or system actions.'
51
+ skip_if create_or_update_coverage_info_cards.blank? && create_or_update_coverage_info_actions.blank?, skip_msg
52
+
53
+ if create_or_update_coverage_info_actions.present?
54
+ actions_check(create_or_update_coverage_info_actions,
55
+ ig_version: 'v201')
56
+ end
57
+
58
+ if create_or_update_coverage_info_cards.present?
59
+ create_or_update_coverage_info_cards.each do |card|
60
+ actions_check(card['suggestions'].first['actions'].select do |action|
61
+ create_or_update_coverage_action_response_type?(action)
62
+ end, ig_version: 'v201')
63
+ end
64
+ end
65
+
66
+ no_error_validation('Some Create or Update Coverage Information received are not valid.')
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/cards_identification'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V201
7
+ class ExternalReferenceCardValidationTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerTestHelper
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::CardsIdentification
11
+
12
+ title 'Valid External Reference cards received'
13
+ id :crd_v201_external_reference_card_validation
14
+ description %(
15
+ This test verifies the presence of valid External Reference cards within the list of valid cards
16
+ returned by the CRD service.
17
+ As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference),
18
+ External Reference cards must contain links with the type set to `absolute`.
19
+ This test checks for the presence of any External Reference cards by verifying:
20
+ - The presence of a `links` array within each card.
21
+ - That every link in the `links` array of a card is of type `absolute`.
22
+ )
23
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@258', 'hl7.fhir.us.davinci-crd_2.0.1@259'
24
+
25
+ input :valid_cards_with_links
26
+ optional
27
+
28
+ run do
29
+ parsed_cards = parse_json(valid_cards_with_links)
30
+ external_reference_cards = parsed_cards.select { |card| external_reference_response_type?(card) }
31
+
32
+ assert external_reference_cards.present?,
33
+ "#{tested_hook_name} hook response did not contain an External Reference card."
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,67 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../../cross_suite/suggestion_actions_validation'
3
+ require_relative '../../server_hook_helper'
4
+ require_relative '../../../cross_suite/cards_identification'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V201
8
+ class FormCompletionResponseValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::SuggestionActionsValidation
11
+ include DaVinciCRDTestKit::ServerHookHelper
12
+ include DaVinciCRDTestKit::CardsIdentification
13
+
14
+ title 'Valid Request Form Completion cards or system actions received'
15
+ id :crd_v201_request_form_completion_response_validation
16
+ description %(
17
+ This test validates the Request Form Completion cards or system actions received from the CRD service,
18
+ as per the specifications outlined in the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion).
19
+
20
+ - **Checking for Presence:**
21
+ The test begins by verifying whether any Request Form Completion cards or system actions are present.
22
+ - **For cards:** It ensures that there are cards with `suggestions` containing `create` actions
23
+ for the `Task` resource, specifically:
24
+ - The `Task` must have a `code` of `complete-questionnaire`.
25
+ - The `Task` should include an input of type `text` (`Task.input.type.text`) labeled as `questionnaire`
26
+ and associated with a valid canonical URL (`Task.input.valueCanonical`).
27
+ - **For system actions:** It checks for the presence of `create` actions for the `Task` resource with
28
+ the characteristics described above.
29
+
30
+ - **Validating:**
31
+ If any Request Form Completion cards or system actions are found, the test proceeds to validate them.
32
+ Each `Task` resource is validated against the [CRD Questionnaire Task profile](http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-taskquestionnaire).
33
+
34
+ If no Request Form Completion cards or system actions are received, the test is skipped.
35
+ )
36
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@299'
37
+ optional
38
+ input :valid_cards_with_suggestions, :valid_system_actions
39
+
40
+ run do
41
+ parsed_cards = parse_json(valid_cards_with_suggestions)
42
+ parsed_actions = parse_json(valid_system_actions)
43
+
44
+ form_completion_cards = parsed_cards.select { |card| form_completion_card_response_type?(card) }
45
+ form_completion_actions = parsed_actions.select { |action| form_completion_action_response_type?(action) }
46
+
47
+ skip_if form_completion_cards.blank? && form_completion_actions.blank?,
48
+ "#{tested_hook_name} hook response does not contain any " \
49
+ 'Request Form Completion cards or system actions.'
50
+
51
+ actions_check(form_completion_actions, ig_version: 'v201') if form_completion_actions.present?
52
+
53
+ if form_completion_cards.present?
54
+ form_completion_cards.each do |card|
55
+ card['suggestions'].each do |suggestion|
56
+ actions_check(suggestion['actions']&.select do |action|
57
+ form_completion_action_response_type?(action)
58
+ end, ig_version: 'v201')
59
+ end
60
+ end
61
+ end
62
+
63
+ no_error_validation('Some Request Form Completion received are not valid.')
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,30 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/cards_identification'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V201
7
+ class InstructionsCardReceivedTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerTestHelper
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::CardsIdentification
11
+
12
+ title 'Valid Instructions cards received'
13
+ id :crd_v201_valid_instructions_card_received
14
+ description %(
15
+ This test validates that an [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions)
16
+ card was received. It does so by:
17
+ - Checking for the presence of a valid card that does not contain the `links` field and the `suggestions` field.
18
+ )
19
+
20
+ input :valid_cards
21
+ optional
22
+
23
+ run do
24
+ parsed_cards = parse_json(valid_cards)
25
+ instructions_card = parsed_cards.find { |card| instructions_response_type?(card) }
26
+ assert instructions_card, "#{tested_hook_name} hook response did not contain an Instructions card."
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../server_hook_helper'
3
+ require_relative '../../../cross_suite/cards_identification'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V201
7
+ class LaunchSmartAppCardValidationTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerTestHelper
9
+ include DaVinciCRDTestKit::ServerHookHelper
10
+ include DaVinciCRDTestKit::CardsIdentification
11
+
12
+ title 'Valid Launch SMART Application cards received'
13
+ id :crd_v201_launch_smart_app_card_validation
14
+ description %(
15
+ This test verifies the presence of valid Launch SMART Application cards within the list of valid cards
16
+ returned by the CRD service.
17
+ As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application),
18
+ Launch SMART Application cards must contain links with the type set to `smart`.
19
+ This test checks for the presence of any Launch SMART Application cards by verifying:
20
+ - The existence of a `links` array within each card.
21
+ - That every link in the `links` array of a card is of type `smart`.
22
+
23
+ The test will be skipped if no Launch SMART Application cards are found within the returned valid cards.
24
+ )
25
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@258'
26
+
27
+ optional
28
+ input :valid_cards_with_links
29
+
30
+ run do
31
+ parsed_cards = parse_json(valid_cards_with_links)
32
+ external_reference_cards = parsed_cards.select { |card| launch_smart_app_response_type?(card) }
33
+
34
+ skip_if external_reference_cards.blank?,
35
+ "#{tested_hook_name} hook response does not contain any Launch SMART App cards."
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,46 @@
1
+ require_relative '../../server_test_helper'
2
+ require_relative '../../../cross_suite/suggestion_actions_validation'
3
+ require_relative '../../server_hook_helper'
4
+ require_relative '../../../cross_suite/cards_identification'
5
+
6
+ module DaVinciCRDTestKit
7
+ module V201
8
+ class ProposeAlternateRequestCardValidationTest < Inferno::Test
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::SuggestionActionsValidation
11
+ include DaVinciCRDTestKit::ServerHookHelper
12
+ include DaVinciCRDTestKit::CardsIdentification
13
+
14
+ title 'Valid Propose Alternate Request cards received'
15
+ id :crd_v201_propose_alternate_request_card_validation
16
+ description %(
17
+ This test validates that all [Propose Alternate Request](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#propose-alternate-request)
18
+ cards received are valid. It checks for the presence of a card's suggestion
19
+ with a single action with `Action.type` of `update` or a card with at least
20
+ two actions, one with `Action.type` of `delete` and the other with
21
+ `Action.type` of `create`.
22
+ )
23
+ optional
24
+ input :valid_cards_with_suggestions, :contexts
25
+
26
+ run do
27
+ parsed_cards = parse_json(valid_cards_with_suggestions)
28
+ parsed_contexts = parse_json(contexts)
29
+ proposed_alternate_cards = parsed_cards.filter do |card|
30
+ propose_alternative_request_response_type?(card)
31
+ end
32
+
33
+ skip_if proposed_alternate_cards.blank?,
34
+ "#{tested_hook_name} hook response does not contain a Propose Alternate Request card."
35
+
36
+ proposed_alternate_cards.each do |card|
37
+ card['suggestions'].each do |suggestion|
38
+ actions_check(suggestion['actions'], parsed_contexts, ig_version: 'v201')
39
+ end
40
+ end
41
+
42
+ no_error_validation('Some Proposed Alternate Request cards are not valid.')
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,83 @@
1
+ require_relative '../../../cross_suite/cards_validation'
2
+ require_relative '../../server_hook_helper'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V201
6
+ class ServiceResponseValidationTest < Inferno::Test
7
+ include DaVinciCRDTestKit::CardsValidation
8
+ include DaVinciCRDTestKit::ServerHookHelper
9
+
10
+ title 'All service responses contain valid cards and optional systemActions'
11
+ id :crd_v201_service_response_validation
12
+ description %(
13
+ As per the [CDS Hooks spec section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response),
14
+ a successful server's response to a service request must be a JSON object containing a `cards` array.
15
+ It must also contain a `systemActions` array for `appointment-book` and `order-sign` hook.
16
+
17
+ Each card must contain the following required fields: `summary`, `indicator`, and `source`.
18
+ The required fields must have a valid data structure.
19
+ )
20
+ input :invoked_hook
21
+ output :valid_cards, :valid_system_actions
22
+
23
+ SYSTEM_ACTIONS_HOOK_NAMES = ['appointment-book', 'order-sign', 'order-dispatch'].freeze
24
+
25
+ def valid_cards
26
+ @valid_cards ||= []
27
+ end
28
+
29
+ def valid_system_actions
30
+ @valid_system_actions ||= []
31
+ end
32
+
33
+ def system_actions_check(system_actions)
34
+ system_actions.each do |action|
35
+ current_error_count = messages.count { |msg| msg[:type] == 'error' }
36
+ action_fields_validation(action, ig_version: 'v201')
37
+ valid_system_actions << action if current_error_count == messages.count { |msg| msg[:type] == 'error' }
38
+ end
39
+ end
40
+
41
+ def perform_system_actions_validation(system_actions, response_index)
42
+ if SYSTEM_ACTIONS_HOOK_NAMES.include?(invoked_hook) && system_actions.nil?
43
+ msg = "Server response #{response_index + 1} did not have the `systemActions` field, " \
44
+ "which must be present for the `#{invoked_hook}` hook."
45
+ add_message('error', msg)
46
+ end
47
+ return if system_actions.nil?
48
+
49
+ unless system_actions.is_a?(Array)
50
+ add_message('error', "`systemActions` of server response #{response_index + 1} is not an array.")
51
+ return
52
+ end
53
+ system_actions_check(system_actions)
54
+ end
55
+
56
+ run do
57
+ load_tagged_requests(tested_hook_name)
58
+ skip_if requests.blank?, "No #{tested_hook_name} request was made in a previous test as expected."
59
+ successful_requests = requests.select { |request| request.status == 200 }
60
+ skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
61
+
62
+ info do
63
+ unsuccessful_count = (requests - successful_requests).length
64
+ assert unsuccessful_count.zero?, "#{unsuccessful_count} out of #{requests.length} requests were unsuccessful"
65
+ end
66
+
67
+ successful_requests.each_with_index do |request, index|
68
+ service_response = JSON.parse(request.response_body)
69
+ perform_cards_validation(service_response['cards'], service_response['systemActions'].present?, 'v201', index)
70
+
71
+ perform_system_actions_validation(service_response['systemActions'], index)
72
+ rescue JSON::ParserError
73
+ add_message('error', "Invalid JSON: server response #{index + 1} is not valid JSON.")
74
+ end
75
+
76
+ output valid_system_actions: valid_system_actions.to_json
77
+ output valid_cards: valid_cards.to_json
78
+
79
+ no_error_validation('Some service responses are not valid. Check messages for issues found.')
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Appointment
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-appointment-with-order
4
+ :profile_name: CRD Appointment with Order
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Appointment
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-appointment-no-order
4
+ :profile_name: CRD Appointment without Order
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: CommunicationRequest
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-communicationrequest
4
+ :profile_name: CRD Communication Request
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Coverage
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-coverage
4
+ :profile_name: CRD Coverage
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Device
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-device
4
+ :profile_name: CRD Device
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: DeviceRequest
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-devicerequest
4
+ :profile_name: CRD Device Request
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Encounter
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-encounter
4
+ :profile_name: CRD Encounter
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Location
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-location
4
+ :profile_name: CRD Location
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: MedicationRequest
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-medicationrequest
4
+ :profile_name: CRD Medication Request
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: NutritionOrder
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-nutritionorder
4
+ :profile_name: CRD Nutrition Order
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Organization
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-organization
4
+ :profile_name: CRD Organization
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: Patient
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-patient
4
+ :profile_name: CRD Patient
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: PractitionerRole
3
+ :profile_url: http://hl7.org/fhir/us/davinci-hrex/StructureDefinition/hrex-practitionerrole
4
+ :profile_name: HRex PractitionerRole Profile
5
+ :profile_version: 1.2.0
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: ServiceRequest
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-servicerequest
4
+ :profile_name: CRD Service Request
5
+ :profile_version: 2.2.1
@@ -0,0 +1,5 @@
1
+ ---
2
+ :resource: VisionPrescription
3
+ :profile_url: http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-visionprescription
4
+ :profile_name: CRD Vision Prescription
5
+ :profile_version: 2.2.1
@@ -0,0 +1,115 @@
1
+ require_relative '../jwt_helper'
2
+ require_relative '../endpoints/jwk_set_endpoint_handler'
3
+ require_relative 'server_discovery_group'
4
+ require_relative 'server_demonstrate_hook_response_group'
5
+ require_relative 'server_hooks_group'
6
+ require_relative 'server_urls'
7
+ require_relative '../endpoints/mock_ehr_endpoints'
8
+
9
+ module DaVinciCRDTestKit
10
+ module V221
11
+ class CRDServerSuite < Inferno::TestSuite
12
+ include ServerURLs
13
+
14
+ id :crd_server_v221
15
+ title 'Da Vinci CRD Server v2.2.1 Test Suite'
16
+ description <<~DESCRIPTION
17
+ The Da Vinci CRD Server v2.2.1 Test Suite tests the conformance of systems to the
18
+ capabilities of a CRD server as described in [version 2.2.1](https://hl7.org/fhir/us/davinci-crd/2.2.1)
19
+ of the Da Vinci Coverage Requirements Discovery (CRD) Implementation Guide.
20
+
21
+ Detailed information about this test suite can be found in the
22
+ [server section](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Server-Details) of the
23
+ [CRD Test Kit Wiki](https://github.com/inferno-framework/davinci-crd-test-kit/wiki), including:
24
+ - [What testers need to successfully execute these tests](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Server-Instructions-v2.2.1#pre-execution-setup-and-required-information),
25
+ - [Minimal](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Server-Instructions-v2.2.1#quick-start)
26
+ and [complete](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Server-Instructions-v2.2.1#additional-testing-options)
27
+ instructions for executing against a server system, and
28
+ - How to [interpret test results](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Server-Instructions-v2.2.1#interpreting-results).
29
+ DESCRIPTION
30
+
31
+ suite_summary <<~SUMMARY
32
+ The Da Vinci CRD Server v2.2.1 Test Suite tests the conformance of server systems
33
+ to [version 2.2.1 of the Da Vinci Coverage Requirements Discovery (CRD)
34
+ Implementation Guide](https://hl7.org/fhir/us/davinci-crd/2.2.1).
35
+ SUMMARY
36
+
37
+ links [
38
+ {
39
+ label: 'Implementation Guide',
40
+ url: 'https://hl7.org/fhir/us/davinci-crd/2.2.1'
41
+ },
42
+ {
43
+ label: 'Report Issue',
44
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit/issues'
45
+ },
46
+ {
47
+ label: 'Open Source',
48
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit'
49
+ },
50
+ {
51
+ label: 'Download',
52
+ url: 'https://github.com/inferno-framework/davinci-crd-test-kit/releases'
53
+ }
54
+ ]
55
+
56
+ requirement_sets(
57
+ {
58
+ identifier: 'hl7.fhir.us.davinci-crd_2.2.1',
59
+ title: 'Da Vinci Coverage Requirements Discovery (CRD) v2.2.1',
60
+ actor: 'CRD Server'
61
+ }
62
+ )
63
+
64
+ input :base_url,
65
+ title: 'CRD server base URL'
66
+
67
+ fhir_resource_validator do
68
+ igs(
69
+ 'hl7.fhir.us.davinci-crd#2.2.1',
70
+ 'hl7.fhir.us.core#3.1.1',
71
+ 'hl7.fhir.us.core#6.1.0',
72
+ 'hl7.fhir.us.core#7.0.0'
73
+ )
74
+
75
+ validation_context do
76
+ snomedCT '731000124108' # explicit snomedCT expansion parameter
77
+ end
78
+
79
+ exclude_message do |message|
80
+ message.message.match?(
81
+ /Appointment\.participant\[.*\]: This element does not match any known slice defined in the profile/
82
+ ) ||
83
+ message.message.match?(
84
+ /Slice 'Appointment.participant:\w+': a matching slice is required, but not found/
85
+ )
86
+ end
87
+ # # extension definition issue present in 2.0.1 but corrected in later versions
88
+ # message.message.match?(%r{The extension http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information is not allowed to be used at this point \(allowed = e:QuestionnaireResponse, e:Encounter, e:NutritionOrder, e:CommunicationRequest, e:DeviceRequest, e:ServiceRequest, e:MedicationRequest; this element is \[Appointment\]\)}) # rubocop:disable Layout/LineLength
89
+ # end
90
+ end
91
+
92
+ US_CORE_7_METADATA_PATTERN = File.join(
93
+ Gem::Specification.find_by_name('us_core_test_kit').gem_dir,
94
+ 'lib', 'us_core_test_kit', 'generated', 'v7.0.0', '*', 'metadata.yml'
95
+ )
96
+ CRD_V221_METADATA_PATTERN = File.join(__dir__, 'crd_metadata', '*.yml')
97
+ include(MockEHREndpoints.with do
98
+ Dir.glob([US_CORE_7_METADATA_PATTERN, CRD_V221_METADATA_PATTERN])
99
+ end)
100
+
101
+ route :get, '/jwks.json', JWKSetEndpointHandler
102
+ resume_test_route :get, RESUME_PASS_PATH do |request|
103
+ request.query_parameters['token']
104
+ end
105
+ resume_test_route :get, RESUME_FAIL_PATH, result: 'fail' do |request|
106
+ request.query_parameters['token']
107
+ end
108
+ group from: :crd_v221_server_discovery_group
109
+
110
+ group from: :crd_v221_server_demonstrate_hook_response
111
+
112
+ group from: :crd_v221_server_hooks
113
+ end
114
+ end
115
+ end