davinci_pas_test_kit 0.15.1 → 0.16.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/g33_br_provider.json +13 -0
- data/config/presets/pas_client_example.json +2 -2
- data/config/presets/pas_client_v201_run_against_pas_server.json +2 -2
- data/config/presets/pas_client_v221_run_against_pas_server.json +3 -3
- data/config/presets/pas_ri.json +6 -6
- data/config/presets/pas_server_v201_run_against_pas_client.json.erb +6 -6
- data/config/presets/pas_server_v221_run_against_pas_client.json.erb +10 -10
- data/lib/davinci_pas_test_kit/client/abstract_approval_submit_test.rb +28 -17
- data/lib/davinci_pas_test_kit/client/abstract_denial_submit_test.rb +26 -16
- data/lib/davinci_pas_test_kit/client/abstract_gather_must_support_test.rb +45 -74
- data/lib/davinci_pas_test_kit/client/abstract_modification_submit_test.rb +29 -19
- data/lib/davinci_pas_test_kit/client/abstract_response_attest.rb +75 -6
- data/lib/davinci_pas_test_kit/client/abstract_subscription_create_test.rb +26 -9
- data/lib/davinci_pas_test_kit/client/abstract_subscription_update_delete_test.rb +91 -0
- data/lib/davinci_pas_test_kit/client/client_bundle_validation_helper.rb +245 -0
- data/lib/davinci_pas_test_kit/client/client_input_descriptions.rb +96 -1
- data/lib/davinci_pas_test_kit/client/endpoints/claim_endpoint.rb +128 -72
- data/lib/davinci_pas_test_kit/client/endpoints/endpoint_session_identification.rb +24 -0
- data/lib/davinci_pas_test_kit/client/endpoints/expired_token.rb +40 -0
- data/lib/davinci_pas_test_kit/client/endpoints/subscription_create_endpoint.rb +7 -12
- data/lib/davinci_pas_test_kit/client/endpoints/subscription_delete_endpoint.rb +13 -0
- data/lib/davinci_pas_test_kit/client/endpoints/subscription_read_endpoint.rb +13 -0
- data/lib/davinci_pas_test_kit/client/endpoints/subscription_status_endpoint.rb +15 -20
- data/lib/davinci_pas_test_kit/client/endpoints/subscription_update_endpoint.rb +13 -0
- data/lib/davinci_pas_test_kit/client/endpoints/token_endpoint.rb +16 -0
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_inquire_request_must_support_beneficiary_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_inquire_response_must_support_beneficiary_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_submit_request_must_support_beneficiary_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_submit_response_must_support_beneficiary_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claim_inquiry/client_inquire_request_must_support_claim_inquiry_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claim_update/client_submit_request_must_support_claim_update_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claiminquiryresponse/client_inquire_response_must_support_claiminquiryresponse_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claimresponse/client_submit_response_must_support_claimresponse_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/communication_request/client_submit_response_must_support_communication_request_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/coverage/client_inquire_request_must_support_coverage_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/coverage/client_submit_request_must_support_coverage_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/encounter/client_submit_request_must_support_encounter_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_inquire_request_must_support_insurer_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_inquire_response_must_support_insurer_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_submit_request_must_support_insurer_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_submit_response_must_support_insurer_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_inquire_must_support_group.rb +1 -1
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_inquire_response_must_support_group.rb +9 -31
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_submit_must_support_group.rb +1 -1
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_submit_response_must_support_group.rb +10 -32
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_inquiry_request_bundle/client_inquire_request_must_support_pas_inquiry_request_bundle_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_inquiry_response_bundle/client_inquire_response_must_support_pas_inquiry_response_bundle_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_request_bundle/client_submit_request_must_support_pas_request_bundle_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_response_bundle/client_submit_response_must_support_pas_response_bundle_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_inquire_request_must_support_practitioner_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_inquire_response_must_support_practitioner_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_submit_request_must_support_practitioner_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_submit_response_must_support_practitioner_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_inquire_request_must_support_practitioner_role_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_inquire_response_must_support_practitioner_role_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_submit_request_must_support_practitioner_role_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_submit_response_must_support_practitioner_role_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_inquire_request_must_support_requestor_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_inquire_response_must_support_requestor_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_submit_request_must_support_requestor_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_submit_response_must_support_requestor_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/subscriber/client_inquire_request_must_support_subscriber_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/subscriber/client_submit_request_must_support_subscriber_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/beneficiary/client_inquire_response_must_support_beneficiary_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/beneficiary/client_submit_response_must_support_beneficiary_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claim_inquiry/client_inquire_request_must_support_claim_inquiry_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claim_update/client_submit_request_must_support_claim_update_test.rb +3 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claiminquiryresponse/client_inquire_response_must_support_claiminquiryresponse_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claimresponse/client_submit_response_must_support_claimresponse_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/communication_request/client_submit_response_must_support_communication_request_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/insurer/client_inquire_response_must_support_insurer_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/insurer/client_submit_response_must_support_insurer_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_inquire_must_support_group.rb +8 -6
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_inquire_response_must_support_group.rb +9 -31
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_submit_must_support_group.rb +13 -9
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_submit_response_must_support_group.rb +10 -32
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_inquiry_response_bundle/client_inquire_response_must_support_pas_inquiry_response_bundle_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_response_bundle/client_submit_response_must_support_pas_response_bundle_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner/client_inquire_response_must_support_practitioner_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner/client_submit_response_must_support_practitioner_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner_role/client_inquire_response_must_support_practitioner_role_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner_role/client_submit_response_must_support_practitioner_role_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/requestor/client_inquire_response_must_support_requestor_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/requestor/client_submit_response_must_support_requestor_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/jobs/send_pas_subscription_notification.rb +64 -3
- data/lib/davinci_pas_test_kit/client/pas_client_subscription_pas_conformance_test.rb +4 -3
- data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_other_display_test.rb +6 -4
- data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_smart_display_test.rb +8 -4
- data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_udap_display_test.rb +9 -4
- data/lib/davinci_pas_test_kit/client/registration/abstract_other_auth_attest_test.rb +5 -4
- data/lib/davinci_pas_test_kit/client/request_count_gating.rb +14 -0
- data/lib/davinci_pas_test_kit/client/response_generator.rb +50 -9
- data/lib/davinci_pas_test_kit/client/session_identification.rb +26 -7
- data/lib/davinci_pas_test_kit/client/subscription_notification_trigger.rb +80 -0
- data/lib/davinci_pas_test_kit/client/subscription_setup_requirement.rb +59 -0
- data/lib/davinci_pas_test_kit/client/user_input_response.rb +50 -10
- data/lib/davinci_pas_test_kit/client/v2.0.1/client_suite.rb +30 -15
- data/lib/davinci_pas_test_kit/client/v2.0.1/must_support/pas_client_must_support_request_profiles_test.rb +2 -2
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_approval_group.rb +8 -7
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_auth_smart_group.rb +4 -4
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_auth_udap_group.rb +4 -4
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_denial_group.rb +8 -7
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_must_support_group.rb +38 -52
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_pended_group.rb +28 -22
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_registration_group.rb +2 -2
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_subscription_setup_group.rb +2 -2
- data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_workflows_group.rb +2 -2
- data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_inquire_request_bundle_validation_test.rb +15 -21
- data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_inquire_response_bundle_validation_test.rb +29 -29
- data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_pended_submit_test.rb +49 -40
- data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_request_bundle_validation_test.rb +15 -21
- data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_response_bundle_validation_test.rb +29 -29
- data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/attestation_instructions.rb +10 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/client_data_element_expectations_attestation_test.rb +44 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/client_provider_review_attestation_test.rb +45 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/client_security_attestation_test.rb +42 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/client_subscription_error_recovery_attestation_test.rb +42 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/client_suite.rb +64 -12
- data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_operation_failure_submit_test.rb +20 -10
- data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_operation_outcome_validation_test.rb +11 -5
- data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_processing_error_response_validation_test.rb +21 -12
- data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_processing_error_submit_test.rb +19 -8
- data/lib/davinci_pas_test_kit/client/v2.2.1/must_support/must_support_with_attestation_option.rb +90 -40
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_approval_group.rb +12 -11
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_attestations_group.rb +32 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_auth_smart_group.rb +4 -4
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_auth_udap_group.rb +4 -4
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_claim_updates_group.rb +24 -6
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_denial_group.rb +12 -10
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_modification_group.rb +13 -14
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_must_support_group.rb +55 -59
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_operation_failure_group.rb +8 -5
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_pended_group.rb +53 -41
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_processing_error_group.rb +9 -7
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_registration_group.rb +2 -2
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_subscription_setup_group.rb +9 -4
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_subscription_update_delete_group.rb +57 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_workflows_group.rb +22 -2
- data/lib/davinci_pas_test_kit/client/v2.2.1/subscription/pas_client_subscription_create_test.rb +2 -1
- data/lib/davinci_pas_test_kit/client/v2.2.1/subscription/pas_client_subscription_put_update_pas_conformance_test.rb +49 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/subscription/pas_client_subscription_update_delete_test.rb +12 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_referenced_resources_test.rb +5 -6
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_submit_tests.rb +82 -56
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_inquire_request_bundle_validation_test.rb +17 -20
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_inquire_response_bundle_validation_test.rb +59 -27
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_modification_verification_test.rb +0 -3
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_pended_send_notification_test.rb +138 -0
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_pended_submit_test.rb +32 -85
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_request_bundle_validation_test.rb +16 -21
- data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_response_bundle_validation_test.rb +27 -27
- data/lib/davinci_pas_test_kit/cross_suite/fhirpath_utils.rb +13 -3
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/beneficiary/metadata.yml +4 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/claim_inquiry/metadata.yml +15 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/claim_update/metadata.yml +17 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/claiminquiryresponse/metadata.yml +15 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/claimresponse/metadata.yml +15 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/communication_request/metadata.yml +4 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/coverage/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/device_request/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/encounter/metadata.yml +3 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/insurer/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/medication_request/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/metadata.yml +143 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/nutrition_order/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/pas_inquiry_request_bundle/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/pas_inquiry_response_bundle/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/pas_request_bundle/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/pas_response_bundle/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/practitioner/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/practitioner_role/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/requestor/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/service_request/metadata.yml +3 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/subscriber/metadata.yml +4 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/task/metadata.yml +1 -4
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/beneficiary/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claim_inquiry/metadata.yml +23 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claim_update/metadata.yml +31 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claiminquiryresponse/metadata.yml +42 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claimresponse/metadata.yml +42 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/communication_request/metadata.yml +4 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/coverage/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/device_request/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/encounter/metadata.yml +3 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/insurer/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/medication_request/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/metadata.yml +265 -1
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/nutrition_order/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_inquiry_request_bundle/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_inquiry_response_bundle/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_request_bundle/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_response_bundle/metadata.yml +2 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/practitioner/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/practitioner_role/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/requestor/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/service_request/metadata.yml +3 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/subscriber/metadata.yml +1 -0
- data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/task/metadata.yml +4 -4
- data/lib/davinci_pas_test_kit/cross_suite/pas_bundle_validation.rb +570 -312
- data/lib/davinci_pas_test_kit/cross_suite/pas_constants.rb +13 -0
- data/lib/davinci_pas_test_kit/cross_suite/pas_datatype_constraints.rb +166 -0
- data/lib/davinci_pas_test_kit/cross_suite/pas_subscription_verification.rb +8 -4
- data/lib/davinci_pas_test_kit/cross_suite/referenced_resource_presence_validation.rb +141 -0
- data/lib/davinci_pas_test_kit/cross_suite/response_selection_utils.rb +39 -21
- data/lib/davinci_pas_test_kit/cross_suite/tags.rb +11 -6
- data/lib/davinci_pas_test_kit/cross_suite/validator_configuration.rb +16 -0
- data/lib/davinci_pas_test_kit/cross_suite/validator_suppressions.rb +210 -146
- data/lib/davinci_pas_test_kit/docs/demo/PAS Client Suite Demonstration.postman_collection.json +7 -7
- data/lib/davinci_pas_test_kit/ext/inferno_core/runnable.rb +1 -0
- data/lib/davinci_pas_test_kit/generator/client_must_support_group_generator.rb +47 -16
- data/lib/davinci_pas_test_kit/generator/must_support_target_profiles.rb +17 -0
- data/lib/davinci_pas_test_kit/generator/must_support_test_generator.rb +14 -2
- data/lib/davinci_pas_test_kit/generator/pas_must_support_metadata_extractor.rb +1 -2
- data/lib/davinci_pas_test_kit/generator/profile_metadata.rb +1 -1
- data/lib/davinci_pas_test_kit/generator/server_must_support_group_generator.rb +23 -0
- data/lib/davinci_pas_test_kit/generator/server_suite_generator.rb +8 -7
- data/lib/davinci_pas_test_kit/generator/templates/client_must_support_group.rb.erb +22 -3
- data/lib/davinci_pas_test_kit/generator/templates/client_must_support_response_group.rb.erb +7 -16
- data/lib/davinci_pas_test_kit/generator/templates/must_support.rb.erb +11 -10
- data/lib/davinci_pas_test_kit/generator/templates/server_must_support_group.rb.erb +22 -0
- data/lib/davinci_pas_test_kit/generator/templates/server_suite.rb.erb +9 -11
- data/lib/davinci_pas_test_kit/generator/templates/use_case_group.rb.erb +3 -0
- data/lib/davinci_pas_test_kit/generator/use_case_group_generator.rb +19 -13
- data/lib/davinci_pas_test_kit/parameters_helper.rb +13 -5
- data/lib/davinci_pas_test_kit/pas_notification_conformance_test.rb +2 -2
- data/lib/davinci_pas_test_kit/requirements/davinci_pas_test_kit_requirements.csv +14 -7
- data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_client_suite_v201_requirements_coverage.csv +21 -21
- data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_client_suite_v221_requirements_coverage.csv +30 -26
- data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_server_suite_v221_requirements_coverage.csv +39 -33
- data/lib/davinci_pas_test_kit/requirements/hl7.fhir.us.davinci-pas_2.2.1_requirements.xlsx +0 -0
- data/lib/davinci_pas_test_kit/server/claim_operation_logic.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/beneficiary/server_inquire_request_must_support_beneficiary_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/beneficiary/server_inquire_response_must_support_beneficiary_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/beneficiary/server_submit_request_must_support_beneficiary_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/beneficiary/server_submit_response_must_support_beneficiary_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/claim_inquiry/server_inquire_request_must_support_claim_inquiry_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/claim_update/server_submit_request_must_support_claim_update_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/claiminquiryresponse/server_inquire_response_must_support_claiminquiryresponse_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/claimresponse/server_submit_response_must_support_claimresponse_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/communication_request/server_submit_response_must_support_communication_request_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/coverage/server_inquire_request_must_support_coverage_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/coverage/server_submit_request_must_support_coverage_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/encounter/server_submit_request_must_support_encounter_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_inquire_request_must_support_insurer_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_inquire_response_must_support_insurer_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_submit_request_must_support_insurer_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_submit_response_must_support_insurer_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_inquiry_request_bundle/server_inquire_request_must_support_pas_inquiry_request_bundle_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_inquiry_response_bundle/server_inquire_response_must_support_pas_inquiry_response_bundle_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_request_bundle/server_submit_request_must_support_pas_request_bundle_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_response_bundle/server_submit_response_must_support_pas_response_bundle_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_approval_use_case_group.rb +4 -3
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_denial_use_case_group.rb +4 -3
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_pended_use_case_group.rb +7 -6
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_inquire_request_must_support_practitioner_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_inquire_response_must_support_practitioner_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_submit_request_must_support_practitioner_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_submit_response_must_support_practitioner_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_inquire_request_must_support_practitioner_role_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_inquire_response_must_support_practitioner_role_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_submit_request_must_support_practitioner_role_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_submit_response_must_support_practitioner_role_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_inquire_request_must_support_requestor_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_inquire_response_must_support_requestor_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_submit_request_must_support_requestor_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_submit_response_must_support_requestor_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/server_suite.rb +9 -11
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/subscriber/server_inquire_request_must_support_subscriber_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/subscriber/server_submit_request_must_support_subscriber_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/task/server_inquire_response_must_support_task_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.0.1/task/server_submit_response_must_support_task_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_inquire_request_must_support_beneficiary_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_inquire_response_must_support_beneficiary_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_submit_request_must_support_beneficiary_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_submit_response_must_support_beneficiary_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claim_inquiry/server_inquire_request_must_support_claim_inquiry_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claim_update/server_submit_request_must_support_claim_update_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claiminquiryresponse/server_inquire_response_must_support_claiminquiryresponse_test.rb +3 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claimresponse/server_submit_response_must_support_claimresponse_test.rb +3 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/communication_request/server_submit_response_must_support_communication_request_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/coverage/server_inquire_request_must_support_coverage_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/coverage/server_submit_request_must_support_coverage_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/encounter/server_submit_request_must_support_encounter_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_inquire_request_must_support_insurer_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_inquire_response_must_support_insurer_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_submit_request_must_support_insurer_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_submit_response_must_support_insurer_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_inquiry_request_bundle/server_inquire_request_must_support_pas_inquiry_request_bundle_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_inquiry_response_bundle/server_inquire_response_must_support_pas_inquiry_response_bundle_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_request_bundle/server_submit_request_must_support_pas_request_bundle_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_response_bundle/server_submit_response_must_support_pas_response_bundle_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_approval_use_case_group.rb +5 -3
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_denial_use_case_group.rb +5 -3
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_must_support_group.rb +12 -0
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_pended_use_case_group.rb +9 -4
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_inquire_request_must_support_practitioner_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_inquire_response_must_support_practitioner_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_submit_request_must_support_practitioner_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_submit_response_must_support_practitioner_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_inquire_request_must_support_practitioner_role_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_inquire_response_must_support_practitioner_role_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_submit_request_must_support_practitioner_role_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_submit_response_must_support_practitioner_role_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_inquire_request_must_support_requestor_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_inquire_response_must_support_requestor_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_submit_request_must_support_requestor_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_submit_response_must_support_requestor_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/server_suite.rb +9 -11
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/subscriber/server_inquire_request_must_support_subscriber_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/subscriber/server_submit_request_must_support_subscriber_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/task/server_inquire_response_must_support_task_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/generated/v2.2.1/task/server_submit_response_must_support_task_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/pas_claim_response_decision_test.rb +2 -2
- data/lib/davinci_pas_test_kit/server/server_request_bundle_validation_test.rb +4 -6
- data/lib/davinci_pas_test_kit/server/server_response_bundle_validation_test.rb +17 -10
- data/lib/davinci_pas_test_kit/server/v2.0.1/must_support/pas_server_must_support_request_profiles_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/v2.0.1/pas_server_subscription_setup.rb +1 -1
- data/lib/davinci_pas_test_kit/server/v2.2.1/claim_inquiry/server_claim_inquiry_response_tests.rb +89 -0
- data/lib/davinci_pas_test_kit/server/v2.2.1/must_support/pas_server_must_support_request_profiles_test.rb +1 -1
- data/lib/davinci_pas_test_kit/server/v2.2.1/pas_error_group.rb +2 -0
- data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_claim_inquiry_responses_group.rb +17 -0
- data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_claim_updates_group.rb +1 -1
- data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_no_custom_extensions_test.rb +241 -0
- data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_subscription_capability_statement_test.rb +40 -0
- data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_subscription_setup.rb +15 -10
- data/lib/davinci_pas_test_kit/server/v2.2.1/server_replaced_pa_inquire_reference_input_test.rb +63 -0
- data/lib/davinci_pas_test_kit/server/v2.2.1/server_replaced_pa_inquire_reference_test.rb +109 -0
- data/lib/davinci_pas_test_kit/version.rb +2 -2
- metadata +38 -13
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/task/client_inquire_response_must_support_task_test.rb +0 -45
- data/lib/davinci_pas_test_kit/client/generated/v2.0.1/task/client_submit_response_must_support_task_test.rb +0 -45
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/task/client_inquire_response_must_support_task_test.rb +0 -55
- data/lib/davinci_pas_test_kit/client/generated/v2.2.1/task/client_submit_response_must_support_task_test.rb +0 -55
- data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_error_handling_group.rb +0 -20
|
@@ -5,6 +5,14 @@ module DaVinciPASTestKit
|
|
|
5
5
|
CLAIM_RESPONSE_PROFILE = 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/profile-claimresponse'.freeze
|
|
6
6
|
CLAIM_INQUIRY_PROFILE = 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/profile-claim-inquiry'.freeze
|
|
7
7
|
CLAIM_INQUIRY_RESPONSE_PROFILE = 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/profile-claiminquiryresponse'.freeze
|
|
8
|
+
DATA_ABSENT_REASON_EXTENSION_URL = 'http://hl7.org/fhir/StructureDefinition/data-absent-reason'.freeze
|
|
9
|
+
|
|
10
|
+
# US Core versions that PAS v2.2 lets supporting information resources conform to
|
|
11
|
+
US_CORE_VERSION_3_1_1 = '3.1.1'.freeze
|
|
12
|
+
US_CORE_VERSION_6_1_0 = '6.1.0'.freeze
|
|
13
|
+
US_CORE_VERSION_7_0_0 = '7.0.0'.freeze
|
|
14
|
+
# Validated against by suites that do not offer the US Core Version option (the v2.2 server suite)
|
|
15
|
+
DEFAULT_US_CORE_VERSION = US_CORE_VERSION_6_1_0
|
|
8
16
|
|
|
9
17
|
BUNDLE_PROFILES_FOR_OPERATION_TYPE = {
|
|
10
18
|
submit_request: 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/profile-pas-request-bundle',
|
|
@@ -13,6 +21,11 @@ module DaVinciPASTestKit
|
|
|
13
21
|
inquire_response: 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/profile-pas-inquiry-response-bundle'
|
|
14
22
|
}.freeze
|
|
15
23
|
|
|
24
|
+
REFERENCE_NUMBER_EXTENSIONS = {
|
|
25
|
+
authorization_number: 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/extension-authorizationNumber',
|
|
26
|
+
administration_reference_number: 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/extension-administrationReferenceNumber'
|
|
27
|
+
}.freeze
|
|
28
|
+
|
|
16
29
|
def self.bundle_profile_url_for_operation_and_type(operation, type)
|
|
17
30
|
BUNDLE_PROFILES_FOR_OPERATION_TYPE[:"#{operation}_#{type}"]
|
|
18
31
|
end
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
require_relative 'pas_constants'
|
|
2
|
+
|
|
3
|
+
module DaVinciPASTestKit
|
|
4
|
+
# Checks for the narrative-only constraints on the PAS Timing and Quantity data type
|
|
5
|
+
# profiles introduced in v2.2 (prof-1, prof-2, prof-3). These constraints have no
|
|
6
|
+
# FHIRPath expression in the StructureDefinitions, so the FHIR validator cannot
|
|
7
|
+
# enforce them and they are verified here instead.
|
|
8
|
+
# See https://hl7.org/fhir/us/davinci-pas/STU2.2/StructureDefinition-profile-datatype-timing.html
|
|
9
|
+
# and https://hl7.org/fhir/us/davinci-pas/STU2.2/StructureDefinition-profile-quantity.html
|
|
10
|
+
module PasDatatypeConstraints
|
|
11
|
+
PAS_STRUCTURE_DEFINITION_BASE = 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition'.freeze
|
|
12
|
+
|
|
13
|
+
TIMING_CALENDAR_PATTERN_EXTENSION_URL = "#{PAS_STRUCTURE_DEFINITION_BASE}/extension-timingcalendarpattern".freeze
|
|
14
|
+
TIMING_DELIVERY_PATTERN_EXTENSION_URL = "#{PAS_STRUCTURE_DEFINITION_BASE}/extension-timingdeliverypattern".freeze
|
|
15
|
+
ITEM_AUTHORIZED_DETAIL_EXTENSION_URL = "#{PAS_STRUCTURE_DEFINITION_BASE}/extension-itemAuthorizedDetail".freeze
|
|
16
|
+
|
|
17
|
+
# Quantity.code is bound (required) to the X12 673 "quantity qualifier" value set,
|
|
18
|
+
# which the terminology validator cannot expand. Requiring this system when a code
|
|
19
|
+
# is present is the machine-checkable part of prof-3.
|
|
20
|
+
X12_QUANTITY_UNITS_SYSTEM = 'https://codesystem.x12.org/005010/673'.freeze
|
|
21
|
+
|
|
22
|
+
# Profiles that apply profile-datatype-timing to elements of their resource.
|
|
23
|
+
TIMING_CONSTRAINED_PROFILE_URLS = [
|
|
24
|
+
"#{PAS_STRUCTURE_DEFINITION_BASE}/profile-devicerequest",
|
|
25
|
+
"#{PAS_STRUCTURE_DEFINITION_BASE}/profile-medicationrequest",
|
|
26
|
+
"#{PAS_STRUCTURE_DEFINITION_BASE}/profile-servicerequest"
|
|
27
|
+
].freeze
|
|
28
|
+
|
|
29
|
+
# Profiles that apply profile-quantity to elements of their resource, directly or
|
|
30
|
+
# inherited from profile-claim-base (Claim.item.quantity) and
|
|
31
|
+
# profile-claimresponse-base (ClaimResponse.addItem.quantity and the
|
|
32
|
+
# itemAuthorizedDetail quantity sub-extension).
|
|
33
|
+
QUANTITY_CONSTRAINED_PROFILE_URLS = [
|
|
34
|
+
PASConstants::CLAIM_PROFILE_FIRST_SUBMIT,
|
|
35
|
+
PASConstants::CLAIM_PROFILE,
|
|
36
|
+
PASConstants::CLAIM_INQUIRY_PROFILE,
|
|
37
|
+
PASConstants::CLAIM_RESPONSE_PROFILE,
|
|
38
|
+
PASConstants::CLAIM_INQUIRY_RESPONSE_PROFILE,
|
|
39
|
+
"#{PAS_STRUCTURE_DEFINITION_BASE}/profile-servicerequest"
|
|
40
|
+
].freeze
|
|
41
|
+
|
|
42
|
+
# Evaluates the PAS data type profile constraints for a resource against a profile.
|
|
43
|
+
# @param resource [FHIR::Model] The resource being validated.
|
|
44
|
+
# @param profile_url [String] The canonical (unversioned) profile URL being validated against.
|
|
45
|
+
# @param version [String] The IG version.
|
|
46
|
+
# @return [Array<Hash>] Error message hashes for each constraint violation found.
|
|
47
|
+
def datatype_constraint_messages(resource, profile_url, version)
|
|
48
|
+
return [] unless pas_datatype_constraints_enabled?(version)
|
|
49
|
+
|
|
50
|
+
constraint_messages = []
|
|
51
|
+
if TIMING_CONSTRAINED_PROFILE_URLS.include?(profile_url)
|
|
52
|
+
profiled_timing_elements(resource).each do |timing, location|
|
|
53
|
+
constraint_messages << timing_prof1_message(resource, timing, location)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
if QUANTITY_CONSTRAINED_PROFILE_URLS.include?(profile_url)
|
|
57
|
+
profiled_quantity_elements(resource).each do |quantity, location|
|
|
58
|
+
constraint_messages << quantity_prof2_message(resource, quantity, location)
|
|
59
|
+
constraint_messages << quantity_prof3_message(resource, quantity, location)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
constraint_messages.compact
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# The Timing and Quantity data type profiles were introduced in PAS v2.2.
|
|
66
|
+
def pas_datatype_constraints_enabled?(version)
|
|
67
|
+
version.to_s.delete_prefix('v').match?(/\A2\.2(\.|\z)/)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
# Timing instances the PAS profiles constrain, paired with their element locations.
|
|
73
|
+
def profiled_timing_elements(resource)
|
|
74
|
+
case resource.resourceType
|
|
75
|
+
when 'DeviceRequest', 'ServiceRequest'
|
|
76
|
+
timing = resource.occurrenceTiming
|
|
77
|
+
timing.present? ? [[timing, "#{resource.resourceType}.occurrenceTiming"]] : []
|
|
78
|
+
when 'MedicationRequest'
|
|
79
|
+
Array(resource.dosageInstruction).each_with_index.filter_map do |dosage, index|
|
|
80
|
+
[dosage.timing, "MedicationRequest.dosageInstruction[#{index}].timing"] if dosage.timing.present?
|
|
81
|
+
end
|
|
82
|
+
else
|
|
83
|
+
[]
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Quantity instances the PAS profiles constrain, paired with their element locations.
|
|
88
|
+
def profiled_quantity_elements(resource)
|
|
89
|
+
case resource.resourceType
|
|
90
|
+
when 'Claim'
|
|
91
|
+
Array(resource.item).each_with_index.filter_map do |item, index|
|
|
92
|
+
[item.quantity, "Claim.item[#{index}].quantity"] if item.quantity.present?
|
|
93
|
+
end
|
|
94
|
+
when 'ClaimResponse'
|
|
95
|
+
claim_response_quantity_elements(resource)
|
|
96
|
+
when 'ServiceRequest'
|
|
97
|
+
quantity = resource.quantityQuantity
|
|
98
|
+
quantity.present? ? [[quantity, 'ServiceRequest.quantityQuantity']] : []
|
|
99
|
+
else
|
|
100
|
+
[]
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def claim_response_quantity_elements(resource)
|
|
105
|
+
add_item_quantities = Array(resource.addItem).each_with_index.filter_map do |add_item, index|
|
|
106
|
+
[add_item.quantity, "ClaimResponse.addItem[#{index}].quantity"] if add_item.quantity.present?
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
authorized_detail_quantities = Array(resource.item).each_with_index.flat_map do |item, index|
|
|
110
|
+
Array(item.extension)
|
|
111
|
+
.select { |extension| extension.url == ITEM_AUTHORIZED_DETAIL_EXTENSION_URL }
|
|
112
|
+
.filter_map do |extension|
|
|
113
|
+
quantity = Array(extension.extension).find { |sub| sub.url == 'quantity' }&.valueQuantity
|
|
114
|
+
if quantity.present?
|
|
115
|
+
[quantity, "ClaimResponse.item[#{index}].extension:authorizedItemDetail.extension:quantity.valueQuantity"]
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
add_item_quantities + authorized_detail_quantities
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# prof-1: Timings SHALL have at least one of: a count, a frequency and period and
|
|
124
|
+
# periodUnit (with optional frequencyMax and periodMax), a calendarPattern, or a
|
|
125
|
+
# deliveryPattern.
|
|
126
|
+
def timing_prof1_message(resource, timing, location)
|
|
127
|
+
repeat = timing.repeat
|
|
128
|
+
return if repeat&.count.present?
|
|
129
|
+
return if repeat&.frequency.present? && repeat.period.present? && repeat.periodUnit.present?
|
|
130
|
+
return if extension_present?(timing, TIMING_CALENDAR_PATTERN_EXTENSION_URL)
|
|
131
|
+
return if extension_present?(timing, TIMING_DELIVERY_PATTERN_EXTENSION_URL)
|
|
132
|
+
|
|
133
|
+
datatype_constraint_message(resource, location,
|
|
134
|
+
'Timings SHALL have at least one of: a count, a frequency and period and ' \
|
|
135
|
+
'periodUnit (with optional frequencyMax and periodMax), a calendarPattern, ' \
|
|
136
|
+
'or a deliveryPattern (prof-1)')
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# prof-2: Quantities SHALL have a value and either a unit or a code.
|
|
140
|
+
def quantity_prof2_message(resource, quantity, location)
|
|
141
|
+
return if quantity.value.present? && (quantity.unit.present? || quantity.code.present?)
|
|
142
|
+
|
|
143
|
+
datatype_constraint_message(resource, location,
|
|
144
|
+
'Quantities SHALL have a value and either a unit or a code (prof-2)')
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# prof-3: If a quantity code is present, it SHALL use the X12 quantity units.
|
|
148
|
+
def quantity_prof3_message(resource, quantity, location)
|
|
149
|
+
return if quantity.code.blank? || quantity.system == X12_QUANTITY_UNITS_SYSTEM
|
|
150
|
+
|
|
151
|
+
datatype_constraint_message(resource, location,
|
|
152
|
+
'If a quantity code is present, it SHALL use the X12 quantity units ' \
|
|
153
|
+
"(system #{X12_QUANTITY_UNITS_SYSTEM}) (prof-3)")
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def extension_present?(element, url)
|
|
157
|
+
Array(element.extension).any? { |extension| extension.url == url }
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Mirrors the "ResourceType/id: location: message" format of validator messages.
|
|
161
|
+
def datatype_constraint_message(resource, location, description)
|
|
162
|
+
resource_label = resource.id.present? ? "#{resource.resourceType}/#{resource.id}" : resource.resourceType
|
|
163
|
+
{ type: 'error', message: "#{resource_label}: #{location}: #{description}" }
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
@@ -7,16 +7,20 @@ module DaVinciPASTestKit
|
|
|
7
7
|
|
|
8
8
|
def verify_pas_subscription(subscription_json_str, ig_version: 'v2.0.1')
|
|
9
9
|
assert_valid_json(subscription_json_str)
|
|
10
|
-
|
|
10
|
+
add_pas_subscription_messages(JSON.parse(subscription_json_str), ig_version:)
|
|
11
11
|
|
|
12
|
+
assert messages.none? { |msg| msg[:type] == 'error' },
|
|
13
|
+
'The Subscription does not conform to PAS requirements - see messages for details.'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Adds a message for each PAS requirement that the parsed Subscription does not meet without failing the
|
|
17
|
+
# test, so that callers checking several Subscriptions can report on all of them.
|
|
18
|
+
def add_pas_subscription_messages(subscription, ig_version: 'v2.0.1')
|
|
12
19
|
if ig_version == 'v2.0.1'
|
|
13
20
|
verify_pas_subscription_v201(subscription)
|
|
14
21
|
else
|
|
15
22
|
verify_pas_subscription_v221(subscription)
|
|
16
23
|
end
|
|
17
|
-
|
|
18
|
-
assert messages.none? { |msg| msg[:type] == 'error' },
|
|
19
|
-
'The Subscription does not conform to PAS requirements - see messages for details.'
|
|
20
24
|
end
|
|
21
25
|
|
|
22
26
|
private
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DaVinciPASTestKit
|
|
4
|
+
# Validates that resources referenced within a FHIR resource are present exactly once in a
|
|
5
|
+
# given set of bundle entries. Kept independent of PasBundleValidation's profile-conformance
|
|
6
|
+
# logic so it can be included on its own (e.g. by tests that only need reference-presence
|
|
7
|
+
# checks, such as PASClientClaimUpdateReferencedResourcesTest).
|
|
8
|
+
module ReferencedResourcePresenceValidation
|
|
9
|
+
# This method traverses references within a FHIR resource, ensuring that referenced resources
|
|
10
|
+
# are populated in the bundle. It also enforces that a referenced resource appears only once in the bundle,
|
|
11
|
+
# as required by the PAS IG.
|
|
12
|
+
# @param target_resource [FHIR::Model] The FHIR resource to traverse and validate.
|
|
13
|
+
# @param base_url [String] The server base url.
|
|
14
|
+
# @param resources_to_match [Array<FHIR:Bundle:Entry] The list of FHIR bundle entries to match references against.
|
|
15
|
+
# @param skip_claim_related [Boolean] When true, a Claim's `related` element is not traversed. This is set
|
|
16
|
+
# for any Claim reached by following a reference (i.e. a non-primary Claim in a Claim Update chain), whose
|
|
17
|
+
# own Claim.related.claim (the grandparent) is deliberately omitted from the Bundle per spec-65/66. The
|
|
18
|
+
# primary Claim passed in by the caller keeps `skip_claim_related: false`, so its parent reference - and the
|
|
19
|
+
# parent's own referenced resources - are still checked.
|
|
20
|
+
# @return [Array<String>] The error messages found during traversal.
|
|
21
|
+
def check_presence_of_referenced_resources(target_resource, base_url, resources_to_match,
|
|
22
|
+
skip_claim_related: false)
|
|
23
|
+
# Indexed once per call rather than linearly scanned per reference encountered during the
|
|
24
|
+
# traversal below. Grouped (not a plain Hash) so a fullUrl appearing on more than one entry
|
|
25
|
+
# is still detected as an error instead of being silently collapsed to the last match.
|
|
26
|
+
entries_by_full_url = resources_to_match.group_by(&:fullUrl)
|
|
27
|
+
traverse_referenced_resources(target_resource, base_url, entries_by_full_url,
|
|
28
|
+
skip_claim_related:, errors: [])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# ClaimResponse.request is a back-reference to the submitted Claim. The PAS IG response bundle
|
|
32
|
+
# profile (profile-pas-response-bundle) has no required Claim entry slice, so the Claim need
|
|
33
|
+
# not be present in the response bundle. Skipping here matches the identical guard in
|
|
34
|
+
# ResponseGenerator#referenced_entities, which also skips ClaimResponse.request when
|
|
35
|
+
# building mock response bundles.
|
|
36
|
+
def claim_response_request_attr?(resource, attr)
|
|
37
|
+
attr.to_s == 'request' &&
|
|
38
|
+
resource.respond_to?(:resourceType) &&
|
|
39
|
+
resource.resourceType == 'ClaimResponse'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Claim.related.claim points to the Claim being updated. For a non-primary Claim in a Claim Update
|
|
43
|
+
# chain (one reached by following a reference), that prior Claim is the grandparent, which spec-65/66
|
|
44
|
+
# require to be omitted from the Bundle. Used with the `skip_claim_related` flag so the generic
|
|
45
|
+
# reference-presence check does not flag the deliberately-omitted grandparent as missing.
|
|
46
|
+
def claim_related_attr?(resource, attr)
|
|
47
|
+
attr.to_s == 'related' &&
|
|
48
|
+
resource.respond_to?(:resourceType) &&
|
|
49
|
+
resource.resourceType == 'Claim'
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Generates a message for a resource that appears more than once in a bundle.
|
|
53
|
+
#
|
|
54
|
+
# @param reference_resource_type [String] The resource type being referenced.
|
|
55
|
+
# @param reference_resource_id [String] The resource ID being referenced.
|
|
56
|
+
# @param total_matches [Integer] The total number of matches found in the bundle.
|
|
57
|
+
#
|
|
58
|
+
# This method generates an error message when a referenced resource appears more than once
|
|
59
|
+
# in a FHIR bundle, which is not allowed.
|
|
60
|
+
def resource_shall_appear_once_message(absolute_ref, total_matches)
|
|
61
|
+
" The referenced #{absolute_ref} resource SHALL appear exactly once in the Bundle, but found #{total_matches}."
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def absolute_url(reference, base_url)
|
|
65
|
+
return if reference.blank?
|
|
66
|
+
return reference if base_url.blank? || reference.starts_with?('urn:uuid:') || URI(reference).absolute?
|
|
67
|
+
|
|
68
|
+
"#{base_url}/#{reference}"
|
|
69
|
+
rescue URI::InvalidURIError
|
|
70
|
+
# left as-is so it is reported as not found in the Bundle rather than erroring the validation
|
|
71
|
+
reference
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Extracts the base URL from an absolute URL by removing the resource type and ID.
|
|
75
|
+
# Expects a non-versioned [base]/[type]/[id] url, as Bundle fullUrls must be (bdl-8).
|
|
76
|
+
# @param absolute_url [String] The absolute URL.
|
|
77
|
+
# @return [String] The base URL, or an empty string if the url is not an absolute url with a host
|
|
78
|
+
# (e.g., a urn:uuid, a relative url, or an invalid url - reported separately by the fullUrl checks).
|
|
79
|
+
def extract_base_url(absolute_url)
|
|
80
|
+
return '' if absolute_url.blank?
|
|
81
|
+
|
|
82
|
+
# Use the raw components rather than URI#authority, which drops an explicit default port (e.g., :443)
|
|
83
|
+
# and userinfo, so that the base URL is exactly what the client sent and relative references resolved
|
|
84
|
+
# against it match the Bundle's fullUrls.
|
|
85
|
+
scheme, userinfo, host, port, _registry, path = URI::RFC3986_PARSER.split(absolute_url)
|
|
86
|
+
return '' if scheme.blank? || host.blank?
|
|
87
|
+
|
|
88
|
+
authority = "#{"#{userinfo}@" if userinfo.present?}#{host}#{":#{port}" if port.present?}"
|
|
89
|
+
|
|
90
|
+
# Split the path segments and remove the last two segments (resource type and id)
|
|
91
|
+
base_path = path.split('/')[0...-2].join('/')
|
|
92
|
+
|
|
93
|
+
"#{scheme}://#{authority}#{base_path}"
|
|
94
|
+
rescue URI::InvalidURIError
|
|
95
|
+
''
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
# Recursive worker for check_presence_of_referenced_resources; errors is threaded through the
|
|
101
|
+
# recursive calls and is private so callers can't pass in (and so corrupt) their own accumulator.
|
|
102
|
+
# entries_by_full_url is a fullUrl => Array<Bundle::Entry> index built once by the public method,
|
|
103
|
+
# so each reference encountered is an O(1) lookup instead of a linear scan of every entry.
|
|
104
|
+
def traverse_referenced_resources(target_resource, base_url, entries_by_full_url, skip_claim_related:, errors:)
|
|
105
|
+
return errors if target_resource.blank?
|
|
106
|
+
|
|
107
|
+
if target_resource.is_a?(FHIR::Reference) && target_resource.reference.present?
|
|
108
|
+
ref = target_resource.reference
|
|
109
|
+
absolute_ref = absolute_url(ref, base_url)
|
|
110
|
+
matching_resources = entries_by_full_url[absolute_ref] || []
|
|
111
|
+
|
|
112
|
+
if matching_resources.length != 1
|
|
113
|
+
errors << resource_shall_appear_once_message(absolute_ref, matching_resources.length)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if matching_resources.length.positive?
|
|
117
|
+
# A resource reached by following a reference is an included resource, not the primary Claim
|
|
118
|
+
# being validated; if it is itself a Claim Update, its referenced grandparent Claim is omitted.
|
|
119
|
+
traverse_referenced_resources(matching_resources.first.resource, base_url, entries_by_full_url,
|
|
120
|
+
skip_claim_related: true, errors:)
|
|
121
|
+
end
|
|
122
|
+
else
|
|
123
|
+
target_resource.source_hash.each_key do |attr|
|
|
124
|
+
next if claim_response_request_attr?(target_resource, attr)
|
|
125
|
+
next if skip_claim_related && claim_related_attr?(target_resource, attr)
|
|
126
|
+
|
|
127
|
+
value = target_resource.send(attr.to_sym)
|
|
128
|
+
if value.is_a?(FHIR::Model)
|
|
129
|
+
traverse_referenced_resources(value, base_url, entries_by_full_url, skip_claim_related:, errors:)
|
|
130
|
+
elsif value.is_a?(Array) && value.all?(FHIR::Model)
|
|
131
|
+
value.each do |elmt|
|
|
132
|
+
traverse_referenced_resources(elmt, base_url, entries_by_full_url, skip_claim_related:, errors:)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
errors
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -2,16 +2,18 @@ require_relative 'fhirpath_utils'
|
|
|
2
2
|
|
|
3
3
|
module DaVinciPASTestKit
|
|
4
4
|
# Selection of a response from a tester-provided list of candidates. Each candidate
|
|
5
|
-
# is either a bare
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
5
|
+
# is either a bare response resource - a FHIR Bundle, or a Parameters wrapping Bundles
|
|
6
|
+
# (e.g., a v2.2.1 $inquire response) - or a plain JSON wrapper object pairing the
|
|
7
|
+
# response resource ("bundle") with the selection criteria ("criteria") that the
|
|
8
|
+
# incoming request must meet for that response to be returned. The wrapper is plain
|
|
9
|
+
# JSON rather than FHIR because Bundle resources cannot carry top-level extensions.
|
|
10
|
+
# Candidates are handled as parsed JSON hashes; the inner response resource is a clean
|
|
11
|
+
# FHIR resource and needs no modification before use.
|
|
11
12
|
# Requires FhirpathUtils and access to `result` (Inferno::Entities::Result).
|
|
12
13
|
module ResponseSelectionUtils
|
|
13
14
|
CRITERIA_KEY = 'criteria'.freeze
|
|
14
15
|
BUNDLE_KEY = 'bundle'.freeze
|
|
16
|
+
RESPONSE_RESOURCE_TYPES = %w[Bundle Parameters].freeze
|
|
15
17
|
REQUEST_RANGE_KEY = 'requestRange'.freeze
|
|
16
18
|
FHIRPATH_KEY = 'fhirpath'.freeze
|
|
17
19
|
|
|
@@ -19,23 +21,23 @@ module DaVinciPASTestKit
|
|
|
19
21
|
# Candidate handling
|
|
20
22
|
# ***********************************************************************
|
|
21
23
|
|
|
22
|
-
def
|
|
23
|
-
entity.is_a?(Hash) && entity['resourceType']
|
|
24
|
+
def bare_response?(entity)
|
|
25
|
+
entity.is_a?(Hash) && RESPONSE_RESOURCE_TYPES.include?(entity['resourceType'])
|
|
24
26
|
end
|
|
25
27
|
|
|
26
|
-
def
|
|
27
|
-
|
|
28
|
+
def entity_response(entity)
|
|
29
|
+
bare_response?(entity) ? entity : entity[BUNDLE_KEY]
|
|
28
30
|
end
|
|
29
31
|
|
|
30
32
|
def entity_criteria(entity)
|
|
31
|
-
criteria =
|
|
33
|
+
criteria = bare_response?(entity) ? nil : entity[CRITERIA_KEY]
|
|
32
34
|
criteria.is_a?(Hash) ? criteria : {}
|
|
33
35
|
end
|
|
34
36
|
|
|
35
|
-
def include_entity?(entity, request_fhir_obj,
|
|
37
|
+
def include_entity?(entity, request_fhir_obj, request_number)
|
|
36
38
|
criteria = entity_criteria(entity)
|
|
37
39
|
return false if criteria[REQUEST_RANGE_KEY].present? &&
|
|
38
|
-
!
|
|
40
|
+
!ranges_cover_value?(request_number, criteria[REQUEST_RANGE_KEY].to_s)
|
|
39
41
|
return false if criteria[FHIRPATH_KEY].present? &&
|
|
40
42
|
!request_meets_inclusion_criteria?(criteria[FHIRPATH_KEY], request_fhir_obj)
|
|
41
43
|
|
|
@@ -55,26 +57,23 @@ module DaVinciPASTestKit
|
|
|
55
57
|
# Request index-based selection criteria
|
|
56
58
|
# ***********************************************************************
|
|
57
59
|
|
|
58
|
-
def request_meets_request_range_criteria?(ranges, operation)
|
|
59
|
-
ranges_cover_value?(count_previous_successful_requests(operation) + 1, ranges.to_s)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
60
|
def count_previous_successful_requests(operation)
|
|
63
61
|
requests_repo = Inferno::Repositories::Requests.new
|
|
64
62
|
previous_requests = requests_repo.requests_for_result(result.id)
|
|
65
63
|
previous_requests.count { |req| req.url.include?(operation) && req.status == 200 }
|
|
66
64
|
end
|
|
67
65
|
|
|
66
|
+
# An invalid range comes from tester input, so it is reported as a warning on the
|
|
67
|
+
# test and treated as unmet rather than raised, leaving the candidate unselected.
|
|
68
68
|
def ranges_cover_value?(value, ranges_string)
|
|
69
69
|
unless /\A(\d+(-\d+)?,)*\d+(-\d+)?\z/.match?(ranges_string)
|
|
70
|
-
raise ArgumentError,
|
|
71
|
-
"Invalid range string: #{ranges_string.inspect}"
|
|
70
|
+
raise ArgumentError, 'expected comma-separated numbers or ranges such as "1-2,4"'
|
|
72
71
|
end
|
|
73
72
|
|
|
74
73
|
ranges_string.split(',').any? do |part|
|
|
75
74
|
if part.include?('-')
|
|
76
75
|
low, high = part.split('-').map(&:to_i)
|
|
77
|
-
raise ArgumentError, "
|
|
76
|
+
raise ArgumentError, "#{part.inspect} is inverted" if low > high
|
|
78
77
|
|
|
79
78
|
(low..high).cover?(value)
|
|
80
79
|
else
|
|
@@ -82,7 +81,26 @@ module DaVinciPASTestKit
|
|
|
82
81
|
end
|
|
83
82
|
end
|
|
84
83
|
rescue ArgumentError => e
|
|
85
|
-
|
|
84
|
+
add_result_warning(
|
|
85
|
+
"Invalid requestRange criteria #{ranges_string.inspect}. The corresponding Bundle was not selected " \
|
|
86
|
+
"(#{e.message})."
|
|
87
|
+
)
|
|
88
|
+
false
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# ***********************************************************************
|
|
92
|
+
# Tester-facing warnings
|
|
93
|
+
# ***********************************************************************
|
|
94
|
+
|
|
95
|
+
# Records a warning on the result of the waiting test, where the tester will see it,
|
|
96
|
+
# since problems with response selection stem from tester-provided input. The same
|
|
97
|
+
# input is evaluated for every incoming request, so a warning identical to one the
|
|
98
|
+
# result already has is not recorded again.
|
|
99
|
+
def add_result_warning(message)
|
|
100
|
+
messages_repo = Inferno::Repositories::Messages.new
|
|
101
|
+
return if messages_repo.messages_for_result(result.id).any? { |existing| existing.message == message }
|
|
102
|
+
|
|
103
|
+
messages_repo.create(result_id: result.id, type: 'warning', message:)
|
|
86
104
|
end
|
|
87
105
|
end
|
|
88
106
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'subscriptions_test_kit/tags'
|
|
4
|
+
|
|
3
5
|
module DaVinciPASTestKit
|
|
4
6
|
AUTH_TAG = 'pas_auth'
|
|
5
7
|
SUBMIT_TAG = 'pas_submit'
|
|
@@ -15,12 +17,15 @@ module DaVinciPASTestKit
|
|
|
15
17
|
CLAIM_UPDATE_ADD_ITEM_TAG = 'pas_claim_update_add_item'
|
|
16
18
|
CLAIM_UPDATE_MODIFY_CANCEL_TAG = 'pas_claim_update_modify_cancel'
|
|
17
19
|
CLAIM_UPDATE_CANCEL_ALL_TAG = 'pas_claim_update_cancel_all'
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
# Subscription tags must match the Subscriptions Test Kit, whose tests load requests tagged by PAS endpoints
|
|
21
|
+
NOTIFICATION_TAG = SubscriptionsTestKit::NOTIFICATION_TAG
|
|
22
|
+
SUBSCRIPTION_CREATE_TAG = SubscriptionsTestKit::SUBSCRIPTION_CREATE_TAG
|
|
23
|
+
SUBSCRIPTION_READ_TAG = SubscriptionsTestKit::SUBSCRIPTION_READ_TAG
|
|
24
|
+
SUBSCRIPTION_UPDATE_TAG = SubscriptionsTestKit::SUBSCRIPTION_UPDATE_TAG
|
|
25
|
+
SUBSCRIPTION_DELETE_TAG = SubscriptionsTestKit::SUBSCRIPTION_DELETE_TAG
|
|
26
|
+
SUBSCRIPTION_STATUS_TAG = SubscriptionsTestKit::SUBSCRIPTION_STATUS_TAG
|
|
27
|
+
REST_HOOK_HANDSHAKE_NOTIFICATION_TAG = SubscriptionsTestKit::REST_HOOK_HANDSHAKE_NOTIFICATION_TAG
|
|
28
|
+
REST_HOOK_EVENT_NOTIFICATION_TAG = SubscriptionsTestKit::REST_HOOK_EVENT_NOTIFICATION_TAG
|
|
24
29
|
OTHER_AUTH_TAG = 'other_auth'
|
|
25
30
|
OPERATION_FAILURE_WORKFLOW_TAG = 'pas_operation_failure_workflow'
|
|
26
31
|
PROCESSING_ERROR_WORKFLOW_TAG = 'pas_processing_error_workflow'
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module DaVinciPASTestKit
|
|
2
|
+
# Shared FHIR resource validator configuration for the PAS suites.
|
|
3
|
+
|
|
4
|
+
# IGs loaded by the validators in each version's suites.
|
|
5
|
+
V201_VALIDATOR_IGS = ['hl7.fhir.us.davinci-pas#2.0.1'].freeze
|
|
6
|
+
V221_VALIDATOR_IGS = ['hl7.fhir.us.davinci-pas#2.2.1', 'hl7.fhir.us.core#6.1.0'].freeze
|
|
7
|
+
|
|
8
|
+
# The validator for resources Inferno sends to the system under test, which may be tester-provided.
|
|
9
|
+
# It doesn't allow extensions beyond those defined in the IGs it loads, so that the system under
|
|
10
|
+
# test drives its behavior only from standard information. Currently defined by the client suites.
|
|
11
|
+
# Bundles should be validated with it using PasBundleValidation#perform_no_custom_extensions_validation.
|
|
12
|
+
NO_CUSTOM_EXTENSIONS_VALIDATOR = :no_custom_extensions
|
|
13
|
+
|
|
14
|
+
# SNOMED CT US Edition, used by the validators for SNOMED CT code validation.
|
|
15
|
+
SNOMED_CT_US_EDITION = '731000124108'.freeze
|
|
16
|
+
end
|