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.
- checksums.yaml +4 -4
- data/config/presets/{inferno_crd_server_suite.json.erb → client_against_inferno_crd_server_suite.json.erb} +0 -33
- data/config/presets/{ri_crd_request_generator.json.erb → client_against_ri_crd_request_generator.json.erb} +1 -14
- data/config/presets/client_v221_against_inferno_crd_server_suite.json.erb +84 -0
- data/config/presets/client_v221_against_ri_br_provider.json.erb +31 -0
- data/config/presets/{ri_crd_request_generator.json_v221.json.erb → client_v221_against_ri_crd_request_generator.json.erb} +1 -1
- data/config/presets/{inferno_crd_client_suite.json.erb → server_against_inferno_crd_client_suite.json.erb} +0 -43
- data/config/presets/{ri_crd_server.json.erb → server_against_ri_crd_server.json.erb} +1 -44
- data/config/presets/{inferno_crd_client_suite_v221.json.erb → server_v221_against_inferno_crd_client_suite.json.erb} +48 -45
- 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
- data/config/presets/server_v221_against_inferno_g31_suite.json.erb +49 -0
- data/lib/davinci_crd_test_kit/client/cross_hook_helper.rb +26 -0
- data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +7 -7
- data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +4 -1
- data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +70 -39
- data/lib/davinci_crd_test_kit/client/endpoints/mock_service_response.rb +26 -7
- data/lib/davinci_crd_test_kit/client/endpoints/mocked_card_responses/external_reference.json +1 -1
- data/lib/davinci_crd_test_kit/client/endpoints/mocked_card_responses/launch_smart_app.json +0 -7
- data/lib/davinci_crd_test_kit/client/endpoints/scenario_service_response.rb +54 -0
- data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +8 -27
- data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +35 -23
- data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +34 -21
- data/lib/davinci_crd_test_kit/client/v2.0.1/cds-services-v201.json +20 -20
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +12 -10
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +12 -10
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +12 -10
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +5 -5
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +12 -10
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +12 -10
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +12 -10
- data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +3 -36
- data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +3 -36
- data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +3 -36
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +4 -13
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +3 -13
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +3 -13
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +3 -13
- data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/attestation_instructions.rb +10 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_authorized_scope_attestation_test.rb +45 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_coverage_based_invocation_attestation_test.rb +44 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_data_element_expectations_attestation_test.rb +44 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_hook_invocation_logging_attestation_test.rb +43 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_must_support_exposure_attestation_test.rb +43 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_must_support_use_attestation_test.rb +41 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_order_sign_support_attestation_test.rb +42 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_prefetch_key_omission_attestation_test.rb +42 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_resource_identifiers_attestation_test.rb +43 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_response_case_distinction_attestation_test.rb +43 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_security_and_privacy_attestation_test.rb +43 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/attestations/client_workflow_integration_attestation_test.rb +44 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +29 -18
- data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +35 -22
- data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +47 -47
- data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +50 -50
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +24 -15
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_attestations_group.rb +49 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +22 -6
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_interaction_group.rb +98 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +19 -11
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +19 -11
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +14 -12
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +25 -5
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +3 -2
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +23 -15
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +19 -11
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +23 -15
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +6 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_scenarios_group.rb +26 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_self_pay_hook_group.rb +36 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_unknown_content_hook_group.rb +34 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +24 -3
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +4 -11
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +1 -9
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +6 -2
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +3 -12
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +8 -89
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/base_hook_invocation_receive_request_test.rb +163 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/cross_hooks_receive_request_test.rb +97 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +8 -90
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +8 -90
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +8 -98
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +8 -98
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +8 -98
- data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +10 -2
- data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +11 -6
- data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +2 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/self_pay/client_self_pay_no_request_test.rb +30 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/self_pay/client_self_pay_workflow_test.rb +55 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/unknown_content/client_unknown_content_attestation_test.rb +99 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/unknown_content/client_unknown_content_receive_request_test.rb +62 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +10 -2
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +7 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +54 -21
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +1 -1
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +6 -3
- data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +18 -0
- data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +30 -13
- data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +25 -11
- data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +2 -0
- data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +28 -28
- data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +211 -43
- data/lib/davinci_crd_test_kit/cross_suite/tags.rb +7 -0
- data/lib/davinci_crd_test_kit/requirements/cds-hooks_3.0.0-ballot_requirements.xlsx +0 -0
- data/lib/davinci_crd_test_kit/requirements/davinci_crd_test_kit_requirements.csv +6 -2
- data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +107 -107
- data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +101 -97
- data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +18 -18
- data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +43 -39
- data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.2.1_requirements.xlsx +0 -0
- data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +3 -3
- data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_no_special_requests.rb +17 -0
- data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
- data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +24 -6
- data/lib/davinci_crd_test_kit/server/server_hook_helper.rb +2 -2
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +1 -1
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +5 -5
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +3 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_standard_prefetch_expressions_test.rb +165 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +10 -102
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +3 -2
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +2 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +10 -97
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +10 -97
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +5 -5
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +10 -103
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +12 -116
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +12 -121
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_response_group.rb +23 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +1 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +1 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +1 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +78 -35
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +70 -124
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +83 -39
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +59 -17
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +80 -45
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +37 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +57 -6
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +56 -17
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +52 -25
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +17 -51
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +1 -1
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +1 -1
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +1 -1
- data/lib/davinci_crd_test_kit/version.rb +2 -2
- metadata +54 -16
- data/config/presets/inferno_crd_server_suite_v221.json.erb +0 -94
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +0 -57
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +0 -65
|
Binary file
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
121
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
|
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
|
|
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
|
|
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: :
|
|
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
|
data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb
ADDED
|
@@ -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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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: :
|
|
185
|
-
|
|
186
|
-
|
|
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/
|
|
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: :
|
|
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
|