davinci_dtr_test_kit 0.17.0 → 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/{cql_test.rb → cross_suite/v2.0.1/cql_test.rb} +3 -3
  15. data/lib/davinci_dtr_test_kit/cross_suite/v2.2.0/dtr_conformance_verification.rb +21 -0
  16. data/lib/davinci_dtr_test_kit/cross_suite/v2.2.0/multi_request_message_helper.rb +35 -0
  17. data/lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb +162 -0
  18. data/lib/davinci_dtr_test_kit/{dtr_client_options.rb → full_ehr/dtr_full_ehr_options.rb} +1 -1
  19. data/lib/davinci_dtr_test_kit/{endpoints → full_ehr/endpoints}/mock_payer.rb +9 -3
  20. data/lib/davinci_dtr_test_kit/{endpoints → full_ehr/endpoints}/mock_udap_smart_server/token_endpoint.rb +2 -2
  21. data/lib/davinci_dtr_test_kit/full_ehr/fixture_loader.rb +37 -0
  22. data/lib/davinci_dtr_test_kit/full_ehr/fixtures/dinner_adaptive/dinner_order_adaptive_next_question_template.json +243 -0
  23. data/lib/davinci_dtr_test_kit/full_ehr/fixtures/dinner_adaptive/parameters_questionnaire_dinner_order_adaptive.json +104 -0
  24. data/lib/davinci_dtr_test_kit/full_ehr/fixtures/dinner_static/parameters_questionnaire_dinner_order_static.json +291 -0
  25. data/lib/davinci_dtr_test_kit/full_ehr/fixtures/empty_templates/next_question_template_empty.json +1 -0
  26. data/lib/davinci_dtr_test_kit/full_ehr/fixtures/empty_templates/parameters_questionnaire_package_empty.json +9 -0
  27. data/lib/davinci_dtr_test_kit/full_ehr/short_circuit_interaction_verification.rb +73 -0
  28. 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 +2 -1
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. data/lib/davinci_dtr_test_kit/{client_groups/adaptive_questionnaire/custom → full_ehr/v2.0.1}/dtr_full_ehr_custom_adaptive_workflow_group.rb +18 -16
  37. 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
  38. data/lib/davinci_dtr_test_kit/{client_groups/must_support → full_ehr/v2.0.1}/dtr_full_ehr_questionnaire_must_support_group.rb +8 -7
  39. 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
  40. data/lib/davinci_dtr_test_kit/{dtr_full_ehr_suite.rb → full_ehr/v2.0.1/dtr_full_ehr_suite.rb} +23 -20
  41. 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
  42. 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
  43. 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
  44. 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
  45. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/must_support/dtr_must_support_attestation_test.rb +2 -1
  46. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/must_support/dtr_questionnaire_must_support_test.rb +3 -2
  47. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/payer_registration/configuration_display_smart_test.rb +1 -1
  48. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/payer_registration/configuration_display_udap_test.rb +1 -1
  49. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_custom_questionnaire_expressions_test.rb +3 -2
  50. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_custom_questionnaire_extensions_test.rb +3 -2
  51. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_custom_questionnaire_libraries_test.rb +3 -2
  52. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_custom_questionnaire_package_validation_test.rb +3 -2
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_prepopulation_attestation_test.rb +1 -1
  62. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_prepopulation_override_attestation_test.rb +1 -1
  63. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_questionnaire_package_request_validation_test.rb +1 -1
  64. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_questionnaire_response_basic_conformance_test.rb +2 -2
  65. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_questionnaire_response_prepopulation_test.rb +1 -1
  66. data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/shared/dtr_rendering_attestation_test.rb +1 -1
  67. 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
  68. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/dtr_full_ehr_abstract_adaptive_group.rb +87 -0
  69. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/dtr_full_ehr_abstract_standard_group.rb +59 -0
  70. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/dtr_full_ehr_suite.rb +145 -0
  71. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/dtr_full_ehr_suite_description_v220.md +254 -0
  72. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/full_ehr_next_question_endpoint.rb +391 -0
  73. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/full_ehr_questionnaire_package_endpoint.rb +206 -0
  74. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/interaction/adaptive_questionnaires_completed_test.rb +108 -0
  75. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/interaction/interaction_wait_test.rb +177 -0
  76. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/interaction/ui_display_and_interaction_attestation_test.rb +132 -0
  77. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/must_support/dtr_additional_questionnaires_interaction_group.rb +74 -0
  78. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/must_support/dtr_questionnaire_adaptive_must_support_test.rb +45 -0
  79. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/must_support/dtr_questionnaire_base_must_support_test.rb +43 -0
  80. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/must_support/dtr_questionnaire_standard_must_support_test.rb +45 -0
  81. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/next_question_template_questionnaires.rb +21 -0
  82. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/request/dtr_next_question_request_validation_test.rb +85 -0
  83. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/request/dtr_questionnaire_package_request_validation_test.rb +89 -0
  84. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/response/dtr_next_question_response_validation_test.rb +85 -0
  85. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/response/dtr_questionnaire_package_response_validation_test.rb +77 -0
  86. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/workflows/dtr_full_ehr_workflow_adaptive_group.rb +24 -0
  87. data/lib/davinci_dtr_test_kit/full_ehr/v2.2.0/workflows/dtr_full_ehr_workflow_standard_group.rb +21 -0
  88. data/lib/davinci_dtr_test_kit/generator/ig_metadata.rb +21 -0
  89. data/lib/davinci_dtr_test_kit/generator/profile_metadata_extractor.rb +57 -0
  90. data/lib/davinci_dtr_test_kit/generator.rb +117 -0
  91. data/lib/davinci_dtr_test_kit/igs/davinci_dtr_2.2.0.tgz +0 -0
  92. data/lib/davinci_dtr_test_kit/{dtr_options.rb → light_ehr/dtr_light_ehr_options.rb} +1 -1
  93. data/lib/davinci_dtr_test_kit/{dtr_light_ehr_suite.rb → light_ehr/v2.0.1/dtr_light_ehr_suite.rb} +21 -10
  94. data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1}/dtr_light_ehr_supported_endpoints_group.rb +5 -5
  95. data/lib/davinci_dtr_test_kit/{client_groups/light_ehr → light_ehr/v2.0.1}/dtr_smart_ehr_launch.rb +3 -3
  96. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request/communication_request_read.rb +1 -1
  97. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage/coverage_read.rb +1 -1
  98. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request/device_request_read.rb +1 -1
  99. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter/encounter_read.rb +1 -1
  100. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request/medication_request_read.rb +1 -1
  101. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order/nutrition_order_read.rb +1 -1
  102. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_create.rb +1 -1
  103. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_update.rb +1 -1
  104. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request/service_request_read.rb +1 -1
  105. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_create.rb +1 -1
  106. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_read.rb +1 -1
  107. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_update.rb +1 -1
  108. data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription/vision_prescription_read.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_accept_header_test.rb +3 -2
  110. 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 +2 -1
  111. 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 +2 -1
  112. 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 +2 -1
  113. 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 +5 -3
  114. data/lib/davinci_dtr_test_kit/metadata.rb +13 -68
  115. data/lib/davinci_dtr_test_kit/requirements/davinci_dtr_test_kit_requirements.csv +216 -0
  116. data/lib/davinci_dtr_test_kit/requirements/generated/dtr_full_ehr_requirements_coverage.csv +1 -1
  117. data/lib/davinci_dtr_test_kit/requirements/generated/dtr_full_ehr_v220_requirements_coverage.csv +1 -0
  118. data/lib/davinci_dtr_test_kit/requirements/generated/dtr_light_ehr_requirements_coverage.csv +1 -1
  119. data/lib/davinci_dtr_test_kit/requirements/generated/dtr_payer_server_requirements_coverage.csv +1 -1
  120. data/lib/davinci_dtr_test_kit/requirements/generated/dtr_payer_server_v220_requirements_coverage.csv +114 -0
  121. data/lib/davinci_dtr_test_kit/requirements/generated/dtr_smart_app_requirements_coverage.csv +1 -1
  122. data/lib/davinci_dtr_test_kit/requirements/hl7.fhir.us.davinci-dtr_2.2.0_requirements.xlsx +0 -0
  123. data/lib/davinci_dtr_test_kit/{endpoints/mock_payer → server/endpoints}/next_question_proxy_endpoint.rb +2 -0
  124. data/lib/davinci_dtr_test_kit/{endpoints/mock_payer → server/endpoints}/questionnaire_package_proxy_endpoint.rb +2 -0
  125. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_form_libraries_test.rb +2 -1
  126. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_form_questionnaire_expressions_test.rb +2 -1
  127. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_form_questionnaire_extensions_test.rb +2 -1
  128. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_next_questionnaire_expressions_test.rb +2 -1
  129. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/adaptive_next_questionnaire_extensions_test.rb +2 -1
  130. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_request_test.rb +2 -1
  131. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_request_validation_test.rb +3 -1
  132. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_response_bundles_validation_test.rb +3 -1
  133. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_response_search_validation_test.rb +3 -1
  134. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_adaptive_response_validation_test.rb +4 -2
  135. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_next_request_validation_test.rb +3 -1
  136. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_next_response_validation_test.rb +3 -1
  137. data/lib/davinci_dtr_test_kit/{dtr_payer_server_suite.rb → server/v2.0.1/dtr_payer_server_suite.rb} +13 -10
  138. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1}/payer_server_adaptive_group.rb +13 -13
  139. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1}/payer_server_static_group.rb +6 -6
  140. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_libraries_test.rb +2 -1
  141. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_questionnaire_expressions_test.rb +2 -1
  142. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_questionnaire_extensions_test.rb +2 -1
  143. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_request_test.rb +4 -2
  144. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_request_validation_test.rb +3 -2
  145. data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/static_forms}/static_form_response_validation_test.rb +5 -3
  146. data/lib/davinci_dtr_test_kit/server/v2.2.0/client_simulation.rb +297 -0
  147. data/lib/davinci_dtr_test_kit/server/v2.2.0/dtr_payer_server_capability_statement_test.rb +73 -0
  148. data/lib/davinci_dtr_test_kit/server/v2.2.0/dtr_payer_server_suite.rb +322 -0
  149. data/lib/davinci_dtr_test_kit/server/v2.2.0/dtr_payer_server_suite_description_v220.md +37 -0
  150. data/lib/davinci_dtr_test_kit/server/v2.2.0/interaction_test.rb +97 -0
  151. data/lib/davinci_dtr_test_kit/server/v2.2.0/log_questionnaire_errors_support_test.rb +57 -0
  152. data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_adaptive_must_support_test.rb +47 -0
  153. data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_adaptive_search_must_support_test.rb +40 -0
  154. data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_base_must_support_test.rb +40 -0
  155. data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_package_bundle_must_support_test.rb +38 -0
  156. data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_package_output_parameters_must_support_test.rb +37 -0
  157. data/lib/davinci_dtr_test_kit/server/v2.2.0/must_support/questionnaire_standard_must_support_test.rb +39 -0
  158. data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_request_validation_test.rb +45 -0
  159. data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/adaptive_questionnaire_endpoint_test.rb +98 -0
  160. data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/invalid_questionnaire_response_test.rb +43 -0
  161. data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/next_contained_questionnaire_response_references_test.rb +46 -0
  162. data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/next_question_response_references_test.rb +56 -0
  163. data/lib/davinci_dtr_test_kit/server/v2.2.0/next_question_support/next_question_response_validation_test.rb +67 -0
  164. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/contained_binary_test.rb +58 -0
  165. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/contained_binary_validation.rb +128 -0
  166. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/cql_library_validation_test.rb +58 -0
  167. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_design_support.rb +65 -0
  168. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_expression_elm_test.rb +81 -0
  169. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_expression_language_test.rb +63 -0
  170. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_prepopulation_test.rb +42 -0
  171. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_design/questionnaire_relevance_logic_test.rb +40 -0
  172. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_operation_validation.rb +440 -0
  173. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_request_validation_test.rb +42 -0
  174. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/adaptive_questionnaire_response_contained_questionnaire_test.rb +127 -0
  175. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/adaptive_questionnaire_response_validation_test.rb +61 -0
  176. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/contained_questionnaire_response_references_test.rb +42 -0
  177. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/dtr_server_no_custom_extension_test.rb +184 -0
  178. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/dtr_server_questionnaire_not_found_test.rb +76 -0
  179. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/dtr_server_questionnaire_package_contents_test.rb +89 -0
  180. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/initial_questionnaire_response_test.rb +132 -0
  181. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_package_input_type_test.rb +110 -0
  182. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_references_version_specific_test.rb +79 -0
  183. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_response_questionnaire_canonical_test.rb +89 -0
  184. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_response_references_test.rb +51 -0
  185. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/questionnaire_response_validation_test.rb +63 -0
  186. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/source_data_error_test.rb +43 -0
  187. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_package_support/value_set_validation_test.rb +90 -0
  188. data/lib/davinci_dtr_test_kit/server/v2.2.0/questionnaire_response_reference_validation.rb +133 -0
  189. data/lib/davinci_dtr_test_kit/server/v2.2.0/value_set_expand_support/small_value_set_expansion_test.rb +120 -0
  190. data/lib/davinci_dtr_test_kit/server/v2.2.0/value_set_expand_support/value_set_expansion_test.rb +51 -0
  191. data/lib/davinci_dtr_test_kit/server/v2.2.0/value_set_expand_support/value_set_expansion_validation.rb +58 -0
  192. data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_authorization/token_endpoint.rb +1 -1
  193. data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_ehr/fhir_get_endpoint.rb +1 -1
  194. data/lib/davinci_dtr_test_kit/smart_app/endpoints/mock_payer/smart_app_next_question_endpoint.rb +12 -0
  195. data/lib/davinci_dtr_test_kit/smart_app/endpoints/mock_payer/smart_app_questionnaire_package_endpoint.rb +12 -0
  196. 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 +17 -15
  197. 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
  198. 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
  199. data/lib/davinci_dtr_test_kit/{auth_groups → smart_app/v2.0.1/auth}/token_request_test.rb +1 -1
  200. 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
  201. data/lib/davinci_dtr_test_kit/{client_groups/must_support → smart_app/v2.0.1}/dtr_smart_app_questionnaire_must_support_group.rb +8 -7
  202. data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1}/dtr_smart_app_respiratory_workflow_group.rb +3 -3
  203. 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
  204. data/lib/davinci_dtr_test_kit/{dtr_smart_app_suite.rb → smart_app/v2.0.1/dtr_smart_app_suite.rb} +25 -21
  205. data/lib/davinci_dtr_test_kit/{docs → smart_app/v2.0.1}/dtr_smart_app_suite_description_v201.md +8 -0
  206. 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
  207. data/lib/davinci_dtr_test_kit/{auth_groups → smart_app/v2.0.1}/oauth2_authentication_group.rb +2 -2
  208. data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_questionnaire_package_group.rb +1 -1
  209. 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
  210. data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_questionnaire_response_group.rb +2 -2
  211. 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
  212. data/lib/davinci_dtr_test_kit/{client_groups/respiratory → smart_app/v2.0.1/static_respiratory}/dtr_respiratory_rendering_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_adaptive_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_prepopulation_attestation_test.rb +1 -1
  215. 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
  216. 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
  217. 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
  218. 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
  219. 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
  220. data/lib/davinci_dtr_test_kit/tags.rb +2 -0
  221. data/lib/davinci_dtr_test_kit/version.rb +2 -2
  222. data/lib/davinci_dtr_test_kit.rb +6 -4
  223. metadata +329 -215
  224. data/lib/davinci_dtr_test_kit/certs/InfernoCA.key +0 -52
  225. data/lib/davinci_dtr_test_kit/certs/InfernoCA.pem +0 -35
  226. data/lib/davinci_dtr_test_kit/certs/TestKit.pem +0 -32
  227. data/lib/davinci_dtr_test_kit/certs/TestKitPrivateKey.key +0 -28
  228. data/lib/davinci_dtr_test_kit/endpoints/mock_payer/full_ehr_next_question_endpoint.rb +0 -30
  229. data/lib/davinci_dtr_test_kit/endpoints/mock_payer/full_ehr_questionnaire_package_endpoint.rb +0 -31
  230. data/lib/davinci_dtr_test_kit/fixture_loader.rb +0 -21
  231. /data/lib/davinci_dtr_test_kit/{endpoints → cross_suite}/cors.rb +0 -0
  232. /data/lib/davinci_dtr_test_kit/{dtr_questionnaire_response_validation.rb → cross_suite/v2.0.1/dtr_questionnaire_response_validation.rb} +0 -0
  233. /data/lib/davinci_dtr_test_kit/{descriptions.rb → full_ehr/descriptions.rb} +0 -0
  234. /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_adaptive/dinner_order_adaptive_next_question_burrito.json +0 -0
  235. /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_adaptive/dinner_order_adaptive_next_question_hamburger.json +0 -0
  236. /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_adaptive/dinner_order_adaptive_next_question_initial.json +0 -0
  237. /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_adaptive/questionnaire_dinner_order_adaptive.json +0 -0
  238. /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_static/questionnaire_dinner_order_static.json +0 -0
  239. /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/dinner_static/questionnaire_response_dinner_order_static.json +0 -0
  240. /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/respiratory_assist_device/pre_populated_questionnaire_response.json +0 -0
  241. /data/lib/davinci_dtr_test_kit/{fixtures → full_ehr/fixtures}/respiratory_assist_device/questionnaire_package.json +0 -0
  242. /data/lib/davinci_dtr_test_kit/{fixtures.rb → full_ehr/fixtures.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_completion_group.rb +0 -0
  244. /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
  245. /data/lib/davinci_dtr_test_kit/{client_groups/auth → full_ehr/v2.0.1}/dtr_client_payer_auth_smart_group.rb +0 -0
  246. /data/lib/davinci_dtr_test_kit/{client_groups/auth → full_ehr/v2.0.1}/dtr_client_payer_auth_udap_group.rb +0 -0
  247. /data/lib/davinci_dtr_test_kit/{docs → full_ehr/v2.0.1}/dtr_full_ehr_suite_description_v201.md +0 -0
  248. /data/lib/davinci_dtr_test_kit/{client_groups → full_ehr/v2.0.1}/must_support/questionnaire_must_support_elements.rb +0 -0
  249. /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
  250. /data/lib/davinci_dtr_test_kit/{create_test.rb → light_ehr/create_test.rb} +0 -0
  251. /data/lib/davinci_dtr_test_kit/{endpoints/mock_payer → light_ehr/endpoints}/light_ehr_supported_payer_endpoint.rb +0 -0
  252. /data/lib/davinci_dtr_test_kit/{read_test.rb → light_ehr/read_test.rb} +0 -0
  253. /data/lib/davinci_dtr_test_kit/{update_test.rb → light_ehr/update_test.rb} +0 -0
  254. /data/lib/davinci_dtr_test_kit/{docs → light_ehr/v2.0.1}/dtr_light_ehr_suite_description_v201.md +0 -0
  255. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request/communication_request_must_support_test.rb +0 -0
  256. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request/communication_request_validation.rb +0 -0
  257. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request/metadata.yml +0 -0
  258. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/communication_request_group.rb +0 -0
  259. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage/coverage_must_support_test.rb +0 -0
  260. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage/coverage_validation.rb +0 -0
  261. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage/metadata.yml +0 -0
  262. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/coverage_group.rb +0 -0
  263. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request/device_request_must_support_test.rb +0 -0
  264. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request/device_request_validation.rb +0 -0
  265. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request/metadata.yml +0 -0
  266. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/device_request_group.rb +0 -0
  267. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter/encounter_must_support_test.rb +0 -0
  268. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter/encounter_validation.rb +0 -0
  269. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter/metadata.yml +0 -0
  270. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/encounter_group.rb +0 -0
  271. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request/medication_request_must_support_test.rb +0 -0
  272. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request/medication_request_validation.rb +0 -0
  273. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request/metadata.yml +0 -0
  274. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/medication_request_group.rb +0 -0
  275. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order/metadata.yml +0 -0
  276. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order/nutrition_order_must_support_test.rb +0 -0
  277. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order/nutrition_order_validation.rb +0 -0
  278. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/nutrition_order_group.rb +0 -0
  279. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/metadata.yml +0 -0
  280. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_context_search.rb +0 -0
  281. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_must_support_test.rb +0 -0
  282. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_patient_search.rb +0 -0
  283. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_read.rb +0 -0
  284. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response/questionnaire_response_validation.rb +0 -0
  285. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/questionnaire_response_group.rb +0 -0
  286. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request/metadata.yml +0 -0
  287. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request/service_request_must_support_test.rb +0 -0
  288. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request/service_request_validation.rb +0 -0
  289. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/service_request_group.rb +0 -0
  290. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/metadata.yml +0 -0
  291. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_must_support_test.rb +0 -0
  292. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task/task_validation.rb +0 -0
  293. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/task_group.rb +0 -0
  294. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription/metadata.yml +0 -0
  295. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription/vision_prescription_must_support_test.rb +0 -0
  296. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription/vision_prescription_validation.rb +0 -0
  297. /data/lib/davinci_dtr_test_kit/{profiles → light_ehr/v2.0.1/profiles}/vision_prescription_group.rb +0 -0
  298. /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
  299. /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
  300. /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
  301. /data/lib/davinci_dtr_test_kit/{endpoints/mock_authorization → server/endpoints}/simple_token_endpoint.rb +0 -0
  302. /data/lib/davinci_dtr_test_kit/{payer_server_groups → server/v2.0.1/adaptive_forms}/payer_server_next_response_complete_test.rb +0 -0
  303. /data/lib/davinci_dtr_test_kit/{docs → server/v2.0.1}/dtr_payer_server_suite_description_v201.md +0 -0
  304. /data/lib/davinci_dtr_test_kit/{validation_test.rb → server/validation_test.rb} +0 -0
  305. /data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_authorization/authorize_endpoint.rb +0 -0
  306. /data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_authorization.rb +0 -0
  307. /data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_ehr/questionnaire_response_endpoint.rb +0 -0
  308. /data/lib/davinci_dtr_test_kit/{endpoints → smart_app/endpoints}/mock_ehr.rb +0 -0
  309. /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
  310. /data/lib/davinci_dtr_test_kit/{auth_groups → smart_app/v2.0.1/auth}/token_validation_test.rb +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,37 @@
1
+ The Da Vinci DTR Test Kit Payer Server Suite validates the conformance of payer
2
+ server systems to the STU 2.2.0 version of the HL7® FHIR® [Da Vinci
3
+ Documentation Templates and Rules (DTR) Implementation
4
+ Guide](https://hl7.org/fhir/us/davinci-dtr/2.2.0/).
5
+
6
+ These tests are a **DRAFT** intended to allow payer implementers to perform
7
+ preliminary checks of their systems against DTR IG requirements and [provide
8
+ feedback](https://github.com/inferno-framework/davinci-dtr-test-kit/issues)
9
+ on the tests. Future versions of these tests may validate other
10
+ requirements and may change the test validation logic.
11
+
12
+ The best place to get started is the [Server Testing
13
+ Instructions](https://github.com/inferno-framework/davinci-dtr-test-kit/wiki/Server-Instructions-v2.2.0),
14
+ which provides a step-by-step guide for running the tests. Visit the [Server
15
+ Testing
16
+ Details](https://github.com/inferno-framework/davinci-dtr-test-kit/wiki/Server-Details)
17
+ documentation for information about technical implementation and known
18
+ limitations of these tests.
19
+
20
+ Inferno will simulate a DTR client and make a series of requests to the system
21
+ under test. Because the business logic that determines Questionnaire design and
22
+ which Questionnaires will be returned is outside of the scope of the DTR
23
+ specification and will vary between implementers, testers are required to
24
+ provide the requests that Inferno will make to the server. These requests must
25
+ cause the server to return Questionnaires which demonstrate support for DTR
26
+ requirements, including
27
+ - Advertising support for DTR operations in the CapabilityStatement
28
+ - Support for SMART backend services authorization
29
+ - Responding to the `$questionnaire-package`, `$next-question` (optional),
30
+ `ValueSet/$expand`, and `$log-questionnaire-errors` operations
31
+ - Populating all Must Support elements in the responses
32
+ - Correctly handling errors
33
+
34
+ All requests and responses will be checked for conformance to the DTR IG
35
+ requirements individually and used in aggregate to determine whether required
36
+ features and functionality are present. HL7® FHIR® resources are validated with
37
+ the Java validator using tx.fhir.org as the terminology server.
@@ -0,0 +1,97 @@
1
+ require_relative 'client_simulation'
2
+
3
+ module DaVinciDTRTestKit
4
+ module DTRPayerServerV220
5
+ class InteractionTest < Inferno::Test
6
+ include ClientSimulation
7
+
8
+ id :dtr_v220_payer_interaction
9
+ title 'Request Questionnaires'
10
+ description %(
11
+ During this test, Inferno will simulate a DTR Client and make requests against
12
+ the payer endpoint to retrieve and complete questionnaires, including
13
+ - the `Questionnaire/$questionnaire-package` operation
14
+ - the `Questionnaire/$next-question` operation
15
+ - the `ValueSet/$expand` operation
16
+
17
+ The tester will provide the details of the requests for Inferno to use, including
18
+ - A list of `$questionnaire-package` request parameters: Inferno will invoke the
19
+ `$questionnaire-package` once per provided request body. Inferno will look
20
+ for the following entries withing package bundles for follow-up requests:
21
+ - Unexpanded ValueSets: Inferno will issue a `ValueSet/$expand` request for each.
22
+ - Adaptive Questionnaires: Inferno will attempt to complete the form using the
23
+ `Questionnaire/$next-question` operation using answers from tester-provided
24
+ QuestionnaireResponse templates.
25
+ - A list of QuestionnaireResponse templates: When an adaptive form is returned in
26
+ a `$questionnaire-package` response, Inferno will find a matching template from
27
+ this list based on the Questionnaire and use the answers to construct a sequence
28
+ of `$next-question` calls.
29
+
30
+ Requests made during this test are tagged for analysis in subsequent tests.
31
+ )
32
+
33
+ input :url,
34
+ title: 'Payer FHIR Server Base Url',
35
+ description: 'Base FHIR URL implementing the DTR server operations.'
36
+ input :questionnaire_package_request_parameters,
37
+ title: '$questionnaire-package Request Parameters',
38
+ description: %(
39
+ Tester-provided list of one or more $questionnaire-package requests each
40
+ as a Parameters resource in json format. Inferno will call the
41
+ `Questionnaire/$questionnaire-package` operation once for each
42
+ with the request as the body of the invocation.
43
+ ),
44
+ type: 'textarea'
45
+ input :questionnaire_response_templates,
46
+ title: 'QuestionnaireResponse Templates for $next-question requests',
47
+ description: %(
48
+ Tester-provided list of one or more QuestionnaireResponse resources in json format
49
+ that Inferno will use to populate answers for adaptive forms for the purpose
50
+ of building `Questionnaire/$next-question` requests to complete these forms.
51
+ If not provided, no `$next-question` requests will be performed.
52
+ ),
53
+ type: 'textarea',
54
+ optional: true
55
+ input :backend_services_smart_auth_info
56
+
57
+ run do
58
+ parameters = extract_fhir_parameters(questionnaire_package_request_parameters)
59
+ templates = extract_fhir_questionnaire_response_templates(questionnaire_response_templates)
60
+ parameters.each { |parameter| questionnaire_interaction(url, parameter, templates) }
61
+ end
62
+
63
+ def extract_fhir_parameters(questionnaire_package_request_parameters)
64
+ parameters_list = Array.wrap(parsed_json_if_valid(questionnaire_package_request_parameters,
65
+ 'Provided well-formed $questionnaire-package bodies.',
66
+ continue: false))
67
+ parameters_list.map.with_index do |entry, index|
68
+ if entry['resourceType'] == 'Parameters'
69
+ FHIR::Parameters.new(entry)
70
+ else
71
+ add_message('warning', "skipping **$questionnaire-package Parameters** input entry #{index + 1}: " \
72
+ 'not a FHIR Parameters resource')
73
+ nil
74
+ end
75
+ end.compact
76
+ end
77
+
78
+ def extract_fhir_questionnaire_response_templates(questionnaire_response_templates)
79
+ return nil unless questionnaire_response_templates.present?
80
+
81
+ questionnaire_response_list =
82
+ Array.wrap(parsed_json_if_valid(questionnaire_response_templates,
83
+ 'Provided well-formed QuestionnaireResponse templates.',
84
+ continue: false))
85
+ questionnaire_response_list.map.with_index do |entry, index|
86
+ if entry['resourceType'] == 'QuestionnaireResponse'
87
+ FHIR::QuestionnaireResponse.new(entry)
88
+ else
89
+ add_message('warning', 'skipping **QuestionnaireResponse Templates for $next-question requests** ' \
90
+ "input entry #{index + 1}: not a FHIR QuestionnaireResponse resource")
91
+ nil
92
+ end
93
+ end.compact
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,57 @@
1
+ module DaVinciDTRTestKit
2
+ module DTRPayerServerV220
3
+ class LogQuestionnaireErrorsSupportTest < Inferno::Test
4
+ id :dtr_v220_payer_log_questionnaire_errors_support
5
+ title 'Verify $log-questionnaire-errors operation support'
6
+ description %(
7
+ This test verifies that the payer supports the
8
+ [`Questionnaire/$log-questionnaire-errors` operation](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/OperationDefinition-log-questionnaire-errors.html).
9
+
10
+ Inferno submits a representative, non-PHI error report containing a
11
+ Questionnaire canonical and an OperationOutcome. The payer must respond
12
+ with a successful HTTP response.
13
+ )
14
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@oper-1'
15
+
16
+ input :url
17
+ input :questionnaire_canonical,
18
+ title: 'Questionnaire Canonical URL',
19
+ description: 'Canonical URL of a Questionnaire supported by the payer.'
20
+
21
+ def log_questionnaire_errors_parameters
22
+ FHIR::Parameters.new(
23
+ parameter: [
24
+ FHIR::Parameters::Parameter.new(
25
+ name: 'questionnaire',
26
+ valueCanonical: questionnaire_canonical
27
+ ),
28
+ FHIR::Parameters::Parameter.new(
29
+ name: 'operationOutcome',
30
+ resource: FHIR::OperationOutcome.new(
31
+ issue: [
32
+ FHIR::OperationOutcome::Issue.new(
33
+ severity: 'error',
34
+ code: 'processing',
35
+ diagnostics: 'Unable to evaluate a Questionnaire expression.'
36
+ )
37
+ ]
38
+ )
39
+ )
40
+ ]
41
+ )
42
+ end
43
+
44
+ run do
45
+ fhir_operation(
46
+ "#{url.chomp('/')}/Questionnaire/$log-questionnaire-errors",
47
+ body: log_questionnaire_errors_parameters,
48
+ headers: { 'Content-Type': 'application/fhir+json' }
49
+ )
50
+
51
+ status = request.status.to_s
52
+ assert status.start_with?('2'),
53
+ "Expected a successful 2xx response to $log-questionnaire-errors, but received HTTP #{status}."
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../../../cross_suite/generated_profile_metadata'
2
+ require_relative '../../../cross_suite/v2.2.0/questionnaire_helper'
3
+ require_relative '../../../tags'
4
+
5
+ module DaVinciDTRTestKit
6
+ module DTRPayerServerV220
7
+ class QuestionnaireAdaptiveMustSupportTest < Inferno::Test
8
+ include QuestionnaireHelper
9
+
10
+ MUST_SUPPORT_METADATA = GeneratedProfileMetadata.for('v2.2.0', 'dtr_questionnaire_adapt')
11
+
12
+ id :dtr_v220_payer_questionnaire_adaptive_must_support
13
+ title 'Server provides adaptive Questionnaire must support elements and extensions'
14
+ description %(
15
+ This test confirms that all must support elements added in the
16
+ [DTR Questionnaire for Adaptive Form](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/StructureDefinition-dtr-questionnaire-adapt.html)
17
+ profile have been observed cumulatively across adaptive Questionnaires returned
18
+ during previous `$next-question` tests. Common inherited Questionnaire elements
19
+ are evaluated separately.
20
+
21
+ This includes the following elements:
22
+ - #{MUST_SUPPORT_METADATA.must_support_strings.join("\n - ")}
23
+ )
24
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@conf-2'
25
+
26
+ run do
27
+ load_tagged_requests(NEXT_TAG)
28
+ questionnaires = questionnaires_from_operation_responses(requests)
29
+
30
+ if questionnaires.blank?
31
+ load_tagged_requests(QUESTIONNAIRE_TAG)
32
+ questionnaire_package_questionnaires = questionnaires_from_operation_responses(requests)
33
+ adaptive_search_questionnaires = questionnaire_package_questionnaires.select do |questionnaire|
34
+ adaptive_questionnaire?(questionnaire)
35
+ end
36
+ omit_if questionnaire_package_questionnaires.present? && adaptive_search_questionnaires.blank?,
37
+ 'The server did not return any adaptive-search Questionnaires.'
38
+
39
+ skip 'No adaptive Questionnaires were found in $next-question responses.'
40
+ end
41
+
42
+ assert_must_support_elements_present(questionnaires, MUST_SUPPORT_METADATA.profile_url,
43
+ metadata: MUST_SUPPORT_METADATA)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../../cross_suite/generated_profile_metadata'
2
+ require_relative '../../../cross_suite/v2.2.0/questionnaire_helper'
3
+ require_relative '../../../tags'
4
+
5
+ module DaVinciDTRTestKit
6
+ module DTRPayerServerV220
7
+ class QuestionnaireAdaptiveSearchMustSupportTest < Inferno::Test
8
+ include QuestionnaireHelper
9
+
10
+ MUST_SUPPORT_METADATA = GeneratedProfileMetadata.for('v2.2.0', 'dtr_questionnaire_adapt_search')
11
+
12
+ id :dtr_v220_payer_questionnaire_adaptive_search_must_support
13
+ title 'Server provides adaptive-search Questionnaire must support elements and extensions'
14
+ description %(
15
+ This test confirms that all must support elements and extensions defined in the
16
+ [DTR Adaptive Questionnaire Search](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/StructureDefinition-dtr-questionnaire-adapt-search.html)
17
+ profile have been observed cumulatively across adaptive-search Questionnaires
18
+ returned during previous `$questionnaire-package` tests.
19
+
20
+ This includes the following elements:
21
+ - #{MUST_SUPPORT_METADATA.must_support_strings.join("\n - ")}
22
+ )
23
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@conf-2'
24
+
25
+ run do
26
+ load_tagged_requests(QUESTIONNAIRE_TAG)
27
+ questionnaires = questionnaires_from_operation_responses(requests)
28
+ skip_if questionnaires.blank?, 'No Questionnaires were found in $questionnaire-package responses.'
29
+
30
+ adaptive_search_questionnaires = questionnaires.select do |questionnaire|
31
+ adaptive_questionnaire?(questionnaire)
32
+ end
33
+ omit_if adaptive_search_questionnaires.blank?, 'The server did not return any adaptive-search Questionnaires.'
34
+
35
+ assert_must_support_elements_present(adaptive_search_questionnaires, MUST_SUPPORT_METADATA.profile_url,
36
+ metadata: MUST_SUPPORT_METADATA)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../../../cross_suite/generated_profile_metadata'
2
+ require_relative '../../../cross_suite/v2.2.0/questionnaire_helper'
3
+
4
+ module DaVinciDTRTestKit
5
+ module DTRPayerServerV220
6
+ class QuestionnaireBaseMustSupportTest < Inferno::Test
7
+ include QuestionnaireHelper
8
+
9
+ MUST_SUPPORT_METADATA = GeneratedProfileMetadata.for('v2.2.0', 'dtr_base_questionnaire')
10
+
11
+ id :dtr_v220_payer_questionnaire_base_must_support
12
+ title 'Server provides common DTR Questionnaire must support elements and extensions'
13
+ description %(
14
+ This test confirms that all must support elements and extensions defined in the
15
+ [DTR Base Questionnaire](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/StructureDefinition-dtr-base-questionnaire.html)
16
+ profile and its parents have been observed cumulatively across standard
17
+ and adaptive Questionnaires returned during previous tests.
18
+
19
+ This includes the following elements:
20
+ - #{MUST_SUPPORT_METADATA.must_support_strings.join("\n - ")}
21
+ )
22
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@conf-2'
23
+
24
+ run do
25
+ questionnaire_package_requests = load_tagged_requests(QUESTIONNAIRE_TAG)
26
+ next_question_requests = load_tagged_requests(NEXT_TAG)
27
+ skip_if requests.blank?, 'Requests must be made prior to running this test.'
28
+
29
+ questionnaires = questionnaires_from_operation_responses(
30
+ questionnaire_package_requests,
31
+ include_adaptive: false
32
+ ) + questionnaires_from_operation_responses(next_question_requests)
33
+ skip_if questionnaires.blank?, 'No standard or adaptive Questionnaires were found to evaluate.'
34
+
35
+ assert_must_support_elements_present(questionnaires, MUST_SUPPORT_METADATA.profile_url,
36
+ metadata: MUST_SUPPORT_METADATA)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../../../cross_suite/generated_profile_metadata'
2
+ require_relative '../../../cross_suite/v2.2.0/questionnaire_helper'
3
+ require_relative '../../../tags'
4
+
5
+ module DaVinciDTRTestKit
6
+ module DTRPayerServerV220
7
+ class QuestionnairePackageBundleMustSupportTest < Inferno::Test
8
+ include QuestionnaireHelper
9
+
10
+ MUST_SUPPORT_METADATA = GeneratedProfileMetadata.for('v2.2.0', 'dtr_q_package_bundle')
11
+
12
+ id :dtr_v220_payer_questionnaire_package_bundle_must_support
13
+ title 'Server provides Questionnaire Package Bundle must support elements'
14
+ description %(
15
+ This test confirms that all must support entries defined in the
16
+ [DTR Questionnaire Package Bundle](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/StructureDefinition-DTR-QPackageBundle.html)
17
+ profile have been observed cumulatively across package Bundles returned during
18
+ previous `$questionnaire-package` tests.
19
+
20
+ This includes the following elements:
21
+ - #{MUST_SUPPORT_METADATA.must_support_strings.join("\n - ")}
22
+ )
23
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@conf-2'
24
+
25
+ run do
26
+ load_tagged_requests(QUESTIONNAIRE_TAG)
27
+ skip_if requests.blank?, 'Requests must be made prior to running this test.'
28
+
29
+ bundles = questionnaire_package_output_parameters_from_operation_responses(requests)
30
+ .flat_map { |parameters| questionnaire_package_bundles(parameters) }
31
+ skip_if bundles.blank?, 'No Questionnaire Package Bundle resources were found to evaluate.'
32
+
33
+ assert_must_support_elements_present(bundles, MUST_SUPPORT_METADATA.profile_url,
34
+ metadata: MUST_SUPPORT_METADATA)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../../../cross_suite/generated_profile_metadata'
2
+ require_relative '../../../cross_suite/v2.2.0/questionnaire_helper'
3
+ require_relative '../../../tags'
4
+
5
+ module DaVinciDTRTestKit
6
+ module DTRPayerServerV220
7
+ class QuestionnairePackageOutputParametersMustSupportTest < Inferno::Test
8
+ include QuestionnaireHelper
9
+
10
+ MUST_SUPPORT_METADATA = GeneratedProfileMetadata.for('v2.2.0', 'dtr_qpackage_output_parameters')
11
+
12
+ id :dtr_v220_payer_questionnaire_package_output_parameters_must_support
13
+ title 'Server provides Questionnaire Package Output Parameters must support elements'
14
+ description %(
15
+ This test confirms that all must support elements defined in the
16
+ [DTR Questionnaire Package Output Parameters](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/StructureDefinition-dtr-qpackage-output-parameters.html)
17
+ profile have been observed cumulatively across `$questionnaire-package` responses
18
+ returned during previous tests.
19
+
20
+ This includes the following elements:
21
+ - #{MUST_SUPPORT_METADATA.must_support_strings.join("\n - ")}
22
+ )
23
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@conf-2'
24
+
25
+ run do
26
+ load_tagged_requests(QUESTIONNAIRE_TAG)
27
+ skip_if requests.blank?, 'Requests must be made prior to running this test.'
28
+
29
+ parameters = questionnaire_package_output_parameters_from_operation_responses(requests)
30
+ skip_if parameters.blank?, 'No Questionnaire Package Output Parameters resources were found to evaluate.'
31
+
32
+ assert_must_support_elements_present(parameters, MUST_SUPPORT_METADATA.profile_url,
33
+ metadata: MUST_SUPPORT_METADATA)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,39 @@
1
+ require_relative '../../../cross_suite/generated_profile_metadata'
2
+ require_relative '../../../cross_suite/v2.2.0/questionnaire_helper'
3
+ require_relative '../../../tags'
4
+
5
+ module DaVinciDTRTestKit
6
+ module DTRPayerServerV220
7
+ class QuestionnaireStandardMustSupportTest < Inferno::Test
8
+ include QuestionnaireHelper
9
+
10
+ MUST_SUPPORT_METADATA = GeneratedProfileMetadata.for('v2.2.0', 'dtr_std_questionnaire')
11
+
12
+ id :dtr_v220_payer_questionnaire_standard_must_support
13
+ title 'Server provides standard Questionnaire must support elements and extensions'
14
+ description %(
15
+ This test confirms that all must support elements added in the
16
+ [DTR Standard Questionnaire](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/StructureDefinition-dtr-std-questionnaire.html)
17
+ profile have been observed cumulatively across standard Questionnaires returned
18
+ during previous `$questionnaire-package` tests. Common inherited Questionnaire
19
+ elements are evaluated separately.
20
+
21
+ This includes the following elements:
22
+ - #{MUST_SUPPORT_METADATA.must_support_strings.join("\n - ")}
23
+ )
24
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@conf-2'
25
+
26
+ run do
27
+ load_tagged_requests(QUESTIONNAIRE_TAG)
28
+ questionnaires = questionnaires_from_operation_responses(requests)
29
+ skip_if questionnaires.blank?, 'No Questionnaires were found in $questionnaire-package responses.'
30
+
31
+ standard_questionnaires = questionnaires.reject { |questionnaire| adaptive_questionnaire?(questionnaire) }
32
+ omit_if standard_questionnaires.blank?, 'The server did not return any standard Questionnaires.'
33
+
34
+ assert_must_support_elements_present(standard_questionnaires, MUST_SUPPORT_METADATA.profile_url,
35
+ metadata: MUST_SUPPORT_METADATA)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,45 @@
1
+ require_relative '../validation_test'
2
+ require_relative '../../tags'
3
+
4
+ module DaVinciDTRTestKit
5
+ module DTRPayerServerV220
6
+ class NextQuestionRequestValidationTest < Inferno::Test
7
+ include DaVinciDTRTestKit::ValidationTest
8
+
9
+ id :dtr_v220_payer_next_question_request_validation
10
+ title '$next-question QuestionnaireResponse request is valid'
11
+ description %(
12
+ This test validates that each outgoing QuestionnaireResponse request to the
13
+ `$next-question` operation
14
+ conforms to the [DTR Questionnaire Response for adaptive form profile](https://hl7.org/fhir/us/davinci-dtr/2.2.0/en/StructureDefinition-dtr-questionnaireresponse-adapt.html).
15
+ Inferno generates these request bodies from the provided test input.
16
+ )
17
+ simulation_verification
18
+
19
+ run do
20
+ load_tagged_requests(NEXT_TAG)
21
+
22
+ omit_if requests.empty?, 'No $next-question requests were made.'
23
+
24
+ requests.each_with_index do |request, index|
25
+ fhir_obj = begin
26
+ FHIR.from_contents(request.request_body)
27
+ rescue StandardError
28
+ nil
29
+ end
30
+
31
+ validate_resource(
32
+ fhir_obj,
33
+ :questionnaire_response,
34
+ 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-questionnaireresponse-adapt|2.2.0',
35
+ index
36
+ )
37
+ end
38
+
39
+ assert_no_error_messages(
40
+ 'Non-conformant $next-question QuestionnaireResponse request. See Messages for details.'
41
+ )
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../tags'
4
+ require_relative '../questionnaire_operation_validation'
5
+
6
+ module DaVinciDTRTestKit
7
+ module DTRPayerServerV220
8
+ class AdaptiveQuestionnaireEndpointTest < Inferno::Test
9
+ include QuestionnaireOperationValidation
10
+
11
+ ADAPTIVE_QUESTIONNAIRE_EXTENSION_URL =
12
+ 'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-questionnaireAdaptive'
13
+
14
+ id :dtr_v220_payer_adaptive_questionnaire_endpoint
15
+ title 'Adaptive Questionnaire endpoints are payer sub-URLs accessible with the configured credentials'
16
+ description %(
17
+ This test verifies that every URL provided by a `questionnaireAdaptive`
18
+ extension is a sub-URL of the payer FHIR base. It also verifies that the
19
+ DTR client's `$next-question` request to that endpoint succeeds. The
20
+ request is made by the same configured FHIR client used for the
21
+ `$questionnaire-package` operation.
22
+ )
23
+
24
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@spec-24'
25
+
26
+ input :url
27
+
28
+ run do
29
+ questionnaire_requests = load_tagged_requests(QUESTIONNAIRE_TAG)
30
+ successful_questionnaire_requests = questionnaire_requests.select do |request|
31
+ request.status.to_s.start_with?('2')
32
+ end
33
+ skip_if successful_questionnaire_requests.blank?, 'No successful $questionnaire-package requests were made.'
34
+
35
+ adaptive_urls = successful_questionnaire_requests.flat_map do |request|
36
+ adaptive_questionnaire_urls(request)
37
+ end.uniq
38
+ omit_if adaptive_urls.blank?, 'No adaptive Questionnaire URLs were returned.'
39
+
40
+ next_question_requests = load_tagged_requests(NEXT_TAG)
41
+ adaptive_urls.each do |adaptive_url|
42
+ payer_base_url = url.chomp('/')
43
+ unless adaptive_url.chomp('/') == payer_base_url || adaptive_url.start_with?("#{payer_base_url}/")
44
+ add_message(
45
+ 'error',
46
+ "`questionnaireAdaptive` extension URL `#{adaptive_url}` is not a sub-URL of payer base `#{url}`."
47
+ )
48
+ next
49
+ end
50
+
51
+ expected_next_question_url = "#{adaptive_url.chomp('/')}/Questionnaire/$next-question"
52
+ matching_request = next_question_requests.find { |request| request.url == expected_next_question_url }
53
+
54
+ if matching_request.nil?
55
+ add_message(
56
+ 'error',
57
+ "No $next-question request was made to `questionnaireAdaptive` extension URL `#{adaptive_url}`."
58
+ )
59
+ elsif !matching_request.status.to_s.start_with?('2')
60
+ add_message(
61
+ 'error',
62
+ "$next-question request to `questionnaireAdaptive` extension URL `#{adaptive_url}` did not succeed " \
63
+ "(received HTTP #{matching_request.status})."
64
+ )
65
+ end
66
+ end
67
+
68
+ assert_no_error_messages(
69
+ '`questionnaireAdaptive` extension URLs must be payer sub-URLs and accessible with ' \
70
+ 'the configured credentials.'
71
+ )
72
+ end
73
+
74
+ private
75
+
76
+ def adaptive_questionnaire_urls(request)
77
+ resource = FHIR.from_contents(request.response_body)
78
+ extract_questionnaire_bundles(resource).flat_map do |bundle|
79
+ adaptive_questionnaire_urls_from_bundle(bundle)
80
+ end
81
+ rescue JSON::ParserError, NoMethodError
82
+ []
83
+ end
84
+
85
+ def adaptive_questionnaire_urls_from_bundle(bundle)
86
+ extract_questionnaires_from_bundles([bundle]).filter_map do |questionnaire|
87
+ adaptive_questionnaire_url(questionnaire)
88
+ end
89
+ end
90
+
91
+ def adaptive_questionnaire_url(questionnaire)
92
+ questionnaire.extension&.find do |extension|
93
+ extension.url == ADAPTIVE_QUESTIONNAIRE_EXTENSION_URL && extension.valueUrl.present?
94
+ end&.valueUrl
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaVinciDTRTestKit
4
+ module DTRPayerServerV220
5
+ class InvalidQuestionnaireResponseTest < Inferno::Test
6
+ id :dtr_v220_payer_invalid_questionnaire_response
7
+ title 'Invalid QuestionnaireResponses return 400 with an OperationOutcome'
8
+ description %(
9
+ Inferno invokes `Questionnaire/$next-question` using a tester-provided
10
+ QuestionnaireResponse that the DTR server considers invalid based on the
11
+ rules in its contained Questionnaire. Inferno verifies that the server
12
+ returns HTTP 400 with an OperationOutcome describing the error.
13
+ )
14
+ verifies_requirements 'hl7.fhir.us.davinci-dtr_2.2.0@spec-147'
15
+
16
+ input :invalid_questionnaire_response,
17
+ title: 'Invalid QuestionnaireResponse',
18
+ description: %(
19
+ Provide a `QuestionnaireResponse` resource in JSON format that the DTR
20
+ server will determine is invalid based on the rules in its contained
21
+ Questionnaire.
22
+ ),
23
+ type: 'textarea'
24
+
25
+ run do
26
+ assert_valid_json invalid_questionnaire_response, 'The provided QuestionnaireResponse is not valid JSON.'
27
+ questionnaire_response = FHIR.from_contents(invalid_questionnaire_response)
28
+ assert_resource_type(:questionnaire_response, resource: questionnaire_response)
29
+
30
+ fhir_operation(
31
+ '/Questionnaire/$next-question',
32
+ body: questionnaire_response,
33
+ headers: { 'Content-Type': 'application/fhir+json' }
34
+ )
35
+
36
+ assert_response_status(400)
37
+ assert_resource_type(:operation_outcome)
38
+ assert resource.issue.present?,
39
+ 'The OperationOutcome did not include an issue describing why the QuestionnaireResponse was invalid.'
40
+ end
41
+ end
42
+ end
43
+ end