davinci_dtr_test_kit 0.17.1 → 0.18.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/v220_full_ehr_suite_run_against_payer_suite.json.erb +19 -0
- data/config/presets/v220_payer_suite_run_against_full_ehr_suite.json.erb +76 -0
- data/lib/davinci_dtr_test_kit/cross_suite/fhirpath_utils.rb +52 -0
- data/lib/davinci_dtr_test_kit/cross_suite/generated/v2.2.0/dtr_base_questionnaire/metadata.yml +212 -0
- data/lib/davinci_dtr_test_kit/cross_suite/generated/v2.2.0/dtr_q_package_bundle/metadata.yml +39 -0
- data/lib/davinci_dtr_test_kit/cross_suite/generated/v2.2.0/dtr_qpackage_output_parameters/metadata.yml +30 -0
- data/lib/davinci_dtr_test_kit/cross_suite/generated/v2.2.0/dtr_questionnaire_adapt/metadata.yml +17 -0
- data/lib/davinci_dtr_test_kit/cross_suite/generated/v2.2.0/dtr_questionnaire_adapt_search/metadata.yml +91 -0
- data/lib/davinci_dtr_test_kit/cross_suite/generated/v2.2.0/dtr_std_questionnaire/metadata.yml +17 -0
- data/lib/davinci_dtr_test_kit/cross_suite/generated/v2.2.0/metadata.yml +403 -0
- data/lib/davinci_dtr_test_kit/cross_suite/generated_profile_metadata.rb +22 -0
- data/lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb +85 -0
- data/lib/davinci_dtr_test_kit/cross_suite/v2.2.0/dtr_conformance_verification.rb +21 -0
- data/lib/davinci_dtr_test_kit/cross_suite/v2.2.0/multi_request_message_helper.rb +35 -0
- data/lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb +162 -0
- data/lib/davinci_dtr_test_kit/{dtr_client_options.rb → full_ehr/dtr_full_ehr_options.rb} +1 -1
- data/lib/davinci_dtr_test_kit/{endpoints → full_ehr/endpoints}/mock_payer.rb +9 -3
- data/lib/davinci_dtr_test_kit/{endpoints → full_ehr/endpoints}/mock_udap_smart_server/token_endpoint.rb +2 -2
- data/lib/davinci_dtr_test_kit/full_ehr/fixture_loader.rb +37 -0
- data/lib/davinci_dtr_test_kit/full_ehr/fixtures/dinner_adaptive/dinner_order_adaptive_next_question_template.json +243 -0
- data/lib/davinci_dtr_test_kit/full_ehr/fixtures/dinner_adaptive/parameters_questionnaire_dinner_order_adaptive.json +104 -0
- data/lib/davinci_dtr_test_kit/full_ehr/fixtures/dinner_static/parameters_questionnaire_dinner_order_static.json +291 -0
- data/lib/davinci_dtr_test_kit/full_ehr/fixtures/empty_templates/next_question_template_empty.json +1 -0
- data/lib/davinci_dtr_test_kit/full_ehr/fixtures/empty_templates/parameters_questionnaire_package_empty.json +9 -0
- data/lib/davinci_dtr_test_kit/full_ehr/short_circuit_interaction_verification.rb +73 -0
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/custom → full_ehr/v2.0.1/adaptive_custom}/dtr_full_ehr_custom_adaptive_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/dinner_order → full_ehr/v2.0.1/adaptive_dinner}/dtr_adaptive_next_question_retrieval_group.rb +3 -3
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/dinner_order → full_ehr/v2.0.1/adaptive_dinner}/dtr_full_ehr_adaptive_initial_retrieval_group.rb +5 -5
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire → full_ehr/v2.0.1/adaptive_interaction}/dtr_adaptive_next_question_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire → full_ehr/v2.0.1/adaptive_interaction}/dtr_adaptive_next_question_request_validation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire → full_ehr/v2.0.1/adaptive_interaction}/dtr_adaptive_response_validation_test.rb +2 -2
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/dinner_order → full_ehr/v2.0.1}/dtr_full_ehr_adaptive_dinner_workflow_group.rb +7 -7
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/custom → full_ehr/v2.0.1}/dtr_full_ehr_custom_adaptive_workflow_group.rb +14 -14
- data/lib/davinci_dtr_test_kit/{client_groups/custom_static → full_ehr/v2.0.1}/dtr_full_ehr_custom_static_workflow_group.rb +11 -11
- data/lib/davinci_dtr_test_kit/{client_groups/must_support → full_ehr/v2.0.1}/dtr_full_ehr_questionnaire_must_support_group.rb +6 -6
- data/lib/davinci_dtr_test_kit/{client_groups/dinner_static → full_ehr/v2.0.1}/dtr_full_ehr_static_dinner_workflow_group.rb +7 -7
- data/lib/davinci_dtr_test_kit/{dtr_full_ehr_suite.rb → full_ehr/v2.0.1/dtr_full_ehr_suite.rb} +19 -20
- data/lib/davinci_dtr_test_kit/{client_groups/payer_registration/dtr_client_registration_group.rb → full_ehr/v2.0.1/dtr_payer_registration_group.rb} +8 -8
- data/lib/davinci_dtr_test_kit/{endpoints/mock_payer/next_question_endpoint.rb → full_ehr/v2.0.1/full_ehr_next_question_endpoint.rb} +18 -7
- data/lib/davinci_dtr_test_kit/{endpoints/mock_payer/questionnaire_package_endpoint.rb → full_ehr/v2.0.1/full_ehr_questionnaire_package_endpoint.rb} +22 -7
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/must_support/dtr_full_ehr_ms_questionnaire_package_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/must_support/dtr_must_support_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/must_support/dtr_questionnaire_must_support_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/payer_registration/configuration_display_smart_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/payer_registration/configuration_display_udap_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_custom_questionnaire_expressions_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_custom_questionnaire_extensions_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_custom_questionnaire_libraries_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_custom_questionnaire_package_validation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_adaptive_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_launch_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_prepopulation_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_prepopulation_override_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_questionnaire_package_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_questionnaire_response_conformance_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_questionnaire_response_correctness_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_store_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_prepopulation_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_prepopulation_override_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_questionnaire_package_request_validation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_questionnaire_response_basic_conformance_test.rb +2 -2
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_questionnaire_response_prepopulation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_rendering_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/dinner_static → full_ehr/v2.0.1/static_dinner}/dtr_static_dinner_enabled_questions_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/dtr_full_ehr_abstract_adaptive_group.rb +87 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/dtr_full_ehr_abstract_standard_group.rb +59 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/dtr_full_ehr_suite.rb +145 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/dtr_full_ehr_suite_description_v220.md +254 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/full_ehr_next_question_endpoint.rb +391 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/full_ehr_questionnaire_package_endpoint.rb +206 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/interaction/adaptive_questionnaires_completed_test.rb +108 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/interaction/interaction_wait_test.rb +177 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/interaction/ui_display_and_interaction_attestation_test.rb +132 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/must_support/dtr_additional_questionnaires_interaction_group.rb +74 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/must_support/dtr_questionnaire_adaptive_must_support_test.rb +45 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/must_support/dtr_questionnaire_base_must_support_test.rb +43 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/must_support/dtr_questionnaire_standard_must_support_test.rb +45 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/next_question_template_questionnaires.rb +21 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/request/dtr_next_question_request_validation_test.rb +85 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/request/dtr_questionnaire_package_request_validation_test.rb +89 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/response/dtr_next_question_response_validation_test.rb +85 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/response/dtr_questionnaire_package_response_validation_test.rb +77 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/workflows/dtr_full_ehr_workflow_adaptive_group.rb +24 -0
- data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/workflows/dtr_full_ehr_workflow_standard_group.rb +21 -0
- data/lib/davinci_dtr_test_kit/generator/ig_metadata.rb +21 -0
- data/lib/davinci_dtr_test_kit/generator/profile_metadata_extractor.rb +57 -0
- data/lib/davinci_dtr_test_kit/generator.rb +117 -0
- data/lib/davinci_dtr_test_kit/igs/davinci_dtr_2.2.0.tgz +0 -0
- data/lib/davinci_dtr_test_kit/{dtr_options.rb → light_ehr/dtr_light_ehr_options.rb} +1 -1
- data/lib/davinci_dtr_test_kit/{dtr_light_ehr_suite.rb → light_ehr/v2.0.1/dtr_light_ehr_suite.rb} +8 -9
- data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1}/dtr_light_ehr_supported_endpoints_group.rb +5 -5
- data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1}/dtr_smart_ehr_launch.rb +3 -3
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request/communication_request_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage/coverage_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request/device_request_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter/encounter_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request/medication_request_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order/nutrition_order_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_create.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_update.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request/service_request_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_create.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_update.rb +1 -1
- data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription/vision_prescription_read.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1/supported_endpoints}/dtr_light_ehr_supported_payers_accept_header_test.rb +2 -2
- data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1/supported_endpoints}/dtr_light_ehr_supported_payers_config_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1/supported_endpoints}/dtr_light_ehr_supported_payers_endpoint_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1/supported_endpoints}/dtr_light_ehr_supported_payers_use_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1/supported_endpoints}/dtr_light_ehr_supported_payers_user_response_test.rb +2 -2
- data/lib/davinci_dtr_test_kit/metadata.rb +13 -68
- data/lib/davinci_dtr_test_kit/requirements/davinci_dtr_test_kit_requirements.csv +216 -0
- data/lib/davinci_dtr_test_kit/requirements/generated/dtr_full_ehr_requirements_coverage.csv +1 -1
- data/lib/davinci_dtr_test_kit/requirements/generated/dtr_full_ehr_v220_requirements_coverage.csv +1 -0
- data/lib/davinci_dtr_test_kit/requirements/generated/dtr_light_ehr_requirements_coverage.csv +1 -1
- data/lib/davinci_dtr_test_kit/requirements/generated/dtr_payer_server_requirements_coverage.csv +1 -1
- data/lib/davinci_dtr_test_kit/requirements/generated/dtr_payer_server_v220_requirements_coverage.csv +114 -0
- data/lib/davinci_dtr_test_kit/requirements/generated/dtr_smart_app_requirements_coverage.csv +1 -1
- data/lib/davinci_dtr_test_kit/requirements/hl7.fhir.us.davinci-dtr_2.2.0_requirements.xlsx +0 -0
- data/lib/davinci_dtr_test_kit/{endpoints/mock_payer → server/endpoints}/next_question_proxy_endpoint.rb +2 -0
- data/lib/davinci_dtr_test_kit/{endpoints/mock_payer → server/endpoints}/questionnaire_package_proxy_endpoint.rb +2 -0
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_form_libraries_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_form_questionnaire_expressions_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_form_questionnaire_extensions_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_next_questionnaire_expressions_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_next_questionnaire_extensions_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_request_validation_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_response_bundles_validation_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_response_search_validation_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_response_validation_test.rb +3 -2
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_next_request_validation_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_next_response_validation_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{dtr_payer_server_suite.rb → server/v2.0.1/dtr_payer_server_suite.rb} +9 -10
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1}/payer_server_adaptive_group.rb +13 -13
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1}/payer_server_static_group.rb +6 -6
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_libraries_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_questionnaire_expressions_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_questionnaire_extensions_test.rb +2 -1
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_request_test.rb +3 -2
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_request_validation_test.rb +3 -2
- data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_response_validation_test.rb +4 -3
- data/lib/davinci_dtr_test_kit/server/v2.2.0/client_simulation.rb +297 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/dtr_payer_server_capability_statement_test.rb +73 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/dtr_payer_server_suite.rb +322 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/dtr_payer_server_suite_description_v220.md +37 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/interaction_test.rb +97 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/log_questionnaire_errors_support_test.rb +57 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_adaptive_must_support_test.rb +47 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_adaptive_search_must_support_test.rb +40 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_base_must_support_test.rb +40 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_package_bundle_must_support_test.rb +38 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_package_output_parameters_must_support_test.rb +37 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_standard_must_support_test.rb +39 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_request_validation_test.rb +45 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/adaptive_questionnaire_endpoint_test.rb +98 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/invalid_questionnaire_response_test.rb +43 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/next_contained_questionnaire_response_references_test.rb +46 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/next_question_response_references_test.rb +56 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/next_question_response_validation_test.rb +67 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/contained_binary_test.rb +58 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/contained_binary_validation.rb +128 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/cql_library_validation_test.rb +58 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_design_support.rb +65 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_expression_elm_test.rb +81 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_expression_language_test.rb +63 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_prepopulation_test.rb +42 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_relevance_logic_test.rb +40 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_operation_validation.rb +440 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_request_validation_test.rb +42 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/adaptive_questionnaire_response_contained_questionnaire_test.rb +127 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/adaptive_questionnaire_response_validation_test.rb +61 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/contained_questionnaire_response_references_test.rb +42 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/dtr_server_no_custom_extension_test.rb +184 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/dtr_server_questionnaire_not_found_test.rb +76 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/dtr_server_questionnaire_package_contents_test.rb +89 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/initial_questionnaire_response_test.rb +132 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_package_input_type_test.rb +110 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_references_version_specific_test.rb +79 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_response_questionnaire_canonical_test.rb +89 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_response_references_test.rb +51 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_response_validation_test.rb +63 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/source_data_error_test.rb +43 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/value_set_validation_test.rb +90 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_response_reference_validation.rb +133 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/value_set_expand_support/small_value_set_expansion_test.rb +120 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/value_set_expand_support/value_set_expansion_test.rb +51 -0
- data/lib/davinci_dtr_test_kit/server/v2.2.0/value_set_expand_support/value_set_expansion_validation.rb +58 -0
- data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_authorization/token_endpoint.rb +1 -1
- data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_ehr/fhir_get_endpoint.rb +1 -1
- data/lib/davinci_dtr_test_kit/smart_app/endpoints/mock_payer/smart_app_next_question_endpoint.rb +12 -0
- data/lib/davinci_dtr_test_kit/smart_app/endpoints/mock_payer/smart_app_questionnaire_package_endpoint.rb +12 -0
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/custom → smart_app/v2.0.1/adaptive_custom}/dtr_smart_app_custom_adaptive_workflow_group.rb +12 -12
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/dinner_order → smart_app/v2.0.1/adaptive_dinner}/dtr_smart_app_adaptive_dinner_workflow_group.rb +5 -5
- data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/dinner_order → smart_app/v2.0.1/adaptive_dinner}/dtr_smart_app_adaptive_initial_retrieval_group.rb +4 -4
- data/lib/davinci_dtr_test_kit/{auth_groups → smart_app/v2.0.1/auth}/token_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/custom_static → smart_app/v2.0.1}/dtr_smart_app_custom_static_workflow_group.rb +11 -11
- data/lib/davinci_dtr_test_kit/{client_groups/must_support → smart_app/v2.0.1}/dtr_smart_app_questionnaire_must_support_group.rb +6 -6
- data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1}/dtr_smart_app_respiratory_workflow_group.rb +3 -3
- data/lib/davinci_dtr_test_kit/{client_groups/dinner_static → smart_app/v2.0.1}/dtr_smart_app_static_dinner_workflow_group.rb +7 -7
- data/lib/davinci_dtr_test_kit/{dtr_smart_app_suite.rb → smart_app/v2.0.1/dtr_smart_app_suite.rb} +21 -21
- data/lib/davinci_dtr_test_kit/{client_groups → smart_app/v2.0.1}/must_support/dtr_smart_app_ms_questionnaire_package_request_test.rb +2 -2
- data/lib/davinci_dtr_test_kit/{auth_groups → smart_app/v2.0.1}/oauth2_authentication_group.rb +2 -2
- data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_questionnaire_package_group.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_questionnaire_package_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_questionnaire_response_group.rb +2 -2
- data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_questionnaire_response_save_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_rendering_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/smart_app → smart_app/v2.0.1/tests}/dtr_smart_app_adaptive_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/smart_app → smart_app/v2.0.1/tests}/dtr_smart_app_prepopulation_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/smart_app → smart_app/v2.0.1/tests}/dtr_smart_app_prepopulation_override_attestation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/smart_app → smart_app/v2.0.1/tests}/dtr_smart_app_questionnaire_package_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/smart_app → smart_app/v2.0.1/tests}/dtr_smart_app_questionnaire_response_correctness_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/smart_app → smart_app/v2.0.1/tests}/dtr_smart_app_questionnaire_response_save_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/{client_groups/smart_app → smart_app/v2.0.1/tests}/dtr_smart_app_saving_questionnaire_response_group.rb +1 -1
- data/lib/davinci_dtr_test_kit/tags.rb +2 -0
- data/lib/davinci_dtr_test_kit/version.rb +2 -2
- data/lib/davinci_dtr_test_kit.rb +6 -4
- metadata +299 -209
- data/lib/davinci_dtr_test_kit/certs/InfernoCA.key +0 -52
- data/lib/davinci_dtr_test_kit/certs/InfernoCA.pem +0 -35
- data/lib/davinci_dtr_test_kit/certs/TestKit.pem +0 -32
- data/lib/davinci_dtr_test_kit/certs/TestKitPrivateKey.key +0 -28
- data/lib/davinci_dtr_test_kit/endpoints/mock_payer/full_ehr_next_question_endpoint.rb +0 -30
- data/lib/davinci_dtr_test_kit/endpoints/mock_payer/full_ehr_questionnaire_package_endpoint.rb +0 -31
- data/lib/davinci_dtr_test_kit/fixture_loader.rb +0 -21
- /data/lib/davinci_dtr_test_kit/{endpoints → cross_suite}/cors.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{cql_test.rb → cross_suite/v2.0.1/cql_test.rb} +0 -0
- /data/lib/davinci_dtr_test_kit/{dtr_questionnaire_response_validation.rb → cross_suite/v2.0.1/dtr_questionnaire_response_validation.rb} +0 -0
- /data/lib/davinci_dtr_test_kit/{descriptions.rb → full_ehr/descriptions.rb} +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_adaptive/dinner_order_adaptive_next_question_burrito.json +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_adaptive/dinner_order_adaptive_next_question_hamburger.json +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_adaptive/dinner_order_adaptive_next_question_initial.json +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_adaptive/questionnaire_dinner_order_adaptive.json +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_static/questionnaire_dinner_order_static.json +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_static/questionnaire_response_dinner_order_static.json +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/respiratory_assist_device/pre_populated_questionnaire_response.json +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/respiratory_assist_device/questionnaire_package.json +0 -0
- /data/lib/davinci_dtr_test_kit/{fixtures.rb → full_ehr/fixtures.rb} +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/custom → full_ehr/v2.0.1/adaptive_custom}/dtr_custom_next_question_response_validation_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/dinner_order → full_ehr/v2.0.1/adaptive_dinner}/dtr_adaptive_completion_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/dinner_order → full_ehr/v2.0.1/adaptive_dinner}/dtr_adaptive_followup_questions_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/auth → full_ehr/v2.0.1}/dtr_client_payer_auth_smart_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/auth → full_ehr/v2.0.1}/dtr_client_payer_auth_udap_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{docs → full_ehr/v2.0.1}/dtr_full_ehr_suite_description_v201.md +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/must_support/questionnaire_must_support_elements.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/full_ehr → full_ehr/v2.0.1/shared}/dtr_full_ehr_saving_questionnaire_response_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{create_test.rb → light_ehr/create_test.rb} +0 -0
- /data/lib/davinci_dtr_test_kit/{endpoints/mock_payer → light_ehr/endpoints}/light_ehr_supported_payer_endpoint.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{read_test.rb → light_ehr/read_test.rb} +0 -0
- /data/lib/davinci_dtr_test_kit/{update_test.rb → light_ehr/update_test.rb} +0 -0
- /data/lib/davinci_dtr_test_kit/{docs → light_ehr/v2.0.1}/dtr_light_ehr_suite_description_v201.md +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request/communication_request_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request/communication_request_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage/coverage_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage/coverage_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request/device_request_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request/device_request_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter/encounter_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter/encounter_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request/medication_request_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request/medication_request_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order/nutrition_order_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order/nutrition_order_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_context_search.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_patient_search.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_read.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request/service_request_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request/service_request_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription/metadata.yml +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription/vision_prescription_must_support_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription/vision_prescription_validation.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription_group.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1/smart_ehr_launch}/fhir_context_coverage_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1/smart_ehr_launch}/fhir_context_references_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1/smart_ehr_launch}/fhir_launch_context_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{endpoints/mock_authorization → server/endpoints}/simple_token_endpoint.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_next_response_complete_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{docs → server/v2.0.1}/dtr_payer_server_suite_description_v201.md +0 -0
- /data/lib/davinci_dtr_test_kit/{validation_test.rb → server/validation_test.rb} +0 -0
- /data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_authorization/authorize_endpoint.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_authorization.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_ehr/questionnaire_response_endpoint.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_ehr.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/custom → smart_app/v2.0.1/adaptive_custom}/dtr_smart_app_custom_adaptive_request_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{auth_groups → smart_app/v2.0.1/auth}/token_validation_test.rb +0 -0
- /data/lib/davinci_dtr_test_kit/{docs → smart_app/v2.0.1}/dtr_smart_app_suite_description_v201.md +0 -0
- /data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_rendering_group.rb +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
require_relative '../../../tags'
|
|
2
|
+
|
|
3
|
+
module DaVinciDTRTestKit
|
|
4
|
+
module DTRPayerServerV220
|
|
5
|
+
class QuestionnairePackageInputTypeTest < Inferno::Test
|
|
6
|
+
id :dtr_v220_payer_questionnaire_package_input_type
|
|
7
|
+
|
|
8
|
+
title 'Verify that all $questionnaire-package input types have been provided'
|
|
9
|
+
description <<~DESCRIPTION
|
|
10
|
+
This test verifies that the user has supplied inputs which contain each
|
|
11
|
+
of the available input types for the $questionnaire-package operation:
|
|
12
|
+
* canonicals specifying the URL and, (optionally) the version of the
|
|
13
|
+
Questionnaire(s) to retrieve
|
|
14
|
+
* A CRD/PAS context ID
|
|
15
|
+
* One or more Request or Encounter resources
|
|
16
|
+
|
|
17
|
+
Each input type must be provided in a set of paramaters without the
|
|
18
|
+
others in order to verify the server's support for each input type.
|
|
19
|
+
DESCRIPTION
|
|
20
|
+
|
|
21
|
+
simulation_verification
|
|
22
|
+
|
|
23
|
+
run do
|
|
24
|
+
load_tagged_requests(QUESTIONNAIRE_TAG)
|
|
25
|
+
|
|
26
|
+
parameters_list =
|
|
27
|
+
requests.map do |request|
|
|
28
|
+
JSON.parse(request.request_body)
|
|
29
|
+
|
|
30
|
+
FHIR.from_contents(request.request_body)
|
|
31
|
+
rescue JSON::ParserError
|
|
32
|
+
nil
|
|
33
|
+
end.compact
|
|
34
|
+
|
|
35
|
+
skip_if parameters_list.blank?, 'No valid request bodies were provided.'
|
|
36
|
+
|
|
37
|
+
assert parameters_list.all?(FHIR::Parameters),
|
|
38
|
+
'Not all provided request bodies were Parameters resources.'
|
|
39
|
+
|
|
40
|
+
unless canonical_input_provided?(parameters_list)
|
|
41
|
+
add_message(
|
|
42
|
+
'error',
|
|
43
|
+
'No $questionnaire-package request body with a Questionnaire canonical was provided.'
|
|
44
|
+
)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
unless context_id_input_provided?(parameters_list)
|
|
48
|
+
add_message(
|
|
49
|
+
'error',
|
|
50
|
+
'No $questionnaire-package request body with a CRD/DTR context id was provided.'
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
unless request_or_encounter_input_provided?(parameters_list)
|
|
55
|
+
add_message(
|
|
56
|
+
'error',
|
|
57
|
+
'No $questionnaire-package request body with an order resource was provided.'
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
assert_no_error_messages('Not all required $questionnaire-package input types were provided.')
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def canonical_input_provided?(parameters_list)
|
|
65
|
+
parameters_list.any? do |parameters|
|
|
66
|
+
parameters_include_canonical?(parameters) &&
|
|
67
|
+
!parameters_include_context_id?(parameters) &&
|
|
68
|
+
!parameters_include_request_or_encounter?(parameters)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def context_id_input_provided?(parameters_list)
|
|
73
|
+
parameters_list.any? do |parameters|
|
|
74
|
+
parameters_include_context_id?(parameters) &&
|
|
75
|
+
!parameters_include_canonical?(parameters) &&
|
|
76
|
+
!parameters_include_request_or_encounter?(parameters)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def request_or_encounter_input_provided?(parameters_list)
|
|
81
|
+
parameters_list.any? do |parameters|
|
|
82
|
+
parameters_include_request_or_encounter?(parameters) &&
|
|
83
|
+
!parameters_include_canonical?(parameters) &&
|
|
84
|
+
!parameters_include_context_id?(parameters)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def parameters_include_canonical?(parameters)
|
|
89
|
+
parameters
|
|
90
|
+
.parameter
|
|
91
|
+
.select { |parameter| parameter.name == 'questionnaire' }
|
|
92
|
+
.any? { |parameter| parameter.valueCanonical.present? }
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def parameters_include_context_id?(parameters)
|
|
96
|
+
parameters
|
|
97
|
+
.parameter
|
|
98
|
+
.select { |parameter| parameter.name == 'context' }
|
|
99
|
+
.any? { |parameter| parameter.valueString.present? }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def parameters_include_request_or_encounter?(parameters)
|
|
103
|
+
parameters
|
|
104
|
+
.parameter
|
|
105
|
+
.select { |parameter| parameter.name == 'order' }
|
|
106
|
+
.any? { |parameter| parameter.resource.present? }
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require_relative '../questionnaire_response_reference_validation'
|
|
2
|
+
require_relative '../../../cross_suite/v2.2.0/multi_request_message_helper'
|
|
3
|
+
require_relative '../../../tags'
|
|
4
|
+
require_relative '../questionnaire_operation_validation'
|
|
5
|
+
|
|
6
|
+
module DaVinciDTRTestKit
|
|
7
|
+
module DTRPayerServerV220
|
|
8
|
+
class QuestionnaireReferencesVersionTest < Inferno::Test
|
|
9
|
+
include QuestionnaireResponseReferenceValidation
|
|
10
|
+
include MultiRequestMessageHelper
|
|
11
|
+
include QuestionnaireOperationValidation
|
|
12
|
+
|
|
13
|
+
id :dtr_v220_payer_questionnaire_references_version_specific
|
|
14
|
+
title 'Validate version-specific references'
|
|
15
|
+
description %(
|
|
16
|
+
This test validates that references to Questionnaires, Libraries, and ValueSets within a Bundle
|
|
17
|
+
is version specific.
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@oper-16'
|
|
21
|
+
|
|
22
|
+
TARGET_REFERENCE = ['Questionnaire', 'Library', 'ValueSet'].freeze
|
|
23
|
+
|
|
24
|
+
run do
|
|
25
|
+
load_tagged_requests(QUESTIONNAIRE_TAG)
|
|
26
|
+
|
|
27
|
+
skip_if requests.blank?, 'No $questionnaire-package requests were made'
|
|
28
|
+
|
|
29
|
+
successful_requests = requests.each_with_index.filter_map do |request, request_index|
|
|
30
|
+
[request, request_index] if [200, 201].include?(request.status)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
skip_if successful_requests.blank?, 'No successful $questionnaire-package requests were made'
|
|
34
|
+
|
|
35
|
+
successful_requests.each do |request, request_index|
|
|
36
|
+
begin
|
|
37
|
+
JSON.parse(request.response_body)
|
|
38
|
+
rescue JSON::ParserError
|
|
39
|
+
next
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
resource = FHIR.from_contents(request.response_body)
|
|
43
|
+
next if resource.nil?
|
|
44
|
+
|
|
45
|
+
extract_questionnaire_bundles(resource).each_with_index do |bundle, bundle_index|
|
|
46
|
+
bundle.each_element do |element, _meta, _path|
|
|
47
|
+
next unless element.is_a?(FHIR::Reference)
|
|
48
|
+
|
|
49
|
+
reference = element.reference
|
|
50
|
+
next if reference.blank?
|
|
51
|
+
|
|
52
|
+
resource_type = element.resource_type
|
|
53
|
+
next unless TARGET_REFERENCE.include?(resource_type)
|
|
54
|
+
|
|
55
|
+
next if check_version_reference?(reference)
|
|
56
|
+
|
|
57
|
+
add_request_message(
|
|
58
|
+
'error',
|
|
59
|
+
"Bundle #{bundle_index}: Unversioned #{resource_type} reference: `#{reference}`",
|
|
60
|
+
request_index
|
|
61
|
+
)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
message = "#{requests_with_errors_prefix}References to Questionnaires, Libraries, and ValueSets " \
|
|
67
|
+
'within questionnaire package Bundles must be version-specific. '
|
|
68
|
+
|
|
69
|
+
assert_no_error_messages("#{message}See Messages for details.")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def check_version_reference?(reference)
|
|
73
|
+
_url, separator, version = reference.to_s.partition('|')
|
|
74
|
+
|
|
75
|
+
separator.present? && version.present?
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../../cross_suite/v2.2.0/multi_request_message_helper'
|
|
4
|
+
require_relative '../../../tags'
|
|
5
|
+
require_relative '../questionnaire_operation_validation'
|
|
6
|
+
|
|
7
|
+
module DaVinciDTRTestKit
|
|
8
|
+
module DTRPayerServerV220
|
|
9
|
+
class QuestionnaireResponseQuestionnaireCanonicalTest < Inferno::Test
|
|
10
|
+
include MultiRequestMessageHelper
|
|
11
|
+
include QuestionnaireOperationValidation
|
|
12
|
+
|
|
13
|
+
ADAPTIVE_QUESTIONNAIRE_EXTENSION_URL = 'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-questionnaireAdaptive'
|
|
14
|
+
|
|
15
|
+
id :dtr_v220_payer_questionnaire_response_questionnaire_canonical
|
|
16
|
+
title 'Standard QuestionnaireResponse references the package Questionnaire canonical'
|
|
17
|
+
description %(
|
|
18
|
+
This test verifies that each QuestionnaireResponse accompanying a standard
|
|
19
|
+
Questionnaire in a `$questionnaire-package` package Bundle references the
|
|
20
|
+
canonical of the Questionnaire returned in that same package Bundle.
|
|
21
|
+
)
|
|
22
|
+
verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@spec-122'
|
|
23
|
+
|
|
24
|
+
run do
|
|
25
|
+
load_tagged_requests(QUESTIONNAIRE_TAG)
|
|
26
|
+
standard_questionnaire_responses_found = false
|
|
27
|
+
|
|
28
|
+
requests.each_with_index do |request, request_index|
|
|
29
|
+
package_bundles_from_request(request).each do |package_bundle|
|
|
30
|
+
questionnaire = package_resources(package_bundle, FHIR::Questionnaire).first
|
|
31
|
+
next if adaptive_questionnaire?(questionnaire)
|
|
32
|
+
|
|
33
|
+
questionnaire_response = package_resources(package_bundle, FHIR::QuestionnaireResponse).first
|
|
34
|
+
next unless questionnaire_response
|
|
35
|
+
|
|
36
|
+
standard_questionnaire_responses_found = true
|
|
37
|
+
questionnaire_canonical = canonical(questionnaire)
|
|
38
|
+
next if questionnaire_response.questionnaire == questionnaire_canonical
|
|
39
|
+
|
|
40
|
+
add_request_message(
|
|
41
|
+
'error',
|
|
42
|
+
"QuestionnaireResponse.questionnaire `#{questionnaire_response.questionnaire}` does not " \
|
|
43
|
+
"match a Questionnaire canonical in its package Bundle (#{questionnaire_canonical}).",
|
|
44
|
+
request_index
|
|
45
|
+
)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
omit_if !standard_questionnaire_responses_found,
|
|
50
|
+
'No QuestionnaireResponse resources accompanying standard Questionnaires were returned.'
|
|
51
|
+
|
|
52
|
+
message = "#{requests_with_errors_prefix}" \
|
|
53
|
+
'QuestionnaireResponse.questionnaire must match a Questionnaire canonical in its package Bundle.'
|
|
54
|
+
assert_no_error_messages("#{message} See Messages for details.")
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def package_bundles_from_request(request)
|
|
60
|
+
resource = FHIR.from_contents(request.response_body)
|
|
61
|
+
return [] unless resource.is_a?(FHIR::Parameters)
|
|
62
|
+
|
|
63
|
+
extract_questionnaire_bundles(resource)
|
|
64
|
+
rescue JSON::ParserError, FHIR::ClientException
|
|
65
|
+
[]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def package_resources(package_bundle, resource_class)
|
|
69
|
+
package_bundle.entry.filter_map do |entry|
|
|
70
|
+
entry.resource if entry.resource.is_a?(resource_class)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def adaptive_questionnaire?(questionnaire)
|
|
75
|
+
questionnaire.is_a?(FHIR::Questionnaire) &&
|
|
76
|
+
questionnaire.extension.any? do |extension|
|
|
77
|
+
extension.url == ADAPTIVE_QUESTIONNAIRE_EXTENSION_URL &&
|
|
78
|
+
(extension.valueBoolean || extension.valueUrl.present?)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def canonical(questionnaire)
|
|
83
|
+
return if questionnaire.blank? || questionnaire.url.blank?
|
|
84
|
+
|
|
85
|
+
"#{questionnaire.url}#{"|#{questionnaire.version}" if questionnaire.version.present?}"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../questionnaire_response_reference_validation'
|
|
4
|
+
require_relative '../../../cross_suite/v2.2.0/multi_request_message_helper'
|
|
5
|
+
require_relative '../../../tags'
|
|
6
|
+
|
|
7
|
+
module DaVinciDTRTestKit
|
|
8
|
+
module DTRPayerServerV220
|
|
9
|
+
class QuestionnaireResponseReferencesTest < Inferno::Test
|
|
10
|
+
include QuestionnaireResponseReferenceValidation
|
|
11
|
+
include MultiRequestMessageHelper
|
|
12
|
+
|
|
13
|
+
id :dtr_v220_payer_questionnaire_response_references
|
|
14
|
+
title 'QuestionnaireResponse references target contained or client FHIR resources'
|
|
15
|
+
description %(
|
|
16
|
+
This test verifies that every reference in each QuestionnaireResponse returned by
|
|
17
|
+
`$questionnaire-package` points to either a resource contained in that
|
|
18
|
+
QuestionnaireResponse or a resource on the DTR client's FHIR endpoint.
|
|
19
|
+
Relative references are interpreted relative to the DTR client's FHIR endpoint.
|
|
20
|
+
To validate absolute references, provide the DTR Client FHIR Endpoint input.
|
|
21
|
+
)
|
|
22
|
+
verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@spec-139'
|
|
23
|
+
|
|
24
|
+
input :client_fhir_endpoint, optional: true
|
|
25
|
+
|
|
26
|
+
run do
|
|
27
|
+
load_tagged_requests(QUESTIONNAIRE_TAG)
|
|
28
|
+
responses_by_request = requests.map { |request| questionnaire_responses_from_request(request) }
|
|
29
|
+
skip_if responses_by_request.all?(&:empty?), 'No QuestionnaireResponse resources were returned.'
|
|
30
|
+
absolute_references_returned = responses_by_request.flatten.any? do |response|
|
|
31
|
+
questionnaire_response_has_absolute_reference?(response)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
responses_by_request.each_with_index do |questionnaire_responses, request_index|
|
|
35
|
+
questionnaire_responses.each do |questionnaire_response|
|
|
36
|
+
invalid_questionnaire_response_references(questionnaire_response, client_fhir_endpoint).each do |reference|
|
|
37
|
+
add_request_message('error', reference, request_index)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
message = "#{requests_with_errors_prefix}" \
|
|
43
|
+
"References must target contained resources or the DTR client's FHIR endpoint. "
|
|
44
|
+
assert_no_error_messages("#{message}See Messages for details.")
|
|
45
|
+
|
|
46
|
+
skip_if client_fhir_endpoint.blank? && absolute_references_returned,
|
|
47
|
+
'Absolute QuestionnaireResponse references were returned, but no DTR Client FHIR Endpoint was provided.'
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require_relative '../../../tags'
|
|
2
|
+
require_relative '../../../urls'
|
|
3
|
+
require_relative '../../validation_test'
|
|
4
|
+
require_relative '../questionnaire_operation_validation'
|
|
5
|
+
|
|
6
|
+
module DaVinciDTRTestKit
|
|
7
|
+
module DTRPayerServerV220
|
|
8
|
+
class QuestionnaireResponseValidationTest < Inferno::Test
|
|
9
|
+
include URLs
|
|
10
|
+
include DaVinciDTRTestKit::ValidationTest
|
|
11
|
+
include QuestionnaireOperationValidation
|
|
12
|
+
|
|
13
|
+
id :dtr_v220_payer_questionnaire_response_validation
|
|
14
|
+
|
|
15
|
+
title 'Verify that the response conforms to the DTR Questionnaire Package Output Parameters profile'
|
|
16
|
+
description %(
|
|
17
|
+
Inferno will verify that the payer server's response to the
|
|
18
|
+
questionnaire-package operation conforms to the [Questionnaire Package
|
|
19
|
+
Output Parameters
|
|
20
|
+
profile](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/StructureDefinition-dtr-qpackage-output-parameters.html).
|
|
21
|
+
)
|
|
22
|
+
verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@oper-10'
|
|
23
|
+
input :url
|
|
24
|
+
|
|
25
|
+
run do
|
|
26
|
+
load_tagged_requests(QUESTIONNAIRE_TAG)
|
|
27
|
+
|
|
28
|
+
skip_if requests.blank?, 'No $questionnaire-package requests were made'
|
|
29
|
+
|
|
30
|
+
requests.each_with_index do |request, index|
|
|
31
|
+
unless [200, 201].include? request.response[:status]
|
|
32
|
+
add_message(
|
|
33
|
+
'error',
|
|
34
|
+
"Request #{index + 1} was unsuccessful."
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
JSON.parse(request.response_body)
|
|
39
|
+
|
|
40
|
+
resource = FHIR.from_contents(request.response_body)
|
|
41
|
+
|
|
42
|
+
if resource.nil?
|
|
43
|
+
add_message(
|
|
44
|
+
'error',
|
|
45
|
+
"Response #{index + 1} did not contain FHIR resources."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
next
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
perform_questionnaire_package_response_validation(resource, index)
|
|
52
|
+
rescue JSON::ParserError
|
|
53
|
+
add_message(
|
|
54
|
+
'error',
|
|
55
|
+
"Response #{index + 1} contained invalid JSON."
|
|
56
|
+
)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
assert_no_error_messages('Not all responses were valid. See messages for details.')
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/source_data_error_test.rb
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DaVinciDTRTestKit
|
|
4
|
+
module DTRPayerServerV220
|
|
5
|
+
class SourceDataErrorTest < Inferno::Test
|
|
6
|
+
id :dtr_v220_payer_source_data_error
|
|
7
|
+
title 'Source data errors return a 4xx response with an OperationOutcome'
|
|
8
|
+
description %(
|
|
9
|
+
Inferno invokes `Questionnaire/$questionnaire-package` using a
|
|
10
|
+
tester-provided request containing source data that the DTR server cannot
|
|
11
|
+
resolve, such as an unknown coverage or context identifier. Inferno verifies
|
|
12
|
+
that the server returns a 4xx response with an OperationOutcome.
|
|
13
|
+
)
|
|
14
|
+
verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@spec-130'
|
|
15
|
+
|
|
16
|
+
input :source_data_error_request,
|
|
17
|
+
title: '$questionnaire-package Request with Invalid Source Data',
|
|
18
|
+
description: %(
|
|
19
|
+
Provide a `Parameters` resource in JSON format containing source data
|
|
20
|
+
known to be unresolvable by the DTR server, such as an unknown coverage
|
|
21
|
+
or context identifier.
|
|
22
|
+
),
|
|
23
|
+
type: 'textarea'
|
|
24
|
+
|
|
25
|
+
run do
|
|
26
|
+
assert_valid_json source_data_error_request, 'The provided $questionnaire-package request is not valid JSON.'
|
|
27
|
+
parameters = FHIR.from_contents(source_data_error_request)
|
|
28
|
+
assert_resource_type(:parameters, resource: parameters)
|
|
29
|
+
|
|
30
|
+
fhir_operation(
|
|
31
|
+
'/Questionnaire/$questionnaire-package',
|
|
32
|
+
body: parameters,
|
|
33
|
+
headers: { 'Content-Type': 'application/fhir+json' }
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
status = request.status.to_i
|
|
37
|
+
assert status.between?(400, 499),
|
|
38
|
+
"Expected a 4xx response for invalid source data, but received HTTP #{status}."
|
|
39
|
+
assert_resource_type(:operation_outcome)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
require_relative '../../../tags'
|
|
2
|
+
require_relative '../../validation_test'
|
|
3
|
+
require_relative '../questionnaire_operation_validation'
|
|
4
|
+
require_relative '../../../cross_suite/v2.2.0/multi_request_message_helper'
|
|
5
|
+
|
|
6
|
+
module DaVinciDTRTestKit
|
|
7
|
+
module DTRPayerServerV220
|
|
8
|
+
class ValueSetValidationTest < Inferno::Test
|
|
9
|
+
include DaVinciDTRTestKit::ValidationTest
|
|
10
|
+
include QuestionnaireOperationValidation
|
|
11
|
+
include MultiRequestMessageHelper
|
|
12
|
+
|
|
13
|
+
id :dtr_v220_payer_value_set_validation
|
|
14
|
+
title 'Validate questionnaire-package response Bundle includes all external ValueSet instances'
|
|
15
|
+
description %(
|
|
16
|
+
This test validates the response to the $questionnaire-package includes all external ValueSet
|
|
17
|
+
instances referenced by the Questionnaire.
|
|
18
|
+
|
|
19
|
+
It verifies that the Bundle includes all ValueSet instances referenced by the Questionnaire.
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@oper-14'
|
|
23
|
+
|
|
24
|
+
run do
|
|
25
|
+
load_tagged_requests(QUESTIONNAIRE_TAG)
|
|
26
|
+
|
|
27
|
+
skip_if requests.blank?, 'No $questionnaire-package requests were made'
|
|
28
|
+
|
|
29
|
+
successful_requests = requests.each_with_index.select do |request, _request_index|
|
|
30
|
+
[200, 201].include? request.status
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
skip_if successful_requests.blank?, 'No successful $questionnaire-package requests were made'
|
|
34
|
+
|
|
35
|
+
external_value_set_referenced = false
|
|
36
|
+
|
|
37
|
+
successful_requests.each do |request, request_index|
|
|
38
|
+
resource = FHIR.from_contents(request.response_body)
|
|
39
|
+
|
|
40
|
+
extract_questionnaire_bundles(resource).each do |bundle|
|
|
41
|
+
bundle_value_set_urls = bundle.entry.filter_map do |entry|
|
|
42
|
+
next unless entry&.resource.is_a?(FHIR::ValueSet)
|
|
43
|
+
|
|
44
|
+
"#{entry.resource.url}|#{entry.resource.version}"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
external_value_set_urls = extract_questionnaires_from_bundles([bundle]).flat_map do |questionnaire|
|
|
48
|
+
value_set_urls_from_items(questionnaire.item)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
next if external_value_set_urls.empty?
|
|
52
|
+
|
|
53
|
+
external_value_set_referenced = true
|
|
54
|
+
|
|
55
|
+
missing_value_set_urls = external_value_set_urls.uniq - bundle_value_set_urls.uniq
|
|
56
|
+
|
|
57
|
+
next if missing_value_set_urls.empty?
|
|
58
|
+
|
|
59
|
+
add_request_message(
|
|
60
|
+
'error',
|
|
61
|
+
"Bundle is missing ValueSet instances: #{missing_value_set_urls.join(', ')}",
|
|
62
|
+
request_index
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
omit_if !external_value_set_referenced, 'No external ValueSet referenced'
|
|
68
|
+
|
|
69
|
+
assert_no_error_messages(
|
|
70
|
+
"#{requests_with_errors_prefix}Questionnaire-package response Bundles are missing ValueSet instances."
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def value_set_urls_from_items(items)
|
|
75
|
+
items.flat_map do |item|
|
|
76
|
+
urls = []
|
|
77
|
+
add_value_set_url(urls, item.answerValueSet)
|
|
78
|
+
urls + value_set_urls_from_items(item.item)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def add_value_set_url(urls, reference)
|
|
83
|
+
reference = reference.to_s
|
|
84
|
+
return if reference.blank? || reference.start_with?('#')
|
|
85
|
+
|
|
86
|
+
urls << reference
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uri'
|
|
4
|
+
|
|
5
|
+
module DaVinciDTRTestKit
|
|
6
|
+
module DTRPayerServerV220
|
|
7
|
+
module QuestionnaireResponseReferenceValidation
|
|
8
|
+
def questionnaire_responses_from_request(request)
|
|
9
|
+
resource = FHIR.from_contents(request.response_body)
|
|
10
|
+
questionnaire_responses_from_resource(resource)
|
|
11
|
+
rescue JSON::ParserError, FHIR::ClientException
|
|
12
|
+
[]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def questionnaire_responses_from_resource(resource)
|
|
16
|
+
case resource&.resourceType
|
|
17
|
+
when 'QuestionnaireResponse'
|
|
18
|
+
[resource]
|
|
19
|
+
when 'Bundle'
|
|
20
|
+
resource.entry.filter_map do |entry|
|
|
21
|
+
questionnaire_responses_from_resource(entry.resource)
|
|
22
|
+
end.flatten
|
|
23
|
+
when 'Parameters'
|
|
24
|
+
resource.parameter.filter_map do |parameter|
|
|
25
|
+
questionnaire_responses_from_resource(parameter.resource)
|
|
26
|
+
end.flatten
|
|
27
|
+
else
|
|
28
|
+
[]
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def invalid_questionnaire_response_references(questionnaire_response, client_fhir_endpoint)
|
|
33
|
+
contained_ids = questionnaire_response.contained.filter_map(&:id)
|
|
34
|
+
invalid_references = []
|
|
35
|
+
|
|
36
|
+
questionnaire_response_references(questionnaire_response).each do |reference|
|
|
37
|
+
reference_value = reference[:value]
|
|
38
|
+
location = reference[:location]
|
|
39
|
+
if reference_value.start_with?('#')
|
|
40
|
+
invalid_references << "#{location} references `#{reference_value}`" \
|
|
41
|
+
unless contained_ids.include?(reference_value.delete_prefix('#'))
|
|
42
|
+
elsif invalid_absolute_reference?(reference_value, client_fhir_endpoint)
|
|
43
|
+
invalid_references << "#{location} references `#{reference_value}`"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
invalid_references
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def invalid_contained_reference_locations(questionnaire_response)
|
|
51
|
+
permitted_locations = answer_value_reference_locations(questionnaire_response.item)
|
|
52
|
+
invalid_references = []
|
|
53
|
+
|
|
54
|
+
questionnaire_response_references(questionnaire_response).each do |reference|
|
|
55
|
+
reference_value = reference[:value]
|
|
56
|
+
location = reference[:location]
|
|
57
|
+
next unless reference_value.start_with?('#') && !permitted_locations.include?(location)
|
|
58
|
+
|
|
59
|
+
invalid_references << "#{location} references `#{reference_value}`"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
invalid_references
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Returns all populated FHIR Reference values below a FHIR resource.
|
|
66
|
+
#
|
|
67
|
+
# Given a QuestionnaireResponse with the following JSON representation:
|
|
68
|
+
# { "subject": { "reference": "Patient/123" },
|
|
69
|
+
# "item": [{ "answer": [{ "valueReference": { "reference": "#observation" } }] }] }
|
|
70
|
+
#
|
|
71
|
+
# it returns:
|
|
72
|
+
# [{ value: 'Patient/123', location: 'subject.reference' },
|
|
73
|
+
# { value: '#observation', location: 'item[0].answer[0].valueReference.reference' }]
|
|
74
|
+
def questionnaire_response_references(questionnaire_response)
|
|
75
|
+
references = []
|
|
76
|
+
|
|
77
|
+
questionnaire_response.each_element do |element, _metadata, path|
|
|
78
|
+
next unless element.is_a?(FHIR::Reference) && element.reference.present?
|
|
79
|
+
|
|
80
|
+
references << { value: element.reference, location: "#{path}.reference" }
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
references
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Returns the locations of QuestionnaireResponse answer value references.
|
|
87
|
+
#
|
|
88
|
+
# Given QuestionnaireResponse items with the following JSON representation:
|
|
89
|
+
# [{ "answer": [{ "valueReference": { "reference": "#observation" } }] }]
|
|
90
|
+
#
|
|
91
|
+
# it returns:
|
|
92
|
+
# ['item[0].answer[0].valueReference.reference']
|
|
93
|
+
def answer_value_reference_locations(items, item_location = 'item', locations = [])
|
|
94
|
+
items.each_with_index do |item, item_index|
|
|
95
|
+
location = "#{item_location}[#{item_index}]"
|
|
96
|
+
answer_value_reference_locations(item.item, "#{location}.item", locations)
|
|
97
|
+
|
|
98
|
+
item.answer.each_with_index do |answer, answer_index|
|
|
99
|
+
answer_location = "#{location}.answer[#{answer_index}]"
|
|
100
|
+
locations << "#{answer_location}.valueReference.reference" if answer.valueReference&.reference.present?
|
|
101
|
+
answer_value_reference_locations(answer.item, "#{answer_location}.item", locations)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
locations
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def absolute_reference?(reference)
|
|
109
|
+
URI.parse(reference).absolute?
|
|
110
|
+
rescue URI::InvalidURIError
|
|
111
|
+
false
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def questionnaire_response_has_absolute_reference?(questionnaire_response)
|
|
115
|
+
questionnaire_response_references(questionnaire_response).any? do |reference|
|
|
116
|
+
absolute_reference?(reference[:value])
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def invalid_absolute_reference?(reference, client_fhir_endpoint)
|
|
121
|
+
client_fhir_endpoint.present? && absolute_reference?(reference) &&
|
|
122
|
+
!reference_on_client_endpoint?(reference, client_fhir_endpoint)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def reference_on_client_endpoint?(reference, client_fhir_endpoint)
|
|
126
|
+
return false if client_fhir_endpoint.blank?
|
|
127
|
+
|
|
128
|
+
normalized_endpoint = client_fhir_endpoint.delete_suffix('/')
|
|
129
|
+
reference == normalized_endpoint || reference.start_with?("#{normalized_endpoint}/")
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|