davinci_crd_test_kit 0.12.2 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +59 -2
- 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 +308 -101
- data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +0 -785
- data/lib/davinci_crd_test_kit/client_hooks_group.rb +0 -75
- 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 -41
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +0 -39
- 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 -41
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +0 -60
- 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 -44
- 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 -185
- 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
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
module DaVinciCRDTestKit
|
|
2
|
-
class ClientFHIRApiSearchTest < Inferno::Test
|
|
3
|
-
id :crd_client_fhir_api_search_test
|
|
4
|
-
title 'Search Interaction'
|
|
5
|
-
description %(
|
|
6
|
-
Verify that the CRD client supports the specified search interaction for the given resource. The capabilities
|
|
7
|
-
required by each resource can be found here: https://hl7.org/fhir/us/davinci-crd/CapabilityStatement-crd-client.html#resourcesSummary1
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
input :search_param_values,
|
|
11
|
-
optional: true
|
|
12
|
-
|
|
13
|
-
attr_accessor :successful_search
|
|
14
|
-
|
|
15
|
-
def resource_type
|
|
16
|
-
config.options[:resource_type]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def search_type
|
|
20
|
-
config.options[:search_type]
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def include_searches
|
|
24
|
-
['organization_include', 'practitioner_include', 'location_include']
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def reference_search_parameters
|
|
28
|
-
['organization', 'practitioner', 'patient']
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def bad_resource_id_message(expected_id, actual_id)
|
|
32
|
-
"Expected resource to have id: `#{expected_id}`, but found `#{actual_id}`"
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def perform_fhir_search(search_params, tags)
|
|
36
|
-
fhir_search(resource_type, params: search_params, tags:)
|
|
37
|
-
assert_response_status(200)
|
|
38
|
-
assert_resource_type(:bundle)
|
|
39
|
-
resource
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def status_search_result_check(bundle, status)
|
|
43
|
-
return if bundle.entry.empty?
|
|
44
|
-
|
|
45
|
-
self.successful_search = true
|
|
46
|
-
|
|
47
|
-
bundle.entry
|
|
48
|
-
.reject { |entry| entry&.resource&.resourceType == 'OperationOutcome' }
|
|
49
|
-
.map(&:resource)
|
|
50
|
-
.each do |resource|
|
|
51
|
-
assert_resource_type(resource_type, resource:)
|
|
52
|
-
assert(resource.status == status, %(
|
|
53
|
-
Each #{resource_type} resource in search result bundle should have a status of `#{status}`, instead got:
|
|
54
|
-
`#{resource.status}` for resource with id: `#{resource.id}`
|
|
55
|
-
))
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def check_id_search_result_entry(bundle_entry, search_id, entry_resource_type)
|
|
60
|
-
assert_resource_type(entry_resource_type, resource: bundle_entry)
|
|
61
|
-
|
|
62
|
-
assert bundle_entry.id.present?, "Expected id field in returned #{entry_resource_type} resource"
|
|
63
|
-
|
|
64
|
-
assert bundle_entry.id == search_id,
|
|
65
|
-
bad_resource_id_message(search_id, bundle_entry.id)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def id_search_result_check(bundle, search_id)
|
|
69
|
-
warning do
|
|
70
|
-
assert bundle.entry.any?,
|
|
71
|
-
"Search result bundle is empty for #{resource_type} _id search with an id of `#{search_id}`"
|
|
72
|
-
end
|
|
73
|
-
return if bundle.entry.empty?
|
|
74
|
-
|
|
75
|
-
self.successful_search = true
|
|
76
|
-
|
|
77
|
-
bundle.entry
|
|
78
|
-
.reject { |entry| entry&.resource&.resourceType == 'OperationOutcome' }
|
|
79
|
-
.map(&:resource)
|
|
80
|
-
.each do |resource|
|
|
81
|
-
check_id_search_result_entry(resource, search_id, resource_type)
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def check_include_reference(base_resource_entry, include_resource_id, include_resource_type)
|
|
86
|
-
base_resource_references = Array.wrap(get_reference_field(include_resource_type, base_resource_entry)).compact
|
|
87
|
-
|
|
88
|
-
assert(base_resource_references.present?, %(
|
|
89
|
-
#{resource_type} resource with id #{base_resource_entry.id} did not include the field that references a
|
|
90
|
-
#{include_resource_type} resource}
|
|
91
|
-
))
|
|
92
|
-
|
|
93
|
-
base_resource_reference_match_found = base_resource_references.any? do |base_resource_reference|
|
|
94
|
-
base_resource_reference.reference_id == include_resource_id
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
assert(base_resource_reference_match_found, %(
|
|
98
|
-
The #{resource_type} resource in search result bundle with id #{base_resource_entry.id} did not have a
|
|
99
|
-
#{include_resource_type} reference with an id of `#{include_resource_id}`.`
|
|
100
|
-
))
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def include_search_result_check(bundle, search_id, included_resource_type) # rubocop:disable Metrics/CyclomaticComplexity
|
|
104
|
-
warning do
|
|
105
|
-
assert bundle.entry.any?,
|
|
106
|
-
"Search result bundle is empty for #{resource_type} _include #{search_type} search with an id
|
|
107
|
-
of `#{search_id}`"
|
|
108
|
-
end
|
|
109
|
-
return if bundle.entry.empty?
|
|
110
|
-
|
|
111
|
-
self.successful_search = true
|
|
112
|
-
|
|
113
|
-
base_resource_entry_list = bundle.entry.select do |entry|
|
|
114
|
-
entry.resource&.resourceType == resource_type
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
assert(base_resource_entry_list.length == 1, %(
|
|
118
|
-
The #{included_resource_type} _include search for #{resource_type} resource with id #{search_id}
|
|
119
|
-
should include exactly 1 #{resource_type} resource, instead got #{base_resource_entry_list.length}.
|
|
120
|
-
))
|
|
121
|
-
|
|
122
|
-
base_resource_entry = base_resource_entry_list.first.resource
|
|
123
|
-
|
|
124
|
-
bundle.entry
|
|
125
|
-
.map(&:resource)
|
|
126
|
-
.each do |resource|
|
|
127
|
-
entry_resource_type = resource.resourceType
|
|
128
|
-
|
|
129
|
-
if entry_resource_type == resource_type
|
|
130
|
-
check_id_search_result_entry(resource, search_id, entry_resource_type)
|
|
131
|
-
elsif entry_resource_type != 'OperationOutcome'
|
|
132
|
-
entry_resource_type = included_resource_type.capitalize
|
|
133
|
-
assert_resource_type(entry_resource_type, resource:)
|
|
134
|
-
|
|
135
|
-
included_resource_id = resource.id
|
|
136
|
-
assert included_resource_id.present?, "Expected id field in returned #{entry_resource_type} resource"
|
|
137
|
-
check_include_reference(base_resource_entry, included_resource_id, included_resource_type)
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def get_reference_field(reference_type, entry)
|
|
143
|
-
case reference_type
|
|
144
|
-
when 'patient'
|
|
145
|
-
entry.beneficiary
|
|
146
|
-
when 'practitioner'
|
|
147
|
-
entry.practitioner
|
|
148
|
-
when 'organization'
|
|
149
|
-
if resource_type == 'Encounter'
|
|
150
|
-
entry.serviceProvider
|
|
151
|
-
else
|
|
152
|
-
entry.organization
|
|
153
|
-
end
|
|
154
|
-
when 'location'
|
|
155
|
-
locations = entry.location
|
|
156
|
-
locations.map(&:location)
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
def reference_search_result_check(bundle, reference_id, reference_type)
|
|
161
|
-
warning do
|
|
162
|
-
assert bundle.entry.any?, %(
|
|
163
|
-
Search result bundle is empty for #{resource_type} #{reference_type} search with a #{reference_type} id
|
|
164
|
-
`#{reference_id}`
|
|
165
|
-
)
|
|
166
|
-
end
|
|
167
|
-
return if bundle.entry.empty?
|
|
168
|
-
|
|
169
|
-
self.successful_search = true
|
|
170
|
-
|
|
171
|
-
bundle.entry
|
|
172
|
-
.reject { |entry| entry&.resource&.resourceType == 'OperationOutcome' }
|
|
173
|
-
.map(&:resource)
|
|
174
|
-
.each do |resource|
|
|
175
|
-
assert_resource_type(resource_type, resource:)
|
|
176
|
-
|
|
177
|
-
entry_reference_field = get_reference_field(reference_type, resource)
|
|
178
|
-
assert(
|
|
179
|
-
entry_reference_field.present?,
|
|
180
|
-
%(
|
|
181
|
-
#{resource_type} resource with id #{resource.id} did not include the field that references
|
|
182
|
-
a #{reference_type} resource
|
|
183
|
-
)
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
entry_reference_id = entry_reference_field.reference_id
|
|
187
|
-
assert(
|
|
188
|
-
entry_reference_id == reference_id,
|
|
189
|
-
%(
|
|
190
|
-
The #{resource_type} resource in search result bundle with id #{resource.id} should have a
|
|
191
|
-
#{reference_type} reference with an id of `#{reference_id}`, instead got: `#{entry_reference_id}`
|
|
192
|
-
)
|
|
193
|
-
)
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
run do
|
|
198
|
-
if search_type == 'status'
|
|
199
|
-
coverage_status = ['active', 'cancelled', 'draft', 'entered-in-error']
|
|
200
|
-
coverage_status.each do |status|
|
|
201
|
-
bundle = perform_fhir_search({ status: }, [resource_type, 'status_search'])
|
|
202
|
-
status_search_result_check(bundle, status)
|
|
203
|
-
end
|
|
204
|
-
else
|
|
205
|
-
skip_if search_param_values.blank?, 'No search parameters passed in, skipping test.'
|
|
206
|
-
|
|
207
|
-
search_id_list = search_param_values.split(',').map(&:strip)
|
|
208
|
-
search_id_list.each do |search_id|
|
|
209
|
-
if search_type == '_id'
|
|
210
|
-
bundle = perform_fhir_search({ _id: search_id }, [resource_type, 'id_search'])
|
|
211
|
-
id_search_result_check(bundle, search_id)
|
|
212
|
-
elsif reference_search_parameters.include?(search_type)
|
|
213
|
-
search_params = {}
|
|
214
|
-
search_params[search_type] = search_id
|
|
215
|
-
bundle = perform_fhir_search(search_params, [resource_type, "#{search_type}_search"])
|
|
216
|
-
reference_search_result_check(bundle, search_id, search_type)
|
|
217
|
-
elsif include_searches.include?(search_type)
|
|
218
|
-
include_resource_type = search_type.gsub('_include', '')
|
|
219
|
-
bundle = perform_fhir_search({ _id: search_id, _include: "#{resource_type}:#{include_resource_type}" },
|
|
220
|
-
[resource_type, "include_#{include_resource_type}_search"])
|
|
221
|
-
include_search_result_check(bundle, search_id, include_resource_type)
|
|
222
|
-
else
|
|
223
|
-
raise StandardError,
|
|
224
|
-
'Passed in search_type does not match to any of the search types handled by this search test.'
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
skip_if !successful_search,
|
|
229
|
-
'No resources returned in any of the search result bundles.'
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
end
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
module DaVinciCRDTestKit
|
|
2
|
-
class ClientFHIRApiUpdateTest < Inferno::Test
|
|
3
|
-
id :crd_client_fhir_api_update_test
|
|
4
|
-
title 'Update Interaction'
|
|
5
|
-
description %(
|
|
6
|
-
Verify that the CRD client supports the update interaction for the given resource. The capabilities required by
|
|
7
|
-
each resource can be found here: https://hl7.org/fhir/us/davinci-crd/CapabilityStatement-crd-client.html#resourcesSummary1
|
|
8
|
-
)
|
|
9
|
-
verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@74'
|
|
10
|
-
|
|
11
|
-
input :update_resources,
|
|
12
|
-
type: 'textarea',
|
|
13
|
-
description:
|
|
14
|
-
'Provide a list of resources to update. e.g., [json_resource_1, json_resource_2]'
|
|
15
|
-
|
|
16
|
-
def resource_type
|
|
17
|
-
config.options[:resource_type]
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
run do
|
|
21
|
-
assert_valid_json(update_resources)
|
|
22
|
-
update_resources_list = JSON.parse(update_resources)
|
|
23
|
-
skip_if(!update_resources_list.is_a?(Array), 'Resources to update not inputted in list format, skipping test.')
|
|
24
|
-
|
|
25
|
-
valid_update_resources =
|
|
26
|
-
update_resources_list
|
|
27
|
-
.compact_blank
|
|
28
|
-
.map { |resource| FHIR.from_contents(resource.to_json) }
|
|
29
|
-
.select { |resource| resource.resourceType == resource_type }
|
|
30
|
-
.select { |resource| resource_is_valid?(resource:) }
|
|
31
|
-
|
|
32
|
-
skip_if(valid_update_resources.blank?,
|
|
33
|
-
%(No valid #{resource_type} resources were provided to send in Update requests, skipping test.))
|
|
34
|
-
|
|
35
|
-
valid_update_resources.each do |update_resource|
|
|
36
|
-
fhir_update(update_resource, update_resource.id)
|
|
37
|
-
assert_response_status([200, 201])
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
module DaVinciCRDTestKit
|
|
2
|
-
class ClientFHIRApiValidationTest < Inferno::Test
|
|
3
|
-
id :crd_client_fhir_api_validation_test
|
|
4
|
-
title 'FHIR Resource Validation'
|
|
5
|
-
description %(
|
|
6
|
-
Verify that the given resources returned from the previous client API interactions are valid resources. Each
|
|
7
|
-
resource is validated against its corresponding [CRD resource profile](https://hl7.org/fhir/us/davinci-crd/STU2/artifacts.html).
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
def resource_type
|
|
11
|
-
config.options[:resource_type]
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def structure_definition_map
|
|
15
|
-
{
|
|
16
|
-
'Practitioner' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-practitioner',
|
|
17
|
-
'PractitionerRole' => 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitionerrole',
|
|
18
|
-
'Patient' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-patient',
|
|
19
|
-
'Encounter' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-encounter',
|
|
20
|
-
'Coverage' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-coverage',
|
|
21
|
-
'Device' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-device',
|
|
22
|
-
'Location' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-location',
|
|
23
|
-
'Organization' => 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/profile-organization'
|
|
24
|
-
}.freeze
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def profile_url
|
|
28
|
-
structure_definition_map[resource_type]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
run do
|
|
32
|
-
load_tagged_requests(resource_type)
|
|
33
|
-
skip_if requests.empty?, 'No FHIR api requests were made'
|
|
34
|
-
|
|
35
|
-
requests.keep_if { |req| req.status == 200 }
|
|
36
|
-
skip_if(requests.blank?,
|
|
37
|
-
'There were no successful FHIR API requests made in previous tests to use in validation.')
|
|
38
|
-
|
|
39
|
-
validated_resources =
|
|
40
|
-
requests
|
|
41
|
-
.map(&:resource)
|
|
42
|
-
.compact
|
|
43
|
-
.flat_map { |resource| resource.is_a?(FHIR::Bundle) ? resource.entry.map(&:resource) : resource }
|
|
44
|
-
.select { |resource| resource.resourceType == resource_type }
|
|
45
|
-
.uniq { |resource| resource.to_reference.reference }
|
|
46
|
-
.each { |resource| resource_is_valid?(resource:, profile_url:) }
|
|
47
|
-
|
|
48
|
-
skip_if(validated_resources.blank?,
|
|
49
|
-
%(No #{resource_type} resources were returned from any of the FHIR API requests made in previous tests
|
|
50
|
-
that could be validated.))
|
|
51
|
-
|
|
52
|
-
validation_error_count = messages.count { |msg| msg[:type] == 'error' }
|
|
53
|
-
assert(validation_error_count.zero?,
|
|
54
|
-
%(#{validation_error_count}/#{validated_resources.length} #{resource_type} resources returned from previous
|
|
55
|
-
test's FHIR API requests failed validation.))
|
|
56
|
-
|
|
57
|
-
skip_if validated_resources.blank?, 'No FHIR resources were made in previous tests that could be validated.'
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
require_relative 'order_dispatch_receive_request_test'
|
|
2
|
-
require_relative 'client_display_cards_attest'
|
|
3
|
-
require_relative 'decode_auth_token_test'
|
|
4
|
-
require_relative 'hook_request_optional_fields_test'
|
|
5
|
-
require_relative 'hook_request_required_fields_test'
|
|
6
|
-
require_relative 'hook_request_valid_context_test'
|
|
7
|
-
require_relative 'hook_request_valid_prefetch_test'
|
|
8
|
-
require_relative 'retrieve_jwks_test'
|
|
9
|
-
require_relative 'submitted_response_validation'
|
|
10
|
-
require_relative 'token_header_test'
|
|
11
|
-
require_relative 'token_payload_test'
|
|
12
|
-
|
|
13
|
-
module DaVinciCRDTestKit
|
|
14
|
-
class ClientOrderDispatchGroup < Inferno::TestGroup
|
|
15
|
-
title 'order-dispatch'
|
|
16
|
-
id :crd_client_order_dispatch
|
|
17
|
-
description <<~DESCRIPTION
|
|
18
|
-
The order-dispatch hook fires when a practitioner is selecting a candidate performer for a pre-existing order
|
|
19
|
-
that was not tied to a specific performer. These tests are based on the following criteria:
|
|
20
|
-
* [CRD IG requirements for this hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-dispatch),
|
|
21
|
-
which includes the profiles that are expected to be used for the resources resolved to by `context`
|
|
22
|
-
FHIR ID fields
|
|
23
|
-
* Specific [order-dispatch `context` requirements](https://cds-hooks.hl7.org/hooks/order-dispatch/2023SepSTU1Ballot/order-dispatch/)
|
|
24
|
-
defined in the CDS Hooks specification
|
|
25
|
-
|
|
26
|
-
This version of the CRD implementation guide refers to version 1.0 of the hook.
|
|
27
|
-
DESCRIPTION
|
|
28
|
-
|
|
29
|
-
run_as_group
|
|
30
|
-
|
|
31
|
-
input_order :cds_jwt_iss, :cds_jwk_set
|
|
32
|
-
|
|
33
|
-
config(
|
|
34
|
-
inputs: {
|
|
35
|
-
auth_token_headers_json: { name: :order_dispatch_auth_token_headers_json },
|
|
36
|
-
auth_tokens: { name: :order_dispatch_auth_tokens },
|
|
37
|
-
auth_tokens_jwk_json: { name: :order_dispatch_auth_tokens_jwk_json },
|
|
38
|
-
client_access_token: { name: :order_dispatch_client_access_token },
|
|
39
|
-
client_fhir_server: { name: :order_dispatch_client_fhir_server },
|
|
40
|
-
crd_jwks_keys_json: { name: :order_dispatch_crd_jwks_keys_json },
|
|
41
|
-
custom_response: { name: :order_dispatch_custom_response },
|
|
42
|
-
selected_response_types: { name: :order_dispatch_selected_response_types }
|
|
43
|
-
},
|
|
44
|
-
outputs: {
|
|
45
|
-
auth_token_headers_json: { name: :order_dispatch_auth_token_headers_json },
|
|
46
|
-
auth_token_payloads_json: { name: :order_dispatch_auth_token_payloads_json },
|
|
47
|
-
auth_tokens: { name: :order_dispatch_auth_tokens },
|
|
48
|
-
auth_tokens_jwk_json: { name: :order_dispatch_auth_tokens_jwk_json },
|
|
49
|
-
client_access_token: { name: :order_dispatch_client_access_token },
|
|
50
|
-
client_fhir_server: { name: :order_dispatch_client_fhir_server },
|
|
51
|
-
crd_jwks_json: { name: :order_dispatch_crd_jwks_json },
|
|
52
|
-
crd_jwks_keys_json: { name: :order_dispatch_crd_jwks_keys_json }
|
|
53
|
-
},
|
|
54
|
-
options: {
|
|
55
|
-
hook_name: 'order-dispatch',
|
|
56
|
-
hook_path: ORDER_DISPATCH_PATH
|
|
57
|
-
}
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
test from: :crd_submitted_response_validation
|
|
61
|
-
test from: :crd_order_dispatch_request
|
|
62
|
-
test from: :crd_decode_auth_token
|
|
63
|
-
test from: :crd_retrieve_jwks
|
|
64
|
-
test from: :crd_token_header
|
|
65
|
-
test from: :crd_token_payload
|
|
66
|
-
test from: :crd_hook_request_required_fields
|
|
67
|
-
test from: :crd_hook_request_optional_fields
|
|
68
|
-
test from: :crd_hook_request_valid_context do
|
|
69
|
-
verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@284', 'hl7.fhir.us.davinci-crd_2.0.1@285',
|
|
70
|
-
'hl7.fhir.us.davinci-crd_2.0.1@286', 'hl7.fhir.us.davinci-crd_2.0.1@287',
|
|
71
|
-
'hl7.fhir.us.davinci-crd_2.0.1@288', 'hl7.fhir.us.davinci-crd_2.0.1@289',
|
|
72
|
-
'hl7.fhir.us.davinci-crd_2.0.1@290', 'hl7.fhir.us.davinci-crd_2.0.1@291',
|
|
73
|
-
'hl7.fhir.us.davinci-crd_2.0.1@292', 'hl7.fhir.us.davinci-crd_2.0.1@293',
|
|
74
|
-
'hl7.fhir.us.davinci-crd_2.0.1@294', 'hl7.fhir.us.davinci-crd_2.0.1@295'
|
|
75
|
-
end
|
|
76
|
-
test from: :crd_hook_request_valid_prefetch
|
|
77
|
-
test from: :crd_card_display_attest_test
|
|
78
|
-
end
|
|
79
|
-
end
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
require_relative 'order_select_receive_request_test'
|
|
2
|
-
require_relative 'client_display_cards_attest'
|
|
3
|
-
require_relative 'decode_auth_token_test'
|
|
4
|
-
require_relative 'hook_request_optional_fields_test'
|
|
5
|
-
require_relative 'hook_request_required_fields_test'
|
|
6
|
-
require_relative 'hook_request_valid_context_test'
|
|
7
|
-
require_relative 'hook_request_valid_prefetch_test'
|
|
8
|
-
require_relative 'retrieve_jwks_test'
|
|
9
|
-
require_relative 'submitted_response_validation'
|
|
10
|
-
require_relative 'token_header_test'
|
|
11
|
-
require_relative 'token_payload_test'
|
|
12
|
-
|
|
13
|
-
module DaVinciCRDTestKit
|
|
14
|
-
class ClientOrderSelectGroup < Inferno::TestGroup
|
|
15
|
-
title 'order-select'
|
|
16
|
-
id :crd_client_order_select
|
|
17
|
-
description <<~DESCRIPTION
|
|
18
|
-
The order-select hook fires when a clinician selects one or more orders to place for a patient,
|
|
19
|
-
(including orders for medications, procedures, labs and other orders). If supported by the CDS Client, this
|
|
20
|
-
hook may also be invoked each time the clinician selects a detail regarding the order. These tests are based on
|
|
21
|
-
the following criteria:
|
|
22
|
-
* [CRD IG requirements for this hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-selecte),
|
|
23
|
-
which includes the profiles that are expected to be used for the resources resolved to by `context`
|
|
24
|
-
FHIR ID fields
|
|
25
|
-
* Specific [order-select `context` requirements](https://cds-hooks.hl7.org/hooks/order-select/2023SepSTU1Ballot/order-select/)
|
|
26
|
-
defined in the CDS Hooks specification
|
|
27
|
-
|
|
28
|
-
This version of the CRD implementation guide refers to version 1.0 of the hook.
|
|
29
|
-
DESCRIPTION
|
|
30
|
-
|
|
31
|
-
run_as_group
|
|
32
|
-
|
|
33
|
-
input_order :cds_jwt_iss, :cds_jwk_set
|
|
34
|
-
|
|
35
|
-
config(
|
|
36
|
-
inputs: {
|
|
37
|
-
auth_token_headers_json: { name: :order_select_auth_token_headers_json },
|
|
38
|
-
auth_tokens: { name: :order_select_auth_tokens },
|
|
39
|
-
auth_tokens_jwk_json: { name: :order_select_auth_tokens_jwk_json },
|
|
40
|
-
client_access_token: { name: :order_select_client_access_token },
|
|
41
|
-
client_fhir_server: { name: :order_select_client_fhir_server },
|
|
42
|
-
crd_jwks_keys_json: { name: :order_select_crd_jwks_keys_json },
|
|
43
|
-
custom_response: { name: :order_select_custom_response },
|
|
44
|
-
selected_response_types: { name: :order_select_selected_response_types }
|
|
45
|
-
},
|
|
46
|
-
outputs: {
|
|
47
|
-
auth_token_headers_json: { name: :order_select_auth_token_headers_json },
|
|
48
|
-
auth_token_payloads_json: { name: :order_select_auth_token_payloads_json },
|
|
49
|
-
auth_tokens: { name: :order_select_auth_tokens },
|
|
50
|
-
auth_tokens_jwk_json: { name: :order_select_auth_tokens_jwk_json },
|
|
51
|
-
client_access_token: { name: :order_select_client_access_token },
|
|
52
|
-
client_fhir_server: { name: :order_select_client_fhir_server },
|
|
53
|
-
crd_jwks_json: { name: :order_select_crd_jwks_json },
|
|
54
|
-
crd_jwks_keys_json: { name: :order_select_crd_jwks_keys_json }
|
|
55
|
-
},
|
|
56
|
-
options: {
|
|
57
|
-
hook_name: 'order-select',
|
|
58
|
-
hook_path: ORDER_SELECT_PATH
|
|
59
|
-
}
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
test from: :crd_submitted_response_validation
|
|
63
|
-
test from: :crd_order_select_request
|
|
64
|
-
test from: :crd_decode_auth_token
|
|
65
|
-
test from: :crd_retrieve_jwks
|
|
66
|
-
test from: :crd_token_header
|
|
67
|
-
test from: :crd_token_payload
|
|
68
|
-
test from: :crd_hook_request_required_fields
|
|
69
|
-
test from: :crd_hook_request_optional_fields
|
|
70
|
-
test from: :crd_hook_request_valid_context do
|
|
71
|
-
verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@71', 'hl7.fhir.us.davinci-crd_2.0.1@284',
|
|
72
|
-
'hl7.fhir.us.davinci-crd_2.0.1@285', 'hl7.fhir.us.davinci-crd_2.0.1@286',
|
|
73
|
-
'hl7.fhir.us.davinci-crd_2.0.1@287', 'hl7.fhir.us.davinci-crd_2.0.1@288',
|
|
74
|
-
'hl7.fhir.us.davinci-crd_2.0.1@289', 'hl7.fhir.us.davinci-crd_2.0.1@290',
|
|
75
|
-
'hl7.fhir.us.davinci-crd_2.0.1@291', 'hl7.fhir.us.davinci-crd_2.0.1@292',
|
|
76
|
-
'hl7.fhir.us.davinci-crd_2.0.1@293', 'hl7.fhir.us.davinci-crd_2.0.1@294',
|
|
77
|
-
'hl7.fhir.us.davinci-crd_2.0.1@295'
|
|
78
|
-
end
|
|
79
|
-
test from: :crd_hook_request_valid_prefetch
|
|
80
|
-
test from: :crd_card_display_attest_test
|
|
81
|
-
end
|
|
82
|
-
end
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
require_relative 'order_sign_receive_request_test'
|
|
2
|
-
require_relative 'client_display_cards_attest'
|
|
3
|
-
require_relative 'decode_auth_token_test'
|
|
4
|
-
require_relative 'hook_request_optional_fields_test'
|
|
5
|
-
require_relative 'hook_request_required_fields_test'
|
|
6
|
-
require_relative 'hook_request_valid_context_test'
|
|
7
|
-
require_relative 'hook_request_valid_prefetch_test'
|
|
8
|
-
require_relative 'retrieve_jwks_test'
|
|
9
|
-
require_relative 'submitted_response_validation'
|
|
10
|
-
require_relative 'token_header_test'
|
|
11
|
-
require_relative 'token_payload_test'
|
|
12
|
-
|
|
13
|
-
module DaVinciCRDTestKit
|
|
14
|
-
class ClientOrderSignGroup < Inferno::TestGroup
|
|
15
|
-
title 'order-sign'
|
|
16
|
-
id :crd_client_order_sign
|
|
17
|
-
description <<~DESCRIPTION
|
|
18
|
-
The order-sign hook fires when a clinician is ready to sign one or more orders for a patient, (including orders
|
|
19
|
-
for medications, procedures, labs and other orders). These tests are based on the following criteria:
|
|
20
|
-
* [CRD IG requirements for this hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign),
|
|
21
|
-
which includes the profiles that are expected to be used for the resources resolved to by `context`
|
|
22
|
-
FHIR ID fields
|
|
23
|
-
* Specific [order-sign `context` requirements](https://cds-hooks.org/hooks/order-sign/)
|
|
24
|
-
defined in the CDS Hooks specification
|
|
25
|
-
|
|
26
|
-
This version of the CRD implementation guide refers to version 1.1 of the hook which, at the time of publication,
|
|
27
|
-
was not available as a snapshot. Therefore the preceding link refers to the CDS hooks current build.
|
|
28
|
-
DESCRIPTION
|
|
29
|
-
|
|
30
|
-
run_as_group
|
|
31
|
-
|
|
32
|
-
input_order :cds_jwt_iss, :cds_jwk_set
|
|
33
|
-
|
|
34
|
-
config(
|
|
35
|
-
inputs: {
|
|
36
|
-
auth_token_headers_json: { name: :order_sign_auth_token_headers_json },
|
|
37
|
-
auth_tokens: { name: :order_sign_auth_tokens },
|
|
38
|
-
auth_tokens_jwk_json: { name: :order_sign_auth_tokens_jwk_json },
|
|
39
|
-
client_access_token: { name: :order_sign_client_access_token },
|
|
40
|
-
client_fhir_server: { name: :order_sign_client_fhir_server },
|
|
41
|
-
crd_jwks_keys_json: { name: :order_sign_crd_jwks_keys_json },
|
|
42
|
-
custom_response: { name: :order_sign_custom_response },
|
|
43
|
-
selected_response_types: { name: :order_sign_selected_response_types }
|
|
44
|
-
},
|
|
45
|
-
outputs: {
|
|
46
|
-
auth_token_headers_json: { name: :order_sign_auth_token_headers_json },
|
|
47
|
-
auth_token_payloads_json: { name: :order_sign_auth_token_payloads_json },
|
|
48
|
-
auth_tokens: { name: :order_sign_auth_tokens },
|
|
49
|
-
auth_tokens_jwk_json: { name: :order_sign_auth_tokens_jwk_json },
|
|
50
|
-
client_access_token: { name: :order_sign_client_access_token },
|
|
51
|
-
client_fhir_server: { name: :order_sign_client_fhir_server },
|
|
52
|
-
crd_jwks_json: { name: :order_sign_crd_jwks_json },
|
|
53
|
-
crd_jwks_keys_json: { name: :order_sign_crd_jwks_keys_json }
|
|
54
|
-
},
|
|
55
|
-
options: {
|
|
56
|
-
hook_name: 'order-sign',
|
|
57
|
-
hook_path: ORDER_SIGN_PATH
|
|
58
|
-
}
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
test from: :crd_submitted_response_validation
|
|
62
|
-
test from: :crd_order_sign_request
|
|
63
|
-
test from: :crd_decode_auth_token
|
|
64
|
-
test from: :crd_retrieve_jwks
|
|
65
|
-
test from: :crd_token_header
|
|
66
|
-
test from: :crd_token_payload
|
|
67
|
-
test from: :crd_hook_request_required_fields
|
|
68
|
-
test from: :crd_hook_request_optional_fields
|
|
69
|
-
test from: :crd_hook_request_valid_context do
|
|
70
|
-
verifies_requirements 'hl7.fhir.us.davinci-crd_2.0.1@71', 'hl7.fhir.us.davinci-crd_2.0.1@284',
|
|
71
|
-
'hl7.fhir.us.davinci-crd_2.0.1@285', 'hl7.fhir.us.davinci-crd_2.0.1@286',
|
|
72
|
-
'hl7.fhir.us.davinci-crd_2.0.1@287', 'hl7.fhir.us.davinci-crd_2.0.1@288',
|
|
73
|
-
'hl7.fhir.us.davinci-crd_2.0.1@289', 'hl7.fhir.us.davinci-crd_2.0.1@290',
|
|
74
|
-
'hl7.fhir.us.davinci-crd_2.0.1@291', 'hl7.fhir.us.davinci-crd_2.0.1@292',
|
|
75
|
-
'hl7.fhir.us.davinci-crd_2.0.1@293', 'hl7.fhir.us.davinci-crd_2.0.1@294',
|
|
76
|
-
'hl7.fhir.us.davinci-crd_2.0.1@295'
|
|
77
|
-
end
|
|
78
|
-
test from: :crd_hook_request_valid_prefetch
|
|
79
|
-
test from: :crd_card_display_attest_test
|
|
80
|
-
end
|
|
81
|
-
end
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
require 'jwt'
|
|
2
|
-
|
|
3
|
-
module DaVinciCRDTestKit
|
|
4
|
-
class CRDClientRegistrationVerification < Inferno::Test
|
|
5
|
-
include URLs
|
|
6
|
-
|
|
7
|
-
id :crd_client_registration_verification
|
|
8
|
-
title 'Verify CRD Client Registration'
|
|
9
|
-
description %(
|
|
10
|
-
During this test, Inferno will verify that the CRD Client registration details
|
|
11
|
-
provided are conformant.
|
|
12
|
-
)
|
|
13
|
-
input :cds_jwt_iss,
|
|
14
|
-
title: 'CRD JWT Issuer',
|
|
15
|
-
description: %(
|
|
16
|
-
The `iss` claim of the JWT in the Authorization header sent by the CRD client under test on
|
|
17
|
-
all CRD requests. This value will be used to associate incoming requests with this test
|
|
18
|
-
session and any requests that use a different `iss` value will not be recognized.
|
|
19
|
-
),
|
|
20
|
-
type: 'text'
|
|
21
|
-
input :cds_jwk_set,
|
|
22
|
-
title: 'CRD JSON Web Key Set (JWKS)',
|
|
23
|
-
type: 'textarea',
|
|
24
|
-
description: %(
|
|
25
|
-
The CRD client's JWK Set containing it's public key. May be either
|
|
26
|
-
a publicly accessible url containing the JWKS, or the raw JWKS.
|
|
27
|
-
This input is required for these tests to pass.
|
|
28
|
-
),
|
|
29
|
-
optional: true
|
|
30
|
-
|
|
31
|
-
run do
|
|
32
|
-
assert cds_jwk_set.present?, 'Provide a jwk set in the **CRD JSON Web Key Set (JWKS)** input.'
|
|
33
|
-
|
|
34
|
-
jwks_warnings = []
|
|
35
|
-
parsed_jwk_set = jwk_set(cds_jwk_set, jwks_warnings)
|
|
36
|
-
jwks_warnings.each { |warning| add_message('warning', warning) }
|
|
37
|
-
|
|
38
|
-
assert parsed_jwk_set.length.positive?, 'JWKS content does not include any valid keys.'
|
|
39
|
-
|
|
40
|
-
assert messages.none? { |msg| msg[:type] == 'error' }, 'Invalid key set provided. See messages for details'
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def jwk_set(jku, warning_messages = []) # rubocop:disable Metrics/CyclomaticComplexity
|
|
44
|
-
jwk_set = JWT::JWK::Set.new
|
|
45
|
-
|
|
46
|
-
if jku.blank?
|
|
47
|
-
warning_messages << 'No key set input.'
|
|
48
|
-
return jwk_set
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
jwk_body = # try as raw jwk set
|
|
52
|
-
begin
|
|
53
|
-
JSON.parse(jku)
|
|
54
|
-
rescue JSON::ParserError
|
|
55
|
-
nil
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
if jwk_body.blank?
|
|
59
|
-
retrieved = Faraday.get(jku) # try as url pointing to a jwk set
|
|
60
|
-
jwk_body =
|
|
61
|
-
begin
|
|
62
|
-
JSON.parse(retrieved.body)
|
|
63
|
-
rescue JSON::ParserError
|
|
64
|
-
warning_messages << "Failed to fetch valid json from jwks uri #{jku}."
|
|
65
|
-
nil
|
|
66
|
-
end
|
|
67
|
-
else
|
|
68
|
-
warning_messages << 'Providing the JWK Set directly is strongly discouraged.'
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
return jwk_set if jwk_body.blank?
|
|
72
|
-
|
|
73
|
-
jwk_body['keys']&.each_with_index do |key_hash, index|
|
|
74
|
-
parsed_key =
|
|
75
|
-
begin
|
|
76
|
-
JWT::JWK.new(key_hash)
|
|
77
|
-
rescue JWT::JWKError => e
|
|
78
|
-
id = key_hash['kid'] | index
|
|
79
|
-
warning_messages << "Key #{id} invalid: #{e}"
|
|
80
|
-
nil
|
|
81
|
-
end
|
|
82
|
-
jwk_set << parsed_key unless parsed_key.blank?
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
jwk_set
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|