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
data/lib/davinci_crd_test_kit/{mock_service_response.rb → client/endpoints/mock_service_response.rb}
RENAMED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
module DaVinciCRDTestKit
|
|
2
2
|
# Serve responses to CRD hook invocations
|
|
3
3
|
module MockServiceResponse
|
|
4
|
+
def build_mock_hook_response
|
|
5
|
+
hook_card_response = create_cards_and_system_actions
|
|
6
|
+
update_specific_hook_card_info(hook_card_response)
|
|
7
|
+
create_warning_messages(hook_card_response)
|
|
8
|
+
|
|
9
|
+
hook_card_response
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def selected_response_types
|
|
13
|
+
@selected_response_types ||=
|
|
14
|
+
JSON.parse(result.input_json)
|
|
15
|
+
.find { |input| input['name'].include?('selected_response_types') }
|
|
16
|
+
&.dig('value') || []
|
|
17
|
+
end
|
|
18
|
+
|
|
4
19
|
def current_time
|
|
5
20
|
Time.now.utc
|
|
6
21
|
end
|
|
@@ -10,7 +25,10 @@ module DaVinciCRDTestKit
|
|
|
10
25
|
end
|
|
11
26
|
|
|
12
27
|
def load_json_file(filename)
|
|
13
|
-
json = JSON.parse(File.read(File.join(__dir__, '
|
|
28
|
+
json = JSON.parse(File.read(File.join(__dir__, 'mocked_card_responses', filename)))
|
|
29
|
+
if ig_version == 'v221'
|
|
30
|
+
json['source']['topic']['system'] = 'http://terminology.hl7.org/CodeSystem/cdshooks-card-type'
|
|
31
|
+
end
|
|
14
32
|
return json unless filename == 'launch_smart_app.json'
|
|
15
33
|
|
|
16
34
|
json['links'].first['url'] = "#{Inferno::Application['base_url']}/custom/smart/launch"
|
|
@@ -18,11 +36,6 @@ module DaVinciCRDTestKit
|
|
|
18
36
|
json
|
|
19
37
|
end
|
|
20
38
|
|
|
21
|
-
def request_body
|
|
22
|
-
@request_body ||=
|
|
23
|
-
JSON.parse(request.params.to_json)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
39
|
def context
|
|
27
40
|
request_body['context']
|
|
28
41
|
end
|
|
@@ -54,13 +67,17 @@ module DaVinciCRDTestKit
|
|
|
54
67
|
end
|
|
55
68
|
|
|
56
69
|
def coverage_information_required?
|
|
57
|
-
coverage_information_required_hooks.include?
|
|
70
|
+
coverage_information_required_hooks.include? requested_hook
|
|
58
71
|
end
|
|
59
72
|
|
|
60
73
|
def get_missing_response_types(hook_card_response)
|
|
61
|
-
|
|
74
|
+
expected_types = if coverage_information_required?
|
|
75
|
+
selected_response_types | ['coverage_information']
|
|
76
|
+
else
|
|
77
|
+
selected_response_types
|
|
78
|
+
end
|
|
62
79
|
|
|
63
|
-
|
|
80
|
+
expected_types
|
|
64
81
|
.select do |response_type|
|
|
65
82
|
response_type = response_type
|
|
66
83
|
.split('_')
|
|
@@ -72,8 +89,6 @@ module DaVinciCRDTestKit
|
|
|
72
89
|
end
|
|
73
90
|
|
|
74
91
|
def create_warning_messages(hook_card_response)
|
|
75
|
-
return if custom_response.present?
|
|
76
|
-
|
|
77
92
|
missing_response_types =
|
|
78
93
|
if hook_card_response.nil?
|
|
79
94
|
selected_response_types
|
|
@@ -88,7 +103,7 @@ module DaVinciCRDTestKit
|
|
|
88
103
|
Inferno::Repositories::Messages.new.create(
|
|
89
104
|
result_id: result.id,
|
|
90
105
|
type: 'warning',
|
|
91
|
-
message: %(Unable to return response type
|
|
106
|
+
message: %(Unable to return response type `#{missing_response_type}` for #{requested_hook} hook)
|
|
92
107
|
)
|
|
93
108
|
end
|
|
94
109
|
end
|
|
@@ -109,14 +124,20 @@ module DaVinciCRDTestKit
|
|
|
109
124
|
def update_specific_hook_card_info(card_response)
|
|
110
125
|
return if card_response.nil?
|
|
111
126
|
|
|
112
|
-
hook_display =
|
|
113
|
-
card_response['cards']
|
|
114
|
-
card
|
|
115
|
-
card['uuid'] = SecureRandom.uuid
|
|
127
|
+
hook_display = requested_hook.split('-').map(&:capitalize).join(' ')
|
|
128
|
+
card_response['cards']&.tap(&:compact!)&.each do |card|
|
|
129
|
+
update_one_card_info(card, hook_display)
|
|
116
130
|
end
|
|
131
|
+
card_response['systemActions']&.compact!
|
|
117
132
|
card_response
|
|
118
133
|
end
|
|
119
134
|
|
|
135
|
+
def update_one_card_info(card, hook_display)
|
|
136
|
+
card['summary'].prepend("#{hook_display} ")
|
|
137
|
+
card['uuid'] = SecureRandom.uuid
|
|
138
|
+
card['suggestions']&.each { |suggestion| suggestion['uuid'] = SecureRandom.uuid if suggestion['uuid'].present? }
|
|
139
|
+
end
|
|
140
|
+
|
|
120
141
|
def resource_to_update_field_name
|
|
121
142
|
{
|
|
122
143
|
'appointment-book' => 'appointments',
|
|
@@ -125,27 +146,14 @@ module DaVinciCRDTestKit
|
|
|
125
146
|
'order-dispatch' => 'order',
|
|
126
147
|
'order-select' => 'draftOrders',
|
|
127
148
|
'order-sign' => 'draftOrders'
|
|
128
|
-
}[
|
|
149
|
+
}[requested_hook]
|
|
129
150
|
end
|
|
130
151
|
|
|
131
152
|
def resource_type_to_update
|
|
132
153
|
{
|
|
133
154
|
'encounter-start' => 'Encounter',
|
|
134
155
|
'encounter-discharge' => 'Encounter'
|
|
135
|
-
}[
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def hook_response
|
|
139
|
-
hook_card_response =
|
|
140
|
-
if custom_response.present?
|
|
141
|
-
JSON.parse(custom_response)
|
|
142
|
-
else
|
|
143
|
-
cards_response = create_cards_and_system_actions
|
|
144
|
-
update_specific_hook_card_info(cards_response)
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
create_warning_messages(hook_card_response)
|
|
148
|
-
create_card_response(hook_card_response)
|
|
156
|
+
}[requested_hook]
|
|
149
157
|
end
|
|
150
158
|
|
|
151
159
|
def make_resource_request(uri, access_token)
|
|
@@ -159,10 +167,15 @@ module DaVinciCRDTestKit
|
|
|
159
167
|
resource.entry.first.resource
|
|
160
168
|
end
|
|
161
169
|
|
|
170
|
+
def patient_coverage
|
|
171
|
+
@patient_coverage ||= get_patient_coverage
|
|
172
|
+
end
|
|
173
|
+
|
|
162
174
|
def get_patient_coverage # rubocop:disable Naming/AccessorMethodName
|
|
163
|
-
|
|
164
|
-
if
|
|
165
|
-
FHIR.from_contents(
|
|
175
|
+
prefetched_coverage = extract_prefetched_coverage(request_body['prefetch'])
|
|
176
|
+
if prefetched_coverage.present?
|
|
177
|
+
coverage_or_bundle = FHIR.from_contents(prefetched_coverage.to_json)
|
|
178
|
+
coverage_or_bundle.is_a?(FHIR::Bundle) ? coverage_or_bundle.entry.first&.resource : coverage_or_bundle
|
|
166
179
|
else
|
|
167
180
|
fhir_server = request_body['fhirServer']
|
|
168
181
|
if fhir_server.present?
|
|
@@ -177,7 +190,17 @@ module DaVinciCRDTestKit
|
|
|
177
190
|
end
|
|
178
191
|
end
|
|
179
192
|
|
|
193
|
+
def extract_prefetched_coverage(prefetch)
|
|
194
|
+
return nil unless prefetch.present?
|
|
195
|
+
return prefetch['coverage'] if prefetch['coverage'].present?
|
|
196
|
+
return prefetch['cov'] if prefetch['cov'].present?
|
|
197
|
+
|
|
198
|
+
nil
|
|
199
|
+
end
|
|
200
|
+
|
|
180
201
|
def get_context_resource(update_resource_id)
|
|
202
|
+
return unless update_resource_id.present?
|
|
203
|
+
|
|
181
204
|
update_resource_id = "#{resource_type_to_update}/#{update_resource_id}" unless update_resource_id.include? '/'
|
|
182
205
|
fhir_server = request_body['fhirServer']
|
|
183
206
|
return if fhir_server.blank?
|
|
@@ -190,7 +213,7 @@ module DaVinciCRDTestKit
|
|
|
190
213
|
end
|
|
191
214
|
|
|
192
215
|
def add_coverage_cards?
|
|
193
|
-
|
|
216
|
+
['coverage_information', 'create_update_coverage_info'].any? { |x| selected_response_types.include?(x) } ||
|
|
194
217
|
coverage_information_required?
|
|
195
218
|
end
|
|
196
219
|
|
|
@@ -200,7 +223,6 @@ module DaVinciCRDTestKit
|
|
|
200
223
|
cards = []
|
|
201
224
|
|
|
202
225
|
add_basic_cards(cards)
|
|
203
|
-
|
|
204
226
|
add_order_hook_cards(cards)
|
|
205
227
|
|
|
206
228
|
system_actions = add_coverage_cards(cards)
|
|
@@ -210,7 +232,9 @@ module DaVinciCRDTestKit
|
|
|
210
232
|
cards_response = { 'cards' => cards }
|
|
211
233
|
cards_response['systemActions'] = system_actions if system_actions.present?
|
|
212
234
|
cards_response
|
|
213
|
-
rescue StandardError
|
|
235
|
+
rescue StandardError => e
|
|
236
|
+
Inferno::Application['logger'].error(e.full_message)
|
|
237
|
+
# TODO: - make sure this gets logged
|
|
214
238
|
nil
|
|
215
239
|
end
|
|
216
240
|
|
|
@@ -231,31 +255,26 @@ module DaVinciCRDTestKit
|
|
|
231
255
|
def add_coverage_cards(cards)
|
|
232
256
|
return unless add_coverage_cards?
|
|
233
257
|
|
|
234
|
-
|
|
235
|
-
if
|
|
258
|
+
system_actions = []
|
|
259
|
+
if patient_coverage.present?
|
|
236
260
|
if selected_response_types.include?('coverage_information') || coverage_information_required?
|
|
237
|
-
system_actions =
|
|
238
|
-
create_coverage_extension_system_actions(coverage.id)
|
|
261
|
+
system_actions = create_coverage_extension_system_actions(patient_coverage.id)
|
|
239
262
|
end
|
|
240
263
|
|
|
241
264
|
if selected_response_types.include?('create_update_coverage_info')
|
|
242
|
-
|
|
265
|
+
coverage_card = create_or_update_coverage(patient_coverage)
|
|
266
|
+
cards.append(coverage_card) if coverage_card.present?
|
|
243
267
|
end
|
|
244
268
|
end
|
|
245
269
|
system_actions
|
|
246
270
|
end
|
|
247
271
|
|
|
248
272
|
def create_coverage_extension_system_actions(coverage_id)
|
|
249
|
-
update_resource = context[resource_to_update_field_name]
|
|
250
|
-
prefetch_id = resource_to_update_field_name.split(/(?=[A-Z])/).first
|
|
251
|
-
|
|
252
273
|
fhir_resource =
|
|
253
|
-
if
|
|
254
|
-
|
|
255
|
-
elsif request_body['prefetch'] && request_body['prefetch'][prefetch_id]
|
|
256
|
-
FHIR.from_contents(request_body['prefetch'][prefetch_id].to_json)
|
|
274
|
+
if requested_hook == 'order-dispatch' && ig_version == 'v221'
|
|
275
|
+
find_prefetched_order_dispatch_orders
|
|
257
276
|
else
|
|
258
|
-
|
|
277
|
+
identify_resources_for_system_actions
|
|
259
278
|
end
|
|
260
279
|
|
|
261
280
|
create_system_actions(fhir_resource, coverage_id)
|
|
@@ -263,6 +282,65 @@ module DaVinciCRDTestKit
|
|
|
263
282
|
nil
|
|
264
283
|
end
|
|
265
284
|
|
|
285
|
+
def identify_resources_for_system_actions
|
|
286
|
+
update_resource = context[resource_to_update_field_name]
|
|
287
|
+
prefetch_id = prefetch_key_for_system_actions
|
|
288
|
+
|
|
289
|
+
if update_resource.is_a? Hash
|
|
290
|
+
FHIR.from_contents(update_resource.to_json)
|
|
291
|
+
elsif prefetch_id.present? && request_body['prefetch'] && request_body['prefetch'][prefetch_id]
|
|
292
|
+
FHIR.from_contents(request_body['prefetch'][prefetch_id].to_json)
|
|
293
|
+
elsif update_resource.present?
|
|
294
|
+
get_context_resource(update_resource)
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def prefetch_key_for_system_actions
|
|
299
|
+
if requested_hook.starts_with?('encounter')
|
|
300
|
+
'encounter'
|
|
301
|
+
elsif requested_hook == 'order-dispatch'
|
|
302
|
+
'order'
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def find_prefetched_order_dispatch_orders
|
|
307
|
+
orders_bundle = FHIR::Bundle.new
|
|
308
|
+
|
|
309
|
+
context['dispatchedOrders']&.each do |order_reference|
|
|
310
|
+
prefetched_entry = find_one_prefetched_order_dispatch_order(order_reference)
|
|
311
|
+
if prefetched_entry.present?
|
|
312
|
+
orders_bundle.entry << prefetched_entry
|
|
313
|
+
next
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
read_resource = get_context_resource(order_reference)
|
|
317
|
+
orders_bundle.entry << FHIR::Bundle::Entry.new({ resource: read_resource }) if read_resource.present?
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
orders_bundle if orders_bundle.entry.present?
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def find_one_prefetched_order_dispatch_order(order_reference)
|
|
324
|
+
resource_type, id = order_reference.split('/')
|
|
325
|
+
return unless request_body['prefetch'].present?
|
|
326
|
+
|
|
327
|
+
request_body['prefetch'].each_value do |prefetch_value|
|
|
328
|
+
entry = find_entry_in_prefetch_bundle(prefetch_value, resource_type, id)
|
|
329
|
+
return entry if entry.present?
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
nil
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def find_entry_in_prefetch_bundle(prefetch_value, resource_type, id)
|
|
336
|
+
return unless prefetch_value.is_a?(Hash)
|
|
337
|
+
|
|
338
|
+
bundle = FHIR.from_contents(prefetch_value.to_json)
|
|
339
|
+
return unless bundle.is_a?(FHIR::Bundle)
|
|
340
|
+
|
|
341
|
+
bundle.entry.find { |e| e.resource.present? && e.resource.resourceType == resource_type && e.resource.id == id }
|
|
342
|
+
end
|
|
343
|
+
|
|
266
344
|
def create_system_actions(resource, coverage_id)
|
|
267
345
|
return if resource.nil?
|
|
268
346
|
|
|
@@ -373,20 +451,40 @@ module DaVinciCRDTestKit
|
|
|
373
451
|
return if context.nil?
|
|
374
452
|
|
|
375
453
|
request_form_completion_card = load_json_file('request_form_completion.json')
|
|
454
|
+
form_completion_questionnaire_action = request_form_completion_card['suggestions'][0]['actions'].find do |action|
|
|
455
|
+
action['resource']['resourceType'] == 'Questionnaire'
|
|
456
|
+
end
|
|
457
|
+
target_fhir_server = request_body['fhirServer'].present? ? request_body['fhirServer'].chomp('/') : ''
|
|
458
|
+
form_completion_questionnaire_action['extension']['davinci-crd.if-none-exist']
|
|
459
|
+
.gsub!('<target_fhir_server>', target_fhir_server)
|
|
460
|
+
|
|
376
461
|
form_completion_task = request_form_completion_card['suggestions'][0]['actions'].find do |action|
|
|
377
462
|
action['resource']['resourceType'] == 'Task'
|
|
378
463
|
end['resource']
|
|
379
464
|
|
|
380
465
|
form_completion_task['for']['reference'] = "Patient/#{context['patientId']}"
|
|
381
466
|
form_completion_task['authoredOn'] = current_time.strftime('%Y-%m-%d')
|
|
467
|
+
form_completion_task['input'].delete_at(1) if ig_version == 'v221'
|
|
468
|
+
form_completion_task['id'] = SecureRandom.uuid
|
|
469
|
+
payer_reference = payer_reference_from_coverage
|
|
470
|
+
if payer_reference.present?
|
|
471
|
+
form_completion_task['requester']['reference'] = payer_reference
|
|
472
|
+
else
|
|
473
|
+
form_completion_task.delete('requester')
|
|
474
|
+
end
|
|
382
475
|
request_form_completion_card
|
|
383
476
|
end
|
|
384
477
|
|
|
478
|
+
def payer_reference_from_coverage
|
|
479
|
+
patient_coverage&.payor&.first&.reference
|
|
480
|
+
end
|
|
481
|
+
|
|
385
482
|
def update_service_request(service_request)
|
|
386
483
|
return if context.nil?
|
|
387
484
|
|
|
388
485
|
service_request['subject']['reference'] = "Patient/#{context['patientId']}"
|
|
389
|
-
service_request['requester']['reference'] =
|
|
486
|
+
service_request['requester']['reference'] =
|
|
487
|
+
requested_hook == 'order-dispatch' && ig_version == 'v221' ? context['performer'] : context['userId']
|
|
390
488
|
service_request['authoredOn'] = current_time.strftime('%Y-%m-%d')
|
|
391
489
|
end
|
|
392
490
|
|
|
@@ -404,13 +502,7 @@ module DaVinciCRDTestKit
|
|
|
404
502
|
|
|
405
503
|
propose_alternate_request_card = load_json_file('propose_alternate_request.json')
|
|
406
504
|
|
|
407
|
-
|
|
408
|
-
order_resource = get_context_resource(context['order'])
|
|
409
|
-
else
|
|
410
|
-
draft_orders = context['draftOrders']['entry']
|
|
411
|
-
draft_order_resource = draft_orders[0]['resource']
|
|
412
|
-
order_resource = FHIR.from_contents(draft_order_resource.to_json)
|
|
413
|
-
end
|
|
505
|
+
order_resource = identify_alternate_order_resource
|
|
414
506
|
return if order_resource.nil?
|
|
415
507
|
|
|
416
508
|
order_resource_type = order_resource.resourceType
|
|
@@ -421,7 +513,7 @@ module DaVinciCRDTestKit
|
|
|
421
513
|
{
|
|
422
514
|
'type' => 'delete',
|
|
423
515
|
'description' => 'Remove current order until health assessment has been done',
|
|
424
|
-
'resourceId' =>
|
|
516
|
+
'resourceId' => "#{order_resource_type}/#{order_resource_id}"
|
|
425
517
|
},
|
|
426
518
|
{
|
|
427
519
|
'type' => 'create',
|
|
@@ -431,5 +523,19 @@ module DaVinciCRDTestKit
|
|
|
431
523
|
)
|
|
432
524
|
propose_alternate_request_card
|
|
433
525
|
end
|
|
526
|
+
|
|
527
|
+
def identify_alternate_order_resource
|
|
528
|
+
if requested_hook == 'order-dispatch'
|
|
529
|
+
if ig_version == 'v221'
|
|
530
|
+
find_prefetched_order_dispatch_orders&.entry&.first&.resource
|
|
531
|
+
elsif context['order'].present?
|
|
532
|
+
get_context_resource(context['order'])
|
|
533
|
+
end
|
|
534
|
+
else
|
|
535
|
+
draft_orders = context['draftOrders']['entry']
|
|
536
|
+
draft_order_resource = draft_orders[0]['resource']
|
|
537
|
+
FHIR.from_contents(draft_order_resource.to_json)
|
|
538
|
+
end
|
|
539
|
+
end
|
|
434
540
|
end
|
|
435
541
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"summary": "Create/Update Coverage Information Card",
|
|
3
|
-
"detail": "This is a Create/Update Coverage Information Card which is sent when the CRD server is aware of additional coverage that is relevant to the current/proposed activity or has updates/corrections to make to the information held by the CRD
|
|
3
|
+
"detail": "This is a Create/Update Coverage Information Card which is sent when the CRD server is aware of additional coverage that is relevant to the current/proposed activity or has updates/corrections to make to the information held by the CRD client",
|
|
4
4
|
"indicator": "info",
|
|
5
5
|
"source": {
|
|
6
6
|
"label": "Inferno",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
"selectionBehavior": "any",
|
|
15
15
|
"suggestions": [
|
|
16
16
|
{
|
|
17
|
-
"label": "Create/Update coverage information"
|
|
17
|
+
"label": "Create/Update coverage information",
|
|
18
|
+
"uuid": "5abc166b-c50f-4df4-bdb2-2b0b62cb9e55"
|
|
18
19
|
}
|
|
19
20
|
]
|
|
20
21
|
}
|
|
@@ -11,6 +11,13 @@
|
|
|
11
11
|
"display": "Coverage Information"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
+
"suggestions": [
|
|
15
|
+
{
|
|
16
|
+
"label": "Inferno placeholder suggestion",
|
|
17
|
+
"uuid": "5abc166b-c50f-4df4-bdb1-2b0b62cb8e55"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"selectionBehavior": "any",
|
|
14
21
|
"links": [
|
|
15
22
|
{
|
|
16
23
|
"label": "Inferno",
|
|
@@ -18,4 +25,4 @@
|
|
|
18
25
|
"type": "smart"
|
|
19
26
|
}
|
|
20
27
|
]
|
|
21
|
-
}
|
|
28
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"suggestions": [
|
|
16
16
|
{
|
|
17
17
|
"label": "Add 'completion of the ABC form' to your task list (possibly for reassignment)",
|
|
18
|
+
"uuid": "5abc166b-c50f-4df4-bdc1-2b0b62cb9e55",
|
|
18
19
|
"actions": [
|
|
19
20
|
{
|
|
20
21
|
"type": "create",
|
|
@@ -22,9 +23,9 @@
|
|
|
22
23
|
"resource": {
|
|
23
24
|
"resourceType": "Questionnaire",
|
|
24
25
|
"id": "XYZ",
|
|
25
|
-
"url": "http://
|
|
26
|
+
"url": "http://inferno.healthit.gov/davinci-crd-test-kit/forms/XYZ",
|
|
26
27
|
"title": "Cancer Quality Forum Questionnaire XYZ",
|
|
27
|
-
"version": 2,
|
|
28
|
+
"version": "2",
|
|
28
29
|
"status": "active",
|
|
29
30
|
"subjectType": [
|
|
30
31
|
"Patient"
|
|
@@ -35,7 +36,7 @@
|
|
|
35
36
|
"linkId": "1",
|
|
36
37
|
"code": [
|
|
37
38
|
{
|
|
38
|
-
"system": "http://
|
|
39
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/sections",
|
|
39
40
|
"code": "COMORBIDITY"
|
|
40
41
|
}
|
|
41
42
|
],
|
|
@@ -45,7 +46,7 @@
|
|
|
45
46
|
"linkId": "1.1",
|
|
46
47
|
"code": [
|
|
47
48
|
{
|
|
48
|
-
"system": "http://
|
|
49
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
|
|
49
50
|
"code": "COMORB"
|
|
50
51
|
}
|
|
51
52
|
],
|
|
@@ -57,7 +58,7 @@
|
|
|
57
58
|
"linkId": "1.1.1",
|
|
58
59
|
"code": [
|
|
59
60
|
{
|
|
60
|
-
"system": "http://
|
|
61
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/sections",
|
|
61
62
|
"code": "CARDIAL"
|
|
62
63
|
}
|
|
63
64
|
],
|
|
@@ -77,7 +78,7 @@
|
|
|
77
78
|
"linkId": "1.1.1.1",
|
|
78
79
|
"code": [
|
|
79
80
|
{
|
|
80
|
-
"system": "http://
|
|
81
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
|
|
81
82
|
"code": "COMORBCAR"
|
|
82
83
|
}
|
|
83
84
|
],
|
|
@@ -89,7 +90,7 @@
|
|
|
89
90
|
"linkId": "1.1.1.1.1",
|
|
90
91
|
"code": [
|
|
91
92
|
{
|
|
92
|
-
"system": "http://
|
|
93
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
|
|
93
94
|
"code": "COMCAR00",
|
|
94
95
|
"display": "Angina Pectoris"
|
|
95
96
|
},
|
|
@@ -122,7 +123,7 @@
|
|
|
122
123
|
"linkId": "1.1.1.2",
|
|
123
124
|
"code": [
|
|
124
125
|
{
|
|
125
|
-
"system": "http://
|
|
126
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
|
|
126
127
|
"code": "COMORBVAS"
|
|
127
128
|
}
|
|
128
129
|
],
|
|
@@ -140,7 +141,7 @@
|
|
|
140
141
|
"linkId": "2",
|
|
141
142
|
"code": [
|
|
142
143
|
{
|
|
143
|
-
"system": "http://
|
|
144
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/sections",
|
|
144
145
|
"code": "HISTOPATHOLOGY"
|
|
145
146
|
}
|
|
146
147
|
],
|
|
@@ -150,7 +151,7 @@
|
|
|
150
151
|
"linkId": "2.1",
|
|
151
152
|
"code": [
|
|
152
153
|
{
|
|
153
|
-
"system": "http://
|
|
154
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/sections",
|
|
154
155
|
"code": "ABDOMINAL"
|
|
155
156
|
}
|
|
156
157
|
],
|
|
@@ -160,7 +161,7 @@
|
|
|
160
161
|
"linkId": "2.1.2",
|
|
161
162
|
"code": [
|
|
162
163
|
{
|
|
163
|
-
"system": "http://
|
|
164
|
+
"system": "http://inferno.healthit.gov/davinci-crd-test-kit/code/questions",
|
|
164
165
|
"code": "STADPT",
|
|
165
166
|
"display": "pT category"
|
|
166
167
|
}
|
|
@@ -174,7 +175,7 @@
|
|
|
174
175
|
]
|
|
175
176
|
},
|
|
176
177
|
"extension": {
|
|
177
|
-
"davinci-crd.if-none-exist": "url=http://
|
|
178
|
+
"davinci-crd.if-none-exist": "url=<target_fhir_server>/Questionnaire?url=http://inferno.healthit.gov/davinci-crd-test-kit/forms/XYZ&version=2"
|
|
178
179
|
}
|
|
179
180
|
},
|
|
180
181
|
{
|
|
@@ -194,11 +195,11 @@
|
|
|
194
195
|
},
|
|
195
196
|
"description": "Complete XYZ form for local retention",
|
|
196
197
|
"for": {
|
|
197
|
-
"reference": "
|
|
198
|
+
"reference": "Patient/<patient-id>"
|
|
198
199
|
},
|
|
199
200
|
"authoredOn": "2018-08-09",
|
|
200
201
|
"requester": {
|
|
201
|
-
"reference": "
|
|
202
|
+
"reference": "Organization/<payer-id>"
|
|
202
203
|
},
|
|
203
204
|
"input": [
|
|
204
205
|
{
|
|
@@ -211,7 +212,7 @@
|
|
|
211
212
|
}
|
|
212
213
|
]
|
|
213
214
|
},
|
|
214
|
-
"valueCanonical": "http://
|
|
215
|
+
"valueCanonical": "http://inferno.healthit.gov/davinci-crd-test-kit/forms/XYZ"
|
|
215
216
|
},
|
|
216
217
|
{
|
|
217
218
|
"type": {
|
|
@@ -239,4 +240,4 @@
|
|
|
239
240
|
]
|
|
240
241
|
}
|
|
241
242
|
]
|
|
242
|
-
}
|
|
243
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module DaVinciCRDTestKit
|
|
2
|
+
module MultiRequestMessageHelper
|
|
3
|
+
def request_prefix(request_index)
|
|
4
|
+
"(Request #{request_index + 1}) "
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def add_request_message(type, message, request_index)
|
|
8
|
+
add_message(type, "#{request_prefix(request_index)}#{message}")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def parse_json_request_entity(body, entity, request_index)
|
|
12
|
+
JSON.parse(body)
|
|
13
|
+
rescue JSON::ParserError
|
|
14
|
+
add_request_message('error', "#{entity} contains invalid JSON.", request_index)
|
|
15
|
+
nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def requests_with_errors_prefix
|
|
19
|
+
request_numbers = error_request_numbers
|
|
20
|
+
return '' if request_numbers.empty?
|
|
21
|
+
|
|
22
|
+
noun = request_numbers.size == 1 ? 'Request' : 'Requests'
|
|
23
|
+
"#{noun} #{request_numbers.to_sentence}: "
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def error_request_numbers
|
|
29
|
+
messages
|
|
30
|
+
.select { |m| m[:type] == 'error' }
|
|
31
|
+
.filter_map { |m| m[:message].match(/\A\(Request (\d+)\)/)&.captures&.first&.to_i }
|
|
32
|
+
.sort.uniq
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module DaVinciCRDTestKit
|
|
2
|
+
module TaggedRequestLoadHelper
|
|
3
|
+
ALL_HOOKS = [
|
|
4
|
+
APPOINTMENT_BOOK_TAG,
|
|
5
|
+
ENCOUNTER_START_TAG,
|
|
6
|
+
ENCOUNTER_DISCHARGE_TAG,
|
|
7
|
+
ORDER_DISPATCH_TAG,
|
|
8
|
+
ORDER_SELECT_TAG,
|
|
9
|
+
ORDER_SIGN_TAG
|
|
10
|
+
].freeze
|
|
11
|
+
|
|
12
|
+
def hook_name
|
|
13
|
+
config.options[:hook_name]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def crd_test_group
|
|
17
|
+
config.options[:crd_test_group]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def tags_to_load(hook = hook_name)
|
|
21
|
+
crd_test_group.present? ? [crd_test_group] : [hook]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def load_hook_requests
|
|
25
|
+
load_tagged_requests(*tags_to_load)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def requests_to_analyze
|
|
29
|
+
if hook_name.present?
|
|
30
|
+
load_tagged_requests(*tags_to_load)
|
|
31
|
+
else
|
|
32
|
+
ALL_HOOKS.each_with_object([]) do |hook, request_list|
|
|
33
|
+
request_list.concat(load_tagged_requests(*tags_to_load(hook)))
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|