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
@@ -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
- subscription = JSON.parse(subscription_json_str)
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 FHIR Bundle or a plain JSON wrapper object pairing the response
6
- # Bundle ("bundle") with the selection criteria ("criteria") that the incoming
7
- # request must meet for that Bundle to be returned. The wrapper is plain JSON
8
- # rather than FHIR because Bundle resources cannot carry top-level extensions.
9
- # Candidates are handled as parsed JSON hashes; the inner Bundle is a clean FHIR
10
- # resource and needs no modification before use.
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 bare_bundle?(entity)
23
- entity.is_a?(Hash) && entity['resourceType'] == 'Bundle'
24
+ def bare_response?(entity)
25
+ entity.is_a?(Hash) && RESPONSE_RESOURCE_TYPES.include?(entity['resourceType'])
24
26
  end
25
27
 
26
- def entity_bundle(entity)
27
- bare_bundle?(entity) ? entity : entity[BUNDLE_KEY]
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 = bare_bundle?(entity) ? nil : entity[CRITERIA_KEY]
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, operation)
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
- !request_meets_request_range_criteria?(criteria[REQUEST_RANGE_KEY], operation)
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, "Inverted range in: #{part.inspect}" if low > high
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
- raise Inferno::Exceptions::TestSuiteImplementationException.new('pas response range criteria', e.message)
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
- NOTIFICATION_TAG = 'subscription_notification'
19
- SUBSCRIPTION_CREATE_TAG = 'subscription_create'
20
- SUBSCRIPTION_READ_TAG = 'subscription_read'
21
- SUBSCRIPTION_STATUS_TAG = 'subscription_status'
22
- REST_HOOK_HANDSHAKE_NOTIFICATION_TAG = 'rest_hook_handshake_notification'
23
- REST_HOOK_EVENT_NOTIFICATION_TAG = 'rest_hook_event_notification'
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