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.
Files changed (334) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/g33_br_provider.json +13 -0
  3. data/config/presets/pas_client_example.json +2 -2
  4. data/config/presets/pas_client_v201_run_against_pas_server.json +2 -2
  5. data/config/presets/pas_client_v221_run_against_pas_server.json +3 -3
  6. data/config/presets/pas_ri.json +6 -6
  7. data/config/presets/pas_server_v201_run_against_pas_client.json.erb +6 -6
  8. data/config/presets/pas_server_v221_run_against_pas_client.json.erb +10 -10
  9. data/lib/davinci_pas_test_kit/client/abstract_approval_submit_test.rb +28 -17
  10. data/lib/davinci_pas_test_kit/client/abstract_denial_submit_test.rb +26 -16
  11. data/lib/davinci_pas_test_kit/client/abstract_gather_must_support_test.rb +45 -74
  12. data/lib/davinci_pas_test_kit/client/abstract_modification_submit_test.rb +29 -19
  13. data/lib/davinci_pas_test_kit/client/abstract_response_attest.rb +75 -6
  14. data/lib/davinci_pas_test_kit/client/abstract_subscription_create_test.rb +26 -9
  15. data/lib/davinci_pas_test_kit/client/abstract_subscription_update_delete_test.rb +91 -0
  16. data/lib/davinci_pas_test_kit/client/client_bundle_validation_helper.rb +245 -0
  17. data/lib/davinci_pas_test_kit/client/client_input_descriptions.rb +96 -1
  18. data/lib/davinci_pas_test_kit/client/endpoints/claim_endpoint.rb +128 -72
  19. data/lib/davinci_pas_test_kit/client/endpoints/endpoint_session_identification.rb +24 -0
  20. data/lib/davinci_pas_test_kit/client/endpoints/expired_token.rb +40 -0
  21. data/lib/davinci_pas_test_kit/client/endpoints/subscription_create_endpoint.rb +7 -12
  22. data/lib/davinci_pas_test_kit/client/endpoints/subscription_delete_endpoint.rb +13 -0
  23. data/lib/davinci_pas_test_kit/client/endpoints/subscription_read_endpoint.rb +13 -0
  24. data/lib/davinci_pas_test_kit/client/endpoints/subscription_status_endpoint.rb +15 -20
  25. data/lib/davinci_pas_test_kit/client/endpoints/subscription_update_endpoint.rb +13 -0
  26. data/lib/davinci_pas_test_kit/client/endpoints/token_endpoint.rb +16 -0
  27. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_inquire_request_must_support_beneficiary_test.rb +3 -3
  28. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_inquire_response_must_support_beneficiary_test.rb +3 -3
  29. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_submit_request_must_support_beneficiary_test.rb +3 -3
  30. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_submit_response_must_support_beneficiary_test.rb +3 -3
  31. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claim_inquiry/client_inquire_request_must_support_claim_inquiry_test.rb +3 -3
  32. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claim_update/client_submit_request_must_support_claim_update_test.rb +3 -3
  33. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claiminquiryresponse/client_inquire_response_must_support_claiminquiryresponse_test.rb +3 -3
  34. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claimresponse/client_submit_response_must_support_claimresponse_test.rb +3 -3
  35. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/communication_request/client_submit_response_must_support_communication_request_test.rb +3 -3
  36. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/coverage/client_inquire_request_must_support_coverage_test.rb +3 -3
  37. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/coverage/client_submit_request_must_support_coverage_test.rb +3 -3
  38. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/encounter/client_submit_request_must_support_encounter_test.rb +3 -3
  39. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_inquire_request_must_support_insurer_test.rb +3 -3
  40. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_inquire_response_must_support_insurer_test.rb +3 -3
  41. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_submit_request_must_support_insurer_test.rb +3 -3
  42. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_submit_response_must_support_insurer_test.rb +3 -3
  43. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_inquire_must_support_group.rb +1 -1
  44. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_inquire_response_must_support_group.rb +9 -31
  45. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_submit_must_support_group.rb +1 -1
  46. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_submit_response_must_support_group.rb +10 -32
  47. 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
  48. 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
  49. 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
  50. 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
  51. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_inquire_request_must_support_practitioner_test.rb +3 -3
  52. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_inquire_response_must_support_practitioner_test.rb +3 -3
  53. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_submit_request_must_support_practitioner_test.rb +3 -3
  54. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_submit_response_must_support_practitioner_test.rb +3 -3
  55. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_inquire_request_must_support_practitioner_role_test.rb +3 -3
  56. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_inquire_response_must_support_practitioner_role_test.rb +3 -3
  57. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_submit_request_must_support_practitioner_role_test.rb +3 -3
  58. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_submit_response_must_support_practitioner_role_test.rb +3 -3
  59. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_inquire_request_must_support_requestor_test.rb +3 -3
  60. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_inquire_response_must_support_requestor_test.rb +3 -3
  61. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_submit_request_must_support_requestor_test.rb +3 -3
  62. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_submit_response_must_support_requestor_test.rb +3 -3
  63. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/subscriber/client_inquire_request_must_support_subscriber_test.rb +3 -3
  64. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/subscriber/client_submit_request_must_support_subscriber_test.rb +3 -3
  65. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/beneficiary/client_inquire_response_must_support_beneficiary_test.rb +4 -3
  66. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/beneficiary/client_submit_response_must_support_beneficiary_test.rb +4 -3
  67. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claim_inquiry/client_inquire_request_must_support_claim_inquiry_test.rb +3 -3
  68. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claim_update/client_submit_request_must_support_claim_update_test.rb +3 -3
  69. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claiminquiryresponse/client_inquire_response_must_support_claiminquiryresponse_test.rb +4 -3
  70. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claimresponse/client_submit_response_must_support_claimresponse_test.rb +4 -3
  71. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/communication_request/client_submit_response_must_support_communication_request_test.rb +4 -3
  72. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/insurer/client_inquire_response_must_support_insurer_test.rb +4 -3
  73. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/insurer/client_submit_response_must_support_insurer_test.rb +4 -3
  74. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_inquire_must_support_group.rb +8 -6
  75. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_inquire_response_must_support_group.rb +9 -31
  76. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_submit_must_support_group.rb +13 -9
  77. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_submit_response_must_support_group.rb +10 -32
  78. 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
  79. 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
  80. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner/client_inquire_response_must_support_practitioner_test.rb +4 -3
  81. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner/client_submit_response_must_support_practitioner_test.rb +4 -3
  82. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner_role/client_inquire_response_must_support_practitioner_role_test.rb +4 -3
  83. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner_role/client_submit_response_must_support_practitioner_role_test.rb +4 -3
  84. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/requestor/client_inquire_response_must_support_requestor_test.rb +4 -3
  85. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/requestor/client_submit_response_must_support_requestor_test.rb +4 -3
  86. data/lib/davinci_pas_test_kit/client/jobs/send_pas_subscription_notification.rb +64 -3
  87. data/lib/davinci_pas_test_kit/client/pas_client_subscription_pas_conformance_test.rb +4 -3
  88. data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_other_display_test.rb +6 -4
  89. data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_smart_display_test.rb +8 -4
  90. data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_udap_display_test.rb +9 -4
  91. data/lib/davinci_pas_test_kit/client/registration/abstract_other_auth_attest_test.rb +5 -4
  92. data/lib/davinci_pas_test_kit/client/request_count_gating.rb +14 -0
  93. data/lib/davinci_pas_test_kit/client/response_generator.rb +50 -9
  94. data/lib/davinci_pas_test_kit/client/session_identification.rb +26 -7
  95. data/lib/davinci_pas_test_kit/client/subscription_notification_trigger.rb +80 -0
  96. data/lib/davinci_pas_test_kit/client/subscription_setup_requirement.rb +59 -0
  97. data/lib/davinci_pas_test_kit/client/user_input_response.rb +50 -10
  98. data/lib/davinci_pas_test_kit/client/v2.0.1/client_suite.rb +30 -15
  99. data/lib/davinci_pas_test_kit/client/v2.0.1/must_support/pas_client_must_support_request_profiles_test.rb +2 -2
  100. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_approval_group.rb +8 -7
  101. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_auth_smart_group.rb +4 -4
  102. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_auth_udap_group.rb +4 -4
  103. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_denial_group.rb +8 -7
  104. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_must_support_group.rb +38 -52
  105. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_pended_group.rb +28 -22
  106. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_registration_group.rb +2 -2
  107. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_subscription_setup_group.rb +2 -2
  108. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_workflows_group.rb +2 -2
  109. data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_inquire_request_bundle_validation_test.rb +15 -21
  110. data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_inquire_response_bundle_validation_test.rb +29 -29
  111. data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_pended_submit_test.rb +49 -40
  112. data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_request_bundle_validation_test.rb +15 -21
  113. data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_response_bundle_validation_test.rb +29 -29
  114. data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/attestation_instructions.rb +10 -0
  115. data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/client_data_element_expectations_attestation_test.rb +44 -0
  116. data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/client_provider_review_attestation_test.rb +45 -0
  117. data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/client_security_attestation_test.rb +42 -0
  118. data/lib/davinci_pas_test_kit/client/v2.2.1/attestations/client_subscription_error_recovery_attestation_test.rb +42 -0
  119. data/lib/davinci_pas_test_kit/client/v2.2.1/client_suite.rb +64 -12
  120. data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_operation_failure_submit_test.rb +20 -10
  121. data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_operation_outcome_validation_test.rb +11 -5
  122. data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_processing_error_response_validation_test.rb +21 -12
  123. data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_processing_error_submit_test.rb +19 -8
  124. data/lib/davinci_pas_test_kit/client/v2.2.1/must_support/must_support_with_attestation_option.rb +90 -40
  125. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_approval_group.rb +12 -11
  126. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_attestations_group.rb +32 -0
  127. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_auth_smart_group.rb +4 -4
  128. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_auth_udap_group.rb +4 -4
  129. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_claim_updates_group.rb +24 -6
  130. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_denial_group.rb +12 -10
  131. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_modification_group.rb +13 -14
  132. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_must_support_group.rb +55 -59
  133. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_operation_failure_group.rb +8 -5
  134. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_pended_group.rb +53 -41
  135. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_processing_error_group.rb +9 -7
  136. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_registration_group.rb +2 -2
  137. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_subscription_setup_group.rb +9 -4
  138. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_subscription_update_delete_group.rb +57 -0
  139. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_workflows_group.rb +22 -2
  140. data/lib/davinci_pas_test_kit/client/v2.2.1/subscription/pas_client_subscription_create_test.rb +2 -1
  141. data/lib/davinci_pas_test_kit/client/v2.2.1/subscription/pas_client_subscription_put_update_pas_conformance_test.rb +49 -0
  142. data/lib/davinci_pas_test_kit/client/v2.2.1/subscription/pas_client_subscription_update_delete_test.rb +12 -0
  143. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_referenced_resources_test.rb +5 -6
  144. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_submit_tests.rb +82 -56
  145. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_inquire_request_bundle_validation_test.rb +17 -20
  146. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_inquire_response_bundle_validation_test.rb +59 -27
  147. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_modification_verification_test.rb +0 -3
  148. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_pended_send_notification_test.rb +138 -0
  149. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_pended_submit_test.rb +32 -85
  150. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_request_bundle_validation_test.rb +16 -21
  151. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_response_bundle_validation_test.rb +27 -27
  152. data/lib/davinci_pas_test_kit/cross_suite/fhirpath_utils.rb +13 -3
  153. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/beneficiary/metadata.yml +4 -0
  154. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/claim_inquiry/metadata.yml +15 -0
  155. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/claim_update/metadata.yml +17 -0
  156. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/claiminquiryresponse/metadata.yml +15 -0
  157. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/claimresponse/metadata.yml +15 -0
  158. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/communication_request/metadata.yml +4 -0
  159. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/coverage/metadata.yml +1 -0
  160. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/device_request/metadata.yml +2 -0
  161. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/encounter/metadata.yml +3 -0
  162. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/insurer/metadata.yml +1 -0
  163. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/medication_request/metadata.yml +2 -0
  164. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/metadata.yml +143 -0
  165. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/nutrition_order/metadata.yml +2 -0
  166. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/pas_inquiry_request_bundle/metadata.yml +2 -0
  167. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/pas_inquiry_response_bundle/metadata.yml +2 -0
  168. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/pas_request_bundle/metadata.yml +2 -0
  169. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/pas_response_bundle/metadata.yml +2 -0
  170. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/practitioner/metadata.yml +1 -0
  171. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/practitioner_role/metadata.yml +1 -0
  172. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/requestor/metadata.yml +1 -0
  173. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/service_request/metadata.yml +3 -0
  174. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/subscriber/metadata.yml +4 -0
  175. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.0.1/task/metadata.yml +1 -4
  176. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/beneficiary/metadata.yml +1 -0
  177. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claim_inquiry/metadata.yml +23 -0
  178. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claim_update/metadata.yml +31 -0
  179. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claiminquiryresponse/metadata.yml +42 -0
  180. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claimresponse/metadata.yml +42 -0
  181. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/communication_request/metadata.yml +4 -0
  182. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/coverage/metadata.yml +1 -0
  183. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/device_request/metadata.yml +2 -0
  184. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/encounter/metadata.yml +3 -0
  185. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/insurer/metadata.yml +1 -0
  186. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/medication_request/metadata.yml +2 -0
  187. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/metadata.yml +265 -1
  188. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/nutrition_order/metadata.yml +2 -0
  189. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_inquiry_request_bundle/metadata.yml +2 -0
  190. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_inquiry_response_bundle/metadata.yml +2 -0
  191. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_request_bundle/metadata.yml +2 -0
  192. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_response_bundle/metadata.yml +2 -0
  193. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/practitioner/metadata.yml +1 -0
  194. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/practitioner_role/metadata.yml +1 -0
  195. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/requestor/metadata.yml +1 -0
  196. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/service_request/metadata.yml +3 -0
  197. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/subscriber/metadata.yml +1 -0
  198. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/task/metadata.yml +4 -4
  199. data/lib/davinci_pas_test_kit/cross_suite/pas_bundle_validation.rb +570 -312
  200. data/lib/davinci_pas_test_kit/cross_suite/pas_constants.rb +13 -0
  201. data/lib/davinci_pas_test_kit/cross_suite/pas_datatype_constraints.rb +166 -0
  202. data/lib/davinci_pas_test_kit/cross_suite/pas_subscription_verification.rb +8 -4
  203. data/lib/davinci_pas_test_kit/cross_suite/referenced_resource_presence_validation.rb +141 -0
  204. data/lib/davinci_pas_test_kit/cross_suite/response_selection_utils.rb +39 -21
  205. data/lib/davinci_pas_test_kit/cross_suite/tags.rb +11 -6
  206. data/lib/davinci_pas_test_kit/cross_suite/validator_configuration.rb +16 -0
  207. data/lib/davinci_pas_test_kit/cross_suite/validator_suppressions.rb +210 -146
  208. data/lib/davinci_pas_test_kit/docs/demo/PAS Client Suite Demonstration.postman_collection.json +7 -7
  209. data/lib/davinci_pas_test_kit/ext/inferno_core/runnable.rb +1 -0
  210. data/lib/davinci_pas_test_kit/generator/client_must_support_group_generator.rb +47 -16
  211. data/lib/davinci_pas_test_kit/generator/must_support_target_profiles.rb +17 -0
  212. data/lib/davinci_pas_test_kit/generator/must_support_test_generator.rb +14 -2
  213. data/lib/davinci_pas_test_kit/generator/pas_must_support_metadata_extractor.rb +1 -2
  214. data/lib/davinci_pas_test_kit/generator/profile_metadata.rb +1 -1
  215. data/lib/davinci_pas_test_kit/generator/server_must_support_group_generator.rb +23 -0
  216. data/lib/davinci_pas_test_kit/generator/server_suite_generator.rb +8 -7
  217. data/lib/davinci_pas_test_kit/generator/templates/client_must_support_group.rb.erb +22 -3
  218. data/lib/davinci_pas_test_kit/generator/templates/client_must_support_response_group.rb.erb +7 -16
  219. data/lib/davinci_pas_test_kit/generator/templates/must_support.rb.erb +11 -10
  220. data/lib/davinci_pas_test_kit/generator/templates/server_must_support_group.rb.erb +22 -0
  221. data/lib/davinci_pas_test_kit/generator/templates/server_suite.rb.erb +9 -11
  222. data/lib/davinci_pas_test_kit/generator/templates/use_case_group.rb.erb +3 -0
  223. data/lib/davinci_pas_test_kit/generator/use_case_group_generator.rb +19 -13
  224. data/lib/davinci_pas_test_kit/parameters_helper.rb +13 -5
  225. data/lib/davinci_pas_test_kit/pas_notification_conformance_test.rb +2 -2
  226. data/lib/davinci_pas_test_kit/requirements/davinci_pas_test_kit_requirements.csv +14 -7
  227. data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_client_suite_v201_requirements_coverage.csv +21 -21
  228. data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_client_suite_v221_requirements_coverage.csv +30 -26
  229. data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_server_suite_v221_requirements_coverage.csv +39 -33
  230. data/lib/davinci_pas_test_kit/requirements/hl7.fhir.us.davinci-pas_2.2.1_requirements.xlsx +0 -0
  231. data/lib/davinci_pas_test_kit/server/claim_operation_logic.rb +1 -1
  232. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/beneficiary/server_inquire_request_must_support_beneficiary_test.rb +1 -1
  233. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/beneficiary/server_inquire_response_must_support_beneficiary_test.rb +1 -1
  234. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/beneficiary/server_submit_request_must_support_beneficiary_test.rb +1 -1
  235. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/beneficiary/server_submit_response_must_support_beneficiary_test.rb +1 -1
  236. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/claim_inquiry/server_inquire_request_must_support_claim_inquiry_test.rb +1 -1
  237. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/claim_update/server_submit_request_must_support_claim_update_test.rb +1 -1
  238. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/claiminquiryresponse/server_inquire_response_must_support_claiminquiryresponse_test.rb +1 -1
  239. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/claimresponse/server_submit_response_must_support_claimresponse_test.rb +1 -1
  240. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/communication_request/server_submit_response_must_support_communication_request_test.rb +1 -1
  241. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/coverage/server_inquire_request_must_support_coverage_test.rb +1 -1
  242. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/coverage/server_submit_request_must_support_coverage_test.rb +1 -1
  243. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/encounter/server_submit_request_must_support_encounter_test.rb +1 -1
  244. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_inquire_request_must_support_insurer_test.rb +1 -1
  245. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_inquire_response_must_support_insurer_test.rb +1 -1
  246. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_submit_request_must_support_insurer_test.rb +1 -1
  247. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_submit_response_must_support_insurer_test.rb +1 -1
  248. 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
  249. 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
  250. 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
  251. 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
  252. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_approval_use_case_group.rb +4 -3
  253. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_denial_use_case_group.rb +4 -3
  254. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_pended_use_case_group.rb +7 -6
  255. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_inquire_request_must_support_practitioner_test.rb +1 -1
  256. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_inquire_response_must_support_practitioner_test.rb +1 -1
  257. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_submit_request_must_support_practitioner_test.rb +1 -1
  258. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_submit_response_must_support_practitioner_test.rb +1 -1
  259. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_inquire_request_must_support_practitioner_role_test.rb +1 -1
  260. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_inquire_response_must_support_practitioner_role_test.rb +1 -1
  261. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_submit_request_must_support_practitioner_role_test.rb +1 -1
  262. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_submit_response_must_support_practitioner_role_test.rb +1 -1
  263. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_inquire_request_must_support_requestor_test.rb +1 -1
  264. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_inquire_response_must_support_requestor_test.rb +1 -1
  265. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_submit_request_must_support_requestor_test.rb +1 -1
  266. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_submit_response_must_support_requestor_test.rb +1 -1
  267. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/server_suite.rb +9 -11
  268. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/subscriber/server_inquire_request_must_support_subscriber_test.rb +1 -1
  269. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/subscriber/server_submit_request_must_support_subscriber_test.rb +1 -1
  270. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/task/server_inquire_response_must_support_task_test.rb +1 -1
  271. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/task/server_submit_response_must_support_task_test.rb +1 -1
  272. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_inquire_request_must_support_beneficiary_test.rb +1 -1
  273. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_inquire_response_must_support_beneficiary_test.rb +1 -1
  274. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_submit_request_must_support_beneficiary_test.rb +1 -1
  275. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_submit_response_must_support_beneficiary_test.rb +1 -1
  276. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claim_inquiry/server_inquire_request_must_support_claim_inquiry_test.rb +1 -1
  277. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claim_update/server_submit_request_must_support_claim_update_test.rb +1 -1
  278. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claiminquiryresponse/server_inquire_response_must_support_claiminquiryresponse_test.rb +3 -1
  279. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claimresponse/server_submit_response_must_support_claimresponse_test.rb +3 -1
  280. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/communication_request/server_submit_response_must_support_communication_request_test.rb +1 -1
  281. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/coverage/server_inquire_request_must_support_coverage_test.rb +1 -1
  282. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/coverage/server_submit_request_must_support_coverage_test.rb +1 -1
  283. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/encounter/server_submit_request_must_support_encounter_test.rb +1 -1
  284. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_inquire_request_must_support_insurer_test.rb +1 -1
  285. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_inquire_response_must_support_insurer_test.rb +1 -1
  286. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_submit_request_must_support_insurer_test.rb +1 -1
  287. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_submit_response_must_support_insurer_test.rb +1 -1
  288. 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
  289. 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
  290. 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
  291. 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
  292. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_approval_use_case_group.rb +5 -3
  293. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_denial_use_case_group.rb +5 -3
  294. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_must_support_group.rb +12 -0
  295. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_pended_use_case_group.rb +9 -4
  296. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_inquire_request_must_support_practitioner_test.rb +1 -1
  297. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_inquire_response_must_support_practitioner_test.rb +1 -1
  298. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_submit_request_must_support_practitioner_test.rb +1 -1
  299. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_submit_response_must_support_practitioner_test.rb +1 -1
  300. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_inquire_request_must_support_practitioner_role_test.rb +1 -1
  301. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_inquire_response_must_support_practitioner_role_test.rb +1 -1
  302. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_submit_request_must_support_practitioner_role_test.rb +1 -1
  303. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_submit_response_must_support_practitioner_role_test.rb +1 -1
  304. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_inquire_request_must_support_requestor_test.rb +1 -1
  305. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_inquire_response_must_support_requestor_test.rb +1 -1
  306. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_submit_request_must_support_requestor_test.rb +1 -1
  307. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_submit_response_must_support_requestor_test.rb +1 -1
  308. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/server_suite.rb +9 -11
  309. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/subscriber/server_inquire_request_must_support_subscriber_test.rb +1 -1
  310. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/subscriber/server_submit_request_must_support_subscriber_test.rb +1 -1
  311. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/task/server_inquire_response_must_support_task_test.rb +1 -1
  312. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/task/server_submit_response_must_support_task_test.rb +1 -1
  313. data/lib/davinci_pas_test_kit/server/pas_claim_response_decision_test.rb +2 -2
  314. data/lib/davinci_pas_test_kit/server/server_request_bundle_validation_test.rb +4 -6
  315. data/lib/davinci_pas_test_kit/server/server_response_bundle_validation_test.rb +17 -10
  316. data/lib/davinci_pas_test_kit/server/v2.0.1/must_support/pas_server_must_support_request_profiles_test.rb +1 -1
  317. data/lib/davinci_pas_test_kit/server/v2.0.1/pas_server_subscription_setup.rb +1 -1
  318. data/lib/davinci_pas_test_kit/server/v2.2.1/claim_inquiry/server_claim_inquiry_response_tests.rb +89 -0
  319. data/lib/davinci_pas_test_kit/server/v2.2.1/must_support/pas_server_must_support_request_profiles_test.rb +1 -1
  320. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_error_group.rb +2 -0
  321. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_claim_inquiry_responses_group.rb +17 -0
  322. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_claim_updates_group.rb +1 -1
  323. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_no_custom_extensions_test.rb +241 -0
  324. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_subscription_capability_statement_test.rb +40 -0
  325. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_subscription_setup.rb +15 -10
  326. data/lib/davinci_pas_test_kit/server/v2.2.1/server_replaced_pa_inquire_reference_input_test.rb +63 -0
  327. data/lib/davinci_pas_test_kit/server/v2.2.1/server_replaced_pa_inquire_reference_test.rb +109 -0
  328. data/lib/davinci_pas_test_kit/version.rb +2 -2
  329. metadata +38 -13
  330. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/task/client_inquire_response_must_support_task_test.rb +0 -45
  331. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/task/client_submit_response_must_support_task_test.rb +0 -45
  332. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/task/client_inquire_response_must_support_task_test.rb +0 -55
  333. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/task/client_submit_response_must_support_task_test.rb +0 -55
  334. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_error_handling_group.rb +0 -20
@@ -1,7 +1,9 @@
1
1
  require_relative '../user_input_response'
2
+ require_relative 'endpoint_session_identification'
3
+ require_relative 'expired_token'
2
4
  require_relative '../response_generator'
5
+ require_relative '../subscription_notification_trigger'
3
6
  require_relative '../client_urls'
4
- require_relative '../jobs/send_pas_subscription_notification'
5
7
  require_relative '../../cross_suite/fhirpath_utils'
6
8
  require_relative '../../cross_suite/response_selection_utils'
7
9
  require 'subscriptions_test_kit'
@@ -11,24 +13,25 @@ module DaVinciPASTestKit
11
13
  class ClaimEndpoint < Inferno::DSL::SuiteEndpoint
12
14
  include SubscriptionsTestKit::SubscriptionsR5BackportR4Client::SubscriptionSimulationUtils
13
15
  include ResponseGenerator
16
+ include SubscriptionNotificationTrigger
14
17
  include ClientURLs
15
18
  include FhirpathUtils
16
19
  include ResponseSelectionUtils
20
+ include EndpointSessionIdentification
21
+ include ExpiredToken
17
22
 
18
23
  # override the one from URLs to make it version specific
19
24
  def suite_id
20
25
  request.path.split('/custom/')[1].split('/')[0] # request.path = {base inferno path}/custom/{suite_id}/...
21
26
  end
22
27
 
23
- def test_run_identifier
24
- return request.params[:session_path] if request.params[:session_path].present?
25
-
26
- UDAPSecurityTestKit::MockUDAPServer.issued_token_to_client_id(
27
- request.headers['authorization']&.delete_prefix('Bearer ')
28
- )
29
- end
28
+ error_response_format :operation_outcome
30
29
 
31
30
  def tags
31
+ # Requests rejected for an expired token or a rejected $inquire are not treated as
32
+ # submissions of any workflow.
33
+ return [] if expired_token? || !operation_enabled?
34
+
32
35
  operation_tag = operation == 'submit' ? SUBMIT_TAG : INQUIRE_TAG
33
36
  workflow_tag = WORKFLOW_TAG_MAP[workflow]
34
37
 
@@ -52,6 +55,13 @@ module DaVinciPASTestKit
52
55
  test.config.options[:suppress_notifications] == true
53
56
  end
54
57
 
58
+ # Tests must opt in to each operation with the submit_enabled and inquire_enabled options. Inferno responds
59
+ # to every request for an operation that is not enabled with an OperationOutcome, without tagging the
60
+ # request or continuing the test.
61
+ def operation_enabled?
62
+ %w[inquire submit].include?(operation) && test.config.options[:"#{operation}_enabled"] == true
63
+ end
64
+
55
65
  def workflow
56
66
  case test.id
57
67
  when /.*pended.*/
@@ -70,7 +80,7 @@ module DaVinciPASTestKit
70
80
  end
71
81
 
72
82
  def must_support_workflow?
73
- test.id =~ /.*must_support.*/ || test.id =~ /.*gather_must_support.*/
83
+ test.id =~ /.*must_support.*/
74
84
  end
75
85
 
76
86
  WORKFLOW_TAG_MAP = {
@@ -87,6 +97,11 @@ module DaVinciPASTestKit
87
97
 
88
98
  response.format = :json
89
99
 
100
+ unless operation_enabled?
101
+ make_rejected_operation_response
102
+ return
103
+ end
104
+
90
105
  # Handle the operation failure and processing error workflows, which require a user-provided response.
91
106
  if workflow == :operation_failure
92
107
  make_operation_failure_response
@@ -136,10 +151,11 @@ module DaVinciPASTestKit
136
151
  end
137
152
 
138
153
  def update_result
139
- if UDAPSecurityTestKit::MockUDAPServer.request_has_expired_token?(request)
154
+ if expired_token?
140
155
  UDAPSecurityTestKit::MockUDAPServer.update_response_for_expired_token(response, 'Bearer token')
141
156
  return
142
157
  end
158
+ return unless operation_enabled? # keep waiting for the request that the test is looking for
143
159
 
144
160
  results_repo.update_result(result.id, 'pass') unless test.config.options[:accepts_multiple_requests]
145
161
  end
@@ -152,27 +168,39 @@ module DaVinciPASTestKit
152
168
  private
153
169
 
154
170
  # Resolves the user-provided response, using criteria-based selection for must support
155
- # workflows or the single-response approach for other workflows.
171
+ # workflows or the single-response approach for other workflows
172
+ # and replaces {{fhirpath}} tokens with values from the request.
156
173
  def resolve_user_response(req_bundle)
157
- if must_support_workflow?
158
- select_must_support_response(req_bundle)
159
- else
160
- UserInputResponse.user_inputted_response(test, operation, result)
161
- end
174
+ user_response = if must_support_workflow?
175
+ select_must_support_response(req_bundle)
176
+ else
177
+ UserInputResponse.user_inputted_response(test, operation, result)
178
+ end
179
+
180
+ return nil unless user_response.present?
181
+
182
+ replace_tokens(user_response, req_bundle)
183
+ rescue FhirpathUtils::FhirpathServiceError => e
184
+ add_result_warning(
185
+ 'Unable to instantiate a tester-provided response, so Inferno will generate a default response: ' \
186
+ "#{e.message}"
187
+ )
188
+ nil
162
189
  end
163
190
 
164
191
  # Selects the first tester-provided response candidate whose selection criteria all
165
192
  # match the incoming request, extracts its response Bundle (unwrapping it when the
166
- # candidate pairs the Bundle with criteria), and replaces {{fhirpath}} tokens with
167
- # values from the request. Returns nil, causing Inferno to generate a default
168
- # response, if no candidates are provided or none match.
193
+ # candidate pairs the Bundle with criteria). Returns nil, causing Inferno to generate a default
194
+ # response, if no candidates are provided or none match. Problems with the
195
+ # tester-provided input or the FHIRPath service also result in nil, with a warning
196
+ # on the waiting test so that the tester can see what went wrong.
169
197
  def select_must_support_response(req_bundle)
170
- candidates = UserInputResponse.response_candidates(result, operation)
198
+ candidates = UserInputResponse.response_candidates(test, operation, result)
171
199
  return if candidates.blank?
172
200
 
173
201
  operation_url_suffix = "$#{operation}"
174
202
  request_number = count_previous_successful_requests(operation_url_suffix) + 1
175
- selected_index = candidates.index { |candidate| include_entity?(candidate, req_bundle, operation_url_suffix) }
203
+ selected_index = candidates.index { |candidate| include_entity?(candidate, req_bundle, request_number) }
176
204
 
177
205
  if selected_index.nil?
178
206
  Inferno::Application['logger'].info(
@@ -186,17 +214,33 @@ module DaVinciPASTestKit
186
214
  "Selected tester-provided response bundle #{selected_index + 1} of #{candidates.length} " \
187
215
  "for #{operation_url_suffix} request ##{request_number}."
188
216
  )
189
- replace_tokens(entity_bundle(candidates[selected_index]), req_bundle)
217
+ entity_response(candidates[selected_index])
218
+ rescue UserInputResponse::InvalidInputError, FhirpathUtils::FhirpathServiceError => e
219
+ add_result_warning(
220
+ 'Unable to select a tester-provided response, so Inferno will generate a default response: ' \
221
+ "#{e.message}"
222
+ )
223
+ nil
190
224
  end
191
225
 
192
- # Round-trips the selected bundle through the FHIR model to normalize it after
193
- # token replacement. Falls back to the replaced string if it no longer parses,
194
- # e.g., when a replaced value breaks the JSON structure.
226
+ # Replaces {{fhirpath}} tokens using values from the incoming request, round-tripping
227
+ # the result through the FHIR model to normalize it. The response may be a parsed hash
228
+ # (must support workflow) or the raw JSON string of a single input. If a replaced value
229
+ # breaks the JSON structure, the result cannot be returned as a FHIR response, so nil is
230
+ # returned with a warning on the waiting test and Inferno generates a default response.
195
231
  def replace_tokens(bundle_hash, req_bundle)
196
- replaced = replace_tokens_in_string(bundle_hash.to_json, req_bundle)
232
+ bundle_json = bundle_hash.is_a?(String) ? bundle_hash : bundle_hash.to_json
233
+ replaced = replace_tokens_in_string(bundle_json, req_bundle)
234
+ return bundle_json if replaced.equal?(bundle_json)
235
+
197
236
  FHIR.from_contents(replaced)&.to_json || replaced
198
237
  rescue JSON::ParserError
199
- replaced
238
+ add_result_warning(
239
+ 'Unable to use the selected tester-provided response, so Inferno will generate a default response. ' \
240
+ 'The response is not valid JSON after {{fhirpath}} token replacement, for example because a token ' \
241
+ 'value contains a double quote.'
242
+ )
243
+ nil
200
244
  end
201
245
 
202
246
  def handle_missing_required_elements(claim_entry, response)
@@ -236,68 +280,80 @@ module DaVinciPASTestKit
236
280
  end
237
281
 
238
282
  def make_processing_error_response
239
- user_provided_bundle = UserInputResponse.user_inputted_response(test, operation, result)
240
- unless user_provided_bundle.present?
241
- response.status = 400
242
- response.body = FHIR::OperationOutcome.new(
243
- issue: FHIR::OperationOutcome::Issue.new(
244
- severity: 'fatal', code: 'required',
245
- details: FHIR::CodeableConcept.new(
246
- text: 'The processing_error_response input is required for this test and was not provided.'
247
- )
248
- )
249
- ).to_json
283
+ unless UserInputResponse.user_inputted_response(test, operation, result).present?
284
+ error_outcome_response('The processing_error_response input is required for this test and was not provided.')
285
+ return
286
+ end
287
+
288
+ req_bundle = FHIR.from_contents(request.body.string)
289
+ if req_bundle.blank?
290
+ handle_missing_required_elements(nil, response)
291
+ return
292
+ end
293
+
294
+ # Unlike other workflows, there is no mocked response to fall back to when instantiation fails.
295
+ instantiated_response = resolve_user_response(req_bundle)
296
+ if instantiated_response.blank?
297
+ error_outcome_response('The processing_error_response input could not be instantiated. ' \
298
+ 'See the warnings on the waiting test for details.')
250
299
  return
251
300
  end
252
301
 
302
+ claim_entry = req_bundle.entry&.find { |e| e&.resource&.resourceType == 'Claim' }
253
303
  response.status = 200
254
- response.body = user_provided_bundle
304
+ response.body = update_tester_provided_response(instantiated_response, claim_entry&.fullUrl, operation,
305
+ ig_version)
306
+ end
307
+
308
+ def make_rejected_operation_response
309
+ response.status = 501
310
+ response.body = FHIR::OperationOutcome.new(
311
+ issue: FHIR::OperationOutcome::Issue.new(
312
+ severity: 'error', code: 'not-supported',
313
+ details: FHIR::CodeableConcept.new(
314
+ text: "Inferno does not support the $#{operation} operation during this test."
315
+ )
316
+ )
317
+ ).to_json
318
+ end
319
+
320
+ def error_outcome_response(text)
321
+ response.status = 400
322
+ response.body = FHIR::OperationOutcome.new(
323
+ issue: FHIR::OperationOutcome::Issue.new(
324
+ severity: 'fatal', code: 'required', details: FHIR::CodeableConcept.new(text:)
325
+ )
326
+ ).to_json
255
327
  end
256
328
 
257
329
  def operation
258
- request.url&.split('$')&.last
330
+ request.path.split('$').last
259
331
  end
260
332
 
261
- def start_notification_job(response_bundle_json, decision, generated_claim_response_uuid)
262
- notification_bearer_token = client_access_token_input(result)
263
- notification_contents = notification_json(response_bundle_json, decision, generated_claim_response_uuid)
333
+ # Helper methods for SubscriptionNotificationTrigger
264
334
 
265
- Inferno::Jobs.perform(Jobs::SendPASSubscriptionNotification, test_run.id, test_run.test_session_id, result.id,
266
- notification_bearer_token, notification_contents, test_run_identifier, suite_id,
267
- ig_version)
335
+ def notification_test_run_id
336
+ test_run.id
268
337
  end
269
338
 
270
- def notification_json(response_bundle_json, decision, generated_claim_response_uuid)
271
- user_inputted_notification_json =
272
- JSON.parse(result.input_json).find { |i| i['name'] == 'notification_bundle' }['value']
339
+ def notification_test_session_id
340
+ test_run.test_session_id
341
+ end
273
342
 
274
- if user_inputted_notification_json.present?
275
- update_tester_provided_notification(user_inputted_notification_json, generated_claim_response_uuid)
276
- else
277
- generate_notification(response_bundle_json, decision)
278
- end
343
+ def notification_result_id
344
+ result.id
279
345
  end
280
346
 
281
- def generate_notification(response_bundle_json, decision)
282
- subscription = find_subscription(test_run.test_session_id, as_json: true)
283
- subscription_reference = "#{fhir_subscription_url}/#{subscription['id']}"
284
- subscription_topic = subscription['criteria']
285
-
286
- if find_subscription_content_type(subscription) == 'full-resource'
287
- mock_full_resource_notification_bundle(response_bundle_json, subscription_reference, subscription_topic,
288
- decision, ig_version)
289
- else # assume id-only since empty not allowed - if asked for empty, other failures will occur
290
- mock_id_only_notification_bundle(response_bundle_json, subscription_reference, subscription_topic,
291
- ig_version)
292
- end
347
+ def notification_bearer_token
348
+ client_access_token_input(result)
349
+ end
350
+
351
+ def tester_notification_bundle
352
+ notification_bundle_input(result)
293
353
  end
294
354
 
295
- def find_subscription_content_type(subscription)
296
- content_ext = subscription.dig('channel', '_payload', 'extension')
297
- &.find do |ext|
298
- ext['url'] == 'http://hl7.org/fhir/uv/subscriptions-backport/StructureDefinition/backport-payload-content'
299
- end
300
- content_ext&.dig('valueCode')
355
+ def client_subscription_json
356
+ find_subscription(test_run.test_session_id, as_json: true)
301
357
  end
302
358
  end
303
359
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'udap_security_test_kit'
4
+
5
+ module DaVinciPASTestKit
6
+ # Identifies the test session for the claim and Subscription endpoints, using either the session
7
+ # path or the client id embedded in the bearer token.
8
+ module EndpointSessionIdentification
9
+ # Where the session identifier is expected. Used in responses when no session is found.
10
+ LOCATION_DESCRIPTION = 'the path or embedded within the bearer token in the Authorization header'
11
+
12
+ def test_run_identifier_location_description
13
+ LOCATION_DESCRIPTION
14
+ end
15
+
16
+ def test_run_identifier
17
+ return request.params[:session_path] if request.params[:session_path].present?
18
+
19
+ UDAPSecurityTestKit::MockUDAPServer.issued_token_to_client_id(
20
+ request.headers['authorization']&.delete_prefix('Bearer ')
21
+ )
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'udap_security_test_kit'
4
+
5
+ module DaVinciPASTestKit
6
+ # Checks whether the request's bearer token has expired.
7
+ module ExpiredToken
8
+ private
9
+
10
+ # Memoized so the token is only decoded and parsed once per request, even though both
11
+ # #tags and the response handling need to check it.
12
+ def expired_token?
13
+ return @expired_token if defined?(@expired_token)
14
+
15
+ @expired_token = UDAPSecurityTestKit::MockUDAPServer.request_has_expired_token?(request)
16
+ end
17
+ end
18
+
19
+ # Prepended to endpoints that reject requests made with an expired bearer token before any other
20
+ # handling.
21
+ module ExpiredTokenRejection
22
+ include ExpiredToken
23
+
24
+ def make_response
25
+ if expired_token?
26
+ UDAPSecurityTestKit::MockUDAPServer.update_response_for_expired_token(response, 'Bearer token')
27
+ return
28
+ end
29
+
30
+ super
31
+ end
32
+
33
+ def tags
34
+ # Requests rejected for an expired token are not treated as submissions of any workflow.
35
+ return [] if expired_token?
36
+
37
+ super
38
+ end
39
+ end
40
+ end
@@ -1,25 +1,18 @@
1
1
  require_relative '../../cross_suite/tags'
2
+ require_relative 'endpoint_session_identification'
3
+ require_relative 'expired_token'
2
4
  require_relative '../jobs/send_subscription_handshake'
3
5
  require 'subscriptions_test_kit'
4
6
 
5
7
  module DaVinciPASTestKit
6
8
  class SubscriptionCreateEndpoint < Inferno::DSL::SuiteEndpoint
7
9
  include SubscriptionsTestKit::SubscriptionsR5BackportR4Client::SubscriptionSimulationUtils
10
+ include EndpointSessionIdentification
11
+ prepend ExpiredTokenRejection
8
12
 
9
- def test_run_identifier
10
- return request.params[:session_path] if request.params[:session_path].present?
11
-
12
- UDAPSecurityTestKit::MockUDAPServer.issued_token_to_client_id(
13
- request.headers['authorization']&.delete_prefix('Bearer ')
14
- )
15
- end
13
+ error_response_format :operation_outcome
16
14
 
17
15
  def make_response
18
- if UDAPSecurityTestKit::MockUDAPServer.request_has_expired_token?(request)
19
- UDAPSecurityTestKit::MockUDAPServer.update_response_for_expired_token(response, 'Bearer token')
20
- return
21
- end
22
-
23
16
  response.format = :json
24
17
  response.status = 400
25
18
 
@@ -73,6 +66,8 @@ module DaVinciPASTestKit
73
66
  [SUBSCRIPTION_CREATE_TAG]
74
67
  end
75
68
 
69
+ private
70
+
76
71
  def verify_subscription(subscription)
77
72
  unless subscription.is_a? FHIR::Subscription
78
73
  return operation_outcome('error', 'invalid', 'No recognized R4 Subscription in request body')
@@ -0,0 +1,13 @@
1
+ require_relative '../../cross_suite/tags'
2
+ require_relative 'endpoint_session_identification'
3
+ require_relative 'expired_token'
4
+ require 'subscriptions_test_kit'
5
+
6
+ module DaVinciPASTestKit
7
+ class SubscriptionDeleteEndpoint < SubscriptionsTestKit::SubscriptionDeleteEndpoint
8
+ include EndpointSessionIdentification
9
+ prepend ExpiredTokenRejection
10
+
11
+ error_response_format :operation_outcome
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../../cross_suite/tags'
2
+ require_relative 'endpoint_session_identification'
3
+ require_relative 'expired_token'
4
+ require 'subscriptions_test_kit'
5
+
6
+ module DaVinciPASTestKit
7
+ class SubscriptionReadEndpoint < SubscriptionsTestKit::SubscriptionReadEndpoint
8
+ include EndpointSessionIdentification
9
+ prepend ExpiredTokenRejection
10
+
11
+ error_response_format :operation_outcome
12
+ end
13
+ end
@@ -1,34 +1,29 @@
1
1
  require_relative '../../cross_suite/tags'
2
+ require_relative 'endpoint_session_identification'
3
+ require_relative 'expired_token'
2
4
  require 'subscriptions_test_kit'
3
5
 
4
6
  module DaVinciPASTestKit
5
7
  class SubscriptionStatusEndpoint < Inferno::DSL::SuiteEndpoint
6
8
  include SubscriptionsTestKit::SubscriptionsR5BackportR4Client::SubscriptionSimulationUtils
7
9
  include ResponseGenerator
10
+ include EndpointSessionIdentification
11
+ prepend ExpiredTokenRejection
8
12
 
9
- def test_run_identifier
10
- return request.params[:session_path] if request.params[:session_path].present?
11
-
12
- UDAPSecurityTestKit::MockUDAPServer.issued_token_to_client_id(
13
- request.headers['authorization']&.delete_prefix('Bearer ')
14
- )
15
- end
13
+ error_response_format :operation_outcome
16
14
 
17
15
  def make_response
18
- if UDAPSecurityTestKit::MockUDAPServer.request_has_expired_token?(request)
19
- UDAPSecurityTestKit::MockUDAPServer.update_response_for_expired_token(response)
20
- return
21
- end
22
-
23
16
  response.format = :json
24
- subscription = find_subscription(test_run.test_session_id)
17
+ # Reflects any updates or deletion of the Subscription by the client
18
+ subscription = find_current_subscription(test_run.test_session_id)
25
19
 
26
- unless subscription.present?
20
+ subscription_id = request.params[:id]
21
+ if subscription.blank? || (subscription_id.present? && subscription_id != subscription.id)
27
22
  not_found
28
23
  return
29
24
  end
30
25
 
31
- subscription_id = request.params[:id]
26
+ status_code = current_subscription_status_code(subscription)
32
27
 
33
28
  # Handle resource-level status params
34
29
  unless subscription_id.present?
@@ -40,7 +35,7 @@ module DaVinciPASTestKit
40
35
  return
41
36
  end
42
37
 
43
- unless subscription_params_match?(params, subscription)
38
+ unless subscription_params_match?(params, subscription, status_code)
44
39
  not_found
45
40
  return
46
41
  end
@@ -48,7 +43,6 @@ module DaVinciPASTestKit
48
43
 
49
44
  subscription_url = "#{base_subscription_url}/#{subscription.id}"
50
45
  subscription_topic = subscription.criteria
51
- status_code = determine_subscription_status_code(subscription_id)
52
46
  event_count = determine_event_count(test_run.test_session_id)
53
47
 
54
48
  notification_json = notification_bundle_input(result)
@@ -69,20 +63,21 @@ module DaVinciPASTestKit
69
63
  response.status = 200
70
64
  end
71
65
 
72
- def subscription_params_match?(params, subscription)
66
+ def subscription_params_match?(params, subscription, status_code)
73
67
  id_params = find_params(params, 'id')
74
68
 
75
69
  return false if id_params&.any? && id_params&.none? { |p| p.valueString == subscription.id }
76
70
 
77
71
  status_params = find_params(params, 'status')
78
- subscription_status = determine_subscription_status_code(subscription.id)
79
- status_params.blank? || status_params.any? { |p| p.valueString == subscription_status }
72
+ status_params.blank? || status_params.any? { |p| p.valueString == status_code }
80
73
  end
81
74
 
82
75
  def tags
83
76
  [SUBSCRIPTION_STATUS_TAG]
84
77
  end
85
78
 
79
+ private
80
+
86
81
  def not_found
87
82
  response.status = 404
88
83
  response.body = operation_outcome('error', 'not-found').to_json
@@ -0,0 +1,13 @@
1
+ require_relative '../../cross_suite/tags'
2
+ require_relative 'endpoint_session_identification'
3
+ require_relative 'expired_token'
4
+ require 'subscriptions_test_kit'
5
+
6
+ module DaVinciPASTestKit
7
+ class SubscriptionUpdateEndpoint < SubscriptionsTestKit::SubscriptionUpdateEndpoint
8
+ include EndpointSessionIdentification
9
+ prepend ExpiredTokenRejection
10
+
11
+ error_response_format :operation_outcome
12
+ end
13
+ end
@@ -12,6 +12,22 @@ module DaVinciPASTestKit
12
12
 
13
13
  def test_run_identifier
14
14
  UDAPSecurityTestKit::MockUDAPServer.client_id_from_client_assertion(request.params[:client_assertion])
15
+ rescue JWT::DecodeError
16
+ nil
17
+ end
18
+
19
+ def test_run_identifier_location_description
20
+ "the client assertion's 'iss' claim representing the client's id"
21
+ end
22
+
23
+ def no_session_response
24
+ response.status = 401
25
+ response.format = :json
26
+ response.body = {
27
+ error: 'invalid_client',
28
+ error_description: no_session_message
29
+
30
+ }.to_json
15
31
  end
16
32
 
17
33
  def make_response
@@ -7,11 +7,11 @@ module DaVinciPASTestKit
7
7
  title 'All must support elements for profile PAS Beneficiary Patient are observed on $inquire requests'
8
8
  description %(
9
9
 
10
- PAS client systems are required to be able to populate all
11
- must support elements on instances of all profiles included in
10
+ PAS clients are required to be able to populate all
11
+ must support elements on instances of all profiles included in `$inquire`
12
12
  requests, including instances of the PAS Beneficiary Patient Profile.
13
13
  This test checks all identified instances of the PAS Beneficiary Patient
14
- Profile on requests sent by the client to ensure that the following
14
+ Profile on requests sent by the PAS client to ensure that the following
15
15
  must support elements are observed:
16
16
 
17
17
  * Patient.address
@@ -7,11 +7,11 @@ module DaVinciPASTestKit
7
7
  title 'All must support elements for profile PAS Beneficiary Patient are observed on $inquire responses'
8
8
  description %(
9
9
 
10
- PAS client systems are required to be able to receive all
11
- must support elements on instances of all profiles included in
10
+ PAS clients are required to be able to receive all
11
+ must support elements on instances of all profiles included in `$inquire`
12
12
  responses, including instances of the PAS Beneficiary Patient Profile.
13
13
  This test checks all identified instances of the PAS Beneficiary Patient
14
- Profile on responses sent to the client to ensure that the following
14
+ Profile on responses sent to the PAS client to ensure that the following
15
15
  must support elements are observed:
16
16
 
17
17
  * Patient.address
@@ -7,11 +7,11 @@ module DaVinciPASTestKit
7
7
  title 'All must support elements for profile PAS Beneficiary Patient are observed on $submit requests'
8
8
  description %(
9
9
 
10
- PAS client systems are required to be able to populate all
11
- must support elements on instances of all profiles included in
10
+ PAS clients are required to be able to populate all
11
+ must support elements on instances of all profiles included in `$submit`
12
12
  requests, including instances of the PAS Beneficiary Patient Profile.
13
13
  This test checks all identified instances of the PAS Beneficiary Patient
14
- Profile on requests sent by the client to ensure that the following
14
+ Profile on requests sent by the PAS client to ensure that the following
15
15
  must support elements are observed:
16
16
 
17
17
  * Patient.address
@@ -7,11 +7,11 @@ module DaVinciPASTestKit
7
7
  title 'All must support elements for profile PAS Beneficiary Patient are observed on $submit responses'
8
8
  description %(
9
9
 
10
- PAS client systems are required to be able to receive all
11
- must support elements on instances of all profiles included in
10
+ PAS clients are required to be able to receive all
11
+ must support elements on instances of all profiles included in `$submit`
12
12
  responses, including instances of the PAS Beneficiary Patient Profile.
13
13
  This test checks all identified instances of the PAS Beneficiary Patient
14
- Profile on responses sent to the client to ensure that the following
14
+ Profile on responses sent to the PAS client to ensure that the following
15
15
  must support elements are observed:
16
16
 
17
17
  * Patient.address
@@ -7,11 +7,11 @@ module DaVinciPASTestKit
7
7
  title 'All must support elements for profile PAS Claim Inquiry are observed on $inquire requests'
8
8
  description %(
9
9
 
10
- PAS client systems are required to be able to populate all
11
- must support elements on instances of all profiles included in
10
+ PAS clients are required to be able to populate all
11
+ must support elements on instances of all profiles included in `$inquire`
12
12
  requests, including instances of the PAS Claim Inquiry Profile.
13
13
  This test checks all identified instances of the PAS Claim Inquiry
14
- Profile on requests sent by the client to ensure that the following
14
+ Profile on requests sent by the PAS client to ensure that the following
15
15
  must support elements are observed:
16
16
 
17
17
  * Claim.accident