davinci_crd_test_kit 0.12.2 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_crd_client_suite.json.erb +20 -14
  3. data/config/presets/inferno_crd_client_suite_prefetch_subset_v221.json.erb +125 -0
  4. data/config/presets/inferno_crd_client_suite_v221.json.erb +124 -0
  5. data/config/presets/inferno_crd_server_suite.json.erb +59 -2
  6. data/config/presets/inferno_crd_server_suite_v221.json.erb +94 -0
  7. data/config/presets/ri_crd_request_generator.json_v221.json.erb +13 -0
  8. data/config/presets/ri_crd_server.json.erb +19 -19
  9. data/lib/davinci_crd_test_kit/client/client_base_urls.rb +80 -0
  10. data/lib/davinci_crd_test_kit/{client_hook_request_validation.rb → client/client_hook_request_validation.rb} +1 -1
  11. data/lib/davinci_crd_test_kit/client/crd_client_options.rb +30 -0
  12. data/lib/davinci_crd_test_kit/client/endpoints/cds_services_discovery_handler.rb +34 -0
  13. data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +342 -0
  14. data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +410 -0
  15. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +233 -0
  16. data/lib/davinci_crd_test_kit/{mock_service_response.rb → client/endpoints/mock_service_response.rb} +165 -59
  17. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/companions_prerequisites.json +1 -0
  18. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/create_update_coverage_information.json +3 -2
  19. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +8 -1
  20. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
  21. data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
  22. data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
  23. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
  24. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
  33. data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
  34. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
  38. data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
  39. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
  40. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
  41. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
  42. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
  43. data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
  44. data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
  45. data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
  46. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
  47. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
  48. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
  49. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
  50. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
  51. data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
  52. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
  53. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
  54. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
  55. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
  56. data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
  57. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
  58. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
  59. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
  60. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
  61. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
  62. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
  63. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
  64. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
  65. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +102 -0
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +96 -0
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +95 -0
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +64 -0
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +101 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +102 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +107 -0
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +27 -0
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +229 -0
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +49 -0
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +107 -0
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
  105. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +127 -0
  106. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
  107. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
  108. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
  109. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +74 -0
  110. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
  111. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
  112. data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
  113. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +312 -0
  114. data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
  115. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
  116. data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
  117. data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
  118. data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
  119. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
  120. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +462 -0
  121. data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
  122. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
  123. data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
  124. data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
  125. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +202 -0
  126. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +274 -0
  127. data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
  128. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +42 -0
  129. data/lib/davinci_crd_test_kit/metadata.rb +10 -44
  130. data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
  131. data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -0
  132. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  133. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +742 -65
  134. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
  135. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
  136. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
  137. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
  138. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
  139. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  140. data/lib/davinci_crd_test_kit/server/endpoints/jwk_set_endpoint_handler.rb +13 -0
  141. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
  142. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
  143. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
  144. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
  145. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
  146. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
  147. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
  148. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
  149. data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
  150. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
  151. data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
  152. data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
  153. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +165 -0
  154. data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
  155. data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +1 -1
  156. data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
  157. data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
  158. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
  159. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
  160. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
  161. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
  162. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
  163. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
  164. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
  165. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
  166. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
  167. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
  168. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
  169. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
  170. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
  171. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
  172. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
  173. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
  174. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
  175. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
  176. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
  177. data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
  178. data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
  179. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
  180. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
  181. data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
  182. data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
  183. data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
  184. data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
  185. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
  186. data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
  187. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
  188. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
  189. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
  190. data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
  191. data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
  192. data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
  193. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
  194. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  195. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  196. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
  197. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
  198. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  199. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
  200. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
  201. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
  202. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
  203. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
  204. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
  205. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
  206. data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
  207. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
  208. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
  209. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
  210. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
  211. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
  212. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
  213. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
  214. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
  215. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
  216. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
  217. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
  218. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
  219. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
  220. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
  221. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
  222. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +115 -0
  223. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
  224. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
  225. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
  226. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
  227. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
  228. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
  229. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
  230. data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
  231. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +213 -0
  232. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +93 -0
  233. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +69 -0
  234. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +194 -0
  235. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +194 -0
  236. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
  237. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +214 -0
  238. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +219 -0
  239. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +241 -0
  240. data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
  241. data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
  242. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +30 -0
  243. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
  244. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
  245. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
  246. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +66 -0
  247. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
  248. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +57 -0
  249. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
  250. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
  251. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +184 -0
  252. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +75 -0
  253. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +47 -0
  254. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +91 -0
  255. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +137 -0
  256. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +32 -0
  257. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +49 -0
  258. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
  259. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +54 -0
  260. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +97 -0
  261. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
  262. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
  263. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
  264. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
  265. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
  266. data/lib/davinci_crd_test_kit/version.rb +2 -2
  267. data/lib/davinci_crd_test_kit.rb +4 -2
  268. metadata +308 -101
  269. data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
  270. data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -75
  271. data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
  272. data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
  273. data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
  274. data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
  275. data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
  276. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -41
  277. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -39
  278. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
  279. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -41
  280. data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -60
  281. data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
  282. data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
  283. data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
  284. data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
  285. data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
  286. data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
  287. data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
  288. data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
  289. data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
  290. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
  291. data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
  292. data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
  293. data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
  294. data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
  295. data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
  296. data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -44
  297. data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
  298. data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
  299. data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -185
  300. data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
  301. data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
  302. data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
  303. data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
  304. data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
  305. data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
  306. data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
  307. data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
  308. data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
  309. data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
  310. data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
  311. data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
  312. data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
  313. data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
  314. data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
  315. data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
  316. data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
  317. data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
  318. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
  319. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
  320. data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
  321. data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
  322. data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
  323. data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
  324. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
  325. data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
  326. data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
  327. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
  328. data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
  329. data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
  330. data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
  331. data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
  332. data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
  333. data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
  334. data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
  335. data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
  336. data/lib/davinci_crd_test_kit/tags.rb +0 -10
  337. data/lib/davinci_crd_test_kit/urls.rb +0 -52
  338. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/external_reference.json +0 -0
  339. /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
  340. /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
  341. /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
@@ -1,6 +1,21 @@
1
1
  module DaVinciCRDTestKit
2
2
  # Serve responses to CRD hook invocations
3
3
  module MockServiceResponse
4
+ def build_mock_hook_response
5
+ hook_card_response = create_cards_and_system_actions
6
+ update_specific_hook_card_info(hook_card_response)
7
+ create_warning_messages(hook_card_response)
8
+
9
+ hook_card_response
10
+ end
11
+
12
+ def selected_response_types
13
+ @selected_response_types ||=
14
+ JSON.parse(result.input_json)
15
+ .find { |input| input['name'].include?('selected_response_types') }
16
+ &.dig('value') || []
17
+ end
18
+
4
19
  def current_time
5
20
  Time.now.utc
6
21
  end
@@ -10,7 +25,10 @@ module DaVinciCRDTestKit
10
25
  end
11
26
 
12
27
  def load_json_file(filename)
13
- json = JSON.parse(File.read(File.join(__dir__, 'card_responses', filename)))
28
+ json = JSON.parse(File.read(File.join(__dir__, 'mocked_card_responses', filename)))
29
+ if ig_version == 'v221'
30
+ json['source']['topic']['system'] = 'http://terminology.hl7.org/CodeSystem/cdshooks-card-type'
31
+ end
14
32
  return json unless filename == 'launch_smart_app.json'
15
33
 
16
34
  json['links'].first['url'] = "#{Inferno::Application['base_url']}/custom/smart/launch"
@@ -18,11 +36,6 @@ module DaVinciCRDTestKit
18
36
  json
19
37
  end
20
38
 
21
- def request_body
22
- @request_body ||=
23
- JSON.parse(request.params.to_json)
24
- end
25
-
26
39
  def context
27
40
  request_body['context']
28
41
  end
@@ -54,13 +67,17 @@ module DaVinciCRDTestKit
54
67
  end
55
68
 
56
69
  def coverage_information_required?
57
- coverage_information_required_hooks.include? hook_name
70
+ coverage_information_required_hooks.include? requested_hook
58
71
  end
59
72
 
60
73
  def get_missing_response_types(hook_card_response)
61
- selected_response_types.append('coverage_information').uniq! if coverage_information_required?
74
+ expected_types = if coverage_information_required?
75
+ selected_response_types | ['coverage_information']
76
+ else
77
+ selected_response_types
78
+ end
62
79
 
63
- selected_response_types
80
+ expected_types
64
81
  .select do |response_type|
65
82
  response_type = response_type
66
83
  .split('_')
@@ -72,8 +89,6 @@ module DaVinciCRDTestKit
72
89
  end
73
90
 
74
91
  def create_warning_messages(hook_card_response)
75
- return if custom_response.present?
76
-
77
92
  missing_response_types =
78
93
  if hook_card_response.nil?
79
94
  selected_response_types
@@ -88,7 +103,7 @@ module DaVinciCRDTestKit
88
103
  Inferno::Repositories::Messages.new.create(
89
104
  result_id: result.id,
90
105
  type: 'warning',
91
- message: %(Unable to return response type: `#{missing_response_type}` for #{hook_name} hook)
106
+ message: %(Unable to return response type `#{missing_response_type}` for #{requested_hook} hook)
92
107
  )
93
108
  end
94
109
  end
@@ -109,14 +124,20 @@ module DaVinciCRDTestKit
109
124
  def update_specific_hook_card_info(card_response)
110
125
  return if card_response.nil?
111
126
 
112
- hook_display = hook_name.split('-').map(&:capitalize).join(' ')
113
- card_response['cards'].map do |card|
114
- card['summary'].prepend("#{hook_display} ")
115
- card['uuid'] = SecureRandom.uuid
127
+ hook_display = requested_hook.split('-').map(&:capitalize).join(' ')
128
+ card_response['cards']&.tap(&:compact!)&.each do |card|
129
+ update_one_card_info(card, hook_display)
116
130
  end
131
+ card_response['systemActions']&.compact!
117
132
  card_response
118
133
  end
119
134
 
135
+ def update_one_card_info(card, hook_display)
136
+ card['summary'].prepend("#{hook_display} ")
137
+ card['uuid'] = SecureRandom.uuid
138
+ card['suggestions']&.each { |suggestion| suggestion['uuid'] = SecureRandom.uuid if suggestion['uuid'].present? }
139
+ end
140
+
120
141
  def resource_to_update_field_name
121
142
  {
122
143
  'appointment-book' => 'appointments',
@@ -125,27 +146,14 @@ module DaVinciCRDTestKit
125
146
  'order-dispatch' => 'order',
126
147
  'order-select' => 'draftOrders',
127
148
  'order-sign' => 'draftOrders'
128
- }[hook_name]
149
+ }[requested_hook]
129
150
  end
130
151
 
131
152
  def resource_type_to_update
132
153
  {
133
154
  'encounter-start' => 'Encounter',
134
155
  'encounter-discharge' => 'Encounter'
135
- }[hook_name]
136
- end
137
-
138
- def hook_response
139
- hook_card_response =
140
- if custom_response.present?
141
- JSON.parse(custom_response)
142
- else
143
- cards_response = create_cards_and_system_actions
144
- update_specific_hook_card_info(cards_response)
145
- end
146
-
147
- create_warning_messages(hook_card_response)
148
- create_card_response(hook_card_response)
156
+ }[requested_hook]
149
157
  end
150
158
 
151
159
  def make_resource_request(uri, access_token)
@@ -159,10 +167,15 @@ module DaVinciCRDTestKit
159
167
  resource.entry.first.resource
160
168
  end
161
169
 
170
+ def patient_coverage
171
+ @patient_coverage ||= get_patient_coverage
172
+ end
173
+
162
174
  def get_patient_coverage # rubocop:disable Naming/AccessorMethodName
163
- prefetch = request_body['prefetch']
164
- if prefetch.present? && prefetch['coverage']
165
- FHIR.from_contents(prefetch['coverage'].to_json)
175
+ prefetched_coverage = extract_prefetched_coverage(request_body['prefetch'])
176
+ if prefetched_coverage.present?
177
+ coverage_or_bundle = FHIR.from_contents(prefetched_coverage.to_json)
178
+ coverage_or_bundle.is_a?(FHIR::Bundle) ? coverage_or_bundle.entry.first&.resource : coverage_or_bundle
166
179
  else
167
180
  fhir_server = request_body['fhirServer']
168
181
  if fhir_server.present?
@@ -177,7 +190,17 @@ module DaVinciCRDTestKit
177
190
  end
178
191
  end
179
192
 
193
+ def extract_prefetched_coverage(prefetch)
194
+ return nil unless prefetch.present?
195
+ return prefetch['coverage'] if prefetch['coverage'].present?
196
+ return prefetch['cov'] if prefetch['cov'].present?
197
+
198
+ nil
199
+ end
200
+
180
201
  def get_context_resource(update_resource_id)
202
+ return unless update_resource_id.present?
203
+
181
204
  update_resource_id = "#{resource_type_to_update}/#{update_resource_id}" unless update_resource_id.include? '/'
182
205
  fhir_server = request_body['fhirServer']
183
206
  return if fhir_server.blank?
@@ -190,7 +213,7 @@ module DaVinciCRDTestKit
190
213
  end
191
214
 
192
215
  def add_coverage_cards?
193
- (['coverage_information', 'create_update_coverage_info'].any? { |x| selected_response_types.include?(x) }) ||
216
+ ['coverage_information', 'create_update_coverage_info'].any? { |x| selected_response_types.include?(x) } ||
194
217
  coverage_information_required?
195
218
  end
196
219
 
@@ -200,7 +223,6 @@ module DaVinciCRDTestKit
200
223
  cards = []
201
224
 
202
225
  add_basic_cards(cards)
203
-
204
226
  add_order_hook_cards(cards)
205
227
 
206
228
  system_actions = add_coverage_cards(cards)
@@ -210,7 +232,9 @@ module DaVinciCRDTestKit
210
232
  cards_response = { 'cards' => cards }
211
233
  cards_response['systemActions'] = system_actions if system_actions.present?
212
234
  cards_response
213
- rescue StandardError
235
+ rescue StandardError => e
236
+ Inferno::Application['logger'].error(e.full_message)
237
+ # TODO: - make sure this gets logged
214
238
  nil
215
239
  end
216
240
 
@@ -231,31 +255,26 @@ module DaVinciCRDTestKit
231
255
  def add_coverage_cards(cards)
232
256
  return unless add_coverage_cards?
233
257
 
234
- coverage = get_patient_coverage
235
- if coverage.present?
258
+ system_actions = []
259
+ if patient_coverage.present?
236
260
  if selected_response_types.include?('coverage_information') || coverage_information_required?
237
- system_actions =
238
- create_coverage_extension_system_actions(coverage.id)
261
+ system_actions = create_coverage_extension_system_actions(patient_coverage.id)
239
262
  end
240
263
 
241
264
  if selected_response_types.include?('create_update_coverage_info')
242
- cards.append(create_or_update_coverage(coverage))
265
+ coverage_card = create_or_update_coverage(patient_coverage)
266
+ cards.append(coverage_card) if coverage_card.present?
243
267
  end
244
268
  end
245
269
  system_actions
246
270
  end
247
271
 
248
272
  def create_coverage_extension_system_actions(coverage_id)
249
- update_resource = context[resource_to_update_field_name]
250
- prefetch_id = resource_to_update_field_name.split(/(?=[A-Z])/).first
251
-
252
273
  fhir_resource =
253
- if update_resource.is_a? Hash
254
- FHIR.from_contents(update_resource.to_json)
255
- elsif request_body['prefetch'] && request_body['prefetch'][prefetch_id]
256
- FHIR.from_contents(request_body['prefetch'][prefetch_id].to_json)
274
+ if requested_hook == 'order-dispatch' && ig_version == 'v221'
275
+ find_prefetched_order_dispatch_orders
257
276
  else
258
- get_context_resource(update_resource)
277
+ identify_resources_for_system_actions
259
278
  end
260
279
 
261
280
  create_system_actions(fhir_resource, coverage_id)
@@ -263,6 +282,65 @@ module DaVinciCRDTestKit
263
282
  nil
264
283
  end
265
284
 
285
+ def identify_resources_for_system_actions
286
+ update_resource = context[resource_to_update_field_name]
287
+ prefetch_id = prefetch_key_for_system_actions
288
+
289
+ if update_resource.is_a? Hash
290
+ FHIR.from_contents(update_resource.to_json)
291
+ elsif prefetch_id.present? && request_body['prefetch'] && request_body['prefetch'][prefetch_id]
292
+ FHIR.from_contents(request_body['prefetch'][prefetch_id].to_json)
293
+ elsif update_resource.present?
294
+ get_context_resource(update_resource)
295
+ end
296
+ end
297
+
298
+ def prefetch_key_for_system_actions
299
+ if requested_hook.starts_with?('encounter')
300
+ 'encounter'
301
+ elsif requested_hook == 'order-dispatch'
302
+ 'order'
303
+ end
304
+ end
305
+
306
+ def find_prefetched_order_dispatch_orders
307
+ orders_bundle = FHIR::Bundle.new
308
+
309
+ context['dispatchedOrders']&.each do |order_reference|
310
+ prefetched_entry = find_one_prefetched_order_dispatch_order(order_reference)
311
+ if prefetched_entry.present?
312
+ orders_bundle.entry << prefetched_entry
313
+ next
314
+ end
315
+
316
+ read_resource = get_context_resource(order_reference)
317
+ orders_bundle.entry << FHIR::Bundle::Entry.new({ resource: read_resource }) if read_resource.present?
318
+ end
319
+
320
+ orders_bundle if orders_bundle.entry.present?
321
+ end
322
+
323
+ def find_one_prefetched_order_dispatch_order(order_reference)
324
+ resource_type, id = order_reference.split('/')
325
+ return unless request_body['prefetch'].present?
326
+
327
+ request_body['prefetch'].each_value do |prefetch_value|
328
+ entry = find_entry_in_prefetch_bundle(prefetch_value, resource_type, id)
329
+ return entry if entry.present?
330
+ end
331
+
332
+ nil
333
+ end
334
+
335
+ def find_entry_in_prefetch_bundle(prefetch_value, resource_type, id)
336
+ return unless prefetch_value.is_a?(Hash)
337
+
338
+ bundle = FHIR.from_contents(prefetch_value.to_json)
339
+ return unless bundle.is_a?(FHIR::Bundle)
340
+
341
+ bundle.entry.find { |e| e.resource.present? && e.resource.resourceType == resource_type && e.resource.id == id }
342
+ end
343
+
266
344
  def create_system_actions(resource, coverage_id)
267
345
  return if resource.nil?
268
346
 
@@ -373,20 +451,40 @@ module DaVinciCRDTestKit
373
451
  return if context.nil?
374
452
 
375
453
  request_form_completion_card = load_json_file('request_form_completion.json')
454
+ form_completion_questionnaire_action = request_form_completion_card['suggestions'][0]['actions'].find do |action|
455
+ action['resource']['resourceType'] == 'Questionnaire'
456
+ end
457
+ target_fhir_server = request_body['fhirServer'].present? ? request_body['fhirServer'].chomp('/') : ''
458
+ form_completion_questionnaire_action['extension']['davinci-crd.if-none-exist']
459
+ .gsub!('<target_fhir_server>', target_fhir_server)
460
+
376
461
  form_completion_task = request_form_completion_card['suggestions'][0]['actions'].find do |action|
377
462
  action['resource']['resourceType'] == 'Task'
378
463
  end['resource']
379
464
 
380
465
  form_completion_task['for']['reference'] = "Patient/#{context['patientId']}"
381
466
  form_completion_task['authoredOn'] = current_time.strftime('%Y-%m-%d')
467
+ form_completion_task['input'].delete_at(1) if ig_version == 'v221'
468
+ form_completion_task['id'] = SecureRandom.uuid
469
+ payer_reference = payer_reference_from_coverage
470
+ if payer_reference.present?
471
+ form_completion_task['requester']['reference'] = payer_reference
472
+ else
473
+ form_completion_task.delete('requester')
474
+ end
382
475
  request_form_completion_card
383
476
  end
384
477
 
478
+ def payer_reference_from_coverage
479
+ patient_coverage&.payor&.first&.reference
480
+ end
481
+
385
482
  def update_service_request(service_request)
386
483
  return if context.nil?
387
484
 
388
485
  service_request['subject']['reference'] = "Patient/#{context['patientId']}"
389
- service_request['requester']['reference'] = context['userId']
486
+ service_request['requester']['reference'] =
487
+ requested_hook == 'order-dispatch' && ig_version == 'v221' ? context['performer'] : context['userId']
390
488
  service_request['authoredOn'] = current_time.strftime('%Y-%m-%d')
391
489
  end
392
490
 
@@ -404,13 +502,7 @@ module DaVinciCRDTestKit
404
502
 
405
503
  propose_alternate_request_card = load_json_file('propose_alternate_request.json')
406
504
 
407
- if hook_name == 'order-dispatch'
408
- order_resource = get_context_resource(context['order'])
409
- else
410
- draft_orders = context['draftOrders']['entry']
411
- draft_order_resource = draft_orders[0]['resource']
412
- order_resource = FHIR.from_contents(draft_order_resource.to_json)
413
- end
505
+ order_resource = identify_alternate_order_resource
414
506
  return if order_resource.nil?
415
507
 
416
508
  order_resource_type = order_resource.resourceType
@@ -421,7 +513,7 @@ module DaVinciCRDTestKit
421
513
  {
422
514
  'type' => 'delete',
423
515
  'description' => 'Remove current order until health assessment has been done',
424
- 'resourceId' => ["#{order_resource_type}/#{order_resource_id}"]
516
+ 'resourceId' => "#{order_resource_type}/#{order_resource_id}"
425
517
  },
426
518
  {
427
519
  'type' => 'create',
@@ -431,5 +523,19 @@ module DaVinciCRDTestKit
431
523
  )
432
524
  propose_alternate_request_card
433
525
  end
526
+
527
+ def identify_alternate_order_resource
528
+ if requested_hook == 'order-dispatch'
529
+ if ig_version == 'v221'
530
+ find_prefetched_order_dispatch_orders&.entry&.first&.resource
531
+ elsif context['order'].present?
532
+ get_context_resource(context['order'])
533
+ end
534
+ else
535
+ draft_orders = context['draftOrders']['entry']
536
+ draft_order_resource = draft_orders[0]['resource']
537
+ FHIR.from_contents(draft_order_resource.to_json)
538
+ end
539
+ end
434
540
  end
435
541
  end
@@ -15,6 +15,7 @@
15
15
  "suggestions": [
16
16
  {
17
17
  "label": "Add monthly physical assessment for the first 3 months",
18
+ "uuid": "5abc166b-c50f-4df4-bdb1-2b0b62cb9e55",
18
19
  "actions": [
19
20
  {
20
21
  "type": "create",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "summary": "Create/Update Coverage Information Card",
3
- "detail": "This is a Create/Update Coverage Information Card which is sent when the CRD server is aware of additional coverage that is relevant to the current/proposed activity or has updates/corrections to make to the information held by the CRD Client",
3
+ "detail": "This is a Create/Update Coverage Information Card which is sent when the CRD server is aware of additional coverage that is relevant to the current/proposed activity or has updates/corrections to make to the information held by the CRD client",
4
4
  "indicator": "info",
5
5
  "source": {
6
6
  "label": "Inferno",
@@ -14,7 +14,8 @@
14
14
  "selectionBehavior": "any",
15
15
  "suggestions": [
16
16
  {
17
- "label": "Create/Update coverage information"
17
+ "label": "Create/Update coverage information",
18
+ "uuid": "5abc166b-c50f-4df4-bdb2-2b0b62cb9e55"
18
19
  }
19
20
  ]
20
21
  }
@@ -11,6 +11,13 @@
11
11
  "display": "Coverage Information"
12
12
  }
13
13
  },
14
+ "suggestions": [
15
+ {
16
+ "label": "Inferno placeholder suggestion",
17
+ "uuid": "5abc166b-c50f-4df4-bdb1-2b0b62cb8e55"
18
+ }
19
+ ],
20
+ "selectionBehavior": "any",
14
21
  "links": [
15
22
  {
16
23
  "label": "Inferno",
@@ -18,4 +25,4 @@
18
25
  "type": "smart"
19
26
  }
20
27
  ]
21
- }
28
+ }
@@ -15,6 +15,7 @@
15
15
  "suggestions": [
16
16
  {
17
17
  "label": "Replace order with a health assessment first",
18
+ "uuid": "5abc166b-c50f-4df4-b5b1-2b0b62cb9e55",
18
19
  "actions": []
19
20
  }
20
21
  ]
@@ -15,6 +15,7 @@
15
15
  "suggestions": [
16
16
  {
17
17
  "label": "Add 'completion of the ABC form' to your task list (possibly for reassignment)",
18
+ "uuid": "5abc166b-c50f-4df4-bdc1-2b0b62cb9e55",
18
19
  "actions": [
19
20
  {
20
21
  "type": "create",
@@ -22,9 +23,9 @@
22
23
  "resource": {
23
24
  "resourceType": "Questionnaire",
24
25
  "id": "XYZ",
25
- "url": "http://example.org/Questionnaire/XYZ",
26
+ "url": "http://inferno.healthit.gov/davinci-crd-test-kit/forms/XYZ",
26
27
  "title": "Cancer Quality Forum Questionnaire XYZ",
27
- "version": 2,
28
+ "version": "2",
28
29
  "status": "active",
29
30
  "subjectType": [
30
31
  "Patient"
@@ -35,7 +36,7 @@
35
36
  "linkId": "1",
36
37
  "code": [
37
38
  {
38
- "system": "http://example.org/system/code/sections",
39
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/sections",
39
40
  "code": "COMORBIDITY"
40
41
  }
41
42
  ],
@@ -45,7 +46,7 @@
45
46
  "linkId": "1.1",
46
47
  "code": [
47
48
  {
48
- "system": "http://example.org/system/code/questions",
49
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
49
50
  "code": "COMORB"
50
51
  }
51
52
  ],
@@ -57,7 +58,7 @@
57
58
  "linkId": "1.1.1",
58
59
  "code": [
59
60
  {
60
- "system": "http://example.org/system/code/sections",
61
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/sections",
61
62
  "code": "CARDIAL"
62
63
  }
63
64
  ],
@@ -77,7 +78,7 @@
77
78
  "linkId": "1.1.1.1",
78
79
  "code": [
79
80
  {
80
- "system": "http://example.org/system/code/questions",
81
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
81
82
  "code": "COMORBCAR"
82
83
  }
83
84
  ],
@@ -89,7 +90,7 @@
89
90
  "linkId": "1.1.1.1.1",
90
91
  "code": [
91
92
  {
92
- "system": "http://example.org/system/code/questions",
93
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
93
94
  "code": "COMCAR00",
94
95
  "display": "Angina Pectoris"
95
96
  },
@@ -122,7 +123,7 @@
122
123
  "linkId": "1.1.1.2",
123
124
  "code": [
124
125
  {
125
- "system": "http://example.org/system/code/questions",
126
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
126
127
  "code": "COMORBVAS"
127
128
  }
128
129
  ],
@@ -140,7 +141,7 @@
140
141
  "linkId": "2",
141
142
  "code": [
142
143
  {
143
- "system": "http://example.org/system/code/sections",
144
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/sections",
144
145
  "code": "HISTOPATHOLOGY"
145
146
  }
146
147
  ],
@@ -150,7 +151,7 @@
150
151
  "linkId": "2.1",
151
152
  "code": [
152
153
  {
153
- "system": "http://example.org/system/code/sections",
154
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/sections",
154
155
  "code": "ABDOMINAL"
155
156
  }
156
157
  ],
@@ -160,7 +161,7 @@
160
161
  "linkId": "2.1.2",
161
162
  "code": [
162
163
  {
163
- "system": "http://example.org/system/code/questions",
164
+ "system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
164
165
  "code": "STADPT",
165
166
  "display": "pT category"
166
167
  }
@@ -174,7 +175,7 @@
174
175
  ]
175
176
  },
176
177
  "extension": {
177
- "davinci-crd.if-none-exist": "url=http://example.org/Questionnaire/XYZ&version=2"
178
+ "davinci-crd.if-none-exist": "url=<target_fhir_server>/Questionnaire?url=http://inferno.healthit.gov/davinci-crd-test-kit/forms/XYZ&version=2"
178
179
  }
179
180
  },
180
181
  {
@@ -194,11 +195,11 @@
194
195
  },
195
196
  "description": "Complete XYZ form for local retention",
196
197
  "for": {
197
- "reference": "http://example.org/fhir/Patient/123"
198
+ "reference": "Patient/<patient-id>"
198
199
  },
199
200
  "authoredOn": "2018-08-09",
200
201
  "requester": {
201
- "reference": "http://example.org/fhir/Organization/payer"
202
+ "reference": "Organization/<payer-id>"
202
203
  },
203
204
  "input": [
204
205
  {
@@ -211,7 +212,7 @@
211
212
  }
212
213
  ]
213
214
  },
214
- "valueCanonical": "http://example.org/Questionnaire/XYZ"
215
+ "valueCanonical": "http://inferno.healthit.gov/davinci-crd-test-kit/forms/XYZ"
215
216
  },
216
217
  {
217
218
  "type": {
@@ -239,4 +240,4 @@
239
240
  ]
240
241
  }
241
242
  ]
242
- }
243
+ }
@@ -0,0 +1,35 @@
1
+ module DaVinciCRDTestKit
2
+ module MultiRequestMessageHelper
3
+ def request_prefix(request_index)
4
+ "(Request #{request_index + 1}) "
5
+ end
6
+
7
+ def add_request_message(type, message, request_index)
8
+ add_message(type, "#{request_prefix(request_index)}#{message}")
9
+ end
10
+
11
+ def parse_json_request_entity(body, entity, request_index)
12
+ JSON.parse(body)
13
+ rescue JSON::ParserError
14
+ add_request_message('error', "#{entity} contains invalid JSON.", request_index)
15
+ nil
16
+ end
17
+
18
+ def requests_with_errors_prefix
19
+ request_numbers = error_request_numbers
20
+ return '' if request_numbers.empty?
21
+
22
+ noun = request_numbers.size == 1 ? 'Request' : 'Requests'
23
+ "#{noun} #{request_numbers.to_sentence}: "
24
+ end
25
+
26
+ private
27
+
28
+ def error_request_numbers
29
+ messages
30
+ .select { |m| m[:type] == 'error' }
31
+ .filter_map { |m| m[:message].match(/\A\(Request (\d+)\)/)&.captures&.first&.to_i }
32
+ .sort.uniq
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,38 @@
1
+ module DaVinciCRDTestKit
2
+ module TaggedRequestLoadHelper
3
+ ALL_HOOKS = [
4
+ APPOINTMENT_BOOK_TAG,
5
+ ENCOUNTER_START_TAG,
6
+ ENCOUNTER_DISCHARGE_TAG,
7
+ ORDER_DISPATCH_TAG,
8
+ ORDER_SELECT_TAG,
9
+ ORDER_SIGN_TAG
10
+ ].freeze
11
+
12
+ def hook_name
13
+ config.options[:hook_name]
14
+ end
15
+
16
+ def crd_test_group
17
+ config.options[:crd_test_group]
18
+ end
19
+
20
+ def tags_to_load(hook = hook_name)
21
+ crd_test_group.present? ? [crd_test_group] : [hook]
22
+ end
23
+
24
+ def load_hook_requests
25
+ load_tagged_requests(*tags_to_load)
26
+ end
27
+
28
+ def requests_to_analyze
29
+ if hook_name.present?
30
+ load_tagged_requests(*tags_to_load)
31
+ else
32
+ ALL_HOOKS.each_with_object([]) do |hook, request_list|
33
+ request_list.concat(load_tagged_requests(*tags_to_load(hook)))
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end