davinci_pas_test_kit 0.14.1 → 0.15.1

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 (461) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/pas_client_v201_run_against_pas_server.json +39 -0
  3. data/config/presets/pas_client_v221_run_against_pas_server.json +85 -0
  4. data/config/presets/pas_ri.json +2 -2
  5. data/config/presets/pas_server_v201_run_against_pas_client.json.erb +76 -0
  6. data/config/presets/pas_server_v221_run_against_pas_client.json.erb +104 -0
  7. data/lib/davinci_pas_test_kit/client/abstract_approval_submit_test.rb +75 -0
  8. data/lib/davinci_pas_test_kit/client/abstract_denial_submit_test.rb +74 -0
  9. data/lib/davinci_pas_test_kit/client/abstract_gather_must_support_test.rb +160 -0
  10. data/lib/davinci_pas_test_kit/client/abstract_modification_submit_test.rb +78 -0
  11. data/lib/davinci_pas_test_kit/client/abstract_response_attest.rb +64 -0
  12. data/lib/davinci_pas_test_kit/client/abstract_subscription_create_test.rb +57 -0
  13. data/lib/davinci_pas_test_kit/{urls.rb → client/client_urls.rb} +7 -23
  14. data/lib/davinci_pas_test_kit/client/endpoints/claim_endpoint.rb +303 -0
  15. data/lib/davinci_pas_test_kit/{endpoints → client/endpoints}/subscription_create_endpoint.rb +1 -1
  16. data/lib/davinci_pas_test_kit/{endpoints → client/endpoints}/subscription_status_endpoint.rb +1 -1
  17. data/lib/davinci_pas_test_kit/{endpoints → client/endpoints}/token_endpoint.rb +1 -2
  18. data/lib/davinci_pas_test_kit/{generated/v2.0.1/beneficiary/client_submit_request_beneficiary_must_support_test.rb → client/generated/v2.0.1/beneficiary/client_inquire_request_must_support_beneficiary_test.rb} +14 -35
  19. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_inquire_response_must_support_beneficiary_test.rb +59 -0
  20. data/lib/davinci_pas_test_kit/{generated/v2.0.1/beneficiary/client_inquire_request_beneficiary_must_support_test.rb → client/generated/v2.0.1/beneficiary/client_submit_request_must_support_beneficiary_test.rb} +14 -35
  21. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/beneficiary/client_submit_response_must_support_beneficiary_test.rb +59 -0
  22. data/lib/davinci_pas_test_kit/{generated/v2.0.1/claim_inquiry/client_inquire_request_claim_inquiry_must_support_test.rb → client/generated/v2.0.1/claim_inquiry/client_inquire_request_must_support_claim_inquiry_test.rb} +14 -35
  23. data/lib/davinci_pas_test_kit/{generated/v2.0.1/claim_update/client_submit_request_claim_update_must_support_test.rb → client/generated/v2.0.1/claim_update/client_submit_request_must_support_claim_update_test.rb} +14 -35
  24. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claiminquiryresponse/client_inquire_response_must_support_claiminquiryresponse_test.rb +57 -0
  25. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/claimresponse/client_submit_response_must_support_claimresponse_test.rb +59 -0
  26. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/communication_request/client_submit_response_must_support_communication_request_test.rb +42 -0
  27. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/coverage/client_inquire_request_must_support_coverage_test.rb +39 -0
  28. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/coverage/client_submit_request_must_support_coverage_test.rb +39 -0
  29. data/lib/davinci_pas_test_kit/{generated/v2.0.1/encounter/client_submit_request_encounter_must_support_test.rb → client/generated/v2.0.1/encounter/client_submit_request_must_support_encounter_test.rb} +14 -35
  30. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_inquire_request_must_support_insurer_test.rb +44 -0
  31. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_inquire_response_must_support_insurer_test.rb +44 -0
  32. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_submit_request_must_support_insurer_test.rb +44 -0
  33. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/insurer/client_submit_response_must_support_insurer_test.rb +44 -0
  34. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_inquire_must_support_group.rb +48 -0
  35. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_inquire_response_must_support_group.rb +79 -0
  36. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_submit_must_support_group.rb +58 -0
  37. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_client_submit_response_must_support_group.rb +84 -0
  38. 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 +37 -0
  39. 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 +36 -0
  40. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_request_bundle/client_submit_request_must_support_pas_request_bundle_test.rb +37 -0
  41. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/pas_response_bundle/client_submit_response_must_support_pas_response_bundle_test.rb +36 -0
  42. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_inquire_request_must_support_practitioner_test.rb +37 -0
  43. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_inquire_response_must_support_practitioner_test.rb +37 -0
  44. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_submit_request_must_support_practitioner_test.rb +37 -0
  45. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner/client_submit_response_must_support_practitioner_test.rb +37 -0
  46. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_inquire_request_must_support_practitioner_role_test.rb +33 -0
  47. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_inquire_response_must_support_practitioner_role_test.rb +33 -0
  48. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_submit_request_must_support_practitioner_role_test.rb +33 -0
  49. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/practitioner_role/client_submit_response_must_support_practitioner_role_test.rb +33 -0
  50. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_inquire_request_must_support_requestor_test.rb +47 -0
  51. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_inquire_response_must_support_requestor_test.rb +47 -0
  52. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_submit_request_must_support_requestor_test.rb +47 -0
  53. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/requestor/client_submit_response_must_support_requestor_test.rb +47 -0
  54. data/lib/davinci_pas_test_kit/{generated/v2.0.1/subscriber/client_inquire_request_subscriber_must_support_test.rb → client/generated/v2.0.1/subscriber/client_inquire_request_must_support_subscriber_test.rb} +14 -35
  55. data/lib/davinci_pas_test_kit/{generated/v2.0.1/subscriber/client_submit_request_subscriber_must_support_test.rb → client/generated/v2.0.1/subscriber/client_submit_request_must_support_subscriber_test.rb} +14 -35
  56. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/task/client_inquire_response_must_support_task_test.rb +45 -0
  57. data/lib/davinci_pas_test_kit/client/generated/v2.0.1/task/client_submit_response_must_support_task_test.rb +45 -0
  58. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/beneficiary/client_inquire_response_must_support_beneficiary_test.rb +53 -0
  59. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/beneficiary/client_submit_response_must_support_beneficiary_test.rb +53 -0
  60. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claim_inquiry/client_inquire_request_must_support_claim_inquiry_test.rb +123 -0
  61. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claim_update/client_submit_request_must_support_claim_update_test.rb +143 -0
  62. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claiminquiryresponse/client_inquire_response_must_support_claiminquiryresponse_test.rb +102 -0
  63. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/claimresponse/client_submit_response_must_support_claimresponse_test.rb +103 -0
  64. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/communication_request/client_submit_response_must_support_communication_request_test.rb +42 -0
  65. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/insurer/client_inquire_response_must_support_insurer_test.rb +47 -0
  66. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/insurer/client_submit_response_must_support_insurer_test.rb +47 -0
  67. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_inquire_must_support_group.rb +60 -0
  68. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_inquire_response_must_support_group.rb +79 -0
  69. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_submit_must_support_group.rb +89 -0
  70. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_client_submit_response_must_support_group.rb +84 -0
  71. 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 +38 -0
  72. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/pas_response_bundle/client_submit_response_must_support_pas_response_bundle_test.rb +39 -0
  73. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner/client_inquire_response_must_support_practitioner_test.rb +44 -0
  74. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner/client_submit_response_must_support_practitioner_test.rb +44 -0
  75. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner_role/client_inquire_response_must_support_practitioner_role_test.rb +40 -0
  76. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/practitioner_role/client_submit_response_must_support_practitioner_role_test.rb +40 -0
  77. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/requestor/client_inquire_response_must_support_requestor_test.rb +50 -0
  78. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/requestor/client_submit_response_must_support_requestor_test.rb +50 -0
  79. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/task/client_inquire_response_must_support_task_test.rb +55 -0
  80. data/lib/davinci_pas_test_kit/client/generated/v2.2.1/task/client_submit_response_must_support_task_test.rb +55 -0
  81. data/lib/davinci_pas_test_kit/{jobs → client/jobs}/send_pas_subscription_notification.rb +12 -7
  82. data/lib/davinci_pas_test_kit/{jobs → client/jobs}/send_subscription_handshake.rb +1 -1
  83. data/lib/davinci_pas_test_kit/client/metadata/mock_pas_server.rb +26 -0
  84. data/lib/davinci_pas_test_kit/client/metadata/pas_server_capability_statement.json +60 -0
  85. data/lib/davinci_pas_test_kit/client/pas_client_options.rb +23 -0
  86. data/lib/davinci_pas_test_kit/client/pas_client_subscription_pas_conformance_test.rb +33 -0
  87. data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_other_display_test.rb +45 -0
  88. data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_smart_display_test.rb +37 -0
  89. data/lib/davinci_pas_test_kit/client/registration/abstract_configuration_udap_display_test.rb +37 -0
  90. data/lib/davinci_pas_test_kit/client/registration/abstract_other_auth_attest_test.rb +39 -0
  91. data/lib/davinci_pas_test_kit/{response_generator.rb → client/response_generator.rb} +197 -61
  92. data/lib/davinci_pas_test_kit/{session_identification.rb → client/session_identification.rb} +1 -2
  93. data/lib/davinci_pas_test_kit/client/user_input_response.rb +64 -0
  94. data/lib/davinci_pas_test_kit/{client_suite.rb → client/v2.0.1/client_suite.rb} +29 -16
  95. data/lib/davinci_pas_test_kit/client/v2.0.1/must_support/pas_client_gather_must_support_test.rb +12 -0
  96. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/must_support/pas_client_must_support_requirement_test.rb → client/v2.0.1/must_support/pas_client_must_support_request_profiles_test.rb} +12 -46
  97. data/lib/davinci_pas_test_kit/{custom_groups → client}/v2.0.1/pas_client_approval_group.rb +5 -5
  98. data/lib/davinci_pas_test_kit/{custom_groups → client}/v2.0.1/pas_client_auth_smart_group.rb +1 -2
  99. data/lib/davinci_pas_test_kit/{custom_groups → client}/v2.0.1/pas_client_auth_udap_group.rb +1 -2
  100. data/lib/davinci_pas_test_kit/{custom_groups → client}/v2.0.1/pas_client_denial_group.rb +6 -6
  101. data/lib/davinci_pas_test_kit/client/v2.0.1/pas_client_must_support_group.rb +96 -0
  102. data/lib/davinci_pas_test_kit/{custom_groups → client}/v2.0.1/pas_client_pended_group.rb +12 -10
  103. data/lib/davinci_pas_test_kit/{custom_groups → client}/v2.0.1/pas_client_registration_group.rb +5 -6
  104. data/lib/davinci_pas_test_kit/{custom_groups → client}/v2.0.1/pas_client_subscription_setup_group.rb +6 -3
  105. data/lib/davinci_pas_test_kit/client/v2.0.1/registration/configuration_other_display_test.rb +12 -0
  106. data/lib/davinci_pas_test_kit/client/v2.0.1/registration/configuration_smart_display_test.rb +12 -0
  107. data/lib/davinci_pas_test_kit/client/v2.0.1/registration/configuration_udap_display_test.rb +12 -0
  108. data/lib/davinci_pas_test_kit/client/v2.0.1/registration/other_auth_attest_test.rb +12 -0
  109. data/lib/davinci_pas_test_kit/client/v2.0.1/subscription/pas_client_subscription_create_test.rb +15 -0
  110. data/lib/davinci_pas_test_kit/client/v2.0.1/urls.rb +15 -0
  111. data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_approval_submit_test.rb +15 -0
  112. data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_denial_submit_test.rb +15 -0
  113. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/client_tests → client/v2.0.1/workflows}/pas_client_inquire_request_bundle_validation_test.rb +1 -3
  114. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/client_tests → client/v2.0.1/workflows}/pas_client_inquire_response_bundle_validation_test.rb +18 -6
  115. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/client_tests → client/v2.0.1/workflows}/pas_client_pended_submit_test.rb +12 -8
  116. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/client_tests → client/v2.0.1/workflows}/pas_client_request_bundle_validation_test.rb +1 -3
  117. data/lib/davinci_pas_test_kit/client/v2.0.1/workflows/pas_client_response_attest.rb +12 -0
  118. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/client_tests → client/v2.0.1/workflows}/pas_client_response_bundle_validation_test.rb +10 -5
  119. data/lib/davinci_pas_test_kit/client/v2.2.1/client_suite.rb +240 -0
  120. data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_operation_failure_submit_test.rb +76 -0
  121. data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_operation_outcome_validation_test.rb +38 -0
  122. data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_processing_error_response_validation_test.rb +55 -0
  123. data/lib/davinci_pas_test_kit/client/v2.2.1/error_handling/pas_client_processing_error_submit_test.rb +67 -0
  124. data/lib/davinci_pas_test_kit/client/v2.2.1/must_support/must_support_with_attestation_option.rb +214 -0
  125. data/lib/davinci_pas_test_kit/client/v2.2.1/must_support/pas_client_gather_must_support_test.rb +12 -0
  126. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_approval_group.rb +40 -0
  127. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_auth_smart_group.rb +31 -0
  128. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_auth_udap_group.rb +30 -0
  129. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_claim_updates_group.rb +112 -0
  130. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_denial_group.rb +47 -0
  131. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_error_handling_group.rb +20 -0
  132. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_modification_group.rb +52 -0
  133. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_must_support_group.rb +96 -0
  134. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_operation_failure_group.rb +45 -0
  135. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_pended_group.rb +125 -0
  136. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_processing_error_group.rb +44 -0
  137. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_registration_group.rb +65 -0
  138. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_subscription_setup_group.rb +31 -0
  139. data/lib/davinci_pas_test_kit/client/v2.2.1/pas_client_workflows_group.rb +25 -0
  140. data/lib/davinci_pas_test_kit/client/v2.2.1/registration/configuration_other_display_test.rb +12 -0
  141. data/lib/davinci_pas_test_kit/client/v2.2.1/registration/configuration_smart_display_test.rb +12 -0
  142. data/lib/davinci_pas_test_kit/client/v2.2.1/registration/configuration_udap_display_test.rb +12 -0
  143. data/lib/davinci_pas_test_kit/client/v2.2.1/registration/other_auth_attest_test.rb +12 -0
  144. data/lib/davinci_pas_test_kit/client/v2.2.1/subscription/pas_client_subscription_create_test.rb +14 -0
  145. data/lib/davinci_pas_test_kit/client/v2.2.1/urls.rb +15 -0
  146. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_approval_submit_test.rb +12 -0
  147. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_cancel_request_test.rb +33 -0
  148. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_cancelled_entries_test.rb +50 -0
  149. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_cancelled_items_certtype_test.rb +47 -0
  150. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_changed_entries_test.rb +100 -0
  151. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_entries_preserved_test.rb +51 -0
  152. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_grandparent_excluded_test.rb +52 -0
  153. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_referenced_claim_test.rb +46 -0
  154. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_referenced_resources_test.rb +43 -0
  155. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_submit_tests.rb +238 -0
  156. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_claim_update_validation_utils.rb +183 -0
  157. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_denial_submit_test.rb +12 -0
  158. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_inquire_request_bundle_validation_test.rb +55 -0
  159. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_inquire_response_bundle_validation_test.rb +78 -0
  160. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_modification_submit_test.rb +12 -0
  161. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_modification_verification_test.rb +101 -0
  162. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_pended_submit_test.rb +148 -0
  163. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_request_bundle_validation_test.rb +56 -0
  164. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_response_attest.rb +12 -0
  165. data/lib/davinci_pas_test_kit/client/v2.2.1/workflows/pas_client_response_bundle_validation_test.rb +84 -0
  166. data/lib/davinci_pas_test_kit/cross_suite/base_urls.rb +27 -0
  167. data/lib/davinci_pas_test_kit/cross_suite/fhirpath_utils.rb +55 -0
  168. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/beneficiary/metadata.yml +16 -13
  169. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/claim_inquiry/metadata.yml +4 -21
  170. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/claim_update/metadata.yml +4 -22
  171. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/claiminquiryresponse/metadata.yml +4 -10
  172. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/claimresponse/metadata.yml +4 -13
  173. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/communication_request/metadata.yml +4 -13
  174. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/coverage/metadata.yml +8 -12
  175. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/device_request/metadata.yml +0 -6
  176. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/encounter/metadata.yml +4 -5
  177. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/insurer/metadata.yml +16 -13
  178. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/medication_request/metadata.yml +0 -6
  179. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/metadata.yml +1 -133
  180. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/nutrition_order/metadata.yml +0 -6
  181. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/pas_inquiry_request_bundle/metadata.yml +4 -7
  182. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/pas_inquiry_response_bundle/metadata.yml +4 -5
  183. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/pas_request_bundle/metadata.yml +4 -7
  184. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/pas_response_bundle/metadata.yml +4 -5
  185. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/practitioner/metadata.yml +16 -13
  186. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/practitioner_role/metadata.yml +16 -19
  187. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/requestor/metadata.yml +16 -13
  188. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/service_request/metadata.yml +0 -6
  189. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/subscriber/metadata.yml +8 -9
  190. data/lib/davinci_pas_test_kit/{generated → cross_suite/generated}/v2.0.1/task/metadata.yml +8 -5
  191. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/beneficiary/metadata.yml +150 -0
  192. data/lib/davinci_pas_test_kit/{generated/v2.0.1/claim → cross_suite/generated/v2.2.1/claim_inquiry}/metadata.yml +154 -203
  193. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claim_update/metadata.yml +733 -0
  194. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claiminquiryresponse/metadata.yml +456 -0
  195. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/claimresponse/metadata.yml +461 -0
  196. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/communication_request/metadata.yml +120 -0
  197. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/coverage/metadata.yml +163 -0
  198. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/must_support/device_request_metadata.yml → cross_suite/generated/v2.2.1/device_request/metadata.yml} +32 -33
  199. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/encounter/metadata.yml +237 -0
  200. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/insurer/metadata.yml +111 -0
  201. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/must_support/medication_request_metadata.yml → cross_suite/generated/v2.2.1/medication_request/metadata.yml} +59 -26
  202. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/metadata.yml +6544 -0
  203. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/must_support/nutrition_order_metadata.yml → cross_suite/generated/v2.2.1/nutrition_order/metadata.yml} +13 -14
  204. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_inquiry_request_bundle/metadata.yml +74 -0
  205. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_inquiry_response_bundle/metadata.yml +70 -0
  206. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_request_bundle/metadata.yml +74 -0
  207. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/pas_response_bundle/metadata.yml +72 -0
  208. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/practitioner/metadata.yml +101 -0
  209. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/practitioner_role/metadata.yml +101 -0
  210. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/requestor/metadata.yml +114 -0
  211. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/must_support/service_request_metadata.yml → cross_suite/generated/v2.2.1/service_request/metadata.yml} +39 -45
  212. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/subscriber/metadata.yml +136 -0
  213. data/lib/davinci_pas_test_kit/cross_suite/generated/v2.2.1/task/metadata.yml +237 -0
  214. data/lib/davinci_pas_test_kit/cross_suite/must_support/must_support_data_gathering.rb +111 -0
  215. data/lib/davinci_pas_test_kit/cross_suite/must_support/must_support_request_type_test.rb +75 -0
  216. data/lib/davinci_pas_test_kit/cross_suite/must_support/must_support_test.rb +67 -0
  217. data/lib/davinci_pas_test_kit/{pas_bundle_validation.rb → cross_suite/pas_bundle_validation.rb} +380 -53
  218. data/lib/davinci_pas_test_kit/cross_suite/pas_constants.rb +31 -0
  219. data/lib/davinci_pas_test_kit/cross_suite/pas_notification_verification.rb +120 -0
  220. data/lib/davinci_pas_test_kit/cross_suite/pas_subscription_verification.rb +72 -0
  221. data/lib/davinci_pas_test_kit/cross_suite/response_selection_utils.rb +88 -0
  222. data/lib/davinci_pas_test_kit/cross_suite/tags.rb +35 -0
  223. data/lib/davinci_pas_test_kit/cross_suite/validation_test.rb +25 -0
  224. data/lib/davinci_pas_test_kit/{validator_suppressions.rb → cross_suite/validator_suppressions.rb} +23 -1
  225. data/lib/davinci_pas_test_kit/ext/inferno_core/runnable.rb +22 -0
  226. data/lib/davinci_pas_test_kit/generator/client_must_support_group_generator.rb +230 -0
  227. data/lib/davinci_pas_test_kit/generator/descriptions.rb +95 -0
  228. data/lib/davinci_pas_test_kit/generator/ig_metadata.rb +45 -38
  229. data/lib/davinci_pas_test_kit/generator/ig_metadata_extractor.rb +3 -5
  230. data/lib/davinci_pas_test_kit/generator/{must_support_check_profiles.rb → must_support_target_profiles.rb} +12 -12
  231. data/lib/davinci_pas_test_kit/generator/must_support_test_generator.rb +63 -83
  232. data/lib/davinci_pas_test_kit/generator/pas_must_support_metadata_extractor.rb +129 -0
  233. data/lib/davinci_pas_test_kit/generator/profile_metadata.rb +86 -0
  234. data/lib/davinci_pas_test_kit/generator/{group_metadata_extractor.rb → profile_metadata_extractor.rb} +11 -78
  235. data/lib/davinci_pas_test_kit/generator/server_must_support_group_generator.rb +166 -0
  236. data/lib/davinci_pas_test_kit/generator/{suite_generator.rb → server_suite_generator.rb} +32 -5
  237. data/lib/davinci_pas_test_kit/generator/templates/client_must_support_group.rb.erb +80 -0
  238. data/lib/davinci_pas_test_kit/generator/templates/client_must_support_response_group.rb.erb +43 -0
  239. data/lib/davinci_pas_test_kit/generator/templates/must_support.rb.erb +14 -35
  240. data/lib/davinci_pas_test_kit/generator/templates/server_must_support_group.rb.erb +121 -0
  241. data/lib/davinci_pas_test_kit/generator/templates/{suite.rb.erb → server_suite.rb.erb} +15 -23
  242. data/lib/davinci_pas_test_kit/generator/templates/use_case_group.rb.erb +181 -0
  243. data/lib/davinci_pas_test_kit/generator/use_case_group_generator.rb +227 -0
  244. data/lib/davinci_pas_test_kit/generator.rb +46 -26
  245. data/lib/davinci_pas_test_kit/igs/davinci_pas_2.2.1.tgz +0 -0
  246. data/lib/davinci_pas_test_kit/metadata.rb +21 -55
  247. data/lib/davinci_pas_test_kit/parameters_helper.rb +18 -0
  248. data/lib/davinci_pas_test_kit/pas_notification_conformance_test.rb +40 -0
  249. data/lib/davinci_pas_test_kit/requirements/davinci_pas_test_kit_requirements.csv +121 -0
  250. data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_client_suite_v201_requirements_coverage.csv +22 -22
  251. data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_client_suite_v221_requirements_coverage.csv +66 -0
  252. data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_server_suite_v201_requirements_coverage.csv +42 -42
  253. data/lib/davinci_pas_test_kit/requirements/generated/davinci_pas_server_suite_v221_requirements_coverage.csv +212 -0
  254. data/lib/davinci_pas_test_kit/requirements/hl7.fhir.us.davinci-pas_2.2.1_requirements.xlsx +0 -0
  255. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/notification/pas_subscription_notification_test.rb → server/abstract_pas_subscription_notification_wait_test.rb} +13 -21
  256. data/lib/davinci_pas_test_kit/server/claim_inquire_operation_test.rb +31 -0
  257. data/lib/davinci_pas_test_kit/server/claim_operation_logic.rb +67 -0
  258. data/lib/davinci_pas_test_kit/server/claim_submit_operation_test.rb +32 -0
  259. data/lib/davinci_pas_test_kit/{generated/v2.0.1/beneficiary/server_submit_request_beneficiary_must_support_test.rb → server/generated/v2.0.1/beneficiary/server_inquire_request_must_support_beneficiary_test.rb} +14 -35
  260. data/lib/davinci_pas_test_kit/{generated/v2.0.1/beneficiary/server_submit_response_beneficiary_must_support_test.rb → server/generated/v2.0.1/beneficiary/server_inquire_response_must_support_beneficiary_test.rb} +16 -36
  261. data/lib/davinci_pas_test_kit/{generated/v2.0.1/beneficiary/server_inquire_request_beneficiary_must_support_test.rb → server/generated/v2.0.1/beneficiary/server_submit_request_must_support_beneficiary_test.rb} +14 -35
  262. data/lib/davinci_pas_test_kit/{generated/v2.0.1/beneficiary/server_inquire_response_beneficiary_must_support_test.rb → server/generated/v2.0.1/beneficiary/server_submit_response_must_support_beneficiary_test.rb} +16 -36
  263. data/lib/davinci_pas_test_kit/{generated/v2.0.1/claim_inquiry/server_inquire_request_claim_inquiry_must_support_test.rb → server/generated/v2.0.1/claim_inquiry/server_inquire_request_must_support_claim_inquiry_test.rb} +14 -35
  264. data/lib/davinci_pas_test_kit/{generated/v2.0.1/claim_update/server_submit_request_claim_update_must_support_test.rb → server/generated/v2.0.1/claim_update/server_submit_request_must_support_claim_update_test.rb} +14 -35
  265. data/lib/davinci_pas_test_kit/{generated/v2.0.1/claiminquiryresponse/server_inquire_response_claiminquiryresponse_must_support_test.rb → server/generated/v2.0.1/claiminquiryresponse/server_inquire_response_must_support_claiminquiryresponse_test.rb} +14 -35
  266. data/lib/davinci_pas_test_kit/{generated/v2.0.1/claimresponse/server_submit_response_claimresponse_must_support_test.rb → server/generated/v2.0.1/claimresponse/server_submit_response_must_support_claimresponse_test.rb} +14 -35
  267. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/communication_request/server_submit_response_must_support_communication_request_test.rb +43 -0
  268. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/coverage/server_inquire_request_must_support_coverage_test.rb +41 -0
  269. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/coverage/server_submit_request_must_support_coverage_test.rb +41 -0
  270. data/lib/davinci_pas_test_kit/{generated/v2.0.1/encounter/server_submit_request_encounter_must_support_test.rb → server/generated/v2.0.1/encounter/server_submit_request_must_support_encounter_test.rb} +14 -35
  271. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_inquire_request_must_support_insurer_test.rb +46 -0
  272. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_inquire_response_must_support_insurer_test.rb +45 -0
  273. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_submit_request_must_support_insurer_test.rb +46 -0
  274. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/insurer/server_submit_response_must_support_insurer_test.rb +45 -0
  275. 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 +39 -0
  276. 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 +37 -0
  277. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_request_bundle/server_submit_request_must_support_pas_request_bundle_test.rb +39 -0
  278. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_response_bundle/server_submit_response_must_support_pas_response_bundle_test.rb +37 -0
  279. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_approval_use_case_group.rb +145 -0
  280. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_denial_use_case_group.rb +145 -0
  281. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_must_support_group.rb +442 -0
  282. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/pas_server_pended_use_case_group.rb +280 -0
  283. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_inquire_request_must_support_practitioner_test.rb +39 -0
  284. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_inquire_response_must_support_practitioner_test.rb +38 -0
  285. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_submit_request_must_support_practitioner_test.rb +39 -0
  286. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner/server_submit_response_must_support_practitioner_test.rb +38 -0
  287. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_inquire_request_must_support_practitioner_role_test.rb +35 -0
  288. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_inquire_response_must_support_practitioner_role_test.rb +34 -0
  289. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_submit_request_must_support_practitioner_role_test.rb +35 -0
  290. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/practitioner_role/server_submit_response_must_support_practitioner_role_test.rb +34 -0
  291. data/lib/davinci_pas_test_kit/{generated/v2.0.1/requestor/server_submit_request_requestor_must_support_test.rb → server/generated/v2.0.1/requestor/server_inquire_request_must_support_requestor_test.rb} +14 -35
  292. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_inquire_response_must_support_requestor_test.rb +48 -0
  293. data/lib/davinci_pas_test_kit/{generated/v2.0.1/requestor/server_inquire_request_requestor_must_support_test.rb → server/generated/v2.0.1/requestor/server_submit_request_must_support_requestor_test.rb} +14 -35
  294. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/requestor/server_submit_response_must_support_requestor_test.rb +48 -0
  295. data/lib/davinci_pas_test_kit/{generated → server/generated}/v2.0.1/server_suite.rb +10 -20
  296. data/lib/davinci_pas_test_kit/{generated/v2.0.1/subscriber/server_inquire_request_subscriber_must_support_test.rb → server/generated/v2.0.1/subscriber/server_inquire_request_must_support_subscriber_test.rb} +14 -35
  297. data/lib/davinci_pas_test_kit/{generated/v2.0.1/subscriber/server_submit_request_subscriber_must_support_test.rb → server/generated/v2.0.1/subscriber/server_submit_request_must_support_subscriber_test.rb} +14 -35
  298. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/task/server_inquire_response_must_support_task_test.rb +46 -0
  299. data/lib/davinci_pas_test_kit/server/generated/v2.0.1/task/server_submit_response_must_support_task_test.rb +46 -0
  300. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_inquire_request_must_support_beneficiary_test.rb +55 -0
  301. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_inquire_response_must_support_beneficiary_test.rb +53 -0
  302. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_submit_request_must_support_beneficiary_test.rb +55 -0
  303. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/beneficiary/server_submit_response_must_support_beneficiary_test.rb +53 -0
  304. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claim_inquiry/server_inquire_request_must_support_claim_inquiry_test.rb +125 -0
  305. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claim_update/server_submit_request_must_support_claim_update_test.rb +145 -0
  306. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claiminquiryresponse/server_inquire_response_must_support_claiminquiryresponse_test.rb +102 -0
  307. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/claimresponse/server_submit_response_must_support_claimresponse_test.rb +103 -0
  308. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/communication_request/server_submit_response_must_support_communication_request_test.rb +42 -0
  309. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/coverage/server_inquire_request_must_support_coverage_test.rb +52 -0
  310. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/coverage/server_submit_request_must_support_coverage_test.rb +52 -0
  311. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/encounter/server_submit_request_must_support_encounter_test.rb +58 -0
  312. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_inquire_request_must_support_insurer_test.rb +49 -0
  313. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_inquire_response_must_support_insurer_test.rb +47 -0
  314. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_submit_request_must_support_insurer_test.rb +49 -0
  315. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/insurer/server_submit_response_must_support_insurer_test.rb +47 -0
  316. 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 +41 -0
  317. 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 +38 -0
  318. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_request_bundle/server_submit_request_must_support_pas_request_bundle_test.rb +41 -0
  319. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_response_bundle/server_submit_response_must_support_pas_response_bundle_test.rb +39 -0
  320. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_approval_use_case_group.rb +125 -0
  321. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_denial_use_case_group.rb +125 -0
  322. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_must_support_group.rb +403 -0
  323. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/pas_server_pended_use_case_group.rb +150 -0
  324. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_inquire_request_must_support_practitioner_test.rb +46 -0
  325. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_inquire_response_must_support_practitioner_test.rb +44 -0
  326. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_submit_request_must_support_practitioner_test.rb +46 -0
  327. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner/server_submit_response_must_support_practitioner_test.rb +44 -0
  328. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_inquire_request_must_support_practitioner_role_test.rb +42 -0
  329. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_inquire_response_must_support_practitioner_role_test.rb +40 -0
  330. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_submit_request_must_support_practitioner_role_test.rb +42 -0
  331. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/practitioner_role/server_submit_response_must_support_practitioner_role_test.rb +40 -0
  332. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_inquire_request_must_support_requestor_test.rb +52 -0
  333. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_inquire_response_must_support_requestor_test.rb +50 -0
  334. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_submit_request_must_support_requestor_test.rb +52 -0
  335. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/requestor/server_submit_response_must_support_requestor_test.rb +50 -0
  336. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/server_suite.rb +148 -0
  337. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/subscriber/server_inquire_request_must_support_subscriber_test.rb +54 -0
  338. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/subscriber/server_submit_request_must_support_subscriber_test.rb +54 -0
  339. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/task/server_inquire_response_must_support_task_test.rb +55 -0
  340. data/lib/davinci_pas_test_kit/server/generated/v2.2.1/task/server_submit_response_must_support_task_test.rb +55 -0
  341. data/lib/davinci_pas_test_kit/server/pas_claim_response_decision_test.rb +73 -0
  342. data/lib/davinci_pas_test_kit/server/server_request_bundle_validation_test.rb +64 -0
  343. data/lib/davinci_pas_test_kit/server/server_response_bundle_validation_test.rb +76 -0
  344. data/lib/davinci_pas_test_kit/{custom_groups → server}/v2.0.1/error_tests/pas_inquiry_error_test.rb +2 -2
  345. data/lib/davinci_pas_test_kit/{custom_groups → server}/v2.0.1/error_tests/pas_submission_error_test.rb +2 -2
  346. data/lib/davinci_pas_test_kit/{custom_groups/v2.0.1/must_support/pas_server_must_support_requirement_test.rb → server/v2.0.1/must_support/pas_server_must_support_request_profiles_test.rb} +12 -45
  347. data/lib/davinci_pas_test_kit/{custom_groups → server}/v2.0.1/pas_error_group.rb +3 -3
  348. data/lib/davinci_pas_test_kit/{custom_groups → server}/v2.0.1/pas_server_subscription_input_conformance.rb +4 -3
  349. data/lib/davinci_pas_test_kit/server/v2.0.1/pas_server_subscription_notification_wait_test.rb +12 -0
  350. data/lib/davinci_pas_test_kit/{custom_groups → server}/v2.0.1/pas_server_subscription_setup.rb +5 -3
  351. data/lib/davinci_pas_test_kit/server/v2.0.1/server_urls.rb +13 -0
  352. data/lib/davinci_pas_test_kit/server/v2.2.1/claim_updates/server_claim_update_response_tests.rb +143 -0
  353. data/lib/davinci_pas_test_kit/server/v2.2.1/error_tests/nonconformant_pas_bundle.json +16 -0
  354. data/lib/davinci_pas_test_kit/server/v2.2.1/error_tests/pas_inquiry_error_test.rb +38 -0
  355. data/lib/davinci_pas_test_kit/server/v2.2.1/error_tests/pas_submission_error_test.rb +56 -0
  356. data/lib/davinci_pas_test_kit/server/v2.2.1/must_support/pas_server_must_support_request_profiles_test.rb +86 -0
  357. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_error_group.rb +20 -0
  358. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_claim_updates_group.rb +104 -0
  359. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_subscription_input_conformance.rb +48 -0
  360. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_subscription_notification_wait_test.rb +12 -0
  361. data/lib/davinci_pas_test_kit/server/v2.2.1/pas_server_subscription_setup.rb +42 -0
  362. data/lib/davinci_pas_test_kit/server/v2.2.1/server_urls.rb +13 -0
  363. data/lib/davinci_pas_test_kit/version.rb +2 -2
  364. data/lib/davinci_pas_test_kit.rb +5 -2
  365. metadata +364 -186
  366. data/config/presets/pas_server_subscription_creation_against_pas_client.json +0 -32
  367. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/claim_response_decision/pas_claim_response_decision_test.rb +0 -43
  368. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_registration/configuration_other_display_test.rb +0 -46
  369. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_registration/configuration_smart_display_test.rb +0 -37
  370. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_registration/configuration_udap_display_test.rb +0 -37
  371. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_registration/other_auth_attest_test.rb +0 -36
  372. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_approval_submit_test.rb +0 -80
  373. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_denial_submit_test.rb +0 -79
  374. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_inquire_must_support_test.rb +0 -63
  375. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_response_attest.rb +0 -52
  376. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_submit_must_support_test.rb +0 -72
  377. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_subscription_create_test.rb +0 -62
  378. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/client_tests/pas_client_subscription_pas_conformance_test.rb +0 -30
  379. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_must_support_group.rb +0 -29
  380. data/lib/davinci_pas_test_kit/custom_groups/v2.0.1/pas_client_options.rb +0 -25
  381. data/lib/davinci_pas_test_kit/endpoints/claim_endpoint.rb +0 -157
  382. data/lib/davinci_pas_test_kit/fhir_resource_navigation.rb +0 -72
  383. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim/claim_operation_test.rb +0 -67
  384. data/lib/davinci_pas_test_kit/generated/v2.0.1/claim_inquiry/claim_inquiry_operation_test.rb +0 -56
  385. data/lib/davinci_pas_test_kit/generated/v2.0.1/communication_request/server_submit_response_communication_request_must_support_test.rb +0 -63
  386. data/lib/davinci_pas_test_kit/generated/v2.0.1/coverage/client_inquire_request_coverage_must_support_test.rb +0 -60
  387. data/lib/davinci_pas_test_kit/generated/v2.0.1/coverage/client_submit_request_coverage_must_support_test.rb +0 -60
  388. data/lib/davinci_pas_test_kit/generated/v2.0.1/coverage/server_inquire_request_coverage_must_support_test.rb +0 -62
  389. data/lib/davinci_pas_test_kit/generated/v2.0.1/coverage/server_submit_request_coverage_must_support_test.rb +0 -62
  390. data/lib/davinci_pas_test_kit/generated/v2.0.1/device_request/client_submit_request_device_request_must_support_test.rb +0 -56
  391. data/lib/davinci_pas_test_kit/generated/v2.0.1/device_request/server_submit_request_device_request_must_support_test.rb +0 -58
  392. data/lib/davinci_pas_test_kit/generated/v2.0.1/insurer/client_inquire_request_insurer_must_support_test.rb +0 -65
  393. data/lib/davinci_pas_test_kit/generated/v2.0.1/insurer/client_submit_request_insurer_must_support_test.rb +0 -65
  394. data/lib/davinci_pas_test_kit/generated/v2.0.1/insurer/server_inquire_request_insurer_must_support_test.rb +0 -67
  395. data/lib/davinci_pas_test_kit/generated/v2.0.1/insurer/server_inquire_response_insurer_must_support_test.rb +0 -65
  396. data/lib/davinci_pas_test_kit/generated/v2.0.1/insurer/server_submit_request_insurer_must_support_test.rb +0 -67
  397. data/lib/davinci_pas_test_kit/generated/v2.0.1/insurer/server_submit_response_insurer_must_support_test.rb +0 -65
  398. data/lib/davinci_pas_test_kit/generated/v2.0.1/medication_request/client_submit_request_medication_request_must_support_test.rb +0 -66
  399. data/lib/davinci_pas_test_kit/generated/v2.0.1/medication_request/server_submit_request_medication_request_must_support_test.rb +0 -68
  400. data/lib/davinci_pas_test_kit/generated/v2.0.1/nutrition_order/client_submit_request_nutrition_order_must_support_test.rb +0 -58
  401. data/lib/davinci_pas_test_kit/generated/v2.0.1/nutrition_order/server_submit_request_nutrition_order_must_support_test.rb +0 -60
  402. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_client_inquiry_must_support_use_case_group.rb +0 -51
  403. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_client_submit_must_support_use_case_group.rb +0 -61
  404. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_request_bundle/client_inquire_request_pas_inquiry_request_bundle_must_support_test.rb +0 -58
  405. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_request_bundle/server_inquire_request_pas_inquiry_request_bundle_must_support_test.rb +0 -60
  406. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_request_bundle/server_pas_inquiry_request_bundle_validation_test.rb +0 -95
  407. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_response_bundle/server_inquire_response_pas_inquiry_response_bundle_must_support_test.rb +0 -57
  408. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_inquiry_response_bundle/server_pas_inquiry_response_bundle_validation_test.rb +0 -89
  409. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_request_bundle/client_submit_request_pas_request_bundle_must_support_test.rb +0 -58
  410. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_request_bundle/server_pas_request_bundle_validation_test.rb +0 -95
  411. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_request_bundle/server_submit_request_pas_request_bundle_must_support_test.rb +0 -60
  412. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_response_bundle/server_pas_response_bundle_validation_test.rb +0 -89
  413. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_response_bundle/server_submit_response_pas_response_bundle_must_support_test.rb +0 -57
  414. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_server_approval_use_case_group.rb +0 -54
  415. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_server_denial_use_case_group.rb +0 -54
  416. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_server_must_support_use_case_group.rb +0 -268
  417. data/lib/davinci_pas_test_kit/generated/v2.0.1/pas_server_pended_use_case_group.rb +0 -90
  418. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner/client_inquire_request_practitioner_must_support_test.rb +0 -58
  419. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner/client_submit_request_practitioner_must_support_test.rb +0 -58
  420. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner/server_inquire_request_practitioner_must_support_test.rb +0 -60
  421. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner/server_inquire_response_practitioner_must_support_test.rb +0 -58
  422. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner/server_submit_request_practitioner_must_support_test.rb +0 -60
  423. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner/server_submit_response_practitioner_must_support_test.rb +0 -58
  424. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner_role/client_inquire_request_practitioner_role_must_support_test.rb +0 -54
  425. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner_role/client_submit_request_practitioner_role_must_support_test.rb +0 -54
  426. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner_role/server_inquire_request_practitioner_role_must_support_test.rb +0 -56
  427. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner_role/server_inquire_response_practitioner_role_must_support_test.rb +0 -54
  428. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner_role/server_submit_request_practitioner_role_must_support_test.rb +0 -56
  429. data/lib/davinci_pas_test_kit/generated/v2.0.1/practitioner_role/server_submit_response_practitioner_role_must_support_test.rb +0 -54
  430. data/lib/davinci_pas_test_kit/generated/v2.0.1/requestor/client_inquire_request_requestor_must_support_test.rb +0 -68
  431. data/lib/davinci_pas_test_kit/generated/v2.0.1/requestor/client_submit_request_requestor_must_support_test.rb +0 -68
  432. data/lib/davinci_pas_test_kit/generated/v2.0.1/requestor/server_inquire_response_requestor_must_support_test.rb +0 -68
  433. data/lib/davinci_pas_test_kit/generated/v2.0.1/requestor/server_submit_response_requestor_must_support_test.rb +0 -68
  434. data/lib/davinci_pas_test_kit/generated/v2.0.1/resource_list.rb +0 -54
  435. data/lib/davinci_pas_test_kit/generated/v2.0.1/service_request/client_submit_request_service_request_must_support_test.rb +0 -58
  436. data/lib/davinci_pas_test_kit/generated/v2.0.1/service_request/server_submit_request_service_request_must_support_test.rb +0 -60
  437. data/lib/davinci_pas_test_kit/generated/v2.0.1/task/server_inquire_response_task_must_support_test.rb +0 -66
  438. data/lib/davinci_pas_test_kit/generated/v2.0.1/task/server_submit_response_task_must_support_test.rb +0 -66
  439. data/lib/davinci_pas_test_kit/generator/group_generator.rb +0 -470
  440. data/lib/davinci_pas_test_kit/generator/group_metadata.rb +0 -73
  441. data/lib/davinci_pas_test_kit/generator/naming.rb +0 -51
  442. data/lib/davinci_pas_test_kit/generator/operation_test_generator.rb +0 -149
  443. data/lib/davinci_pas_test_kit/generator/resource_list_generator.rb +0 -59
  444. data/lib/davinci_pas_test_kit/generator/templates/group.rb.erb +0 -136
  445. data/lib/davinci_pas_test_kit/generator/templates/operation.rb.erb +0 -65
  446. data/lib/davinci_pas_test_kit/generator/templates/resource_list.rb.erb +0 -13
  447. data/lib/davinci_pas_test_kit/generator/templates/validation.rb.erb +0 -99
  448. data/lib/davinci_pas_test_kit/generator/validation_test_generator.rb +0 -172
  449. data/lib/davinci_pas_test_kit/generator/value_extractor.rb +0 -51
  450. data/lib/davinci_pas_test_kit/must_support_test.rb +0 -71
  451. data/lib/davinci_pas_test_kit/pas_subscription_verification.rb +0 -30
  452. data/lib/davinci_pas_test_kit/tags.rb +0 -17
  453. data/lib/davinci_pas_test_kit/user_input_response.rb +0 -35
  454. data/lib/davinci_pas_test_kit/validation_test.rb +0 -57
  455. /data/lib/davinci_pas_test_kit/{certs → client/certs}/InfernoCA.key +0 -0
  456. /data/lib/davinci_pas_test_kit/{certs → client/certs}/InfernoCA.pem +0 -0
  457. /data/lib/davinci_pas_test_kit/{certs → client/certs}/TestKit.pem +0 -0
  458. /data/lib/davinci_pas_test_kit/{certs → client/certs}/TestKitPrivateKey.key +0 -0
  459. /data/lib/davinci_pas_test_kit/{descriptions.rb → client/client_input_descriptions.rb} +0 -0
  460. /data/lib/davinci_pas_test_kit/{custom_groups → client}/v2.0.1/pas_client_workflows_group.rb +0 -0
  461. /data/lib/davinci_pas_test_kit/{custom_groups → server}/v2.0.1/error_tests/nonconformant_pas_bundle.json +0 -0
@@ -0,0 +1,120 @@
1
+ require_relative 'tags'
2
+
3
+ module DaVinciPASTestKit
4
+ module PASNotificationVerification
5
+ PAS_RESPONSE_BUNDLE_PROFILE = 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/profile-pas-response-bundle'.freeze
6
+
7
+ def verify_pas_notification(notification_json_str, ig_version: 'v2.2.1') # rubocop:disable Lint/UnusedMethodArgument
8
+ assert_valid_json(notification_json_str)
9
+ notification_bundle = FHIR.from_contents(notification_json_str)
10
+
11
+ assert notification_bundle.present?, 'Not a FHIR resource'
12
+ assert_resource_type(:bundle, resource: notification_bundle)
13
+
14
+ assert notification_bundle.entry.present?,
15
+ 'The notification Bundle must contain at least one entry'
16
+
17
+ # First entry is the SubscriptionStatus Parameters resource
18
+ subscription_status = notification_bundle.entry[0]&.resource
19
+ assert subscription_status&.resourceType == 'Parameters',
20
+ 'The first entry in the notification Bundle must be a Parameters ' \
21
+ "(SubscriptionStatus) resource, but found `#{subscription_status&.resourceType}`"
22
+
23
+ # Extract focus references from notification-event parameters
24
+ focus_references = extract_focus_references(subscription_status)
25
+ assert focus_references.present?,
26
+ 'The SubscriptionStatus must include at least one notification-event ' \
27
+ 'parameter with a focus reference'
28
+
29
+ # Resolve each focus reference to a Bundle entry and validate PAS structure
30
+ bundle_entries = notification_bundle.entry.drop(1)
31
+ focus_references.each do |focus_ref|
32
+ focus_entry = resolve_focus_entry(focus_ref, bundle_entries)
33
+
34
+ if focus_entry.nil?
35
+ add_message('error', %(
36
+ Could not resolve focus reference `#{focus_ref}` to a Bundle entry.
37
+ The notification Bundle must include the focus resource.
38
+ ))
39
+ next
40
+ end
41
+
42
+ focus_resource = focus_entry.resource
43
+ if focus_resource.nil?
44
+ add_message('error', %(
45
+ The Bundle entry for focus reference `#{focus_ref}` does not contain
46
+ a resource.
47
+ ))
48
+ next
49
+ end
50
+
51
+ # Check PAS-specific structural requirements only.
52
+ # Profile validation is handled by the Subscription conformance tests
53
+ # (9.3.3.01 and 9.3.3.02) to avoid duplicate error messages.
54
+ validate_focus_as_response_bundle(focus_resource)
55
+ end
56
+
57
+ assert messages.none? { |msg| msg[:type] == 'error' },
58
+ 'The notification does not conform to PAS requirements - see messages for details.'
59
+ end
60
+
61
+ private
62
+
63
+ def extract_focus_references(subscription_status)
64
+ return [] unless subscription_status.respond_to?(:parameter)
65
+
66
+ notification_events = subscription_status.parameter&.select do |p|
67
+ p.name == 'notification-event'
68
+ end
69
+ return [] if notification_events.blank?
70
+
71
+ notification_events.filter_map do |event|
72
+ focus_part = event.part&.find { |part| part.name == 'focus' }
73
+ focus_part&.valueReference&.reference
74
+ end
75
+ end
76
+
77
+ def resolve_focus_entry(reference, bundle_entries)
78
+ check_full_url = reference.start_with?('urn:')
79
+
80
+ bundle_entries.find do |entry|
81
+ if check_full_url
82
+ reference == entry.fullUrl
83
+ else
84
+ entry.fullUrl == reference ||
85
+ (entry.resource.present? &&
86
+ reference.include?("#{entry.resource.resourceType}/#{entry.resource.id}"))
87
+ end
88
+ end
89
+ end
90
+
91
+ # Validates PAS-specific structural requirements only:
92
+ # - Focus resource must be a Bundle
93
+ # - Bundle must be of type 'collection' (PAS Response Bundle)
94
+ # - Bundle must contain at least one ClaimResponse entry
95
+ def validate_focus_as_response_bundle(focus_resource)
96
+ if focus_resource.resourceType != 'Bundle'
97
+ add_message('error', %(
98
+ Expected the focus resource to be a Bundle (PAS Response Bundle),
99
+ but found `#{focus_resource.resourceType}`.
100
+ ))
101
+ return
102
+ end
103
+
104
+ if focus_resource.type != 'collection'
105
+ add_message('error', %(
106
+ Expected the focus Bundle to be of type 'collection' (PAS Response Bundle),
107
+ but found type '#{focus_resource.type}'.
108
+ ))
109
+ end
110
+
111
+ claim_response = focus_resource.entry&.find { |e| e.resource&.resourceType == 'ClaimResponse' }
112
+ return if claim_response.present?
113
+
114
+ add_message('error', %(
115
+ The focus Bundle (PAS Response Bundle) must contain at least one
116
+ ClaimResponse entry, but none was found.
117
+ ))
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,72 @@
1
+ module DaVinciPASTestKit
2
+ module PASSubscriptionVerification
3
+ PAS_SUBSCRIPTION_PROFILE = 'http://hl7.org/fhir/us/davinci-pas/StructureDefinition/profile-subscription'.freeze
4
+ PAS_SUBSCRIPTION_TOPIC = 'http://hl7.org/fhir/us/davinci-pas/SubscriptionTopic/PASSubscriptionTopic'.freeze
5
+ BACKPORT_FILTER_CRITERIA_URL =
6
+ 'http://hl7.org/fhir/uv/subscriptions-backport/StructureDefinition/backport-filter-criteria'.freeze
7
+
8
+ def verify_pas_subscription(subscription_json_str, ig_version: 'v2.0.1')
9
+ assert_valid_json(subscription_json_str)
10
+ subscription = JSON.parse(subscription_json_str)
11
+
12
+ if ig_version == 'v2.0.1'
13
+ verify_pas_subscription_v201(subscription)
14
+ else
15
+ verify_pas_subscription_v221(subscription)
16
+ end
17
+
18
+ assert messages.none? { |msg| msg[:type] == 'error' },
19
+ 'The Subscription does not conform to PAS requirements - see messages for details.'
20
+ end
21
+
22
+ private
23
+
24
+ def verify_pas_subscription_v201(subscription)
25
+ unless subscription['criteria'] == PAS_SUBSCRIPTION_TOPIC
26
+ add_message('error', %(
27
+ The Subscription must use the PAS-defined Subscription topic
28
+ `#{PAS_SUBSCRIPTION_TOPIC}`
29
+ in the `Subscription.criteria` element.
30
+ ))
31
+ end
32
+
33
+ filter_criteria = subscription.dig('_criteria', 'extension')
34
+ &.select { |ext| ext['url'] == BACKPORT_FILTER_CRITERIA_URL }
35
+ return if filter_criteria&.length == 1
36
+
37
+ add_message('error', %(
38
+ The Subscription must include a single filter on the submitting organization
39
+ in the `Subscription.criteria.extension` element.
40
+ ))
41
+ end
42
+
43
+ def verify_pas_subscription_v221(subscription)
44
+ verify_v221_profile(subscription)
45
+ verify_v221_criteria_format(subscription)
46
+ end
47
+
48
+ def verify_v221_profile(subscription) # rubocop:disable Naming/PredicateMethod
49
+ resource = FHIR.from_contents(subscription.to_json)
50
+ resource_is_valid?(resource: resource, profile_url: PAS_SUBSCRIPTION_PROFILE)
51
+ end
52
+
53
+ def verify_v221_criteria_format(subscription)
54
+ filter_criteria = subscription.dig('_criteria', 'extension')
55
+ &.select { |ext| ext['url'] == BACKPORT_FILTER_CRITERIA_URL }
56
+
57
+ return if filter_criteria.blank?
58
+
59
+ filter_criteria.each do |fc|
60
+ value = fc['valueString']
61
+ # PAS v2.2.1 requires filter criteria in the format 'org-identifier=<identifier>'
62
+ # where <identifier> is a non-whitespace organization identifier string
63
+ next if value.present? && value.match?(/\Aorg-identifier=\S+\z/)
64
+
65
+ add_message('error', %(
66
+ The Subscription filter criteria value `#{value}` does not match
67
+ the expected format `org-identifier=<identifier>`.
68
+ ))
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,88 @@
1
+ require_relative 'fhirpath_utils'
2
+
3
+ module DaVinciPASTestKit
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.
11
+ # Requires FhirpathUtils and access to `result` (Inferno::Entities::Result).
12
+ module ResponseSelectionUtils
13
+ CRITERIA_KEY = 'criteria'.freeze
14
+ BUNDLE_KEY = 'bundle'.freeze
15
+ REQUEST_RANGE_KEY = 'requestRange'.freeze
16
+ FHIRPATH_KEY = 'fhirpath'.freeze
17
+
18
+ # ***********************************************************************
19
+ # Candidate handling
20
+ # ***********************************************************************
21
+
22
+ def bare_bundle?(entity)
23
+ entity.is_a?(Hash) && entity['resourceType'] == 'Bundle'
24
+ end
25
+
26
+ def entity_bundle(entity)
27
+ bare_bundle?(entity) ? entity : entity[BUNDLE_KEY]
28
+ end
29
+
30
+ def entity_criteria(entity)
31
+ criteria = bare_bundle?(entity) ? nil : entity[CRITERIA_KEY]
32
+ criteria.is_a?(Hash) ? criteria : {}
33
+ end
34
+
35
+ def include_entity?(entity, request_fhir_obj, operation)
36
+ criteria = entity_criteria(entity)
37
+ return false if criteria[REQUEST_RANGE_KEY].present? &&
38
+ !request_meets_request_range_criteria?(criteria[REQUEST_RANGE_KEY], operation)
39
+ return false if criteria[FHIRPATH_KEY].present? &&
40
+ !request_meets_inclusion_criteria?(criteria[FHIRPATH_KEY], request_fhir_obj)
41
+
42
+ true
43
+ end
44
+
45
+ # ***********************************************************************
46
+ # FHIRPath-based selection criteria
47
+ # ***********************************************************************
48
+
49
+ def request_meets_inclusion_criteria?(expression, request_fhir_obj)
50
+ fhirpath_result = execute_fhirpath(request_fhir_obj, expression)
51
+ interpret_fhirpath_result_as_boolean(fhirpath_result)
52
+ end
53
+
54
+ # ***********************************************************************
55
+ # Request index-based selection criteria
56
+ # ***********************************************************************
57
+
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
+ def count_previous_successful_requests(operation)
63
+ requests_repo = Inferno::Repositories::Requests.new
64
+ previous_requests = requests_repo.requests_for_result(result.id)
65
+ previous_requests.count { |req| req.url.include?(operation) && req.status == 200 }
66
+ end
67
+
68
+ def ranges_cover_value?(value, ranges_string)
69
+ unless /\A(\d+(-\d+)?,)*\d+(-\d+)?\z/.match?(ranges_string)
70
+ raise ArgumentError,
71
+ "Invalid range string: #{ranges_string.inspect}"
72
+ end
73
+
74
+ ranges_string.split(',').any? do |part|
75
+ if part.include?('-')
76
+ low, high = part.split('-').map(&:to_i)
77
+ raise ArgumentError, "Inverted range in: #{part.inspect}" if low > high
78
+
79
+ (low..high).cover?(value)
80
+ else
81
+ part.to_i == value
82
+ end
83
+ end
84
+ rescue ArgumentError => e
85
+ raise Inferno::Exceptions::TestSuiteImplementationException.new('pas response range criteria', e.message)
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaVinciPASTestKit
4
+ AUTH_TAG = 'pas_auth'
5
+ SUBMIT_TAG = 'pas_submit'
6
+ INQUIRE_TAG = 'pas_inquire'
7
+ APPROVAL_WORKFLOW_TAG = 'pas_approved_workflow'
8
+ DENIAL_WORKFLOW_TAG = 'pas_denied_workflow'
9
+ PENDED_WORKFLOW_TAG = 'pas_pended_workflow'
10
+ MODIFICATION_WORKFLOW_TAG = 'pas_modified_workflow'
11
+ MUST_SUPPORT_WORKFLOW_TAG = 'pas_must_support_workflow'
12
+ # Claim update workflow: a unique tag per submission so verification tests can
13
+ # reload each specific request (initial submit, then each subsequent update).
14
+ CLAIM_UPDATE_INITIAL_TAG = 'pas_claim_update_initial'
15
+ CLAIM_UPDATE_ADD_ITEM_TAG = 'pas_claim_update_add_item'
16
+ CLAIM_UPDATE_MODIFY_CANCEL_TAG = 'pas_claim_update_modify_cancel'
17
+ 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'
24
+ OTHER_AUTH_TAG = 'other_auth'
25
+ OPERATION_FAILURE_WORKFLOW_TAG = 'pas_operation_failure_workflow'
26
+ PROCESSING_ERROR_WORKFLOW_TAG = 'pas_processing_error_workflow'
27
+
28
+ def self.use_case_tag(use_case)
29
+ const_get(:"#{use_case.upcase}_WORKFLOW_TAG")
30
+ end
31
+
32
+ def self.operation_tag(operation)
33
+ const_get(:"#{operation.upcase}_TAG")
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaVinciPASTestKit
4
+ module ValidationTest
5
+ def perform_validation_test(resources,
6
+ profile_url,
7
+ profile_version,
8
+ skip_if_empty: true)
9
+ skip_if skip_if_empty && resources.blank?,
10
+ "No #{resource_type} resources conforming to the #{profile_url} profile were returned"
11
+
12
+ omit_if resources.blank?,
13
+ "No #{resource_type} resources provided so the #{profile_url} profile does not apply"
14
+
15
+ profile_with_version = "#{profile_url}|#{profile_version}"
16
+ resources.each do |resource|
17
+ resource_is_valid?(resource:, profile_url: profile_with_version)
18
+ end
19
+
20
+ errors_found = messages.any? { |message| message[:type] == 'error' }
21
+
22
+ assert !errors_found, "Resource does not conform to the profile #{profile_with_version}"
23
+ end
24
+ end
25
+ end
@@ -119,6 +119,7 @@ module DaVinciPASTestKit
119
119
  'ValueSet https://valueset.x12.org/x217/005010/response/2010B/NM1/1/01/00/98 not found',
120
120
  # additional lines added beyond the errors suppressed in the IG
121
121
  'http://hl7.org/fhir/5.0/StructureDefinition/extension-Claim.encounter', # validator bug, https://github.com/hapifhir/org.hl7.fhir.core/issues/1556
122
+ 'X12278DiagnosisCodes', # ValueSet includes full ICD-10-CM plus unavailable code systems; validator cannot fully expand
122
123
  'X12278RequestedServiceType', # X12 code system included in this PAS-defined value set
123
124
  'X12278LocationType', # X12 code system included in this PAS-defined value set
124
125
  'ValueSet https://valueset.x12.org/x217/005010/response/2010B/NM1/1/01/00/98 not found',
@@ -138,7 +139,28 @@ module DaVinciPASTestKit
138
139
  # addition validator clean-up based on Bundle sub-validations where Inferno error supression doesn't
139
140
  # work. The test kit validates these instances individually as well, so they are still checked,
140
141
  # but in a way that Inferno can supress errors
141
- 'Unable to find a match for profile'
142
+ 'Unable to find a match for profile',
143
+ 'Unable to find a profile match for',
144
+ # IG defect: extension context definitions for these extensions don't match where the profiles place them
145
+ # extension-authorizationNumber context allows Claim.item only, but profile-claim-base marks it must-support on Claim.extension
146
+ /extension-authorizationNumber( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
147
+ /extension-administrationReferenceNumber( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
148
+ /extension-communicatedDiagnosis( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
149
+ # IG defect: extension-productOrServiceCodeEnd context only lists Claim.item/ClaimResponse, but profile-servicerequest marks it must-support on ServiceRequest
150
+ /extension-productOrServiceCodeEnd( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
151
+ # IG defect: extension-infoChanged and modifierextension-infoCancelled context only lists Claim.item,
152
+ # but profile-claim-base marks them must-support on Claim.supportingInfo as well
153
+ /extension-infoChanged( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
154
+ /modifierextension-infoCancelled( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
155
+ # IG defect: extension-itemAuthorizedProvider context allows ExplanationOfBenefit/ClaimResponse.item only,
156
+ # but profile-claimresponse marks ClaimResponse.extension:authorizedProvider as must-support on ClaimResponse root
157
+ /extension-itemAuthorizedProvider( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
158
+ # IG defect: extension-revenueUnitRateLimit, extension-serviceItemRequestType, extension-certificationType
159
+ # context prohibits ClaimResponse.addItem, but profile-claimresponse marks all three as must-support there
160
+ /extension-revenueUnitRateLimit( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
161
+ /extension-serviceItemRequestType( v\d+\.\d+\.\d+)? is not allowed to be used at this point/,
162
+ /extension-certificationType( v\d+\.\d+\.\d+)? is not allowed to be used at this point/
163
+
142
164
  ]
143
165
  )
144
166
  # rubocop:enable Layout/LineLength
@@ -0,0 +1,22 @@
1
+ module Inferno
2
+ module DSL
3
+ module Runnable
4
+ PRE_FLIGHT_HANDLER = proc do
5
+ [
6
+ 200,
7
+ {
8
+ 'Access-Control-Allow-Origin' => '*',
9
+ 'Access-Control-Allow-Headers' => 'Content-Type, Authorization'
10
+ },
11
+ ['']
12
+ ]
13
+ end
14
+
15
+ def allow_cors(*paths)
16
+ paths.each do |path|
17
+ route(:options, path, PRE_FLIGHT_HANDLER)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,230 @@
1
+ require_relative 'must_support_target_profiles'
2
+ require_relative 'descriptions'
3
+
4
+ module DaVinciPASTestKit
5
+ class Generator
6
+ class ClientMustSupportGroupGenerator
7
+ class << self
8
+ def generate(ig_metadata, base_client_output_dir)
9
+ submit_request_profiles = ig_metadata.profiles.select do |profile|
10
+ MustSupportTargetProfiles.submit_request_profile?(profile)
11
+ end
12
+ new(ig_metadata, 'submit', submit_request_profiles, base_client_output_dir).generate
13
+
14
+ submit_response_profiles = ig_metadata.profiles.select do |profile|
15
+ MustSupportTargetProfiles.submit_response_profile?(profile)
16
+ end
17
+ new(ig_metadata, 'submit', submit_response_profiles, base_client_output_dir, 'response').generate
18
+
19
+ inquire_request_profiles = ig_metadata.profiles.select do |profile|
20
+ MustSupportTargetProfiles.inquire_request_profile?(profile)
21
+ end
22
+ new(ig_metadata, 'inquire', inquire_request_profiles, base_client_output_dir).generate
23
+
24
+ inquire_response_profiles = ig_metadata.profiles.select do |profile|
25
+ MustSupportTargetProfiles.inquire_response_profile?(profile)
26
+ end
27
+ new(ig_metadata, 'inquire', inquire_response_profiles, base_client_output_dir, 'response').generate
28
+ end
29
+ end
30
+
31
+ attr_accessor :ig_metadata, :operation, :profiles, :base_output_dir, :type
32
+
33
+ def initialize(ig_metadata, operation, profiles, base_output_dir, type = 'request')
34
+ self.ig_metadata = ig_metadata
35
+ self.operation = operation
36
+ self.profiles = profiles
37
+ self.base_output_dir = base_output_dir
38
+ self.type = type
39
+ end
40
+
41
+ def template
42
+ @template ||= File.read(File.join(__dir__, 'templates', template_file_name))
43
+ end
44
+
45
+ def template_file_name
46
+ type == 'response' ? 'client_must_support_response_group.rb.erb' : 'client_must_support_group.rb.erb'
47
+ end
48
+
49
+ def output
50
+ @output ||= ERB.new(template, trim_mode: '-').result(binding)
51
+ end
52
+
53
+ def base_output_file_name
54
+ "#{class_name.underscore}.rb"
55
+ end
56
+
57
+ def class_name
58
+ if type == 'response'
59
+ "PASClient#{operation.camelize}ResponseMustSupportGroup"
60
+ else
61
+ "PASClient#{operation.camelize}MustSupportGroup"
62
+ end
63
+ end
64
+
65
+ def module_name
66
+ "DaVinciPAS#{ig_version_for_id.upcase}"
67
+ end
68
+
69
+ def title
70
+ if type == 'response'
71
+ return '$submit Response Must Support Coverage' if operation == 'submit'
72
+
73
+ '$inquire Response Must Support Coverage'
74
+ else
75
+ return '$submit Request Must Support Coverage' if operation == 'submit'
76
+
77
+ '$inquire Request Must Support Coverage'
78
+ end
79
+ end
80
+
81
+ def request_type
82
+ "#{operation}_#{type}"
83
+ end
84
+
85
+ def output_file_name
86
+ File.join(base_output_dir, base_output_file_name)
87
+ end
88
+
89
+ def profile_identifier(profile_metadata)
90
+ ig_metadata.snake_case_for_profile(profile_metadata)
91
+ end
92
+
93
+ def group_id
94
+ if type == 'response'
95
+ "pas_client_#{ig_version_for_id}_#{operation}_response_must_support"
96
+ else
97
+ "pas_client_#{ig_version_for_id}_#{operation}_must_support"
98
+ end
99
+ end
100
+
101
+ def ig_version
102
+ ig_metadata.ig_version
103
+ end
104
+
105
+ def ig_version_for_id
106
+ ig_metadata.reformatted_version
107
+ end
108
+
109
+ def generate
110
+ FileUtils.mkdir_p(base_output_dir)
111
+ File.write(output_file_name, output)
112
+ end
113
+
114
+ def required_profiles
115
+ @required_profiles = profiles.reject do |profile_metadata|
116
+ MustSupportTargetProfiles.request_profile?(profile_metadata)
117
+ end
118
+ end
119
+
120
+ def request_profiles
121
+ @request_profiles = profiles.select do |profile_metadata|
122
+ MustSupportTargetProfiles.request_profile?(profile_metadata)
123
+ end
124
+ end
125
+
126
+ def test_id_for_profile(profile_metadata)
127
+ "pas_client_#{ig_metadata.reformatted_version}_#{request_type}_" \
128
+ "must_support_#{profile_identifier_for_profile(profile_metadata)}"
129
+ end
130
+
131
+ def test_file_for_profile(profile_metadata)
132
+ profile_id = profile_identifier_for_profile(profile_metadata)
133
+ File.join(profile_id, "client_#{request_type}_must_support_#{profile_id}_test")
134
+ end
135
+
136
+ def profile_identifier_for_profile(profile_metadata)
137
+ ig_metadata.snake_case_for_profile(profile_metadata)
138
+ end
139
+
140
+ def profile_test_ids
141
+ target_profiles = type == 'response' ? profiles : required_profiles
142
+ target_profiles.map { |profile_metadata| test_id_for_profile(profile_metadata) }
143
+ end
144
+
145
+ # The collapsed attestation structure / optional response tests are only applied to v2.2.1.
146
+ def optional_must_support_enabled?
147
+ ig_version == 'v2.2.1'
148
+ end
149
+
150
+ # The Claim (request) / ClaimResponse (response) profiles remain mandatory standalone tests.
151
+ def mandatory_profile?(profile_metadata)
152
+ %w[Claim ClaimResponse].include?(profile_metadata.resource)
153
+ end
154
+
155
+ # Response groups: pairs each per-profile test id with whether it should be marked optional.
156
+ def profile_tests
157
+ profiles.map do |profile_metadata|
158
+ {
159
+ id: test_id_for_profile(profile_metadata),
160
+ optional: optional_must_support_enabled? && !mandatory_profile?(profile_metadata)
161
+ }
162
+ end
163
+ end
164
+
165
+ # Collapsed request groups: the mandatory Claim profile(s) kept as standalone tests.
166
+ def claim_profiles
167
+ required_profiles.select { |profile_metadata| profile_metadata.resource == 'Claim' }
168
+ end
169
+
170
+ # Collapsed request groups: every other supporting profile, assessed by the attestation test.
171
+ def other_profiles
172
+ required_profiles.reject { |profile_metadata| profile_metadata.resource == 'Claim' }
173
+ end
174
+
175
+ def other_profiles_title
176
+ 'All must support elements for other profiles referenced by Claim ' \
177
+ "#{operation == 'submit' ? 'submissions' : 'inquiries'} are observed on $#{operation} requests"
178
+ end
179
+
180
+ # Formats a profiles list for an attestation test's config, one hash literal per line.
181
+ def attestation_profiles_block(profile_metadatas)
182
+ profile_metadatas.map do |profile_metadata|
183
+ " { resource_type: '#{profile_metadata.resource}', " \
184
+ "profile_key: '#{profile_identifier(profile_metadata)}', " \
185
+ "title: '#{profile_metadata.profile_name}' }"
186
+ end.join(",\n")
187
+ end
188
+
189
+ def profile_test_files
190
+ target_profiles = type == 'response' ? profiles : required_profiles
191
+ target_profiles.map { |profile_metadata| test_file_for_profile(profile_metadata) }
192
+ end
193
+
194
+ def verifies_requirements
195
+ case "#{operation}_#{ig_version}"
196
+ when 'submit_v2.0.1'
197
+ return nil if type == 'response'
198
+
199
+ ['hl7.fhir.us.davinci-pas_2.0.1@58', 'hl7.fhir.us.davinci-pas_2.0.1@62',
200
+ 'hl7.fhir.us.davinci-pas_2.0.1@70', 'hl7.fhir.us.davinci-pas_2.0.1@202']
201
+ end
202
+ end
203
+
204
+ def description
205
+ if type == 'response'
206
+ <<~DESCRIPTION
207
+ Check that `$#{operation}` responses provided to the client contain
208
+ all PAS-defined profiles and their must support elements.
209
+
210
+ **USER INPUT VALIDATION**: These tests validate responses provided by the tester,
211
+ not the system under test. Errors will be treated as skips instead of failures.
212
+
213
+ For `$#{operation}` responses, this includes the following profiles:
214
+
215
+ #{Descriptions.profile_links_list(profiles, ig_version)}
216
+ DESCRIPTION
217
+ else
218
+ <<~DESCRIPTION
219
+ Check that the client can demonstrate `$#{operation}` requests that contain
220
+ all PAS-defined profiles and their must support elements.
221
+
222
+ For `$#{operation}` requests, this includes the following profiles:
223
+
224
+ #{Descriptions.profile_links_list(required_profiles, ig_version, request_profiles: operation == 'submit' ? request_profiles : nil)}
225
+ DESCRIPTION
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end