davinci_crd_test_kit 0.13.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_crd_client_suite.json.erb +20 -14
  3. data/config/presets/inferno_crd_client_suite_prefetch_subset_v221.json.erb +125 -0
  4. data/config/presets/inferno_crd_client_suite_v221.json.erb +188 -0
  5. data/config/presets/inferno_crd_server_suite.json.erb +58 -1
  6. data/config/presets/inferno_crd_server_suite_v221.json.erb +94 -0
  7. data/config/presets/ri_crd_request_generator.json_v221.json.erb +13 -0
  8. data/config/presets/ri_crd_server.json.erb +19 -19
  9. data/lib/davinci_crd_test_kit/client/client_base_urls.rb +80 -0
  10. data/lib/davinci_crd_test_kit/{client_hook_request_validation.rb → client/client_hook_request_validation.rb} +1 -1
  11. data/lib/davinci_crd_test_kit/client/crd_client_options.rb +30 -0
  12. data/lib/davinci_crd_test_kit/client/endpoints/cds_services_discovery_handler.rb +34 -0
  13. data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +342 -0
  14. data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +410 -0
  15. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +239 -0
  16. data/lib/davinci_crd_test_kit/{mock_service_response.rb → client/endpoints/mock_service_response.rb} +165 -59
  17. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/companions_prerequisites.json +1 -0
  18. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/create_update_coverage_information.json +3 -2
  19. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/external_reference.json +1 -1
  20. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +1 -1
  21. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
  22. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
  23. data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
  24. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
  33. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
  34. data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
  38. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
  39. data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
  40. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
  41. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
  42. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
  43. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
  44. data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
  45. data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
  46. data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
  47. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
  48. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
  49. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
  50. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
  51. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
  52. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
  53. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
  54. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
  55. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
  56. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
  57. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
  58. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
  59. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
  60. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
  61. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
  62. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
  63. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
  64. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
  65. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +109 -0
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +102 -0
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +101 -0
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +84 -0
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +107 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +108 -0
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +113 -0
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +33 -0
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +234 -0
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +54 -0
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +108 -0
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
  105. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
  106. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +133 -0
  107. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
  108. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
  109. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
  110. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +75 -0
  111. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
  112. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
  113. data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
  114. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +321 -0
  115. data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
  116. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
  117. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
  118. data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
  119. data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
  120. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
  121. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +476 -0
  122. data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
  123. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
  124. data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
  125. data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
  126. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +203 -0
  127. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +435 -0
  128. data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
  129. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +46 -0
  130. data/lib/davinci_crd_test_kit/metadata.rb +10 -44
  131. data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
  132. data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -0
  133. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  134. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +742 -65
  135. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
  136. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
  137. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
  138. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
  139. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
  140. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  141. data/lib/davinci_crd_test_kit/server/endpoints/jwk_set_endpoint_handler.rb +13 -0
  142. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
  143. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
  144. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
  145. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
  146. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
  147. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
  148. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
  149. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
  150. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
  151. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
  152. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_no_special_requests.rb +17 -0
  153. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
  154. data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
  155. data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
  156. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +183 -0
  157. data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
  158. data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +3 -3
  159. data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
  160. data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
  161. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
  162. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
  163. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
  164. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
  165. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
  166. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
  167. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
  168. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
  169. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
  170. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
  171. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
  172. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
  173. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
  174. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
  175. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
  176. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
  177. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
  178. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
  179. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
  180. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
  181. data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
  182. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
  183. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
  184. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
  185. data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
  186. data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
  187. data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
  188. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
  189. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
  190. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
  191. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
  192. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
  193. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
  194. data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
  195. data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
  196. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
  197. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  198. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  199. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
  200. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
  201. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  202. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
  203. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
  204. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
  205. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
  206. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
  207. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
  208. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
  209. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
  210. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
  211. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
  212. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
  213. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
  214. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
  215. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
  216. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
  217. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
  218. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
  219. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
  220. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
  221. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
  222. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
  223. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
  224. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
  225. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +118 -0
  226. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
  227. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
  228. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
  229. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
  230. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_standard_prefetch_expressions_test.rb +166 -0
  231. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
  232. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
  233. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
  234. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
  235. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
  236. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +121 -0
  237. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +94 -0
  238. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +71 -0
  239. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +107 -0
  240. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +107 -0
  241. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
  242. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +121 -0
  243. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +115 -0
  244. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +132 -0
  245. data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
  246. data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
  247. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_response_group.rb +23 -0
  248. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
  249. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
  250. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
  251. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
  252. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
  253. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
  254. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +31 -0
  255. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
  256. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +40 -0
  257. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +41 -0
  258. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +109 -0
  259. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
  260. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
  261. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
  262. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +130 -0
  263. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +119 -0
  264. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +89 -0
  265. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +126 -0
  266. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +174 -0
  267. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +83 -0
  268. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +88 -0
  269. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
  270. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +81 -0
  271. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +63 -0
  272. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
  273. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
  274. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
  275. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
  276. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
  277. data/lib/davinci_crd_test_kit/version.rb +2 -2
  278. data/lib/davinci_crd_test_kit.rb +4 -2
  279. metadata +307 -93
  280. data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
  281. data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -74
  282. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
  283. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
  284. data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
  285. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
  286. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
  287. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -42
  288. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -40
  289. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
  290. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -42
  291. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -61
  292. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
  293. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
  294. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
  295. data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
  296. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
  297. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
  298. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
  299. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
  300. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
  301. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
  302. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
  303. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
  304. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
  305. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
  306. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
  307. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -48
  308. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
  309. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
  310. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -193
  311. data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
  312. data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
  313. data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
  314. data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
  315. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
  316. data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
  317. data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
  318. data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
  319. data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
  320. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
  321. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
  322. data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
  323. data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
  324. data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
  325. data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
  326. data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
  327. data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
  328. data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
  329. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
  330. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
  331. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
  332. data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
  333. data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
  334. data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
  335. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
  336. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
  337. data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
  338. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
  339. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
  340. data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
  341. data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
  342. data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
  343. data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
  344. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
  345. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
  346. data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
  347. data/lib/davinci_crd_test_kit/tags.rb +0 -10
  348. data/lib/davinci_crd_test_kit/urls.rb +0 -52
  349. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
  350. /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
  351. /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
@@ -0,0 +1,108 @@
1
+ module DaVinciCRDTestKit
2
+ module V221
3
+ # Users of this test need to set config options for coverage_code, reason_code, and optionally require_reason_text
4
+ class CoverageInfoReasonTest < Inferno::Test
5
+ id :crd_v221_coverage_info_reason
6
+ title 'Coverage Information responses have the expected coverage and reason codes'
7
+
8
+ description <<~DESCRIPTION
9
+ This test verifies that the Coverage Information responses received contain Coverage Information extensions
10
+ with the expected coverage and reason codes.
11
+ DESCRIPTION
12
+
13
+ input :coverage_info
14
+
15
+ COVERAGE_INFO_EXTENSION_URL =
16
+ 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information'.freeze
17
+
18
+ run do
19
+ coverage_info_actions = JSON.parse(coverage_info)
20
+
21
+ skip_if coverage_info_actions.blank?, 'No Coverage Information system actions received'
22
+
23
+ coverage_info_actions.each_with_index do |action, index|
24
+ coverage_info_extensions(action['resource']).each do |extension|
25
+ unless expected_coverage? extension
26
+ coverage_code = coverage_extension_value(extension)
27
+ add_message(
28
+ 'error',
29
+ "Coverage should be `#{expected_coverage_code}`, but found `#{coverage_code}` in action ##{index + 1}"
30
+ )
31
+ end
32
+
33
+ unless expected_reason? extension
34
+ reason_code =
35
+ reason_extension_values(extension)
36
+ &.map { |reason| "`#{reason}`" }
37
+ &.join(', ') || 'no reason'
38
+ add_message(
39
+ 'error',
40
+ "Coverage reason should be `#{expected_reason_code}`, but found #{reason_code} in action ##{index + 1}"
41
+ )
42
+
43
+ next
44
+ end
45
+
46
+ next unless require_reason_text?
47
+ next if reason_text?(extension)
48
+
49
+ add_message(
50
+ 'error',
51
+ "`#{expected_reason_code}` coverage reason contains no additional details in `text` field " \
52
+ "in action ##{index + 1}"
53
+ )
54
+ end
55
+ end
56
+
57
+ assert_no_error_messages(
58
+ "Not all coverage info extensions had `#{expected_coverage_code}` coverage " \
59
+ "with a reason of `#{expected_reason_code}`"
60
+ )
61
+ end
62
+
63
+ def coverage_info_extensions(resource)
64
+ resource['extension'].select { |extension| extension['url'] == COVERAGE_INFO_EXTENSION_URL }
65
+ end
66
+
67
+ def coverage_extension_value(coverage_info_extension)
68
+ coverage_info_extension['extension']
69
+ .find { |extension| extension['url'] == 'covered' }
70
+ &.dig('valueCode')
71
+ end
72
+
73
+ def expected_coverage?(coverage_info_extension)
74
+ coverage_extension_value(coverage_info_extension) == expected_coverage_code
75
+ end
76
+
77
+ def reason_extension_values(coverage_info_extension)
78
+ coverage_info_extension['extension']
79
+ .find { |extension| extension['url'] == 'reason' }
80
+ &.dig('valueCodeableConcept', 'coding')
81
+ &.map { |coding| coding['code'] }
82
+ end
83
+
84
+ def expected_reason?(coverage_info_extension)
85
+ reason_extension_values(coverage_info_extension)&.include? expected_reason_code
86
+ end
87
+
88
+ def reason_text?(coverage_info_extension)
89
+ coverage_info_extension['extension']
90
+ .find { |extension| extension['url'] == 'reason' }
91
+ &.dig('valueCodeableConcept', 'text')
92
+ &.present?
93
+ end
94
+
95
+ def expected_coverage_code
96
+ config.options[:expected_coverage_code]
97
+ end
98
+
99
+ def expected_reason_code
100
+ config.options[:expected_reason_code]
101
+ end
102
+
103
+ def require_reason_text?
104
+ config.options[:require_reason_text] || false
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,116 @@
1
+ require_relative '../interaction/server_invoke_hook_single_request_test'
2
+ require_relative 'coverage_info_reason_test'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class CoverageNotFoundGroup < Inferno::TestGroup
7
+ title 'Coverage Not Found'
8
+ id :crd_v221_server_coverage_not_found_group
9
+ description %(
10
+ This group of tests allows the system to demonstrate its ability to respond to a CRD Hook invocation
11
+ with a `not-covered` coverage determination when the patient can be resolved but coverage cannot be found
12
+ or cannot be resolved to a single coverage.
13
+
14
+ For these tests, provide a hook request body that represents a resolvable patient for whom the CRD Server
15
+ cannot find coverage or cannot resolve to a single coverage. The tests then verify that a Coverage
16
+ Information systemAction is received with `not-covered` coverage for `coverage-not-found` reason.
17
+ )
18
+
19
+ config options: { hook_name: COVERAGE_NOT_FOUND_TAG }
20
+ run_as_group
21
+
22
+ group do
23
+ title 'Interaction'
24
+
25
+ test from: :crd_v221_server_invoke_hook_single_request_test,
26
+ title: 'Inferno invokes the selected hook to elicit coverage not found response',
27
+ description: <<~DESCRIPTION,
28
+ This test initiates a POST request to a specified CDS Service using the JSON body provided
29
+ by the user. The request body should represent a resolvable patient for whom coverage cannot be
30
+ found or cannot be resolved to a single coverage.
31
+ DESCRIPTION
32
+ config: {
33
+ inputs: {
34
+ service_ids: {
35
+ name: :coverage_not_found_service_ids,
36
+ title: 'Service id to use for the "Coverage Not Found" test',
37
+ description: %(
38
+ If blank, Inferno will attempt to infer the service id to use by finding a service entry
39
+ in the Discovery response for the hook indicated in the provided request body. If it
40
+ cannot be inferred, the tests will be skipped.
41
+ )
42
+ },
43
+ service_request_bodies: {
44
+ name: :coverage_not_found_request_body,
45
+ title: 'Request body to use for the "Coverage Not Found" test',
46
+ description: %(
47
+ Provide a single JSON request body to submit for the hook invocation. The type of hook
48
+ invoked will be inferred based on the `hook` element in the request. The body should be
49
+ constructed so that it represents a resolvable patient for whom coverage cannot be found.
50
+ )
51
+ }
52
+ }
53
+ }
54
+ end
55
+
56
+ group do
57
+ title 'Requests'
58
+ simulation_verification
59
+
60
+ test from: :crd_v221_service_request_required_fields_validation,
61
+ config: {
62
+ outputs: {
63
+ contexts: {
64
+ name: :coverage_not_found_contexts
65
+ }
66
+ }
67
+ }
68
+ test from: :crd_v221_service_request_context_validation,
69
+ config: {
70
+ inputs: {
71
+ contexts: {
72
+ name: :coverage_not_found_contexts
73
+ },
74
+ request_body: {
75
+ name: :coverage_not_found_request_body
76
+ }
77
+ }
78
+ }
79
+ end
80
+
81
+ group do
82
+ title 'Responses'
83
+
84
+ test from: :crd_v221_service_response_validation
85
+ test from: :crd_v221_coverage_info_system_action_validation,
86
+ config: {
87
+ outputs: {
88
+ coverage_info: {
89
+ name: :coverage_not_found_coverage_info
90
+ }
91
+ }
92
+ }
93
+ test from: :crd_v221_coverage_info_reason,
94
+ title: 'Coverage Information responses have not-covered coverage for coverage-not-found reason',
95
+ description: <<~DESCRIPTION,
96
+ This test verifies that the Coverage Information responses received contain Coverage Information
97
+ extensions with `not-covered` coverage and a `coverage-not-found` reason.
98
+ DESCRIPTION
99
+ config: {
100
+ inputs: {
101
+ coverage_info: {
102
+ name: :coverage_not_found_coverage_info
103
+ }
104
+ },
105
+ options: {
106
+ expected_coverage_code: 'not-covered',
107
+ expected_reason_code: 'coverage-not-found'
108
+ }
109
+ },
110
+ verifies_requirements: [
111
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-45'
112
+ ]
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,115 @@
1
+ require_relative '../interaction/server_invoke_hook_single_request_test'
2
+ require_relative 'coverage_info_reason_test'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class NoActiveCoverageGroup < Inferno::TestGroup
7
+ title 'No Active Coverage'
8
+ id :crd_v221_server_no_active_coverage_group
9
+ description %(
10
+ This group of tests allows the system to demonstrate its ability to respond to a CRD Hook invocation
11
+ with a `not-covered` coverage determination when the patient can be resolved but does not have active
12
+ coverage.
13
+
14
+ For these tests, provide a hook request body that represents a resolvable patient without active
15
+ coverage. The tests then verify that a Coverage Information systemAction is received with `not-covered`
16
+ coverage for `no-active-coverage` reason.
17
+ )
18
+
19
+ config options: { hook_name: NO_ACTIVE_COVERAGE_TAG }
20
+ run_as_group
21
+
22
+ group do
23
+ title 'Interaction'
24
+
25
+ test from: :crd_v221_server_invoke_hook_single_request_test,
26
+ title: 'Inferno invokes the selected hook to elicit no active coverage response',
27
+ description: <<~DESCRIPTION,
28
+ This test initiates a POST request to a specified CDS Service using the JSON body provided
29
+ by the user. The request body should represent a resolvable patient without active coverage.
30
+ DESCRIPTION
31
+ config: {
32
+ inputs: {
33
+ service_ids: {
34
+ name: :no_active_coverage_service_ids,
35
+ title: 'Service id to use for the "No Active Coverage" test',
36
+ description: %(
37
+ If blank, Inferno will attempt to infer the service id to use by finding a service entry
38
+ in the Discovery response for the hook indicated in the provided request body. If it
39
+ cannot be inferred, the tests will be skipped.
40
+ )
41
+ },
42
+ service_request_bodies: {
43
+ name: :no_active_coverage_request_body,
44
+ title: 'Request body to use for the "No Active Coverage" test',
45
+ description: %(
46
+ Provide a single JSON request body to submit for the hook invocation. The type of hook
47
+ invoked will be inferred based on the `hook` element in the request. The body should be
48
+ constructed so that it represents a resolvable patient without active coverage.
49
+ )
50
+ }
51
+ }
52
+ }
53
+ end
54
+
55
+ group do
56
+ title 'Requests'
57
+ simulation_verification
58
+
59
+ test from: :crd_v221_service_request_required_fields_validation,
60
+ config: {
61
+ outputs: {
62
+ contexts: {
63
+ name: :no_active_coverage_contexts
64
+ }
65
+ }
66
+ }
67
+ test from: :crd_v221_service_request_context_validation,
68
+ config: {
69
+ inputs: {
70
+ contexts: {
71
+ name: :no_active_coverage_contexts
72
+ },
73
+ request_body: {
74
+ name: :no_active_coverage_request_body
75
+ }
76
+ }
77
+ }
78
+ end
79
+
80
+ group do
81
+ title 'Responses'
82
+
83
+ test from: :crd_v221_service_response_validation
84
+ test from: :crd_v221_coverage_info_system_action_validation,
85
+ config: {
86
+ outputs: {
87
+ coverage_info: {
88
+ name: :no_active_coverage_coverage_info
89
+ }
90
+ }
91
+ }
92
+ test from: :crd_v221_coverage_info_reason,
93
+ title: 'Coverage Information responses have not-covered coverage for no-active-coverage reason',
94
+ description: <<~DESCRIPTION,
95
+ This test verifies that the Coverage Information responses received contain Coverage Information
96
+ extensions with `not-covered` coverage and a `no-active-coverage` reason.
97
+ DESCRIPTION
98
+ config: {
99
+ inputs: {
100
+ coverage_info: {
101
+ name: :no_active_coverage_coverage_info
102
+ }
103
+ },
104
+ options: {
105
+ expected_coverage_code: 'not-covered',
106
+ expected_reason_code: 'no-active-coverage'
107
+ }
108
+ },
109
+ verifies_requirements: [
110
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-45'
111
+ ]
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,117 @@
1
+ require_relative '../interaction/server_invoke_hook_single_request_test'
2
+ require_relative 'coverage_info_reason_test'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class NoMemberFoundGroup < Inferno::TestGroup
7
+ title 'No Member Found'
8
+ id :crd_v221_server_no_member_found_group
9
+ description %(
10
+ This group of tests allows the system to demonstrate its ability to respond to a CRD Hook invocation
11
+ with a `not-covered` coverage determination when it is unable to resolve the patient for a
12
+ non-technical reason.
13
+
14
+ For these tests, provide a hook request body that represents a patient/member the CRD Server cannot
15
+ resolve for a non-technical reason.
16
+
17
+ The tests then verify that a Coverage Information systemAction is received with `not-covered` coverage
18
+ for `no-member-found` reasons.
19
+ )
20
+
21
+ config options: { hook_name: NO_MEMBER_FOUND_TAG }
22
+ run_as_group
23
+
24
+ group do
25
+ title 'Interaction'
26
+
27
+ test from: :crd_v221_server_invoke_hook_single_request_test,
28
+ title: 'Inferno invokes the selected hook to elicit unresolved member response',
29
+ description: <<~DESCRIPTION,
30
+ This test initiates a POST request to a specified CDS Service using the JSON body provided
31
+ by the user. The request body should represent an unrecognized member.
32
+ DESCRIPTION
33
+ config: {
34
+ inputs: {
35
+ service_ids: {
36
+ name: :no_member_found_service_ids,
37
+ title: 'Service id to use for the "No Member Found" test',
38
+ description: %(
39
+ If blank, Inferno will attempt to infer the service id to use by finding a service entry
40
+ in the Discovery response for the hook indicated in the provided request body. If it
41
+ cannot be inferred, the tests will be skipped.
42
+ )
43
+ },
44
+ service_request_bodies: {
45
+ name: :no_member_found_request_body,
46
+ title: 'Request body to use for the "No Member Found" test',
47
+ description: %(
48
+ Provide a single JSON request body to submit for the hook invocation. The type of hook
49
+ invoked will be inferred based on the `hook` element in the request. The body should be
50
+ constructed so that the CRD Server is unable to resolve the patient/member.
51
+ )
52
+ }
53
+ }
54
+ }
55
+ end
56
+
57
+ group do
58
+ title 'Requests'
59
+ simulation_verification
60
+
61
+ test from: :crd_v221_service_request_required_fields_validation,
62
+ config: {
63
+ outputs: {
64
+ contexts: {
65
+ name: :no_member_found_contexts
66
+ }
67
+ }
68
+ }
69
+ test from: :crd_v221_service_request_context_validation,
70
+ config: {
71
+ inputs: {
72
+ contexts: {
73
+ name: :no_member_found_contexts
74
+ },
75
+ request_body: {
76
+ name: :no_member_found_request_body
77
+ }
78
+ }
79
+ }
80
+ end
81
+
82
+ group do
83
+ title 'Responses'
84
+
85
+ test from: :crd_v221_service_response_validation
86
+ test from: :crd_v221_coverage_info_system_action_validation,
87
+ config: {
88
+ outputs: {
89
+ coverage_info: {
90
+ name: :no_member_found_coverage_info
91
+ }
92
+ }
93
+ }
94
+ test from: :crd_v221_coverage_info_reason,
95
+ title: 'Coverage Information responses have not-covered coverage for no-member-found reason',
96
+ description: <<~DESCRIPTION,
97
+ This test verifies that the Coverage Information responses received contain Coverage Information
98
+ extensions with `not-covered` coverage and a `no-member-found` reason.
99
+ DESCRIPTION
100
+ config: {
101
+ inputs: {
102
+ coverage_info: {
103
+ name: :no_member_found_coverage_info
104
+ }
105
+ },
106
+ options: {
107
+ expected_coverage_code: 'not-covered',
108
+ expected_reason_code: 'no-member-found'
109
+ }
110
+ },
111
+ verifies_requirements: [
112
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-44'
113
+ ]
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,121 @@
1
+ require_relative 'technical_issues_invoke_test'
2
+ require_relative 'coverage_info_reason_test'
3
+
4
+ module DaVinciCRDTestKit
5
+ module V221
6
+ class TechnicalIssuesGroup < Inferno::TestGroup
7
+ title 'Technical Issues'
8
+ id :crd_v221_server_technical_issues_group
9
+ description %(
10
+ This group of tests allows the system to demonstrate its ability to
11
+ respond to a CRD Hook invocation with an `indeterminate` coverage
12
+ determination due to technical issues.
13
+
14
+ For these tests, the hook call will include an invalid access token,
15
+ which due to the nature of Inferno's FHIR server simulation will result
16
+ in 500 response to FHIR requests, simulating a temporary server outage.
17
+ The tests then verify that a Coverage Information systemAction is
18
+ received with `indeterminate` coverage for `technical` reasons.
19
+ )
20
+
21
+ config options: { hook_name: TECHNICAL_ISSUES_TAG }
22
+ run_as_group
23
+
24
+ group do
25
+ title 'Interaction'
26
+
27
+ test from: :crd_v221_server_technical_issues_invoke_hook_test,
28
+ description: <<~DESCRIPTION,
29
+ This test initiates a POST request to a specified CDS Service
30
+ using the JSON body list provided by the user. This request is
31
+ generated so that requests for FHIR resources from the CDS service
32
+ result in 500 errors, simulating a temporary server error.
33
+ DESCRIPTION
34
+ config: {
35
+ inputs: {
36
+ service_ids: {
37
+ name: :technical_issues_service_ids,
38
+ title: 'Service id to use for the "Technical Issues" test',
39
+ description: %(
40
+ If blank, Inferno will attempt to infer the service id to use
41
+ by finding a service entry in the Discovery response for the
42
+ hook indicated in the provided request body. If it cannot be
43
+ inferred, the tests will be skipped.
44
+ )
45
+ },
46
+ service_request_bodies: {
47
+ name: :technical_issues_request_body,
48
+ title: 'Request body to use for the "Technical Issues" test',
49
+ description: %(
50
+ Provide a single JSON request body to submit for the hook
51
+ invocation. The type of hook invoked will be inferred based
52
+ on the `hook` element in the request.
53
+ )
54
+ }
55
+ }
56
+ }
57
+ end
58
+
59
+ group do
60
+ title 'Requests'
61
+ simulation_verification
62
+
63
+ test from: :crd_v221_service_request_required_fields_validation,
64
+ config: {
65
+ outputs: {
66
+ contexts: {
67
+ name: :technical_issues_contexts
68
+ }
69
+ }
70
+ }
71
+ test from: :crd_v221_service_request_context_validation,
72
+ config: {
73
+ inputs: {
74
+ contexts: {
75
+ name: :technical_issues_contexts
76
+ },
77
+ request_body: {
78
+ name: :technical_issues_request_body
79
+ }
80
+ }
81
+ }
82
+ end
83
+
84
+ group do
85
+ title 'Responses'
86
+
87
+ test from: :crd_v221_service_response_validation
88
+ test from: :crd_v221_coverage_info_system_action_validation,
89
+ config: {
90
+ outputs: {
91
+ coverage_info: {
92
+ name: :technical_issues_coverage_info
93
+ }
94
+ }
95
+ }
96
+ test from: :crd_v221_coverage_info_reason,
97
+ title: 'Coverage Information responses have indeterminate coverage for technical reasons',
98
+ description: <<~DESCRIPTION,
99
+ This test verifies that the Coverage Information responses received contain Coverage Information
100
+ extensions with `indeterminate` coverage and a `technical` reason, and additional details about the
101
+ failure are included in the `text` field of the reason extension.
102
+ DESCRIPTION
103
+ config: {
104
+ inputs: {
105
+ coverage_info: {
106
+ name: :technical_issues_coverage_info
107
+ }
108
+ },
109
+ options: {
110
+ expected_coverage_code: 'indeterminate',
111
+ expected_reason_code: 'technical',
112
+ require_reason_text: true
113
+ }
114
+ },
115
+ verifies_requirements: [
116
+ 'hl7.fhir.us.davinci-crd_2.2.1@resp-43'
117
+ ]
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../server_urls'
2
+ require_relative '../../jobs/invoke_hook_with_bad_auth'
3
+ require_relative '../../server_abstract_invoke_hook_test'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class TechnicalIssuesInvokeHookTest < ServerAbstractInvokeHookTest
8
+ include ServerURLs
9
+
10
+ title 'Inferno invokes the selected hook with invalid authorization'
11
+ id :crd_v221_server_technical_issues_invoke_hook_test
12
+
13
+ def perform_invoke_hook_job(*)
14
+ Inferno::Jobs.perform(DaVinciCRDTestKit::Jobs::InvokeHookWithBadAuth, *)
15
+ end
16
+
17
+ def check_request_length(payloads)
18
+ skip_if payloads.length != 1, 'The *Technical Issues* test supports only one request body.'
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../server_hook_request_validation'
2
+ require_relative '../../server_test_helper'
3
+ require_relative '../../server_hook_helper'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class ServiceRequestContextValidationTest < Inferno::Test
8
+ include DaVinciCRDTestKit::ServerHookRequestValidation
9
+ include DaVinciCRDTestKit::ServerTestHelper
10
+ include DaVinciCRDTestKit::ServerHookHelper
11
+
12
+ title 'Service request contexts are valid'
13
+ id :crd_v221_service_request_context_validation
14
+ description %(
15
+ This test verifies that all service requests `context` field is valid and contains all the
16
+ required fields.
17
+ )
18
+ input :contexts, :invoked_hook
19
+ simulation_verification
20
+
21
+ run do
22
+ parsed_contexts = parse_json(contexts)
23
+ parsed_contexts.each do |context|
24
+ hook_request_context_check(context, invoked_hook, ig_version: 'v221')
25
+ end
26
+
27
+ no_error_validation('Some contexts are not valid.')
28
+ end
29
+ end
30
+ end
31
+ end