davinci_crd_test_kit 0.14.0 → 0.14.2

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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/{inferno_crd_server_suite.json.erb → client_against_inferno_crd_server_suite.json.erb} +0 -33
  3. data/config/presets/{ri_crd_request_generator.json.erb → client_against_ri_crd_request_generator.json.erb} +1 -14
  4. data/config/presets/client_v221_against_inferno_crd_server_suite.json.erb +84 -0
  5. data/config/presets/client_v221_against_ri_br_provider.json.erb +31 -0
  6. data/config/presets/{ri_crd_request_generator.json_v221.json.erb → client_v221_against_ri_crd_request_generator.json.erb} +1 -1
  7. data/config/presets/{inferno_crd_client_suite.json.erb → server_against_inferno_crd_client_suite.json.erb} +0 -43
  8. data/config/presets/{ri_crd_server.json.erb → server_against_ri_crd_server.json.erb} +1 -44
  9. data/config/presets/{inferno_crd_client_suite_v221.json.erb → server_v221_against_inferno_crd_client_suite.json.erb} +48 -45
  10. data/config/presets/{inferno_crd_client_suite_prefetch_subset_v221.json.erb → server_v221_against_inferno_crd_client_suite_prefetch_subset.json.erb} +0 -46
  11. data/config/presets/server_v221_against_inferno_g31_suite.json.erb +49 -0
  12. data/lib/davinci_crd_test_kit/client/cross_hook_helper.rb +26 -0
  13. data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +7 -7
  14. data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +4 -1
  15. data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +70 -39
  16. data/lib/davinci_crd_test_kit/client/endpoints/mock_service_response.rb +26 -7
  17. data/lib/davinci_crd_test_kit/client/endpoints/mocked_card_responses/external_reference.json +1 -1
  18. data/lib/davinci_crd_test_kit/client/endpoints/mocked_card_responses/launch_smart_app.json +0 -7
  19. data/lib/davinci_crd_test_kit/client/endpoints/scenario_service_response.rb +54 -0
  20. data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +8 -27
  21. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +35 -23
  22. data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +34 -21
  23. data/lib/davinci_crd_test_kit/client/v2.0.1/cds-services-v201.json +20 -20
  24. data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +12 -10
  25. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +12 -10
  26. data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +12 -10
  27. data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +5 -5
  28. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +12 -10
  29. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +12 -10
  30. data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +12 -10
  31. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +3 -36
  32. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +3 -36
  33. data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +3 -36
  34. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +4 -13
  35. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +3 -13
  36. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +3 -13
  37. data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +3 -13
  38. data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +1 -1
  39. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/attestation_instructions.rb +10 -0
  40. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_authorized_scope_attestation_test.rb +45 -0
  41. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_coverage_based_invocation_attestation_test.rb +44 -0
  42. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_data_element_expectations_attestation_test.rb +44 -0
  43. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_hook_invocation_logging_attestation_test.rb +43 -0
  44. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_must_support_exposure_attestation_test.rb +43 -0
  45. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_must_support_use_attestation_test.rb +41 -0
  46. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_order_sign_support_attestation_test.rb +42 -0
  47. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_prefetch_key_omission_attestation_test.rb +42 -0
  48. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_resource_identifiers_attestation_test.rb +43 -0
  49. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_response_case_distinction_attestation_test.rb +43 -0
  50. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_security_and_privacy_attestation_test.rb +43 -0
  51. data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_workflow_integration_attestation_test.rb +44 -0
  52. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +1 -1
  53. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +29 -18
  54. data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +35 -22
  55. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +47 -47
  56. data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +50 -50
  57. data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +24 -15
  58. data/lib/davinci_crd_test_kit/client/v2.2.1/client_attestations_group.rb +49 -0
  59. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +22 -6
  60. data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_interaction_group.rb +98 -0
  61. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +19 -11
  62. data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +19 -11
  63. data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +14 -12
  64. data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +25 -5
  65. data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +3 -2
  66. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +23 -15
  67. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +19 -11
  68. data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +23 -15
  69. data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +6 -0
  70. data/lib/davinci_crd_test_kit/client/v2.2.1/client_scenarios_group.rb +26 -0
  71. data/lib/davinci_crd_test_kit/client/v2.2.1/client_self_pay_hook_group.rb +36 -0
  72. data/lib/davinci_crd_test_kit/client/v2.2.1/client_unknown_content_hook_group.rb +34 -0
  73. data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +24 -3
  74. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +1 -1
  75. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +4 -11
  76. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +1 -9
  77. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +6 -2
  78. data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +3 -12
  79. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +8 -89
  80. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/base_hook_invocation_receive_request_test.rb +163 -0
  81. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/cross_hooks_receive_request_test.rb +97 -0
  82. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +8 -90
  83. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +8 -90
  84. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +8 -98
  85. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +8 -98
  86. data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +8 -98
  87. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +10 -2
  88. data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +11 -6
  89. data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +2 -1
  90. data/lib/davinci_crd_test_kit/client/v2.2.1/self_pay/client_self_pay_no_request_test.rb +30 -0
  91. data/lib/davinci_crd_test_kit/client/v2.2.1/self_pay/client_self_pay_workflow_test.rb +55 -0
  92. data/lib/davinci_crd_test_kit/client/v2.2.1/unknown_content/client_unknown_content_attestation_test.rb +99 -0
  93. data/lib/davinci_crd_test_kit/client/v2.2.1/unknown_content/client_unknown_content_receive_request_test.rb +62 -0
  94. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +1 -1
  95. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +10 -2
  96. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +1 -1
  97. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +1 -1
  98. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +7 -1
  99. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +1 -1
  100. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +1 -1
  101. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +1 -1
  102. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +54 -21
  103. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +1 -1
  104. data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +6 -3
  105. data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +18 -0
  106. data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +30 -13
  107. data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +25 -11
  108. data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +2 -0
  109. data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +28 -28
  110. data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +211 -43
  111. data/lib/davinci_crd_test_kit/cross_suite/tags.rb +7 -0
  112. data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
  113. data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +6 -2
  114. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +107 -107
  115. data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +101 -97
  116. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +18 -18
  117. data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +43 -39
  118. data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
  119. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +3 -3
  120. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_no_special_requests.rb +17 -0
  121. data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
  122. data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +24 -6
  123. data/lib/davinci_crd_test_kit/server/server_hook_helper.rb +2 -2
  124. data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +1 -1
  125. data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +5 -5
  126. data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +3 -0
  127. data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_standard_prefetch_expressions_test.rb +165 -0
  128. data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
  129. data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +10 -102
  130. data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +3 -2
  131. data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +2 -0
  132. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +10 -97
  133. data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +10 -97
  134. data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +5 -5
  135. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +10 -103
  136. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +12 -116
  137. data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +12 -121
  138. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_response_group.rb +23 -0
  139. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
  140. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
  141. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
  142. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
  143. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
  144. data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
  145. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +1 -0
  146. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +1 -0
  147. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +1 -0
  148. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +78 -35
  149. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
  150. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +70 -124
  151. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +83 -39
  152. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +59 -17
  153. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +80 -45
  154. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +37 -0
  155. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +57 -6
  156. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +56 -17
  157. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +52 -25
  158. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +17 -51
  159. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +1 -1
  160. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +1 -1
  161. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +1 -1
  162. data/lib/davinci_crd_test_kit/version.rb +2 -2
  163. metadata +54 -16
  164. data/config/presets/inferno_crd_server_suite_v221.json.erb +0 -94
  165. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +0 -57
  166. data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +0 -65
@@ -135,7 +135,7 @@ module DaVinciCRDTestKit
135
135
  def send_unknown_configuration_invocation(request_body, response)
136
136
  return if @unknown_configuration_invoked
137
137
  return unless response.status == 200
138
- return unless coverage_info_response?(parsed_response_body(response))
138
+ return unless coverage_info_system_action_response?(parsed_response_body(response))
139
139
  return unless test_waiting?
140
140
 
141
141
  request_body = JSON.parse(request_body.to_json)
@@ -149,7 +149,7 @@ module DaVinciCRDTestKit
149
149
  def send_unknown_context_invocation(request_body, response)
150
150
  return if @unknown_context_invoked
151
151
  return unless response.status == 200
152
- return unless coverage_info_response?(parsed_response_body(response))
152
+ return unless coverage_info_system_action_response?(parsed_response_body(response))
153
153
  return unless test_waiting?
154
154
 
155
155
  request_body = JSON.parse(request_body.to_json)
@@ -163,7 +163,7 @@ module DaVinciCRDTestKit
163
163
  def send_unknown_cds_hooks_element_invocation(request_body, response)
164
164
  return if @unknown_cds_hooks_element_invoked
165
165
  return unless response.status == 200
166
- return unless coverage_info_response?(parsed_response_body(response))
166
+ return unless coverage_info_system_action_response?(parsed_response_body(response))
167
167
  return unless test_waiting?
168
168
 
169
169
  request_body = JSON.parse(request_body.to_json)
@@ -0,0 +1,17 @@
1
+ require_relative 'invoke_hook'
2
+
3
+ module DaVinciCRDTestKit
4
+ module Jobs
5
+ class InvokeHookNoSpecialRequests < InvokeHook
6
+ def perform(*)
7
+ # Skip all of the special hook invocations.
8
+ @coverage_info_configuration_invoked = true
9
+ @unknown_configuration_invoked = true
10
+ @unknown_context_invoked = true
11
+ @unknown_cds_hooks_element_invoked = true
12
+
13
+ super
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'invoke_hook_no_special_requests'
2
+
3
+ module DaVinciCRDTestKit
4
+ module Jobs
5
+ class InvokeHookWithBadAuth < InvokeHookNoSpecialRequests
6
+ def prepare_hook_request(parsed_request)
7
+ super
8
+
9
+ parsed_request['fhirAuthorization']['access_token'] = 'TRIGGER_500_STATUS'
10
+ parsed_request
11
+ end
12
+ end
13
+ end
14
+ end
@@ -117,8 +117,8 @@ module DaVinciCRDTestKit
117
117
  assert_valid_json(service_request_bodies)
118
118
 
119
119
  payloads = [JSON.parse(service_request_bodies)].flatten
120
- skip_if tested_hook_name == ANY_HOOK_TAG && payloads.length != 1,
121
- 'The *Demonstrate a Hook Invocation* test supports only one request body.'
120
+ check_request_length(payloads)
121
+
122
122
  invoked_hook = identify_hook(payloads)
123
123
  output(invoked_hook:)
124
124
  service_id = target_service_id(service_ids, invoked_hook)
@@ -130,10 +130,19 @@ module DaVinciCRDTestKit
130
130
  failure_url = "#{resume_fail_url}?token=#{test_session_id}"
131
131
 
132
132
  acknowledge_before_continuing = manual_continuation == 'yes'
133
- Inferno::Jobs.perform(DaVinciCRDTestKit::Jobs::InvokeHook, test_session_id,
134
- payloads, service_endpoint, inferno_base_url, jwks_kid, encryption_method,
135
- tested_hook_name, continuation_url, failure_url, acknowledge_before_continuing,
136
- coverage_info_configuration_supported?)
133
+ perform_invoke_hook_job(
134
+ test_session_id,
135
+ payloads,
136
+ service_endpoint,
137
+ inferno_base_url,
138
+ jwks_kid,
139
+ encryption_method,
140
+ tested_hook_name,
141
+ continuation_url,
142
+ failure_url,
143
+ acknowledge_before_continuing,
144
+ coverage_info_configuration_supported?
145
+ )
137
146
 
138
147
  wait(
139
148
  identifier: test_session_id,
@@ -142,6 +151,15 @@ module DaVinciCRDTestKit
142
151
  )
143
152
  end
144
153
 
154
+ def check_request_length(payloads)
155
+ skip_if tested_hook_name == ANY_HOOK_TAG && payloads.length != 1,
156
+ 'The *Demonstrate a Hook Invocation* test supports only one request body.'
157
+ end
158
+
159
+ def perform_invoke_hook_job(*)
160
+ Inferno::Jobs.perform(DaVinciCRDTestKit::Jobs::InvokeHook, *)
161
+ end
162
+
145
163
  def wait_message(acknowledge_before_continuing, continuation_url)
146
164
  message = "Inferno's simulated CRD Client will initiate hook requests to the server. " \
147
165
  'During these invocations the server will be able to make FHIR requests ' \
@@ -11,11 +11,11 @@ module DaVinciCRDTestKit
11
11
 
12
12
  # identify the hook to invoke
13
13
  def identify_hook(payloads)
14
- if tested_hook_name == ANY_HOOK_TAG
14
+ if ALL_HOOK_TAGS.exclude? tested_hook_name
15
15
  hook_list_from_payloads = payloads.map { |body| body['hook'] }.uniq
16
16
 
17
17
  assert hook_list_from_payloads.length == 1,
18
- 'Could not identify the tested hook for the *Demonstrated Any Hook tests* from the request bodies.'
18
+ 'Could not identify the tested hook from the request bodies.'
19
19
 
20
20
  hook_list_from_payloads.first
21
21
  else
@@ -69,7 +69,7 @@ module DaVinciCRDTestKit
69
69
 
70
70
  exclude_message do |message|
71
71
  # extension definition issue present in 2.0.1 but corrected in later versions
72
- message.message.match?(%r{The extension http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information is not allowed to be used at this point \(allowed = e:QuestionnaireResponse, e:Encounter, e:NutritionOrder, e:CommunicationRequest, e:DeviceRequest, e:ServiceRequest, e:MedicationRequest; this element is \[Appointment\]\)}) # rubocop:disable Layout/LineLength
72
+ message.message.match?(%r{The extension http://hl7\.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information v2\.0\.1 is not allowed to be used at this point \(this element is \[Appointment\]}) # rubocop:disable Layout/LineLength
73
73
  end
74
74
  end
75
75
 
@@ -19,10 +19,10 @@ module DaVinciCRDTestKit
19
19
  The supported hooks include:
20
20
  - [appointment-book](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#appointment-book)
21
21
  - [encounter-start](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-start)
22
- - [encounter-discharge](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-discharge)
23
22
  - [order-select](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-select)
24
- - [order-dispatch](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-dispatch)
25
23
  - [order-sign](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
24
+ - [order-dispatch](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-dispatch)
25
+ - [encounter-discharge](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-discharge)
26
26
 
27
27
  The [CRD STU2 IG section on Supported Hooks](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#supported-hooks)
28
28
  states that "CRD Servers conforming to this implementation guide
@@ -59,13 +59,13 @@ module DaVinciCRDTestKit
59
59
  optional: true
60
60
  group from: :crd_v201_server_encounter_start,
61
61
  optional: true
62
- group from: :crd_v201_server_encounter_discharge,
63
- optional: true
64
62
  group from: :crd_v201_server_order_select,
65
63
  optional: true
64
+ group from: :crd_v201_server_order_sign,
65
+ optional: true
66
66
  group from: :crd_v201_server_order_dispatch,
67
67
  optional: true
68
- group from: :crd_v201_server_order_sign,
68
+ group from: :crd_v201_server_encounter_discharge,
69
69
  optional: true
70
70
  group from: :crd_v201_server_required_card_response_validation
71
71
  end
@@ -4,6 +4,7 @@ require_relative 'server_discovery_group'
4
4
  require_relative 'server_demonstrate_hook_response_group'
5
5
  require_relative 'server_hooks_group'
6
6
  require_relative 'server_urls'
7
+ require_relative 'specific_coverage_response_group'
7
8
  require_relative '../endpoints/mock_ehr_endpoints'
8
9
 
9
10
  module DaVinciCRDTestKit
@@ -110,6 +111,8 @@ module DaVinciCRDTestKit
110
111
  group from: :crd_v221_server_demonstrate_hook_response
111
112
 
112
113
  group from: :crd_v221_server_hooks
114
+
115
+ group from: :crd_v221_specific_coverage_responses
113
116
  end
114
117
  end
115
118
  end
@@ -0,0 +1,165 @@
1
+ require_relative '../../server_test_helper'
2
+
3
+ module DaVinciCRDTestKit
4
+ module V221
5
+ class DiscoveryStandardPrefetchExpressionsTest < Inferno::Test
6
+ include DaVinciCRDTestKit::ServerTestHelper
7
+
8
+ title 'Server uses standard prefetch expressions'
9
+ id :crd_v221_discovery_standard_prefetch_expressions
10
+ description %(
11
+ This test checks each prefetch expression value advertised by CRD services in the discovery
12
+ response against the standard prefetch expressions listed in the CRD IG for the service hook. If a prefetch
13
+ expression does not match one of the standard expressions for that hook, the test will add a warning.
14
+
15
+ These warnings should be checked individually, as the interpretation of the warning will depend on the server's
16
+ intent: For expressions that are intended to capture any of the data elements in that hook's set of
17
+ [standard prefetch queries](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/foundation.html#appointment-book-prefetch),
18
+ it must match the corresponding expression in the IG, and the warning should be considered an error. Note that
19
+ the expression keys do not need to match and are ignored by this test. FHIRPath alternative ordering is also
20
+ ignored by this test.
21
+ For expressions that are meant to capture other data in addition to what is captured by the standard prefetch
22
+ queries, the warning can be ignored.
23
+ )
24
+
25
+ verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@found-29'
26
+
27
+ input :cds_services
28
+ input :crd_discovery_service_ignore_list,
29
+ optional: true
30
+
31
+ ALL_HOOKS = [
32
+ 'appointment-book',
33
+ 'encounter-start',
34
+ 'encounter-discharge',
35
+ 'order-dispatch',
36
+ 'order-select',
37
+ 'order-sign'
38
+ ].freeze
39
+
40
+ def ignored_service_ids
41
+ crd_discovery_service_ignore_list.to_s.split(',').map(&:strip).reject(&:blank?)
42
+ end
43
+
44
+ def services_for_crd_validation(services)
45
+ services
46
+ .select { |service| ignored_service_ids.include?(service['id']) }
47
+ .each do |service|
48
+ info "Ignoring service `#{service['id']}` because it is in the ignore list."
49
+ end
50
+
51
+ services.reject { |service| ignored_service_ids.include?(service['id']) }
52
+ end
53
+
54
+ # rubocop:disable-next Layout/LineLength
55
+ def standard_prefetch_expressions(hook)
56
+ case hook
57
+ when 'appointment-book'
58
+ {
59
+ 'patient' => 'Patient/{{context.patientId}}',
60
+ 'encounter' => 'Encounter/{{context.encounterId}}',
61
+ 'coverage' => 'Coverage?patient={{context.patientId}}&status=active',
62
+ 'deviceRequests' => "DeviceRequest?_id={{context.appointments.entry.resource.basedOn.extension('http://hl7.org/fhir/StructureDefinition/alternate-reference').value.resolve().ofType(DeviceRequest).id}}",
63
+ 'serviceRequests' => 'ServiceRequest?_id={{context.appointments.entry.resource.basedOn.resolve().ofType(ServiceRequest).id}}',
64
+ 'medicationRequests' => "MedicationRequest?_id={{context.appointments.entry.resource.basedOn.extension('http://hl7.org/fhir/StructureDefinition/alternate-reference').value.resolve().ofType(MedicationRequest).id}}",
65
+ 'devices' => 'Device?_id={{%deviceRequests.entry.resource.code.resolve().id}}',
66
+ 'medications' => 'Medication?_id={{%medicationRequests.entry.resource.medication.resolve().id}}',
67
+ 'practitionerRoles' => 'PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|context.appointments.entry.resource.participant.actor.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id}}',
68
+ 'practitioners' => 'Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|context.appointments.entry.resource.participant.actor.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id}}',
69
+ 'organizations' => 'Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|%medicationRequests.entry.resource.dispenseRequest.performer.resolve().ofType(Organization).id|%serviceRequests.entry.resource.performer.resolve().ofType(Organization).id}}',
70
+ 'locations' => 'Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|context.appointments.entry.resource.participant.actor.resolve().ofType(Location).id|%serviceRequests.entry.resource.locationReference.resolve().ofType(Location).id}}'
71
+ }
72
+ when 'encounter-start', 'encounter-discharge'
73
+ {
74
+ 'patient' => 'Patient/{{context.patientId}}',
75
+ 'encounter' => 'Encounter/{{context.encounterId}}',
76
+ 'coverage' => 'Coverage?patient={{context.patientId}}&status=active',
77
+ 'practitionerRoles' => 'PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id}}',
78
+ 'practitioners' => 'Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id}}',
79
+ 'organizations' => 'Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id}}',
80
+ 'locations' => 'Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id}}'
81
+ }
82
+ when 'order-dispatch'
83
+ {
84
+ 'patient' => 'Patient/{{context.patientId}}',
85
+ 'encounter' => 'Encounter/{{context.encounterId}}',
86
+ 'coverage' => 'Coverage?patient={{context.patientId}}&status=active',
87
+ 'communicationRequests' => 'CommunicationRequest?_id={{context.dispatchedOrders.resolve().ofType(CommunicationRequest).id}}',
88
+ 'deviceRequests' => 'DeviceRequest?_id={{context.dispatchedOrders.resolve().ofType(DeviceRequest).id}}',
89
+ 'medicationRequests' => 'MedicationRequest?_id={{context.dispatchedOrders.resolve().ofType(MedicationRequest).id}}',
90
+ 'nutritionOrders' => 'NutritionOrder?_id={{context.dispatchedOrders.resolve().ofType(NutritionOrder).id}}',
91
+ 'serviceRequests' => 'ServiceRequest?_id={{context.dispatchedOrders.resolve().ofType(ServiceRequest).id}}',
92
+ 'visionPrescriptions' => 'VisionPrescription?_id={{context.dispatchedOrders.resolve().ofType(VisionPrescription).id}}',
93
+ 'devices' => 'Device?_id={{%deviceRequests.entry.resource.code.resolve().id}}',
94
+ 'medications' => 'Medication?_id={{%medicationRequests.entry.resource.medication.resolve().id}}',
95
+ 'practitionerRoles' => 'PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.sender.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.recipient.resolve().ofType(PractitionerRole).id|%communicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%deviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%medicationRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.performer.resolve().ofType(PractitionerRole).id|%serviceRequests.entry.resource.requester.resolve().ofType(PractitionerRole).id|%nutritionOrders.entry.resource.orderer.resolve().ofType(PractitionerRole).id|%visionPrescriptions.entry.resource.prescriber.resolve().ofType(PractitionerRole).id}}',
96
+ 'practitioners' => 'Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.sender.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.recipient.resolve().ofType(Practitioner).id|%communicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%deviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%medicationRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.performer.resolve().ofType(Practitioner).id|%serviceRequests.entry.resource.requester.resolve().ofType(Practitioner).id|%nutritionOrders.entry.resource.orderer.resolve().ofType(Practitioner).id|%visionPrescriptions.entry.resource.prescriber.resolve().ofType(Practitioner).id}}',
97
+ 'organizations' => 'Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|%communicationRequests.entry.resource.recipient.resolve().ofType(Organization).id|%communicationRequests.entry.resource.sender.resolve().ofType(Organization).id|%medicationRequests.entry.resource.dispenseRequest.performer.resolve().id|%serviceRequests.entry.resource.performer.resolve().ofType(Organization).id}}',
98
+ 'locations' => 'Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|%serviceRequests.entry.resource.locationReference.resolve().id}}'
99
+ }
100
+ when 'order-select', 'order-sign'
101
+ {
102
+ 'patient' => 'Patient/{{context.patientId}}',
103
+ 'encounter' => 'Encounter/{{context.encounterId}}',
104
+ 'coverage' => 'Coverage?patient={{context.patientId}}&status=active',
105
+ 'devices' => 'Device?_id={{context.draftOrders.entry.resource.ofType(DeviceRequest).code.resolve().id}}',
106
+ 'medications' => 'Medication?_id={{context.draftOrders.entry.resource.ofType(MedicationRequest).medication.resolve().id}}',
107
+ 'practitionerRoles' => 'PractitionerRole?_id={{%encounter.participant.individual.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.sender.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.recipient.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.requester.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.performer.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.orderer.resolve().ofType(PractitionerRole).id|context.draftOrders.entry.resource.prescriber.resolve().ofType(PractitionerRole).id}}',
108
+ 'practitioners' => 'Practitioner?_id={{%practitionerRoles.entry.resource.practitioner.resolve().id|%encounter.participant.individual.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.sender.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.recipient.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.requester.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.performer.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.orderer.resolve().ofType(Practitioner).id|context.draftOrders.entry.resource.prescriber.resolve().ofType(Practitioner).id}}',
109
+ 'organizations' => 'Organization?_id={{%practitionerRoles.entry.resource.organization.resolve().id|%encounter.serviceProvider.resolve().ofType(Organization).id|context.draftOrders.entry.resource.dispenseRequest.performer.resolve().id|context.draftOrders.entry.resource.sender.resolve().ofType(Organization).id|context.draftOrders.entry.resource.recipient.resolve().ofType(Organization).id|context.draftOrders.entry.resource.performer.resolve().ofType(Organization).id}}',
110
+ 'locations' => 'Location?_id={{%practitionerRoles.entry.resource.location.resolve().id|%encounter.location.location.resolve().id|context.draftOrders.entry.resource.locationReference.resolve().id}}'
111
+ }
112
+ end
113
+ end
114
+
115
+ # The IG examples contain FHIRPath alternatives separated by `|`, and CDS Hooks prefetch field names can vary.
116
+ # Build a canonical signature so alternative ordering and `%prefetchKey` names do not affect matching.
117
+ def expression_signature(expression)
118
+ expression = expression.to_s
119
+ # CRD's standard expressions use one `{{...}}` token; split that token into its surrounding request string.
120
+ match = expression.match(/\A(.*?)\{\{(.*)\}\}(.*)\z/)
121
+ return expression unless match
122
+
123
+ prefix, fhirpath_expression, suffix = match.captures
124
+ alternatives =
125
+ fhirpath_expression
126
+ .split('|')
127
+ .map { |alternative| alternative.gsub(/%[A-Za-z][A-Za-z0-9_-]*/, '%prefetch') }
128
+ .uniq
129
+ .sort
130
+
131
+ [prefix, alternatives, suffix]
132
+ end
133
+
134
+ run do
135
+ object = parse_json(cds_services)
136
+ assert object['services'], 'Discovery response did not contain `services`'
137
+
138
+ services = object['services']
139
+ assert services.is_a?(Array), 'Services field of the CDS Discovery response object is not an array.'
140
+
141
+ prefetch_services =
142
+ services_for_crd_validation(services)
143
+ .select { |service| service['prefetch'].is_a?(Hash) && service['prefetch'].present? }
144
+
145
+ skip_if prefetch_services.blank?, 'No CRD services advertised prefetch support'
146
+
147
+ prefetch_services.each do |service|
148
+ next unless ALL_HOOKS.include?(service['hook'])
149
+
150
+ standard_expression_signatures =
151
+ standard_prefetch_expressions(service['hook']).values.map { |expression| expression_signature(expression) }
152
+
153
+ service['prefetch'].each do |prefetch_key, prefetch_value|
154
+ next if standard_expression_signatures.include?(expression_signature(prefetch_value))
155
+
156
+ msg = "Service `#{service['id']}` advertises prefetch expression `#{prefetch_value}` " \
157
+ "for hook `#{service['hook']}` in prefetch field `#{prefetch_key}`, which does not match " \
158
+ 'one of the standard CRD prefetch expressions for that hook.'
159
+ add_message('warning', msg)
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../server_urls'
2
+ require_relative '../../jobs/invoke_hook_no_special_requests'
3
+ require_relative '../../server_abstract_invoke_hook_test'
4
+
5
+ module DaVinciCRDTestKit
6
+ module V221
7
+ class InvokeHookSingleTest < ServerAbstractInvokeHookTest
8
+ include ServerURLs
9
+
10
+ title 'Inferno invokes the selected hook with the provided request body'
11
+ id :crd_v221_server_invoke_hook_single_request_test
12
+
13
+ def perform_invoke_hook_job(*)
14
+ Inferno::Jobs.perform(DaVinciCRDTestKit::Jobs::InvokeHookNoSpecialRequests, *)
15
+ end
16
+
17
+ def check_request_length(payloads)
18
+ skip_if payloads.length != 1, 'This test supports only one request body.'
19
+ end
20
+ end
21
+ end
22
+ end
@@ -4,10 +4,9 @@ require_relative 'verify_request/service_request_required_fields_validation_test
4
4
  require_relative 'verify_request/service_request_optional_fields_validation_test'
5
5
  require_relative 'verify_request/service_request_context_validation_test'
6
6
  require_relative 'verify_response/service_response_validation_test'
7
- require_relative 'verify_response/card_optional_fields_validation_test'
8
7
  require_relative 'verify_response/external_reference_card_validation_test'
9
- require_relative 'verify_response/coverage_information_system_action_received_test'
10
8
  require_relative 'verify_response/coverage_information_system_action_validation_test'
9
+ require_relative 'verify_response/coverage_information_card_absence_test'
11
10
  require_relative 'verify_response/coverage_info_configuration_test'
12
11
  require_relative 'verify_response/instructions_card_received_test'
13
12
  require_relative 'verify_response/form_completion_response_validation_test'
@@ -73,6 +72,7 @@ module DaVinciCRDTestKit
73
72
 
74
73
  group do
75
74
  title 'Requests'
75
+ simulation_verification
76
76
 
77
77
  test from: :crd_v221_service_request_required_fields_validation,
78
78
  config: {
@@ -96,84 +96,11 @@ module DaVinciCRDTestKit
96
96
  group do
97
97
  title 'Responses'
98
98
 
99
- test from: :crd_v221_service_response_validation,
100
- config: {
101
- outputs: {
102
- valid_cards: {
103
- name: :appointment_book_valid_cards
104
- },
105
- valid_system_actions: {
106
- name: :appointment_book_valid_system_actions
107
- }
108
- }
109
- }
110
- test from: :crd_v221_card_optional_fields_validation,
111
- config: {
112
- inputs: {
113
- valid_cards: {
114
- name: :appointment_book_valid_cards
115
- }
116
- },
117
- outputs: {
118
- valid_cards_with_links: {
119
- name: :appointment_book_valid_cards_with_links
120
- },
121
- valid_cards_with_suggestions: {
122
- name: :appointment_book_valid_cards_with_suggestions
123
- }
124
- }
125
- }
126
- test from: :crd_v221_external_reference_card_validation,
127
- config: {
128
- inputs: {
129
- valid_cards_with_links: {
130
- name: :appointment_book_valid_cards_with_links
131
- }
132
- }
133
- }
134
- test from: :crd_v221_launch_smart_app_card_validation,
135
- config: {
136
- inputs: {
137
- valid_cards_with_links: {
138
- name: :appointment_book_valid_cards_with_links
139
- }
140
- }
141
- }
142
- test from: :crd_v221_valid_instructions_card_received,
143
- config: {
144
- inputs: {
145
- valid_cards: {
146
- name: :appointment_book_valid_cards
147
- }
148
- }
149
- }
150
- test from: :crd_v221_coverage_info_system_action_received,
151
- config: {
152
- inputs: {
153
- valid_system_actions: {
154
- name: :appointment_book_valid_system_actions
155
- }
156
- },
157
- outputs: {
158
- coverage_info: {
159
- name: :appointment_book_coverage_info
160
- }
161
- }
162
- },
163
- verifies_requirements: [
164
- 'hl7.fhir.us.davinci-crd_2.2.1@resp-26'
165
- ]
166
- test from: :crd_v221_coverage_info_system_action_validation,
167
- config: {
168
- inputs: {
169
- coverage_info: {
170
- name: :appointment_book_coverage_info
171
- }
172
- }
173
- },
174
- verifies_requirements: [
175
- 'hl7.fhir.us.davinci-crd_2.2.1@resp-25'
176
- ]
99
+ test from: :crd_v221_service_response_validation
100
+ test from: :crd_v221_external_reference_card_validation
101
+ test from: :crd_v221_launch_smart_app_card_validation
102
+ test from: :crd_v221_valid_instructions_card_received
103
+ test from: :crd_v221_coverage_info_system_action_validation
177
104
  test from: :crd_v221_all_responses_include_coverage_information,
178
105
  verifies_requirements: [
179
106
  'hl7.fhir.us.davinci-crd_2.2.1@hook-16',
@@ -181,28 +108,9 @@ module DaVinciCRDTestKit
181
108
  'hl7.fhir.us.davinci-crd_2.2.1@hook-26',
182
109
  'hl7.fhir.us.davinci-crd_2.2.1@resp-29'
183
110
  ]
184
- test from: :crd_v221_request_form_completion_response_validation,
185
- config: {
186
- inputs: {
187
- valid_system_actions: {
188
- name: :appointment_book_valid_system_actions
189
- },
190
- valid_cards_with_suggestions: {
191
- name: :appointment_book_valid_cards_with_suggestions
192
- }
193
- }
194
- }
195
- test from: :crd_v221_create_or_update_coverage_info_response_validation,
196
- config: {
197
- inputs: {
198
- valid_system_actions: {
199
- name: :appointment_book_valid_system_actions
200
- },
201
- valid_cards_with_suggestions: {
202
- name: :appointment_book_valid_cards_with_suggestions
203
- }
204
- }
205
- }
111
+ test from: :crd_v221_coverage_information_card_absence
112
+ test from: :crd_v221_request_form_completion_response_validation
113
+ test from: :crd_v221_create_or_update_coverage_info_response_validation
206
114
  test from: :crd_v221_coverage_info_configuration
207
115
  test from: :crd_v221_unknown_configuration
208
116
  test from: :crd_v221_unknown_context
@@ -1,5 +1,5 @@
1
1
  require_relative '../../cross_suite/tags'
2
- require_relative 'interaction/server_invoke_hook_test'
2
+ require_relative 'interaction/server_invoke_hook_single_request_test'
3
3
  require_relative 'verify_request/service_request_required_fields_validation_test'
4
4
  require_relative 'verify_request/service_request_optional_fields_validation_test'
5
5
  require_relative 'verify_request/service_request_context_validation_test'
@@ -25,7 +25,7 @@ module DaVinciCRDTestKit
25
25
  group do
26
26
  title 'Interaction'
27
27
 
28
- test from: :crd_v221_server_invoke_hook_test,
28
+ test from: :crd_v221_server_invoke_hook_single_request_test,
29
29
  config: {
30
30
  inputs: {
31
31
  service_ids: {
@@ -51,6 +51,7 @@ module DaVinciCRDTestKit
51
51
 
52
52
  group do
53
53
  title 'Requests'
54
+ simulation_verification
54
55
 
55
56
  test from: :crd_v221_service_request_required_fields_validation,
56
57
  config: {
@@ -3,6 +3,7 @@ require_relative 'discovery/discovery_configuration_test'
3
3
  require_relative 'discovery/discovery_endpoint_test'
4
4
  require_relative 'discovery/discovery_services_validation_test'
5
5
  require_relative 'discovery/discovery_prefetch_support_test'
6
+ require_relative 'discovery/discovery_standard_prefetch_expressions_test'
6
7
 
7
8
  module DaVinciCRDTestKit
8
9
  module V221
@@ -64,6 +65,7 @@ module DaVinciCRDTestKit
64
65
  test from: :crd_v221_discovery_services_validation
65
66
  test from: :crd_v221_discovery_configuration
66
67
  test from: :crd_v221_discovery_prefetch_support
68
+ test from: :crd_v221_discovery_standard_prefetch_expressions
67
69
  end
68
70
  end
69
71
  end