davinci_dtr_test_kit 0.17.1 → 0.18.0

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