davinci_crd_test_kit 0.13.0 → 0.14.1
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 +188 -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 +239 -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}/external_reference.json +1 -1
- data/lib/davinci_crd_test_kit/{card_responses → client/endpoints/mocked_card_responses}/launch_smart_app.json +1 -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 +109 -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 +102 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_encounter_start_group.rb +101 -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 +84 -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 +107 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_select_group.rb +108 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_order_sign_group.rb +113 -0
- data/lib/davinci_crd_test_kit/client/v2.2.1/client_registration_group.rb +33 -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 +234 -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 +54 -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 +108 -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 +133 -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 +75 -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 +321 -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 +476 -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 +203 -0
- data/lib/davinci_crd_test_kit/cross_suite/response_logical_model_validation.rb +435 -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 +46 -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/server/jobs/invoke_hook_no_special_requests.rb +17 -0
- data/lib/davinci_crd_test_kit/server/jobs/invoke_hook_with_bad_auth.rb +14 -0
- data/lib/davinci_crd_test_kit/{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 +183 -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} +3 -3
- 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 +118 -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/discovery/discovery_standard_prefetch_expressions_test.rb +166 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/interaction/server_invoke_hook_single_request_test.rb +22 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/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 +121 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_demonstrate_hook_response_group.rb +94 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_discovery_group.rb +71 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_discharge_group.rb +107 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_encounter_start_group.rb +107 -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 +121 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_select_group.rb +115 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/server_order_sign_group.rb +132 -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/specific_coverage_response_group.rb +23 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_info_reason_test.rb +108 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/coverage_not_found_group.rb +116 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_active_coverage_group.rb +115 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/no_member_found_group.rb +117 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_group.rb +121 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/specific_coverage_responses/technical_issues_invoke_test.rb +22 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_context_validation_test.rb +31 -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 +40 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_request/service_request_required_fields_validation_test.rb +41 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb +109 -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/coverage_info_configuration_test.rb +83 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_card_absence_test.rb +76 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_information_system_action_validation_test.rb +130 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/create_or_update_coverage_info_response_validation_test.rb +119 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/external_reference_card_validation_test.rb +89 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/form_completion_response_validation_test.rb +126 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/hook_request_resource_resolution.rb +174 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/instructions_card_received_test.rb +83 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/launch_smart_app_card_validation_test.rb +88 -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 +81 -0
- data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/service_response_validation_test.rb +63 -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 +307 -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}/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,120 @@
|
|
|
1
|
+
require_relative '../../resource_extractor'
|
|
2
|
+
require_relative '../../server_hook_helper'
|
|
3
|
+
|
|
4
|
+
module DaVinciCRDTestKit
|
|
5
|
+
module V221
|
|
6
|
+
class ServiceRequestNoCustomExtensionsTest < Inferno::Test
|
|
7
|
+
include DaVinciCRDTestKit::ResourceExtractor
|
|
8
|
+
include DaVinciCRDTestKit::ServerHookHelper
|
|
9
|
+
|
|
10
|
+
US_CORE_EXTENSION_URLS = [
|
|
11
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex',
|
|
12
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-direct',
|
|
13
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity',
|
|
14
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race',
|
|
15
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/uscdi-requirement',
|
|
16
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-extension-questionnaire-uri',
|
|
17
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-genderIdentity',
|
|
18
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-jurisdiction',
|
|
19
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-sex',
|
|
20
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-tribal-affiliation',
|
|
21
|
+
'http://hl7.org/fhir/us/core/StructureDefinition/us-core-medication-adherence',
|
|
22
|
+
'http://hl7.org/fhir/StructureDefinition/condition-assertedDate'
|
|
23
|
+
].freeze
|
|
24
|
+
|
|
25
|
+
CRD_EXTENSION_URLS = [
|
|
26
|
+
'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information',
|
|
27
|
+
'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-billing-options',
|
|
28
|
+
'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-request-category',
|
|
29
|
+
'http://hl7.org/fhir/StructureDefinition/codeOptions',
|
|
30
|
+
'http://hl7.org/fhir/StructureDefinition/alternate-reference',
|
|
31
|
+
'http://hl7.org/fhir/5.0/StructureDefinition/extension-CommunicationRequest.payload.content',
|
|
32
|
+
'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.requestedPeriod',
|
|
33
|
+
'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.requestedPerformer',
|
|
34
|
+
'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.performer',
|
|
35
|
+
'http://hl7.org/fhir/StructureDefinition/request-doNotPerform',
|
|
36
|
+
'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.input.value',
|
|
37
|
+
'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.output.value',
|
|
38
|
+
'http://hl7.org/fhir/5.0/StructureDefinition/extension-Task.statusReason'
|
|
39
|
+
].freeze
|
|
40
|
+
|
|
41
|
+
HREX_EXTENSION_URLS = [
|
|
42
|
+
'http://hl7.org/fhir/us/davinci-hrex/StructureDefinition/extension-CoverageDavinciWellknownLocation'
|
|
43
|
+
].freeze
|
|
44
|
+
|
|
45
|
+
VALID_EXTENSION_URLS = (US_CORE_EXTENSION_URLS + CRD_EXTENSION_URLS + HREX_EXTENSION_URLS).freeze
|
|
46
|
+
|
|
47
|
+
title 'Server does not require custom extensions'
|
|
48
|
+
id :crd_v221_service_request_no_custom_extensions
|
|
49
|
+
description %(
|
|
50
|
+
This test verifies that the server is capable of responding to a client
|
|
51
|
+
without the use of any custom extensions. It inspects each successful
|
|
52
|
+
hook call, and if it finds one which doesn't use any extensions not
|
|
53
|
+
defined by US Core, CRD, or HREX it passes.
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@conf-7',
|
|
57
|
+
'hl7.fhir.us.davinci-crd_2.2.1@hook-22'
|
|
58
|
+
|
|
59
|
+
run do
|
|
60
|
+
ALL_HOOK_TAGS.each do |tag|
|
|
61
|
+
load_tagged_requests(tag)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
skip_if requests.blank?, 'No requests were made in a previous test as expected.'
|
|
65
|
+
|
|
66
|
+
successful_requests = requests.select { |request| request.status == 200 }
|
|
67
|
+
|
|
68
|
+
skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
|
|
69
|
+
|
|
70
|
+
embedded_resources =
|
|
71
|
+
successful_requests
|
|
72
|
+
.map { |request| resources_from_request(request) }
|
|
73
|
+
.reject(&:blank?)
|
|
74
|
+
|
|
75
|
+
skip_if embedded_resources.blank?,
|
|
76
|
+
'No embedded FHIR resources were found in successful hook requests.'
|
|
77
|
+
|
|
78
|
+
request_with_no_custom_extensions =
|
|
79
|
+
embedded_resources.any? { |resources| resources.all? { |resource| no_custom_extensions? resource } }
|
|
80
|
+
|
|
81
|
+
pass_if request_with_no_custom_extensions
|
|
82
|
+
|
|
83
|
+
custom_extensions_string =
|
|
84
|
+
embedded_resources
|
|
85
|
+
.flatten
|
|
86
|
+
.flat_map { |resource| custom_extensions(resource) }
|
|
87
|
+
.uniq
|
|
88
|
+
.map { |extension| "\n- `#{extension}`" }
|
|
89
|
+
.join
|
|
90
|
+
|
|
91
|
+
skip 'No requests were made without custom extensions. The following custom extensions were found: ' \
|
|
92
|
+
"#{custom_extensions_string}"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def no_custom_extensions?(resource)
|
|
96
|
+
resource.each_element do |value, _metadata, path|
|
|
97
|
+
next unless value.is_a? FHIR::Extension
|
|
98
|
+
|
|
99
|
+
next if path.scan('extension').length > 1
|
|
100
|
+
|
|
101
|
+
return false unless VALID_EXTENSION_URLS.include? value.url
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
true
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def custom_extensions(resource)
|
|
108
|
+
[].tap do |custom_extensions|
|
|
109
|
+
resource.each_element do |value, _metadata, path|
|
|
110
|
+
next unless value.is_a? FHIR::Extension
|
|
111
|
+
|
|
112
|
+
next if path.scan('extension').length > 1
|
|
113
|
+
|
|
114
|
+
custom_extensions << value.url unless VALID_EXTENSION_URLS.include? value.url
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require_relative '../../server_hook_request_validation'
|
|
2
|
+
require_relative '../../server_hook_helper'
|
|
3
|
+
|
|
4
|
+
module DaVinciCRDTestKit
|
|
5
|
+
module V221
|
|
6
|
+
class ServiceRequestOptionalFieldsValidationTest < Inferno::Test
|
|
7
|
+
include DaVinciCRDTestKit::ServerHookRequestValidation
|
|
8
|
+
include DaVinciCRDTestKit::ServerHookHelper
|
|
9
|
+
|
|
10
|
+
title 'Service request optional fields are valid'
|
|
11
|
+
id :crd_v221_service_request_optional_fields_validation
|
|
12
|
+
description %(
|
|
13
|
+
This optional test reviews the user-submitted CRD service requests for the presence of optional fields:
|
|
14
|
+
`fhirAuthorization` and `prefetch`.
|
|
15
|
+
|
|
16
|
+
The test will not fail if these optional fields are missing from a service request; instead, it generates an
|
|
17
|
+
informational message.
|
|
18
|
+
)
|
|
19
|
+
optional
|
|
20
|
+
simulation_verification
|
|
21
|
+
|
|
22
|
+
run do
|
|
23
|
+
load_tagged_requests(tested_hook_name)
|
|
24
|
+
skip_if requests.empty?, "No #{tested_hook_name} request was made in a previous test as expected."
|
|
25
|
+
|
|
26
|
+
requests.each_with_index do |request, index|
|
|
27
|
+
@request_number = index + 1
|
|
28
|
+
request_body = json_parse(request.request_body)
|
|
29
|
+
if request_body.blank?
|
|
30
|
+
add_message('error', "#{request_number}Hook request body cannot be empty.")
|
|
31
|
+
next
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
hook_request_optional_fields_check(request_body, ig_version: 'v221')
|
|
35
|
+
end
|
|
36
|
+
no_error_validation('Some service requests have invalid optional fields.')
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require_relative '../../server_hook_request_validation'
|
|
2
|
+
require_relative '../../server_hook_helper'
|
|
3
|
+
|
|
4
|
+
module DaVinciCRDTestKit
|
|
5
|
+
module V221
|
|
6
|
+
class ServiceRequestRequiredFieldsValidationTest < Inferno::Test
|
|
7
|
+
include DaVinciCRDTestKit::ServerHookRequestValidation
|
|
8
|
+
include DaVinciCRDTestKit::ServerHookHelper
|
|
9
|
+
|
|
10
|
+
title 'Service requests contain required fields'
|
|
11
|
+
id :crd_v221_service_request_required_fields_validation
|
|
12
|
+
description %(
|
|
13
|
+
This test validates all CRD service requests provided by the user, ensuring each includes all required fields
|
|
14
|
+
specified in the [CDS Hooks spec section on Calling a CDS Service](https://cds-hooks.hl7.org/2.0/#calling-a-cds-service):
|
|
15
|
+
`hook`, `hookInstance`, and `context`. Furthermore, the test checks for the conditional presence of the
|
|
16
|
+
`fhirServer` field if `fhirAuthorization` is included.
|
|
17
|
+
)
|
|
18
|
+
input :invoked_hook
|
|
19
|
+
output :contexts
|
|
20
|
+
simulation_verification
|
|
21
|
+
|
|
22
|
+
run do
|
|
23
|
+
load_tagged_requests(tested_hook_name)
|
|
24
|
+
skip_if requests.empty?, "No #{tested_hook_name} request was made in a previous test as expected."
|
|
25
|
+
contexts = []
|
|
26
|
+
requests.each_with_index do |request, index|
|
|
27
|
+
@request_number = index + 1
|
|
28
|
+
request_body = json_parse(request.request_body)
|
|
29
|
+
next if request_body.blank?
|
|
30
|
+
|
|
31
|
+
contexts << request_body['context'] if request_body['context'].is_a?(Hash)
|
|
32
|
+
hook_request_required_fields_check(request_body, invoked_hook, ig_version: 'v221')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
output contexts: contexts.to_json
|
|
36
|
+
|
|
37
|
+
no_error_validation('Some service requests made are not valid.')
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/additional_orders_validation_test.rb
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require_relative '../../server_test_helper'
|
|
2
|
+
require_relative '../../server_hook_helper'
|
|
3
|
+
require_relative '../../../cross_suite/cards_identification'
|
|
4
|
+
require_relative '../../../cross_suite/response_logical_model_validation'
|
|
5
|
+
|
|
6
|
+
module DaVinciCRDTestKit
|
|
7
|
+
module V221
|
|
8
|
+
class AdditionalOrdersValidationTest < Inferno::Test
|
|
9
|
+
include DaVinciCRDTestKit::ServerTestHelper
|
|
10
|
+
include DaVinciCRDTestKit::ServerHookHelper
|
|
11
|
+
include DaVinciCRDTestKit::CardsIdentification
|
|
12
|
+
include DaVinciCRDTestKit::ResponseLogicalModelValidation
|
|
13
|
+
|
|
14
|
+
title 'Additional Orders cards are valid'
|
|
15
|
+
id :crd_v221_additional_orders_card_validation
|
|
16
|
+
description %(
|
|
17
|
+
This test validates that an [Identify Additional
|
|
18
|
+
Orders](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#identify-additional-orders-response-type)
|
|
19
|
+
card was received. It does so by:
|
|
20
|
+
- Filtering cards with the following criteria:
|
|
21
|
+
- For each suggestion in the card's suggestions array, all actions
|
|
22
|
+
have a type of 'create' and the action's resource type is one of the
|
|
23
|
+
expected types: CommunicationRequest, Device, DeviceRequest,
|
|
24
|
+
Medication, MedicationRequest, NutritionOrder, ServiceRequest, or
|
|
25
|
+
VisionPrescription.
|
|
26
|
+
- Then, for each valid Additional Orders card retrieved, verifying that
|
|
27
|
+
each action within the card's suggestions complies with their
|
|
28
|
+
respective profiles as specified in the [CRD IG section on Identify
|
|
29
|
+
Additional
|
|
30
|
+
Orders](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#identify-additional-orders-response-type):
|
|
31
|
+
-
|
|
32
|
+
[crd-profile-communicationrequest](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-communicationrequest.html)
|
|
33
|
+
-
|
|
34
|
+
[crd-profile-device](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-device.html)
|
|
35
|
+
-
|
|
36
|
+
[crd-profile-deviceRequest](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-devicerequest.html)
|
|
37
|
+
-
|
|
38
|
+
[us-core-medication](http://hl7.org/fhir/us/core/STU3.1.1/StructureDefinition-us-core-medication.html)
|
|
39
|
+
-
|
|
40
|
+
[crd-profile-medicationRequest](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-medicationrequest.html)
|
|
41
|
+
-
|
|
42
|
+
[crd-profile-nutritionOrder](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-nutritionorder.html)
|
|
43
|
+
-
|
|
44
|
+
[crd-profile-serviceRequest](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-servicerequest.html)
|
|
45
|
+
-
|
|
46
|
+
[crd-profile-visionPrescription](https://hl7.org/fhir/us/davinci-crd/2.2.1/StructureDefinition-profile-visionprescription.html).
|
|
47
|
+
|
|
48
|
+
The test will skip if no Identify Additional Orders cards are found.
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-3',
|
|
52
|
+
'hl7.fhir.us.davinci-crd_2.2.1@resp-57',
|
|
53
|
+
'hl7.fhir.us.davinci-crd_2.2.1@resp-58'
|
|
54
|
+
|
|
55
|
+
input :invoked_hook
|
|
56
|
+
|
|
57
|
+
optional
|
|
58
|
+
|
|
59
|
+
def body_has_no_cards?(body)
|
|
60
|
+
!body.is_a?(Hash) ||
|
|
61
|
+
body['cards'].blank? ||
|
|
62
|
+
!body['cards'].is_a?(Array) ||
|
|
63
|
+
!body['cards'].all?(Hash)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def additional_orders_cards(request)
|
|
67
|
+
return [] if request.status != 200
|
|
68
|
+
|
|
69
|
+
response_body = JSON.parse(request.response_body)
|
|
70
|
+
|
|
71
|
+
return [] if body_has_no_cards?(response_body)
|
|
72
|
+
|
|
73
|
+
response_body['cards'].select { |card| additional_orders_response_type? card }
|
|
74
|
+
rescue JSON::ParserError
|
|
75
|
+
[]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
run do
|
|
79
|
+
load_tagged_requests(tested_hook_name)
|
|
80
|
+
|
|
81
|
+
additional_orders_count = 0
|
|
82
|
+
|
|
83
|
+
successful_requests = requests.select { |request| request.status == 200 }
|
|
84
|
+
|
|
85
|
+
skip_if successful_requests.blank?,
|
|
86
|
+
'No successful hook responses were received'
|
|
87
|
+
|
|
88
|
+
requests.each_with_index do |request, index|
|
|
89
|
+
cards = additional_orders_cards(request)
|
|
90
|
+
|
|
91
|
+
additional_orders_count += cards.length
|
|
92
|
+
|
|
93
|
+
perform_response_logical_model_validation(
|
|
94
|
+
cards,
|
|
95
|
+
nil,
|
|
96
|
+
request.request_body,
|
|
97
|
+
index,
|
|
98
|
+
'2.2.1'
|
|
99
|
+
)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
skip_if additional_orders_count.zero?,
|
|
103
|
+
"#{tested_hook_name} hook responses do not contain any Additional Orders cards."
|
|
104
|
+
|
|
105
|
+
no_error_validation('Not all Additional Orders cards were valid. See messages for more information.')
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
require_relative '../../server_test_helper'
|
|
2
|
+
require_relative '../../server_hook_helper'
|
|
3
|
+
require_relative '../../../cross_suite/cards_identification'
|
|
4
|
+
require_relative '../../../cross_suite/profiles_and_resource_types'
|
|
5
|
+
|
|
6
|
+
module DaVinciCRDTestKit
|
|
7
|
+
module V221
|
|
8
|
+
class AllResponsesIncludeCoverageInformationTest < Inferno::Test
|
|
9
|
+
include DaVinciCRDTestKit::ServerTestHelper
|
|
10
|
+
include DaVinciCRDTestKit::ServerHookHelper
|
|
11
|
+
include DaVinciCRDTestKit::CardsIdentification
|
|
12
|
+
|
|
13
|
+
title 'Hook responses include Coverage Information system actions'
|
|
14
|
+
id :crd_v221_all_responses_include_coverage_information
|
|
15
|
+
description %(
|
|
16
|
+
This test validates that a [Coverage
|
|
17
|
+
Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
|
|
18
|
+
system action was returned for every hook call, unless the resource
|
|
19
|
+
which is the focus of the hook call already includes a
|
|
20
|
+
[coverage-information
|
|
21
|
+
extension](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/StructureDefinition-ext-coverage-information.html).
|
|
22
|
+
It does so by:
|
|
23
|
+
- First checking for the presence of actions with a `resource` element
|
|
24
|
+
of the following types:
|
|
25
|
+
- For `appointment-book`: Appointment
|
|
26
|
+
- For `order-sign` or `order-dispatch`: CommunicationRequest,
|
|
27
|
+
DeviceRequest, MedicationRequest, NutritionOrder, ServiceRequest, or
|
|
28
|
+
VisionPrescription
|
|
29
|
+
- Then, checking whether each resource contains the coverage-information extension
|
|
30
|
+
- Finally verifying that the response to each hook call where the
|
|
31
|
+
resource did not contain a coverage-information extension includes
|
|
32
|
+
coverage information system action
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@hook-16',
|
|
36
|
+
'hl7.fhir.us.davinci-crd_2.2.1@resp-28'
|
|
37
|
+
|
|
38
|
+
input :invoked_hook
|
|
39
|
+
|
|
40
|
+
def target_resources
|
|
41
|
+
{
|
|
42
|
+
'appointment-book' => ['Appointment'],
|
|
43
|
+
'order-sign' => ProfilesAndResourceTypes::ORDER_RESOURCE_TYPES,
|
|
44
|
+
'order-dispatch' => ProfilesAndResourceTypes::ORDER_RESOURCE_TYPES,
|
|
45
|
+
'order-select' => ProfilesAndResourceTypes::ORDER_RESOURCE_TYPES,
|
|
46
|
+
'encounter-start' => ['Encounter'],
|
|
47
|
+
'encounter-discharge' => ['Encounter']
|
|
48
|
+
}[tested_hook_name]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def hook_bundle_field_name
|
|
52
|
+
{
|
|
53
|
+
'appointment-book' => 'appointments',
|
|
54
|
+
'order-sign' => 'draftOrders'
|
|
55
|
+
}[tested_hook_name]
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def resources_contain_coverage_information_extension?(resources)
|
|
59
|
+
resources.all? do |resource|
|
|
60
|
+
resource.extension&.any? do |extension|
|
|
61
|
+
extension.url == 'http://hl7.org/fhir/us/davinci-crd/StructureDefinition/ext-coverage-information'
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def order_resources(hook_call_body)
|
|
67
|
+
bundle = FHIR::Bundle.new(hook_call_body.dig('context', hook_bundle_field_name))
|
|
68
|
+
bundle.entry.map(&:resource).select { |resource| target_resources.include? resource.resourceType }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
run do
|
|
72
|
+
successful_hook_calls_without_coverage_information = 0
|
|
73
|
+
coverage_information_system_actions_received = 0
|
|
74
|
+
|
|
75
|
+
load_tagged_requests(tested_hook_name)
|
|
76
|
+
|
|
77
|
+
requests.each do |request|
|
|
78
|
+
next if request.status != 200
|
|
79
|
+
|
|
80
|
+
hook_call_body = JSON.parse(request.request_body)
|
|
81
|
+
|
|
82
|
+
# TODO: handle when default value for coverage-info is false
|
|
83
|
+
next if hook_call_body.dig('extension', 'davinci-crd.configuration', 'coverage-info') == false
|
|
84
|
+
|
|
85
|
+
resources = order_resources(hook_call_body)
|
|
86
|
+
|
|
87
|
+
next if resources_contain_coverage_information_extension?(resources)
|
|
88
|
+
|
|
89
|
+
successful_hook_calls_without_coverage_information += 1
|
|
90
|
+
|
|
91
|
+
hook_call_response = JSON.parse(request.response_body)
|
|
92
|
+
|
|
93
|
+
system_actions = hook_call_response['systemActions']
|
|
94
|
+
|
|
95
|
+
next if system_actions.blank?
|
|
96
|
+
|
|
97
|
+
system_actions_resources =
|
|
98
|
+
system_actions
|
|
99
|
+
.select { |action| action['type'] == 'update' }
|
|
100
|
+
.select { |action| target_resources.include? action['resource']['resourceType'] }
|
|
101
|
+
.map { |action| FHIR.from_contents(action['resource'].to_json) }
|
|
102
|
+
|
|
103
|
+
next unless resources_contain_coverage_information_extension?(system_actions_resources)
|
|
104
|
+
|
|
105
|
+
coverage_information_system_actions_received += 1
|
|
106
|
+
rescue JSON::ParserError => e
|
|
107
|
+
warning(e.message)
|
|
108
|
+
next
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
skip_if successful_hook_calls_without_coverage_information.zero?,
|
|
112
|
+
'No successful hook calls were made with resources which did not already ' \
|
|
113
|
+
'contain a coverage-information extension.'
|
|
114
|
+
|
|
115
|
+
assert successful_hook_calls_without_coverage_information == coverage_information_system_actions_received,
|
|
116
|
+
"#{successful_hook_calls_without_coverage_information} successful hook calls " \
|
|
117
|
+
'without a coverage-information extension were made, but only ' \
|
|
118
|
+
"#{coverage_information_system_actions_received} of the responses contained " \
|
|
119
|
+
'a coverage information system action.'
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
data/lib/davinci_crd_test_kit/server/v2.2.1/verify_response/coverage_info_configuration_test.rb
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require_relative '../../../cross_suite/cards_identification'
|
|
2
|
+
require_relative '../../server_hook_helper'
|
|
3
|
+
require_relative '../server_urls'
|
|
4
|
+
|
|
5
|
+
module DaVinciCRDTestKit
|
|
6
|
+
module V221
|
|
7
|
+
class CoverageInfoConfigurationTest < Inferno::Test
|
|
8
|
+
include DaVinciCRDTestKit::CardsIdentification
|
|
9
|
+
include DaVinciCRDTestKit::ServerHookHelper
|
|
10
|
+
include DaVinciCRDTestKit::V221::ServerURLs
|
|
11
|
+
|
|
12
|
+
title 'Coverage Information configuration option suppresses coverage-info responses'
|
|
13
|
+
id :crd_v221_coverage_info_configuration
|
|
14
|
+
description %(
|
|
15
|
+
This test checks follow-up hook requests made with
|
|
16
|
+
`extension.davinci-crd.configuration.coverage-info` set to `false` after prior successful hook requests
|
|
17
|
+
returned coverage-info content.
|
|
18
|
+
|
|
19
|
+
CRD Servers SHALL behave in the manner prescribed by supported configuration information received from
|
|
20
|
+
the CRD Client. When `coverage-info` is `false`, responses must not include coverage-info cards or
|
|
21
|
+
coverage-information/form-completion system actions.
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@dev-14',
|
|
25
|
+
'hl7.fhir.us.davinci-crd_2.2.1@resp-28'
|
|
26
|
+
|
|
27
|
+
def coverage_info_message(cards, actions)
|
|
28
|
+
card_summaries = cards.map { |card| card['summary'] }.compact
|
|
29
|
+
action_descriptions = actions.map { |action| action['description'] }.compact
|
|
30
|
+
|
|
31
|
+
'Coverage-info disabled server response included coverage-info content despite ' \
|
|
32
|
+
"`#{COVERAGE_INFO_CONFIGURATION_CODE}` being set to `false`. " \
|
|
33
|
+
"Cards: #{card_summaries.join(', ')}. System actions: #{action_descriptions.join(', ')}."
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def primary_hook?
|
|
37
|
+
['appointment-book', 'order-sign', 'order-dispatch'].include? tested_hook_name
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def parsed_body(json)
|
|
41
|
+
JSON.parse(json)
|
|
42
|
+
rescue JSON::ParserError
|
|
43
|
+
nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
run do
|
|
47
|
+
load_tagged_requests(tested_hook_name, COVERAGE_INFO_DISABLED_TAG)
|
|
48
|
+
|
|
49
|
+
if requests.empty?
|
|
50
|
+
message = "No successful #{tested_hook_name} response contained coverage-info content to suppress."
|
|
51
|
+
if primary_hook?
|
|
52
|
+
skip message
|
|
53
|
+
else
|
|
54
|
+
omit message
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
requests.each do |request|
|
|
59
|
+
unless request.status == 200
|
|
60
|
+
add_message(
|
|
61
|
+
'error',
|
|
62
|
+
"Coverage-info disabled server request returned HTTP #{request.status}; expected HTTP 200."
|
|
63
|
+
)
|
|
64
|
+
next
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
response_body = parsed_body(request.response_body)
|
|
68
|
+
unless response_body.is_a?(Hash)
|
|
69
|
+
add_message('error', 'Coverage-info disabled server response was not valid JSON.')
|
|
70
|
+
next
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
cards, actions = coverage_info_content(response_body)
|
|
74
|
+
next if cards.empty? && actions.empty?
|
|
75
|
+
|
|
76
|
+
add_message('error', coverage_info_message(cards, actions))
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
assert_no_error_messages('Coverage-info configuration responses were not valid. Check messages for details.')
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require_relative '../../server_hook_helper'
|
|
2
|
+
require_relative '../../../cross_suite/cards_identification'
|
|
3
|
+
require_relative 'hook_request_resource_resolution'
|
|
4
|
+
|
|
5
|
+
module DaVinciCRDTestKit
|
|
6
|
+
module V221
|
|
7
|
+
class CoverageInformationCardAbsenceTest < Inferno::Test
|
|
8
|
+
include DaVinciCRDTestKit::ServerHookHelper
|
|
9
|
+
include DaVinciCRDTestKit::CardsIdentification
|
|
10
|
+
include HookRequestResourceResolution
|
|
11
|
+
|
|
12
|
+
title 'Hook responses do not include Coverage Information cards'
|
|
13
|
+
id :crd_v221_coverage_information_card_absence
|
|
14
|
+
description %(
|
|
15
|
+
This test verifies that the server does not return the
|
|
16
|
+
[Coverage Information](https://hl7.org/fhir/us/davinci-crd/2.2.1/en/cards.html#coverage-information-response-type)
|
|
17
|
+
response type as a CDS Hooks card. Coverage Information responses must be returned as `systemActions`
|
|
18
|
+
that update resources with the `coverage-information` extension (inclusion of systemActions is verified in a
|
|
19
|
+
previous test).
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
verifies_requirements 'hl7.fhir.us.davinci-crd_2.2.1@resp-25'
|
|
23
|
+
|
|
24
|
+
input :mock_ehr_bundle, optional: true
|
|
25
|
+
|
|
26
|
+
def coverage_information_card_message(response_index, card)
|
|
27
|
+
identifier = card['uuid'].present? ? "uuid `#{card['uuid']}`" : 'no uuid'
|
|
28
|
+
|
|
29
|
+
"Server response #{response_index + 1} included a card with #{identifier} and a suggestion action that only " \
|
|
30
|
+
'adds or modifies the coverage-information extension. Coverage Information must be returned as a ' \
|
|
31
|
+
'systemAction, not as a card.'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def coverage_information_card_response_type?(card, request)
|
|
35
|
+
Array(card['suggestions']).any? do |suggestion|
|
|
36
|
+
Array(suggestion['actions']).any? do |action|
|
|
37
|
+
coverage_information_card_action?(action, request)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def coverage_information_card_action?(action, request)
|
|
43
|
+
return false unless coverage_information_response_type?(action)
|
|
44
|
+
return false unless action['type'] == 'update'
|
|
45
|
+
|
|
46
|
+
source_resource = find_action_source_resource(action, request)
|
|
47
|
+
return coverage_information_extension_only_payload?(action['resource']) unless source_resource
|
|
48
|
+
|
|
49
|
+
only_coverage_information_changed?(source_resource.to_hash, action['resource'])
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
run do
|
|
53
|
+
load_tagged_requests(tested_hook_name)
|
|
54
|
+
skip_if requests.blank?, "No #{tested_hook_name} request was made in a previous test as expected."
|
|
55
|
+
|
|
56
|
+
successful_requests = requests.select { |request| request.status == 200 }
|
|
57
|
+
skip_if successful_requests.empty?, 'All service requests were unsuccessful.'
|
|
58
|
+
|
|
59
|
+
successful_requests.each_with_index do |request, index|
|
|
60
|
+
response_body = JSON.parse(request.response_body)
|
|
61
|
+
cards = response_body['cards'].is_a?(Array) ? response_body['cards'] : []
|
|
62
|
+
|
|
63
|
+
cards.select { |card| coverage_information_card_response_type?(card, request) }.each do |card|
|
|
64
|
+
add_message('error', coverage_information_card_message(index, card))
|
|
65
|
+
end
|
|
66
|
+
rescue JSON::ParserError
|
|
67
|
+
add_message('error', "Invalid JSON: server response #{index + 1} is not valid JSON.")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
assert_no_error_messages(
|
|
71
|
+
'Service response(s) included Coverage Information cards. Check messages for details.'
|
|
72
|
+
)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|