davinci_crd_test_kit 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config/presets/inferno_crd_client_suite.json.erb +20 -14
- data/config/presets/inferno_crd_client_suite_prefetch_subset_v221.json.erb +125 -0
- data/config/presets/inferno_crd_client_suite_v221.json.erb +124 -0
- data/config/presets/inferno_crd_server_suite.json.erb +58 -1
- data/config/presets/inferno_crd_server_suite_v221.json.erb +94 -0
- data/config/presets/ri_crd_request_generator.json_v221.json.erb +13 -0
- data/config/presets/ri_crd_server.json.erb +19 -19
- data/lib/davinci_crd_test_kit/client/client_base_urls.rb +80 -0
- data/lib/davinci_crd_test_kit/{client_hook_request_validation.rb → client/client_hook_request_validation.rb} +1 -1
- data/lib/davinci_crd_test_kit/client/crd_client_options.rb +30 -0
- data/lib/davinci_crd_test_kit/client/endpoints/cds_services_discovery_handler.rb +34 -0
- data/lib/davinci_crd_test_kit/client/endpoints/custom_service_response.rb +342 -0
- data/lib/davinci_crd_test_kit/client/endpoints/gather_response_generation_data.rb +410 -0
- data/lib/davinci_crd_test_kit/client/endpoints/hook_request_endpoint.rb +233 -0
- data/lib/davinci_crd_test_kit/{mock_service_response.rb → client/endpoints/mock_service_response.rb} +165 -59
- data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/companions_prerequisites.json +1 -0
- data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/create_update_coverage_information.json +3 -2
- data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +8 -1
- data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/propose_alternate_request.json +1 -0
- data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/request_form_completion.json +17 -16
- data/lib/davinci_crd_test_kit/client/multi_request_message_helper.rb +35 -0
- data/lib/davinci_crd_test_kit/client/tagged_request_load_helper.rb +38 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_create_test.rb +43 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_read_test.rb +43 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_search_test.rb +234 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_update_test.rb +43 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/api/client_fhir_api_validation_test.rb +63 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/auth/decode_auth_token_test.rb +65 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/auth/retrieve_jwks_test.rb +109 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_header_test.rb +70 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/auth/token_payload_test.rb +85 -0
- data/lib/davinci_crd_test_kit/{routes/cds-services.json → client/v2.0.1/cds-services-v201.json} +1 -1
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_appointment_book_group.rb +108 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_card_must_support_group.rb +31 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_discharge_group.rb +105 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_encounter_start_group.rb +105 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_fhir_api_group.rb +790 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_hooks_group.rb +74 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_dispatch_group.rb +111 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_select_group.rb +116 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_order_sign_group.rb +113 -0
- data/lib/davinci_crd_test_kit/{client_registration_group.rb → client/v2.0.1/client_registration_group.rb} +12 -8
- data/lib/davinci_crd_test_kit/client/v2.0.1/client_urls.rb +13 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/crd_client_suite.rb +134 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/appointment_book_receive_request_test.rb +129 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_discharge_receive_request_test.rb +126 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/encounter_start_receive_request_test.rb +126 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_dispatch_receive_request_test.rb +138 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_select_receive_request_test.rb +134 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/invocation/order_sign_receive_request_test.rb +136 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_coverage_information.rb +93 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_external_reference.rb +62 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb +62 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb +94 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_service_registration_attestation_test.rb +40 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_fetched_data_test.rb +86 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb +63 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_prefetch_equals_queried_test.rb +96 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_required_fields_test.rb +55 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_context_test.rb +70 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_valid_prefetch_test.rb +62 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/client_display_cards_attest.rb +83 -0
- data/lib/davinci_crd_test_kit/client/v2.0.1/verify_response/inferno_response_validation.rb +79 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_coverage_info_update_test.rb +212 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/api/client_crd_update_verification_group.rb +18 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/auth/decode_auth_token_test.rb +69 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/auth/retrieve_jwks_test.rb +120 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_header_test.rb +92 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/auth/token_payload_test.rb +93 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-prefetch-subset-v221.json +198 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/cds-services-v221.json +202 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_appointment_book_group.rb +102 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_cross_hook_group.rb +28 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_discharge_group.rb +96 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +95 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_fhir_api_group.rb +88 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_hooks_group.rb +64 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_long_running_hook_group.rb +32 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_dispatch_group.rb +101 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +102 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +107 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +27 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_urls.rb +27 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/crd_client_suite.rb +229 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_card_must_support_coverage_information_test.rb +63 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_fhirpath_collection_as_comma_delimited_string_test.rb +60 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_hook_instances_unique_test.rb +45 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_location_address_propagation_test.rb +135 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/cross_hook/client_prefetch_complete_and_subset_test.rb +103 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/appointment_book_receive_request_test.rb +156 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_discharge_receive_request_test.rb +157 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/encounter_start_receive_request_test.rb +157 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_dispatch_receive_request_test.rb +165 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_select_receive_request_test.rb +165 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/invocation/order_sign_receive_request_test.rb +165 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_long_running_receive_request_test.rb +64 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/long_running/client_skip_long_running_attestation_test.rb +49 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_registration_verification_test.rb +161 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/registration/client_service_registration_attestation_test.rb +107 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_conformance_test.rb +47 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_coverage_verification_test.rb +152 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_data_fetch_verification_test.rb +55 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_granted_scopes_test.rb +123 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_complete_test.rb +127 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_prefetch_profiles_test.rb +55 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_requested_version_test.rb +54 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_request/hook_request_secured_transport_test.rb +48 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/client_display_cards_attest.rb +74 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/hook_response_support_coverage_information_test.rb +30 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/verify_response/inferno_response_validation.rb +77 -0
- data/lib/davinci_crd_test_kit/cross_suite/base_urls.rb +20 -0
- data/lib/davinci_crd_test_kit/cross_suite/cards_identification.rb +312 -0
- data/lib/davinci_crd_test_kit/{cards_validation.rb → cross_suite/cards_validation.rb} +104 -47
- data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu201_metadata.yml +27 -0
- data/lib/davinci_crd_test_kit/cross_suite/coverage-information_stu221_metadata.yml +60 -0
- data/lib/davinci_crd_test_kit/cross_suite/fhirpath_on_cds_request.rb +177 -0
- data/lib/davinci_crd_test_kit/{hook_request_field_validation.rb → cross_suite/hook_request_field_validation.rb} +282 -203
- data/lib/davinci_crd_test_kit/cross_suite/logical_models_override_helper.rb +220 -0
- data/lib/davinci_crd_test_kit/cross_suite/prefetch_completeness_checker.rb +462 -0
- data/lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb +81 -0
- data/lib/davinci_crd_test_kit/cross_suite/prefetch_profile_validation.rb +48 -0
- data/lib/davinci_crd_test_kit/cross_suite/profiles_and_resource_types.rb +63 -0
- data/lib/davinci_crd_test_kit/cross_suite/replace_tokens.rb +38 -0
- data/lib/davinci_crd_test_kit/cross_suite/requests_logical_model_validation.rb +202 -0
- data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +274 -0
- data/lib/davinci_crd_test_kit/{suggestion_actions_validation.rb → cross_suite/suggestion_actions_validation.rb} +70 -50
- data/lib/davinci_crd_test_kit/cross_suite/tags.rb +42 -0
- data/lib/davinci_crd_test_kit/metadata.rb +10 -44
- data/lib/davinci_crd_test_kit/requirements/cds-hooks-library_1.0.1_requirements.xlsx +0 -0
- data/lib/davinci_crd_test_kit/requirements/cds-hooks_2.0_requirements.xlsx +0 -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 +742 -65
- data/lib/davinci_crd_test_kit/requirements/generated/crd_client_requirements_coverage.csv +279 -54
- data/lib/davinci_crd_test_kit/requirements/generated/crd_client_v221_requirements_coverage.csv +1430 -0
- data/lib/davinci_crd_test_kit/requirements/generated/crd_server_requirements_coverage.csv +36 -45
- data/lib/davinci_crd_test_kit/requirements/generated/crd_server_v221_requirements_coverage.csv +143 -0
- data/lib/davinci_crd_test_kit/requirements/hl7.fhir.us.davinci-crd_2.0.1_requirements.xlsx +0 -0
- 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/endpoints/jwk_set_endpoint_handler.rb +13 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_create_endpoint.rb +23 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_delete_endpoint.rb +30 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_metadata_endpoint.rb +112 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_read_endpoint.rb +21 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_request_handler.rb +261 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_search_endpoint.rb +561 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/fhir_update_endpoint.rb +24 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr/stress-test-Bundle.json +54687 -0
- data/lib/davinci_crd_test_kit/server/endpoints/mock_ehr_endpoints.rb +95 -0
- data/lib/davinci_crd_test_kit/server/jobs/invoke_hook.rb +225 -0
- data/lib/davinci_crd_test_kit/{jwt_helper.rb → server/jwt_helper.rb} +1 -12
- data/lib/davinci_crd_test_kit/server/resource_extractor.rb +68 -0
- data/lib/davinci_crd_test_kit/server/server_abstract_invoke_hook_test.rb +165 -0
- data/lib/davinci_crd_test_kit/server/server_base_urls.rb +30 -0
- data/lib/davinci_crd_test_kit/{server_hook_helper.rb → server/server_hook_helper.rb} +1 -1
- data/lib/davinci_crd_test_kit/{server_hook_request_validation.rb → server/server_hook_request_validation.rb} +1 -1
- data/lib/davinci_crd_test_kit/{test_helper.rb → server/server_test_helper.rb} +7 -3
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Appointment.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ClaimResponse.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/CommunicationRequest.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Coverage.yml +21 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Device.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/DeviceRequest.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Encounter.yml +7 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Location.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/MedicationRequest.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/NutritionOrder.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Organization.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Patient.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Practitioner.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/PractitionerRole.yml +40 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/ServiceRequest.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/Task.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_metadata/VisionPrescription.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/crd_server_suite.rb +99 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_endpoint_test.rb +90 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/discovery/discovery_services_validation_test.rb +67 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/interaction/server_invoke_hook_test.rb +12 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +34 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/external_reference_card_across_hooks_validation_test.rb +30 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/must_support/instructions_card_received_across_hooks_test.rb +27 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_appointment_book_group.rb +191 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_demonstrate_hook_response_group.rb +93 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_discovery_group.rb +62 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_discharge_group.rb +186 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_encounter_start_group.rb +186 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_hooks_group.rb +73 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_dispatch_group.rb +191 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_select_group.rb +211 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_order_sign_group.rb +216 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_required_card_response_validation_group.rb +28 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/server_urls.rb +13 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_context_validation_test.rb +30 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/additional_orders_validation_test.rb +59 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/card_optional_fields_validation_test.rb +51 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/coverage_information_system_action_validation_test.rb +120 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +70 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/external_reference_card_validation_test.rb +37 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/form_completion_response_validation_test.rb +67 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/instructions_card_received_test.rb +30 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/launch_smart_app_card_validation_test.rb +39 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/propose_alternate_request_card_validation_test.rb +46 -0
- data/lib/davinci_crd_test_kit/server/v2.0.1/verify_response/service_response_validation_test.rb +83 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withorder.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Appointment_withoutorder.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/CommunicationRequest.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Coverage.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Device.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/DeviceRequest.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Encounter.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Location.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/MedicationRequest.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/NutritionOrder.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Organization.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/Patient.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/PractitionerRole.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/ServiceRequest.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_metadata/VisionPrescription.yml +5 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/crd_server_suite.rb +115 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_configuration_test.rb +159 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_endpoint_test.rb +90 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_prefetch_support_test.rb +43 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/discovery/discovery_services_validation_test.rb +121 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_test.rb +17 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_must_support_test.rb +71 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/coverage_information_system_action_across_hooks_validation_test.rb +36 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/must_support/supported_us_core_versions_test.rb +118 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_appointment_book_group.rb +213 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +93 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +69 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +194 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +194 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_hooks_group.rb +73 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_dispatch_group.rb +214 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +219 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +241 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_required_card_response_validation_group.rb +30 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_urls.rb +13 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +30 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_no_custom_extensions_test.rb +120 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_optional_fields_validation_test.rb +39 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +40 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +66 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/all_responses_include_coverage_information_test.rb +123 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/card_optional_fields_validation_test.rb +57 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb +83 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_received_test.rb +65 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +184 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +75 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +47 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +91 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +137 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +32 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +49 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/order_dispatch_coverage_information_test.rb +38 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/propose_alternate_request_card_validation_test.rb +54 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +97 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_cds_hooks_elements_test.rb +78 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_configuration_test.rb +78 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/unknown_context_test.rb +78 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_billing_options_test.rb +43 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/verify_response_without_configuration_test.rb +44 -0
- data/lib/davinci_crd_test_kit/version.rb +2 -2
- data/lib/davinci_crd_test_kit.rb +4 -2
- metadata +297 -93
- data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
- data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -74
- data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +0 -93
- data/lib/davinci_crd_test_kit/client_tests/client_appointment_book_group.rb +0 -75
- data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +0 -48
- data/lib/davinci_crd_test_kit/client_tests/client_encounter_discharge_group.rb +0 -73
- data/lib/davinci_crd_test_kit/client_tests/client_encounter_start_group.rb +0 -73
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +0 -42
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -40
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +0 -232
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +0 -42
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -61
- data/lib/davinci_crd_test_kit/client_tests/client_order_dispatch_group.rb +0 -79
- data/lib/davinci_crd_test_kit/client_tests/client_order_select_group.rb +0 -82
- data/lib/davinci_crd_test_kit/client_tests/client_order_sign_group.rb +0 -81
- data/lib/davinci_crd_test_kit/client_tests/client_registration_verification_test.rb +0 -88
- data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +0 -60
- data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +0 -90
- data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +0 -90
- data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +0 -57
- data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +0 -49
- data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +0 -68
- data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +0 -69
- data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +0 -102
- data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +0 -98
- data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +0 -101
- data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +0 -105
- data/lib/davinci_crd_test_kit/client_tests/submitted_response_validation.rb +0 -48
- data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +0 -65
- data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +0 -78
- data/lib/davinci_crd_test_kit/crd_client_suite.rb +0 -193
- data/lib/davinci_crd_test_kit/crd_options.rb +0 -9
- data/lib/davinci_crd_test_kit/crd_server_suite.rb +0 -125
- data/lib/davinci_crd_test_kit/igs/davinci-crd-2.0.1.tgz +0 -0
- data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +0 -18
- data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +0 -77
- data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +0 -15
- data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +0 -176
- data/lib/davinci_crd_test_kit/server_demonstrate_hook_response_group.rb +0 -77
- data/lib/davinci_crd_test_kit/server_discovery_group.rb +0 -60
- data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +0 -170
- data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +0 -170
- data/lib/davinci_crd_test_kit/server_hooks_group.rb +0 -71
- data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +0 -176
- data/lib/davinci_crd_test_kit/server_order_select_group.rb +0 -195
- data/lib/davinci_crd_test_kit/server_order_sign_group.rb +0 -201
- data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +0 -26
- data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +0 -68
- data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +0 -47
- data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +0 -32
- data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +0 -63
- data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +0 -118
- data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +0 -71
- data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +0 -88
- data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +0 -65
- data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +0 -28
- data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +0 -36
- data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +0 -78
- data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +0 -25
- data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +0 -26
- data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +0 -38
- data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +0 -63
- data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +0 -101
- data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +0 -28
- data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +0 -37
- data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +0 -38
- data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +0 -81
- data/lib/davinci_crd_test_kit/tags.rb +0 -10
- data/lib/davinci_crd_test_kit/urls.rb +0 -52
- /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/external_reference.json +0 -0
- /data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/instructions.json +0 -0
- /data/lib/davinci_crd_test_kit/{crd_jwks.json → server/endpoints/crd_jwks.json} +0 -0
- /data/lib/davinci_crd_test_kit/{jwks.rb → server/endpoints/jwks.rb} +0 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
require_relative '../client_urls'
|
|
2
|
+
|
|
3
|
+
module DaVinciCRDTestKit
|
|
4
|
+
module V201
|
|
5
|
+
class OrderSignReceiveRequestTest < Inferno::Test
|
|
6
|
+
include ClientURLs
|
|
7
|
+
|
|
8
|
+
id :crd_v201_order_sign_request
|
|
9
|
+
title 'Request received for order-sign hook'
|
|
10
|
+
description %(
|
|
11
|
+
This test waits for multiple incoming [order-sign](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
|
|
12
|
+
hook requests and responds to the client with the response types selected as an input. This hook is a 'primary'
|
|
13
|
+
hook, meaning that CRD servers SHALL, at minimum, return a [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-ext-coverage-information.html)
|
|
14
|
+
system action for these hooks, even if the response indicates that further information is needed or that the
|
|
15
|
+
level of detail provided is insufficient to determine coverage.
|
|
16
|
+
|
|
17
|
+
For more details on how Inferno's simulated CDS Service behave during hook invocation see the
|
|
18
|
+
[simulated CRD server](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details#crd-server-simulation)
|
|
19
|
+
documentation.
|
|
20
|
+
)
|
|
21
|
+
verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@218', 'hl7.fhir.us.davinci-crd_2.0.1@225',
|
|
22
|
+
'hl7.fhir.us.davinci-crd_2.0.1@243', 'hl7.fhir.us.davinci-crd_2.0.1@244',
|
|
23
|
+
'hl7.fhir.us.davinci-crd_2.0.1@245', 'cds-hooks_2.0@15'
|
|
24
|
+
|
|
25
|
+
config options: { accepts_multiple_requests: true }
|
|
26
|
+
|
|
27
|
+
input :cds_jwt_iss,
|
|
28
|
+
title: 'CRD JWT Issuer',
|
|
29
|
+
description: %(
|
|
30
|
+
Value of the `iss` claim that must be sent on the Bearer token in the `Authorization`
|
|
31
|
+
header of all requests. Run or re-run the **Client Registration** group to set or
|
|
32
|
+
change this value.
|
|
33
|
+
),
|
|
34
|
+
locked: true
|
|
35
|
+
input :order_sign_response_approach,
|
|
36
|
+
title: 'Response generation approach for order-sign',
|
|
37
|
+
description: %(
|
|
38
|
+
Determines how Inferno will generate response for order-sign
|
|
39
|
+
hook invocations.
|
|
40
|
+
),
|
|
41
|
+
type: 'radio',
|
|
42
|
+
default: 'mocked',
|
|
43
|
+
options: {
|
|
44
|
+
list_options: [
|
|
45
|
+
{
|
|
46
|
+
label: 'Create simple mocks based on selected response types',
|
|
47
|
+
value: 'mocked'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
label: 'Generate responses based on a tester-provided template',
|
|
51
|
+
value: 'custom'
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
input :order_sign_selected_response_types,
|
|
56
|
+
title: 'Response types to return from order-sign hook requests',
|
|
57
|
+
description: %(
|
|
58
|
+
Select the CRD response types that the simulated Inferno CRD server will [mock](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#mocked-responses)
|
|
59
|
+
when responding to hook invocations. If no types are selected, Inferno will mock and return
|
|
60
|
+
a [Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
|
|
61
|
+
response for this primary hook.
|
|
62
|
+
),
|
|
63
|
+
type: 'checkbox',
|
|
64
|
+
default: ['coverage_information', 'external_reference', 'instructions'],
|
|
65
|
+
optional: true,
|
|
66
|
+
options: {
|
|
67
|
+
list_options: [
|
|
68
|
+
{
|
|
69
|
+
label: 'External Reference',
|
|
70
|
+
value: 'external_reference'
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
label: 'Instructions',
|
|
74
|
+
value: 'instructions'
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
label: 'Coverage Information',
|
|
78
|
+
value: 'coverage_information'
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
label: 'Request Form Completion',
|
|
82
|
+
value: 'request_form_completion'
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
label: 'Create/Update Coverage Information',
|
|
86
|
+
value: 'create_update_coverage_info'
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
label: 'Launch SMART Application',
|
|
90
|
+
value: 'launch_smart_app'
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
label: 'Propose Alternate Request',
|
|
94
|
+
value: 'propose_alternate_request'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
label: 'Additional Orders as Companions/Prerequisites',
|
|
98
|
+
value: 'companions_prerequisites'
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
enable_when: { input_name: 'order_sign_response_approach', value: 'mocked' }
|
|
103
|
+
input :order_sign_custom_response_template,
|
|
104
|
+
title: 'Custom response template for order-sign hook requests',
|
|
105
|
+
description: %(
|
|
106
|
+
Provide a [custom response template](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses#tester-directed-custom-responses)
|
|
107
|
+
in JSON form for Inferno to use when responding to hook invocations.
|
|
108
|
+
),
|
|
109
|
+
type: 'textarea',
|
|
110
|
+
optional: true,
|
|
111
|
+
enable_when: { input_name: 'order_sign_response_approach', value: 'custom' }
|
|
112
|
+
output :continuation_url
|
|
113
|
+
|
|
114
|
+
run do
|
|
115
|
+
identifier = cds_jwt_iss
|
|
116
|
+
continuation_url = "#{resume_pass_url}?token=#{identifier}"
|
|
117
|
+
output(continuation_url:)
|
|
118
|
+
|
|
119
|
+
wait(
|
|
120
|
+
identifier:,
|
|
121
|
+
message: %(
|
|
122
|
+
**Order Sign CDS Service Test**:
|
|
123
|
+
|
|
124
|
+
Invoke the order-sign hook and send requests to:
|
|
125
|
+
|
|
126
|
+
`#{order_sign_url}`
|
|
127
|
+
|
|
128
|
+
Inferno will process the requests and return CDS cards if successful.
|
|
129
|
+
|
|
130
|
+
[Click here](#{continuation_url}) when you have finished submitting requests.
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require_relative '../../../cross_suite/cards_identification'
|
|
2
|
+
|
|
3
|
+
module DaVinciCRDTestKit
|
|
4
|
+
module V201
|
|
5
|
+
class ClientCardMustSupportCoverageInformationTest < Inferno::Test
|
|
6
|
+
include CardsIdentification
|
|
7
|
+
|
|
8
|
+
title 'Coverage Information Action Support'
|
|
9
|
+
id :crd_v201_client_card_must_support_coverage_information
|
|
10
|
+
description <<~DESCRIPTION
|
|
11
|
+
Checks that the client demonstrated support for the [Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
|
|
12
|
+
action type. At least one hook invocation performed during this test session must have returned a Coverage Information action.
|
|
13
|
+
Additionally, all [coverage-information extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-ext-coverage-information.html)
|
|
14
|
+
must support elements must be demonstrated across all the returned actions.
|
|
15
|
+
|
|
16
|
+
If this test fails, adjust the [cards returned by Inferno's simulated CRD server](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses)
|
|
17
|
+
and/or the hook requests made by the client during the Hooks tests such that Coverage Information actions are returned
|
|
18
|
+
that cover the full scope of the coverage-information extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-ext-coverage-information.html)
|
|
19
|
+
and support for them is demonstrated.
|
|
20
|
+
DESCRIPTION
|
|
21
|
+
|
|
22
|
+
ALL_HOOKS = [
|
|
23
|
+
APPOINTMENT_BOOK_TAG,
|
|
24
|
+
ENCOUNTER_START_TAG,
|
|
25
|
+
ENCOUNTER_DISCHARGE_TAG,
|
|
26
|
+
ORDER_DISPATCH_TAG,
|
|
27
|
+
ORDER_SELECT_TAG,
|
|
28
|
+
ORDER_SIGN_TAG
|
|
29
|
+
].freeze
|
|
30
|
+
|
|
31
|
+
def metadata
|
|
32
|
+
@metadata ||= YAML.load_file(
|
|
33
|
+
File.join(__dir__, '..', '..', '..', 'cross_suite', 'coverage-information_stu201_metadata.yml')
|
|
34
|
+
)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def configured_hook_name
|
|
38
|
+
config.options[:hook_name]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def crd_test_group
|
|
42
|
+
config.options[:crd_test_group]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def tags_to_load(hook_name)
|
|
46
|
+
crd_test_group.present? ? [hook_name, crd_test_group] : [hook_name]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def requests_to_analyze
|
|
50
|
+
if configured_hook_name.present?
|
|
51
|
+
load_requests_for_tags(tags_to_load(configured_hook_name))
|
|
52
|
+
else
|
|
53
|
+
ALL_HOOKS.each_with_object([]) do |hook_name, request_list|
|
|
54
|
+
request_list.concat(load_requests_for_tags(tags_to_load(hook_name)))
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def load_requests_for_tags(tags_to_load)
|
|
60
|
+
load_tagged_requests(*tags_to_load)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class MustSupportMetadataHolder
|
|
64
|
+
attr_accessor :metadata
|
|
65
|
+
|
|
66
|
+
def initialize(metadata)
|
|
67
|
+
self.metadata = metadata
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def must_supports
|
|
71
|
+
@must_supports ||= {
|
|
72
|
+
extensions: metadata[:must_supports][:extensions] || [],
|
|
73
|
+
slices: metadata[:must_supports][:slices] || [],
|
|
74
|
+
elements: metadata[:must_supports][:elements] || []
|
|
75
|
+
}
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
run do
|
|
80
|
+
loaded_requests = requests_to_analyze
|
|
81
|
+
|
|
82
|
+
sorted_cards = sorted_cards_from_requests(loaded_requests)
|
|
83
|
+
|
|
84
|
+
assert sorted_cards['actions'][COVERAGE_INFORMATION_RESPONSE_TYPE].present?,
|
|
85
|
+
'Coverage Information action support not demonstrated.'
|
|
86
|
+
|
|
87
|
+
coverage_information_extensions = extract_coverage_information_extensions(sorted_cards)
|
|
88
|
+
assert_must_support_elements_present(coverage_information_extensions, COVERAGE_INFO_EXT_URL,
|
|
89
|
+
metadata: MustSupportMetadataHolder.new(metadata))
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require_relative '../../../cross_suite/cards_identification'
|
|
2
|
+
|
|
3
|
+
module DaVinciCRDTestKit
|
|
4
|
+
module V201
|
|
5
|
+
class ClientCardMustSupportExternalReferenceTest < Inferno::Test
|
|
6
|
+
include CardsIdentification
|
|
7
|
+
|
|
8
|
+
title 'External Reference Card Support'
|
|
9
|
+
id :crd_v201_client_card_must_support_external_reference
|
|
10
|
+
description <<~DESCRIPTION
|
|
11
|
+
Checks that the client demonstrated support for the [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference)
|
|
12
|
+
card type. At least one hook invocation performed during this test session must have returned an External Reference card.
|
|
13
|
+
|
|
14
|
+
If this test fails, adjust the [cards returned by Inferno's simulated CRD server](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses)
|
|
15
|
+
and/or the hook requests made by the client during the Hooks tests such that an External Reference card is returned and support for it is demonstrated.
|
|
16
|
+
DESCRIPTION
|
|
17
|
+
|
|
18
|
+
ALL_HOOKS = [
|
|
19
|
+
APPOINTMENT_BOOK_TAG,
|
|
20
|
+
ENCOUNTER_START_TAG,
|
|
21
|
+
ENCOUNTER_DISCHARGE_TAG,
|
|
22
|
+
ORDER_DISPATCH_TAG,
|
|
23
|
+
ORDER_SELECT_TAG,
|
|
24
|
+
ORDER_SIGN_TAG
|
|
25
|
+
].freeze
|
|
26
|
+
|
|
27
|
+
def configured_hook_name
|
|
28
|
+
config.options[:hook_name]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def crd_test_group
|
|
32
|
+
config.options[:crd_test_group]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def tags_to_load(hook_name)
|
|
36
|
+
crd_test_group.present? ? [hook_name, crd_test_group] : [hook_name]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def requests_to_analyze
|
|
40
|
+
if configured_hook_name.present?
|
|
41
|
+
load_requests_for_tags(tags_to_load(configured_hook_name))
|
|
42
|
+
else
|
|
43
|
+
ALL_HOOKS.each_with_object([]) do |hook_name, request_list|
|
|
44
|
+
request_list.concat(load_requests_for_tags(tags_to_load(hook_name)))
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def load_requests_for_tags(tags_to_load)
|
|
50
|
+
load_tagged_requests(*tags_to_load)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
run do
|
|
54
|
+
loaded_requests = requests_to_analyze
|
|
55
|
+
sorted_cards = sorted_cards_from_requests(loaded_requests)
|
|
56
|
+
|
|
57
|
+
assert sorted_cards['cards'][EXTERNAL_REFERENCE_RESPONSE_TYPE].present?,
|
|
58
|
+
'External Reference card support not demonstrated.'
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
data/lib/davinci_crd_test_kit/client/v2.0.1/must_support/client_card_must_support_instructions.rb
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require_relative '../../../cross_suite/cards_identification'
|
|
2
|
+
|
|
3
|
+
module DaVinciCRDTestKit
|
|
4
|
+
module V201
|
|
5
|
+
class ClientCardMustSupportInstructionsTest < Inferno::Test
|
|
6
|
+
include CardsIdentification
|
|
7
|
+
|
|
8
|
+
title 'Instructions Card Support'
|
|
9
|
+
id :crd_v201_client_card_must_support_instructions
|
|
10
|
+
description <<~DESCRIPTION
|
|
11
|
+
Checks that the client demonstrated support for the [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference)
|
|
12
|
+
card type. At least one hook invocation performed during this test session must have returned an Instructions card.
|
|
13
|
+
|
|
14
|
+
If this test fails, adjust the [cards returned by Inferno's simulated CRD server](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Controlling-Simulated-Responses)
|
|
15
|
+
and/or the hook requests made by the client during the Hooks tests such that an Instructions card is returned and support for it is demonstrated.
|
|
16
|
+
DESCRIPTION
|
|
17
|
+
|
|
18
|
+
ALL_HOOKS = [
|
|
19
|
+
APPOINTMENT_BOOK_TAG,
|
|
20
|
+
ENCOUNTER_START_TAG,
|
|
21
|
+
ENCOUNTER_DISCHARGE_TAG,
|
|
22
|
+
ORDER_DISPATCH_TAG,
|
|
23
|
+
ORDER_SELECT_TAG,
|
|
24
|
+
ORDER_SIGN_TAG
|
|
25
|
+
].freeze
|
|
26
|
+
|
|
27
|
+
def configured_hook_name
|
|
28
|
+
config.options[:hook_name]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def crd_test_group
|
|
32
|
+
config.options[:crd_test_group]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def tags_to_load(hook_name)
|
|
36
|
+
crd_test_group.present? ? [hook_name, crd_test_group] : [hook_name]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def requests_to_analyze
|
|
40
|
+
if configured_hook_name.present?
|
|
41
|
+
load_requests_for_tags(tags_to_load(configured_hook_name))
|
|
42
|
+
else
|
|
43
|
+
ALL_HOOKS.each_with_object([]) do |hook_name, request_list|
|
|
44
|
+
request_list.concat(load_requests_for_tags(tags_to_load(hook_name)))
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def load_requests_for_tags(tags_to_load)
|
|
50
|
+
load_tagged_requests(*tags_to_load)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
run do
|
|
54
|
+
loaded_requests = requests_to_analyze
|
|
55
|
+
sorted_cards = sorted_cards_from_requests(loaded_requests)
|
|
56
|
+
|
|
57
|
+
assert sorted_cards['cards'][INSTRUCTIONS_RESPONSE_TYPE].present?,
|
|
58
|
+
'Instructions card support not demonstrated.'
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
data/lib/davinci_crd_test_kit/client/v2.0.1/registration/client_registration_verification_test.rb
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'jwt'
|
|
2
|
+
|
|
3
|
+
module DaVinciCRDTestKit
|
|
4
|
+
module V201
|
|
5
|
+
class CRDClientRegistrationVerification < Inferno::Test
|
|
6
|
+
include ClientURLs
|
|
7
|
+
|
|
8
|
+
id :crd_v201_client_registration_verification
|
|
9
|
+
title 'Verify CRD Client Registration'
|
|
10
|
+
description %(
|
|
11
|
+
During this test, Inferno will verify that the CRD client registration details
|
|
12
|
+
provided are conformant.
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
verifies_requirements 'cds-hooks_2.0@174', 'cds-hooks_2.0@197'
|
|
16
|
+
|
|
17
|
+
input :cds_jwt_iss,
|
|
18
|
+
title: 'CRD JWT Issuer',
|
|
19
|
+
description: %(
|
|
20
|
+
The `iss` claim of the JWT in the Authorization header sent by the CRD client under test on
|
|
21
|
+
all CRD requests. This value will be used to associate incoming requests with this test
|
|
22
|
+
session and any requests that use a different `iss` value will not be recognized.
|
|
23
|
+
),
|
|
24
|
+
type: 'text'
|
|
25
|
+
input :cds_jwk_set,
|
|
26
|
+
title: 'CRD JSON Web Key Set (JWKS)',
|
|
27
|
+
type: 'textarea',
|
|
28
|
+
description: %(
|
|
29
|
+
The CRD client's JWK Set containing it's public key. May be either
|
|
30
|
+
a publicly accessible url containing the JWKS, or the raw JWKS.
|
|
31
|
+
The client suite may be run without this input, but it is required
|
|
32
|
+
for the tests to pass.
|
|
33
|
+
),
|
|
34
|
+
optional: true
|
|
35
|
+
|
|
36
|
+
run do
|
|
37
|
+
assert cds_jwk_set.present?, 'Provide a jwk set in the **CRD JSON Web Key Set (JWKS)** input.'
|
|
38
|
+
|
|
39
|
+
jwks_warnings = []
|
|
40
|
+
parsed_jwk_set = jwk_set(cds_jwk_set, jwks_warnings)
|
|
41
|
+
jwks_warnings.each { |warning| add_message('warning', warning) }
|
|
42
|
+
|
|
43
|
+
assert parsed_jwk_set.length.positive?, 'JWKS content does not include any valid keys.'
|
|
44
|
+
|
|
45
|
+
assert messages.none? { |msg| msg[:type] == 'error' }, 'Invalid key set provided. See Messages for details.'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def jwk_set(jku, warning_messages = []) # rubocop:disable Metrics/CyclomaticComplexity
|
|
49
|
+
jwk_set = JWT::JWK::Set.new
|
|
50
|
+
|
|
51
|
+
if jku.blank?
|
|
52
|
+
warning_messages << 'No key set input.'
|
|
53
|
+
return jwk_set
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
jwk_body = # try as raw jwk set
|
|
57
|
+
begin
|
|
58
|
+
JSON.parse(jku)
|
|
59
|
+
rescue JSON::ParserError
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
if jwk_body.blank?
|
|
64
|
+
retrieved = Faraday.get(jku) # try as url pointing to a jwk set
|
|
65
|
+
jwk_body =
|
|
66
|
+
begin
|
|
67
|
+
JSON.parse(retrieved.body)
|
|
68
|
+
rescue JSON::ParserError
|
|
69
|
+
warning_messages << "Failed to fetch valid json from jwks uri #{jku}."
|
|
70
|
+
nil
|
|
71
|
+
end
|
|
72
|
+
else
|
|
73
|
+
warning_messages << 'Providing the JWK Set directly is strongly discouraged.'
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
return jwk_set if jwk_body.blank?
|
|
77
|
+
|
|
78
|
+
jwk_body['keys']&.each_with_index do |key_hash, index|
|
|
79
|
+
parsed_key =
|
|
80
|
+
begin
|
|
81
|
+
JWT::JWK.new(key_hash)
|
|
82
|
+
rescue JWT::JWKError => e
|
|
83
|
+
id = key_hash['kid'] | index
|
|
84
|
+
warning_messages << "Key #{id} invalid: #{e}"
|
|
85
|
+
nil
|
|
86
|
+
end
|
|
87
|
+
jwk_set << parsed_key unless parsed_key.blank?
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
jwk_set
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module DaVinciCRDTestKit
|
|
2
|
+
module V201
|
|
3
|
+
class CRDClientServiceRegistrationAttestation < Inferno::Test
|
|
4
|
+
include ClientURLs
|
|
5
|
+
|
|
6
|
+
id :crd_v201_client_service_registration_attestation
|
|
7
|
+
title 'Attest to the registration of the Inferno Service by the CRD client'
|
|
8
|
+
description %(
|
|
9
|
+
During this test, the tester will confirm that Inferno has been registered as a
|
|
10
|
+
trusted CRD server that can access the CRD client's FHIR Server.
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
verifies_requirements 'cds-hooks_2.0@174'
|
|
14
|
+
|
|
15
|
+
output :attest_true_url
|
|
16
|
+
output :attest_false_url
|
|
17
|
+
|
|
18
|
+
run do
|
|
19
|
+
identifier = SecureRandom.hex(32)
|
|
20
|
+
attest_true_url = "#{resume_pass_url}?token=#{identifier}"
|
|
21
|
+
attest_false_url = "#{resume_fail_url}?token=#{identifier}"
|
|
22
|
+
output(attest_true_url:)
|
|
23
|
+
output(attest_false_url:)
|
|
24
|
+
wait(
|
|
25
|
+
identifier:,
|
|
26
|
+
message: <<~MESSAGE
|
|
27
|
+
**Registration of Inferno as a trusted CRD server**:
|
|
28
|
+
|
|
29
|
+
I attest that Inferno has been registered as a trusted CRD server that is allowed to access
|
|
30
|
+
data stored on the CRD client's FHIR Server.
|
|
31
|
+
|
|
32
|
+
[Click here](#{attest_true_url}) if the above statement is **true**.
|
|
33
|
+
|
|
34
|
+
[Click here](#{attest_false_url}) if the above statement is **false**.
|
|
35
|
+
MESSAGE
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require_relative '../../../cross_suite/tags'
|
|
2
|
+
|
|
3
|
+
module DaVinciCRDTestKit
|
|
4
|
+
module V201
|
|
5
|
+
class HookRequestFetchedDataTest < Inferno::Test
|
|
6
|
+
id :crd_v201_hook_request_fetched_data
|
|
7
|
+
title 'Minimum resource dataset was accessible during the hook invocation'
|
|
8
|
+
description %(
|
|
9
|
+
Clients must make a set of data related to the request available to the CRD server via either prefetch
|
|
10
|
+
as a part of the hook invocation or via FHIR API during server processing of the hook call. According
|
|
11
|
+
to the IG, the minimal data set includes:
|
|
12
|
+
- Patient
|
|
13
|
+
- Relevant Coverage
|
|
14
|
+
- Authoring Practitioner
|
|
15
|
+
- Authoring Organization
|
|
16
|
+
- Requested performing Practitioner (if specified)
|
|
17
|
+
- Requested performing Organization (if specified)
|
|
18
|
+
- Requested Location (if specified)
|
|
19
|
+
- Associated Medication (if any)
|
|
20
|
+
- Associated Device (if any)
|
|
21
|
+
|
|
22
|
+
When it receives a hook invocation, Inferno analyzes the hook request to determine what resources it
|
|
23
|
+
needs access to and requests those that are not provided as a part of the prefetched data. All data
|
|
24
|
+
is requested via the read interaction except for Coverages which requires a search interaction.
|
|
25
|
+
|
|
26
|
+
This test checks that those requests were successful, demonstrating that the system can provide access
|
|
27
|
+
to this required information.
|
|
28
|
+
|
|
29
|
+
For more details on what Inferno's simulated CDS Service fetches during hook invocation and
|
|
30
|
+
how the client must respond to pass this test, see the
|
|
31
|
+
[Data Fetching During Hook Invocations](https://github.com/inferno-framework/davinci-crd-test-kit/wiki/Client-Details#data-fetching-during-hook-invocations)
|
|
32
|
+
documentation.
|
|
33
|
+
)
|
|
34
|
+
verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@43', 'hl7.fhir.us.davinci-crd_2.0.1@323'
|
|
35
|
+
|
|
36
|
+
def hook_name
|
|
37
|
+
config.options[:hook_name]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def crd_test_group
|
|
41
|
+
config.options[:crd_test_group]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def tags_to_load
|
|
45
|
+
crd_test_group.present? ? [hook_name, crd_test_group] : [hook_name]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def no_error_validation(message)
|
|
49
|
+
assert messages.none? { |msg| msg[:type] == 'error' }, message
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
run do
|
|
53
|
+
hook_requests = load_tagged_requests(*tags_to_load)
|
|
54
|
+
|
|
55
|
+
hook_requests.each do |hook_request|
|
|
56
|
+
request_body = JSON.parse(hook_request.request_body)
|
|
57
|
+
hook_instance = request_body['hookInstance']
|
|
58
|
+
|
|
59
|
+
if request_body.dig('fhirAuthorization', 'access_token').blank?
|
|
60
|
+
add_message(:error, "Access token not provided for FHIR data access on hook instance `#{hook_instance}`.")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
failed_data_fetches =
|
|
64
|
+
load_tagged_requests(TagMethods.hook_instance_data_fetch_tag(hook_instance)).reject do |fetch|
|
|
65
|
+
fetch.status.to_s.starts_with?('2')
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
next unless failed_data_fetches.present?
|
|
69
|
+
|
|
70
|
+
server = "#{request_body['fhirServer'].chomp('/')}/"
|
|
71
|
+
failed_data_fetches.each do |request|
|
|
72
|
+
reference = request.url.starts_with?(server) ? request.url[server.length..] : request.url
|
|
73
|
+
if reference.starts_with?('Coverage')
|
|
74
|
+
add_message(:error,
|
|
75
|
+
"Failed to perform Coverage search `#{reference}` for hook instance `#{hook_instance}`.")
|
|
76
|
+
else
|
|
77
|
+
add_message(:error, "Failed to read reference `#{reference}` for hook instance `#{hook_instance}`.")
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
no_error_validation('Inferno could not fetch some required data during the hook invocations.')
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
data/lib/davinci_crd_test_kit/client/v2.0.1/verify_request/hook_request_optional_fields_test.rb
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require_relative '../../client_hook_request_validation'
|
|
2
|
+
require_relative '../client_urls'
|
|
3
|
+
|
|
4
|
+
module DaVinciCRDTestKit
|
|
5
|
+
module V201
|
|
6
|
+
class HookRequestOptionalFieldsTest < Inferno::Test
|
|
7
|
+
include ClientHookRequestValidation
|
|
8
|
+
include ClientURLs
|
|
9
|
+
|
|
10
|
+
id :crd_v201_hook_request_optional_fields
|
|
11
|
+
title 'Hook request optional fields are valid'
|
|
12
|
+
description %(
|
|
13
|
+
Under the [CDS hooks HTTP Request section](https://cds-hooks.hl7.org/2.0/#http-request_1), the specification
|
|
14
|
+
requires that a CDS service request SHALL include a JSON POST body which MAY contain the following
|
|
15
|
+
optional input fields:
|
|
16
|
+
* `fhirServer` - *URL*
|
|
17
|
+
* `fhirAuthorization` - *object*
|
|
18
|
+
* `prefetch` - *object*
|
|
19
|
+
|
|
20
|
+
This test checks that the optional fields that are present are of the correct type. This test
|
|
21
|
+
will not fail if the hook request does not contain an optional field, it only produces an informational message.
|
|
22
|
+
If the client provides its FHIR server URL in the `fhirServer` field, and it's authorization token in the
|
|
23
|
+
`fhirAuthorization` field object, they will be produced as an output from this test to be used in
|
|
24
|
+
subsequent tests.
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
verifies_requirements 'cds-hooks_2.0@1', 'cds-hooks_2.0@3', 'cds-hooks_2.0@20', 'cds-hooks_2.0@21',
|
|
28
|
+
'cds-hooks_2.0@23', 'cds-hooks_2.0@65', 'cds-hooks_2.0@66', 'cds-hooks_2.0@67',
|
|
29
|
+
'cds-hooks_2.0@68', 'cds-hooks_2.0@69', 'cds-hooks_2.0@70'
|
|
30
|
+
|
|
31
|
+
def hook_name
|
|
32
|
+
config.options[:hook_name]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
output :client_fhir_server
|
|
36
|
+
output :client_access_token,
|
|
37
|
+
optional: true
|
|
38
|
+
|
|
39
|
+
run do
|
|
40
|
+
load_tagged_requests(hook_name)
|
|
41
|
+
skip_if requests.empty?, "No #{hook_name} requests were made in a previous test as expected."
|
|
42
|
+
client_fhir_server = nil
|
|
43
|
+
requests.each_with_index do |request, index|
|
|
44
|
+
@request_number = index + 1
|
|
45
|
+
request_body = json_parse(request.request_body)
|
|
46
|
+
if request_body.blank?
|
|
47
|
+
add_message('error', "#{request_number}Hook request body cannot be empty.")
|
|
48
|
+
next
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
fhir_server_info = hook_request_optional_fields_check(request_body, ig_version: 'v201')
|
|
52
|
+
client_fhir_server ||= fhir_server_info
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
unless client_fhir_server.nil?
|
|
56
|
+
output client_fhir_server: client_fhir_server[:fhir_server_uri],
|
|
57
|
+
client_access_token: client_fhir_server[:fhir_access_token]
|
|
58
|
+
end
|
|
59
|
+
no_error_validation('Some service requests contain invalid optional fields.')
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|