davinci_dtr_test_kit 0.14.2 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/full_ehr_postman_dinner_order_example_postman.json +19 -0
  3. data/config/presets/full_ehr_postman_respiratory_device_example.json +15 -0
  4. data/config/presets/light_ehr_ref_server_local.json +105 -0
  5. data/config/presets/light_ehr_ref_server_prod.json +85 -0
  6. data/config/presets/payer_server_adaptive_client_flow.json +37 -0
  7. data/config/presets/payer_server_adaptive_manual_flow.json +44 -0
  8. data/config/presets/payer_server_run_against_smart_app_tests.json +35 -0
  9. data/config/presets/smart_app_postman_dinner_order_example.json +44 -0
  10. data/config/presets/smart_app_postman_respiratory_device_example.json +43 -0
  11. data/lib/davinci_dtr_test_kit/auth_groups/token_validation_test.rb +1 -1
  12. data/lib/davinci_dtr_test_kit/client_groups/custom_static/dtr_custom_questionnaire_expressions_test.rb +22 -0
  13. data/lib/davinci_dtr_test_kit/client_groups/custom_static/dtr_custom_questionnaire_extensions_test.rb +19 -0
  14. data/lib/davinci_dtr_test_kit/client_groups/custom_static/dtr_custom_questionnaire_libraries_test.rb +21 -0
  15. data/lib/davinci_dtr_test_kit/client_groups/custom_static/dtr_custom_questionnaire_package_validation_test.rb +39 -0
  16. data/lib/davinci_dtr_test_kit/client_groups/custom_static/dtr_full_ehr_custom_static_workflow_group.rb +122 -0
  17. data/lib/davinci_dtr_test_kit/client_groups/custom_static/dtr_smart_app_custom_static_workflow_group.rb +91 -0
  18. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_adaptive_questionnaire_completion_group.rb → dtr_adaptive_completion_group.rb} +4 -4
  19. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_adaptive_questionnaire_followup_questions_group.rb → dtr_adaptive_followup_questions_group.rb} +4 -4
  20. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_adaptive_questionnaire_next_question_request_test.rb → dtr_adaptive_next_question_request_test.rb} +3 -2
  21. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_adaptive_questionnaire_next_question_request_validation_test.rb → dtr_adaptive_next_question_request_validation_test.rb} +3 -2
  22. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_adaptive_questionnaire_next_question_retrieval_group.rb → dtr_adaptive_next_question_retrieval_group.rb} +8 -8
  23. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_adaptive_questionnaire_response_validation_test.rb → dtr_adaptive_response_validation_test.rb} +6 -4
  24. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_full_ehr_adaptive_dinner_questionnaire_workflow_group.rb → dtr_full_ehr_adaptive_dinner_workflow_group.rb} +14 -12
  25. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_full_ehr_adaptive_questionnaire_initial_retrieval_group.rb → dtr_full_ehr_adaptive_initial_retrieval_group.rb} +10 -10
  26. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_full_ehr_adaptive_questionnaire_request_test.rb → dtr_full_ehr_adaptive_request_test.rb} +4 -2
  27. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_smart_app_questionnaire_workflow_group.rb → dtr_smart_app_adaptive_dinner_workflow_group.rb} +25 -19
  28. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/dtr_smart_app_adaptive_initial_retrieval_group.rb +24 -0
  29. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/{dtr_smart_app_adaptive_questionnaire_request_test.rb → dtr_smart_app_adaptive_request_test.rb} +2 -2
  30. data/lib/davinci_dtr_test_kit/client_groups/dinner_static/{dtr_full_ehr_questionnaire_workflow_group.rb → dtr_full_ehr_static_dinner_workflow_group.rb} +15 -14
  31. data/lib/davinci_dtr_test_kit/client_groups/dinner_static/{dtr_smart_app_questionnaire_workflow_group.rb → dtr_smart_app_static_dinner_workflow_group.rb} +18 -13
  32. data/lib/davinci_dtr_test_kit/client_groups/{full_ehr/dtr_full_ehr_rendering_enabled_questions_attestation_test.rb → dinner_static/dtr_static_dinner_enabled_questions_attestation_test.rb} +2 -2
  33. data/lib/davinci_dtr_test_kit/client_groups/full_ehr/dtr_full_ehr_launch_attestation_test.rb +8 -3
  34. data/lib/davinci_dtr_test_kit/client_groups/full_ehr/dtr_full_ehr_prepopulation_attestation_test.rb +3 -1
  35. data/lib/davinci_dtr_test_kit/client_groups/full_ehr/dtr_full_ehr_prepopulation_override_attestation_test.rb +2 -1
  36. data/lib/davinci_dtr_test_kit/client_groups/full_ehr/dtr_full_ehr_questionnaire_package_request_test.rb +2 -1
  37. data/lib/davinci_dtr_test_kit/client_groups/full_ehr/dtr_full_ehr_questionnaire_response_conformance_test.rb +6 -1
  38. data/lib/davinci_dtr_test_kit/client_groups/full_ehr/dtr_full_ehr_questionnaire_response_correctness_test.rb +11 -22
  39. data/lib/davinci_dtr_test_kit/client_groups/full_ehr/dtr_full_ehr_saving_questionnaire_response_group.rb +4 -4
  40. data/lib/davinci_dtr_test_kit/client_groups/full_ehr/dtr_full_ehr_store_attestation_test.rb +2 -1
  41. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/dtr_light_ehr_supported_endpoints_group.rb +22 -0
  42. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/dtr_light_ehr_supported_payers_accept_header_test.rb +26 -0
  43. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/dtr_light_ehr_supported_payers_config_test.rb +34 -0
  44. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/dtr_light_ehr_supported_payers_endpoint_test.rb +44 -0
  45. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/dtr_light_ehr_supported_payers_use_test.rb +32 -0
  46. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/dtr_light_ehr_supported_payers_user_response_test.rb +70 -0
  47. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/dtr_smart_ehr_launch.rb +18 -0
  48. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/fhir_context_coverage_test.rb +42 -0
  49. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/fhir_context_references_test.rb +59 -0
  50. data/lib/davinci_dtr_test_kit/client_groups/light_ehr/fhir_launch_context_test.rb +23 -0
  51. data/lib/davinci_dtr_test_kit/client_groups/{resp_assist_device/dtr_questionnaire_package_group.rb → respiratory/dtr_respiratory_questionnaire_package_group.rb} +5 -5
  52. data/lib/davinci_dtr_test_kit/client_groups/{resp_assist_device/dtr_resp_questionnaire_package_request_test.rb → respiratory/dtr_respiratory_questionnaire_package_request_test.rb} +2 -2
  53. data/lib/davinci_dtr_test_kit/client_groups/{resp_assist_device/dtr_questionnaire_response_group.rb → respiratory/dtr_respiratory_questionnaire_response_group.rb} +7 -7
  54. data/lib/davinci_dtr_test_kit/client_groups/{resp_assist_device/dtr_questionnaire_response_save_test.rb → respiratory/dtr_respiratory_questionnaire_response_save_test.rb} +2 -2
  55. data/lib/davinci_dtr_test_kit/client_groups/{resp_assist_device/dtr_questionnaire_rendering_attestation_test.rb → respiratory/dtr_respiratory_rendering_attestation_test.rb} +2 -2
  56. data/lib/davinci_dtr_test_kit/client_groups/respiratory/dtr_respiratory_rendering_group.rb +14 -0
  57. data/lib/davinci_dtr_test_kit/client_groups/{resp_assist_device/dtr_smart_app_questionnaire_workflow_group.rb → respiratory/dtr_smart_app_respiratory_workflow_group.rb} +8 -8
  58. data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_prepopulation_attestation_test.rb +33 -0
  59. data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_prepopulation_override_attestation_test.rb +36 -0
  60. data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_package_request_validation_test.rb +3 -1
  61. data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_response_basic_conformance_test.rb +8 -4
  62. data/lib/davinci_dtr_test_kit/client_groups/shared/{dtr_questionnaire_response_pre_population_test.rb → dtr_questionnaire_response_prepopulation_test.rb} +5 -2
  63. data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_rendering_attestation_test.rb +32 -0
  64. data/lib/davinci_dtr_test_kit/client_groups/smart_app/dtr_smart_app_prepopulation_attestation_test.rb +3 -1
  65. data/lib/davinci_dtr_test_kit/client_groups/smart_app/dtr_smart_app_prepopulation_override_attestation_test.rb +1 -1
  66. data/lib/davinci_dtr_test_kit/client_groups/{dinner_static/dtr_smart_app_dinner_questionnaire_package_request_test.rb → smart_app/dtr_smart_app_questionnaire_package_request_test.rb} +6 -6
  67. data/lib/davinci_dtr_test_kit/client_groups/smart_app/dtr_smart_app_questionnaire_response_correctness_test.rb +30 -0
  68. data/lib/davinci_dtr_test_kit/client_groups/smart_app/dtr_smart_app_questionnaire_response_save_test.rb +2 -2
  69. data/lib/davinci_dtr_test_kit/client_groups/smart_app/dtr_smart_app_saving_questionnaire_response_group.rb +3 -7
  70. data/lib/davinci_dtr_test_kit/cql_test.rb +58 -0
  71. data/lib/davinci_dtr_test_kit/docs/dtr_light_ehr_suite_description_v201.md +9 -6
  72. data/lib/davinci_dtr_test_kit/dtr_full_ehr_suite.rb +19 -6
  73. data/lib/davinci_dtr_test_kit/dtr_light_ehr_suite.rb +60 -40
  74. data/lib/davinci_dtr_test_kit/dtr_payer_server_suite.rb +0 -2
  75. data/lib/davinci_dtr_test_kit/dtr_questionnaire_response_validation.rb +50 -4
  76. data/lib/davinci_dtr_test_kit/dtr_smart_app_suite.rb +9 -9
  77. data/lib/davinci_dtr_test_kit/endpoints/mock_authorization.rb +10 -2
  78. data/lib/davinci_dtr_test_kit/endpoints/mock_ehr.rb +17 -1
  79. data/lib/davinci_dtr_test_kit/endpoints/mock_payer/light_ehr_supported_payer_endpoint.rb +44 -0
  80. data/lib/davinci_dtr_test_kit/endpoints/mock_payer/questionnaire_package_endpoint.rb +7 -1
  81. data/lib/davinci_dtr_test_kit/fixtures.rb +6 -6
  82. data/lib/davinci_dtr_test_kit/igs/davinci_dtr_2.0.1.tgz +0 -0
  83. data/lib/davinci_dtr_test_kit/metadata.rb +104 -0
  84. data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_form_libraries_test.rb +4 -1
  85. data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_form_questionnaire_expressions_test.rb +2 -1
  86. data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_form_questionnaire_extensions_test.rb +4 -1
  87. data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_next_questionnaire_expressions_test.rb +1 -0
  88. data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_next_questionnaire_extensions_test.rb +4 -1
  89. data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_request_test.rb +2 -0
  90. data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_bundles_validation_test.rb +3 -2
  91. data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_search_validation_test.rb +8 -3
  92. data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_validation_test.rb +6 -15
  93. data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_response_complete_test.rb +1 -0
  94. data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_static_group.rb +1 -1
  95. data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_libraries_test.rb +4 -1
  96. data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_questionnaire_expressions_test.rb +2 -1
  97. data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_questionnaire_extensions_test.rb +4 -1
  98. data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_request_test.rb +3 -1
  99. data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_response_validation_test.rb +6 -15
  100. data/lib/davinci_dtr_test_kit/profiles/communication_request/communication_request_must_support_test.rb +46 -0
  101. data/lib/davinci_dtr_test_kit/profiles/communication_request/communication_request_read.rb +6 -3
  102. data/lib/davinci_dtr_test_kit/profiles/communication_request/communication_request_validation.rb +9 -8
  103. data/lib/davinci_dtr_test_kit/profiles/communication_request/metadata.yml +135 -0
  104. data/lib/davinci_dtr_test_kit/profiles/communication_request_group.rb +9 -0
  105. data/lib/davinci_dtr_test_kit/profiles/coverage/coverage_must_support_test.rb +54 -0
  106. data/lib/davinci_dtr_test_kit/profiles/coverage/coverage_read.rb +5 -3
  107. data/lib/davinci_dtr_test_kit/profiles/coverage/coverage_validation.rb +9 -8
  108. data/lib/davinci_dtr_test_kit/profiles/coverage/metadata.yml +133 -0
  109. data/lib/davinci_dtr_test_kit/profiles/coverage_group.rb +8 -0
  110. data/lib/davinci_dtr_test_kit/profiles/device_request/device_request_must_support_test.rb +45 -0
  111. data/lib/davinci_dtr_test_kit/profiles/device_request/device_request_read.rb +6 -3
  112. data/lib/davinci_dtr_test_kit/profiles/device_request/device_request_validation.rb +9 -8
  113. data/lib/davinci_dtr_test_kit/profiles/device_request/metadata.yml +130 -0
  114. data/lib/davinci_dtr_test_kit/profiles/device_request_group.rb +9 -0
  115. data/lib/davinci_dtr_test_kit/profiles/encounter/encounter_must_support_test.rb +58 -0
  116. data/lib/davinci_dtr_test_kit/profiles/encounter/encounter_read.rb +6 -3
  117. data/lib/davinci_dtr_test_kit/profiles/encounter/encounter_validation.rb +9 -8
  118. data/lib/davinci_dtr_test_kit/profiles/encounter/metadata.yml +169 -0
  119. data/lib/davinci_dtr_test_kit/profiles/encounter_group.rb +9 -0
  120. data/lib/davinci_dtr_test_kit/profiles/medication_request/medication_request_must_support_test.rb +50 -0
  121. data/lib/davinci_dtr_test_kit/profiles/medication_request/medication_request_read.rb +6 -3
  122. data/lib/davinci_dtr_test_kit/profiles/medication_request/medication_request_validation.rb +9 -8
  123. data/lib/davinci_dtr_test_kit/profiles/medication_request/metadata.yml +159 -0
  124. data/lib/davinci_dtr_test_kit/profiles/medication_request_group.rb +9 -0
  125. data/lib/davinci_dtr_test_kit/profiles/nutrition_order/metadata.yml +94 -0
  126. data/lib/davinci_dtr_test_kit/profiles/nutrition_order/nutrition_order_must_support_test.rb +45 -0
  127. data/lib/davinci_dtr_test_kit/profiles/nutrition_order/nutrition_order_read.rb +6 -3
  128. data/lib/davinci_dtr_test_kit/profiles/nutrition_order/nutrition_order_validation.rb +9 -8
  129. data/lib/davinci_dtr_test_kit/profiles/nutrition_order_group.rb +9 -0
  130. data/lib/davinci_dtr_test_kit/profiles/questionnaire_response/questionnaire_response_context_search.rb +3 -1
  131. data/lib/davinci_dtr_test_kit/profiles/questionnaire_response/questionnaire_response_create.rb +1 -0
  132. data/lib/davinci_dtr_test_kit/profiles/questionnaire_response/questionnaire_response_must_support_test.rb +54 -0
  133. data/lib/davinci_dtr_test_kit/profiles/questionnaire_response/questionnaire_response_patient_search.rb +3 -1
  134. data/lib/davinci_dtr_test_kit/profiles/questionnaire_response/questionnaire_response_read.rb +2 -1
  135. data/lib/davinci_dtr_test_kit/profiles/questionnaire_response/questionnaire_response_update.rb +1 -0
  136. data/lib/davinci_dtr_test_kit/profiles/questionnaire_response/questionnaire_response_validation.rb +1 -1
  137. data/lib/davinci_dtr_test_kit/profiles/questionnaire_response_group.rb +11 -1
  138. data/lib/davinci_dtr_test_kit/profiles/service_request/metadata.yml +140 -0
  139. data/lib/davinci_dtr_test_kit/profiles/service_request/service_request_must_support_test.rb +47 -0
  140. data/lib/davinci_dtr_test_kit/profiles/service_request/service_request_read.rb +6 -3
  141. data/lib/davinci_dtr_test_kit/profiles/service_request/service_request_validation.rb +9 -8
  142. data/lib/davinci_dtr_test_kit/profiles/service_request_group.rb +9 -0
  143. data/lib/davinci_dtr_test_kit/profiles/task/metadata.yml +165 -0
  144. data/lib/davinci_dtr_test_kit/profiles/task/task_create.rb +1 -0
  145. data/lib/davinci_dtr_test_kit/profiles/task/task_must_support_test.rb +46 -0
  146. data/lib/davinci_dtr_test_kit/profiles/task/task_read.rb +6 -3
  147. data/lib/davinci_dtr_test_kit/profiles/task/task_update.rb +1 -0
  148. data/lib/davinci_dtr_test_kit/profiles/task/task_validation.rb +9 -8
  149. data/lib/davinci_dtr_test_kit/profiles/task_group.rb +11 -1
  150. data/lib/davinci_dtr_test_kit/profiles/vision_prescription/metadata.yml +107 -0
  151. data/lib/davinci_dtr_test_kit/profiles/vision_prescription/vision_prescription_must_support_test.rb +54 -0
  152. data/lib/davinci_dtr_test_kit/profiles/vision_prescription/vision_prescription_read.rb +6 -3
  153. data/lib/davinci_dtr_test_kit/profiles/vision_prescription/vision_prescription_validation.rb +9 -8
  154. data/lib/davinci_dtr_test_kit/profiles/vision_prescription_group.rb +9 -0
  155. data/lib/davinci_dtr_test_kit/read_test.rb +5 -0
  156. data/lib/davinci_dtr_test_kit/requirements/davinci-dtr-test-kit_out_of_scope_requirements.csv +13 -0
  157. data/lib/davinci_dtr_test_kit/requirements/davinci-dtr-test-kit_requirements.csv +374 -0
  158. data/lib/davinci_dtr_test_kit/requirements/generated/davinci-dtr-test-kit_requirements_coverage.csv +372 -0
  159. data/lib/davinci_dtr_test_kit/tags.rb +1 -0
  160. data/lib/davinci_dtr_test_kit/urls.rb +6 -0
  161. data/lib/davinci_dtr_test_kit/version.rb +2 -1
  162. data/lib/davinci_dtr_test_kit.rb +2 -0
  163. data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +22 -0
  164. data/lib/inferno_requirements_tools/rake/rakefile_template +31 -0
  165. data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +284 -0
  166. data/lib/requirements_config.yaml +25 -0
  167. metadata +95 -37
  168. data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/dtr_smart_app_adaptive_questionnaire_initial_retrieval_group.rb +0 -24
  169. data/lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_questionnaire_rendering_group.rb +0 -14
  170. data/lib/davinci_dtr_test_kit/client_groups/smart_app/dtr_smart_app_rendering_enabled_questions_attestation_test.rb +0 -30
@@ -1,10 +1,9 @@
1
1
  require_relative 'dtr_smart_app_questionnaire_response_save_test'
2
2
  require_relative '../shared/dtr_questionnaire_response_basic_conformance_test'
3
- require_relative '../shared/dtr_questionnaire_response_pre_population_test'
4
3
 
5
4
  module DaVinciDTRTestKit
6
5
  class DTRSmartAppSavingQuestionnaireResponseGroup < Inferno::TestGroup
7
- id :dtr_smart_app_saving_questionnaire_response
6
+ id :dtr_smart_app_saving_qr
8
7
  title 'Saving the QuestionnaireResponse'
9
8
  description %(
10
9
  The tester will complete the questionnaire such that a QuestionnaireResponse is stored
@@ -15,13 +14,10 @@ module DaVinciDTRTestKit
15
14
  run_as_group
16
15
 
17
16
  # Test 1: wait for a QuestionnaireResponse
18
- test from: :dtr_smart_app_questionnaire_response_save,
17
+ test from: :dtr_smart_app_qr_save,
19
18
  receives_request: :questionnaire_response_save
20
19
  # Test 2: validate basic conformance of the QuestionnaireResponse
21
- test from: :dtr_questionnaire_response_basic_conformance,
22
- uses_request: :questionnaire_response_save
23
- # Test 3: validate workflow-specific details such as pre-population and overrides
24
- test from: :dtr_questionnaire_response_pre_population,
20
+ test from: :dtr_qr_basic_conformance,
25
21
  uses_request: :questionnaire_response_save
26
22
  end
27
23
  end
@@ -1,5 +1,19 @@
1
1
  module DaVinciDTRTestKit
2
2
  module CQLTest
3
+ STATIC_QUESTIONNAIRE_PACKAGE_BUNDLE_PROFILE = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle|2.0.1'.freeze
4
+ STATIC_QUESTIONNAIRE_PACKAGE_PARAMETER_PROFILE = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters|2.0.1'.freeze
5
+ ADAPTIVE_QUESTIONNAIRE_PACKAGE_BUNDLE_PROFILE = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle|2.0.1'.freeze
6
+ ADAPTIVE_QUESTIONNAIRE_PACKAGE_PARAMETER_PROFILE = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters|2.0.1'.freeze
7
+
8
+ def questionnaire_package_profile_urls
9
+ {
10
+ static_bundle: STATIC_QUESTIONNAIRE_PACKAGE_BUNDLE_PROFILE,
11
+ static_parameter: STATIC_QUESTIONNAIRE_PACKAGE_PARAMETER_PROFILE,
12
+ adaptive_bundle: ADAPTIVE_QUESTIONNAIRE_PACKAGE_BUNDLE_PROFILE,
13
+ adaptive_parameter: ADAPTIVE_QUESTIONNAIRE_PACKAGE_PARAMETER_PROFILE
14
+ }
15
+ end
16
+
3
17
  def extension_presence
4
18
  @extension_presence ||= { 'found_min_launch_context' => false, 'found_min_variable' => false,
5
19
  'found_min_pop_context' => false, 'found_min_init_expression' => false,
@@ -320,6 +334,50 @@ module DaVinciDTRTestKit
320
334
  end&.flatten&.compact
321
335
  end
322
336
 
337
+ def perform_questionnaire_package_validation(resource, form = 'static')
338
+ scratch[:"#{form}_questionnaire_bundles"] = extract_questionnaire_bundles(resource)
339
+ validate_questionnaire_package(resource, form)
340
+ assert scratch[:"#{form}_questionnaire_bundles"].present?, 'No questionnaire bundle found in the response'
341
+ end
342
+
343
+ def validate_questionnaire_package(resource, form)
344
+ case resource&.resourceType
345
+ when 'Bundle'
346
+ assert_valid_resource(resource:, profile_url: questionnaire_package_profile_urls[:"#{form}_bundle"])
347
+ when 'Parameters'
348
+ assert_valid_resource(resource:, profile_url: questionnaire_package_profile_urls[:"#{form}_parameter"])
349
+ else
350
+ assert(false, "Unexpected resourceType: #{resource&.resourceType}. Expected Parameters or Bundle")
351
+ end
352
+ end
353
+
354
+ def extract_questionnaire_bundles(resource)
355
+ case resource&.resourceType
356
+ when 'Bundle'
357
+ [resource]
358
+ when 'Parameters'
359
+ extract_bundles_from_parameter(resource)
360
+ else
361
+ []
362
+ end
363
+ end
364
+
365
+ def extract_bundles_from_parameter(parameter)
366
+ return [] if parameter.blank?
367
+
368
+ parameter.parameter&.filter_map do |param|
369
+ param.resource if param.resource&.resourceType == 'Bundle'
370
+ end
371
+ end
372
+
373
+ def extract_questionnaire_from_questionnaire_package(questionnaire_pkg_json, questionnaire_url)
374
+ resource = FHIR.from_contents(questionnaire_pkg_json)
375
+ questionnaire_bundles = extract_questionnaire_bundles(resource)
376
+ questionnaires = extract_questionnaires_from_bundles(questionnaire_bundles)
377
+
378
+ questionnaires.find { |q| q.url == questionnaire_url }
379
+ end
380
+
323
381
  def extract_libraries_from_bundles(questionnaire_bundles)
324
382
  questionnaire_bundles.filter_map do |qb|
325
383
  qb.entry.filter_map { |entry| entry.resource if entry&.resource.is_a?(FHIR::Library) }
@@ -12,11 +12,18 @@ requirements and may change the test validation logic.
12
12
 
13
13
  ## Test Methodology
14
14
 
15
- Inferno will simulate a DTR SMART App that will connect to the DTR Light EHR system under test. The tester will need to launch Inferno using either an EHR launch or a Standalone launch. Once the connection between Inferno's simulated DTR SMART App and the DTR Light EHR under test is established, tests within this suite will make FHIR API requests corresponding to capabilities required by the [Light DTR EHR Capability Statement](https://hl7.org/fhir/us/davinci-dtr/STU2/CapabilityStatement-light-dtr-ehr) and check that the EHR's responses are conformant.
15
+ Inferno will simulate a DTR SMART App that will connect to the DTR Light EHR system under test. The tester will need to launch Inferno using an EHR launch. Once the connection between Inferno's simulated DTR SMART App and the DTR Light EHR under test is established, tests within this suite will make FHIR API requests corresponding to capabilities required by the [Light DTR EHR Capability Statement](https://hl7.org/fhir/us/davinci-dtr/STU2/CapabilityStatement-light-dtr-ehr) and check that the EHR's responses are conformant.
16
16
 
17
17
  ## Running the Tests
18
18
 
19
- If you would like to try out the tests but don't have a DTR Light EHR implementation, you can run these tests against the [public instance of the Inferno Reference Server](https://inferno.healthit.gov/reference-server/r4/) by using the Inferno Reference Server preset in the test suite. In order to get the Inferno Reference Server to do an EHR launch, navigate to https://inferno.healthit.gov/reference-server/app/app-launch and use https://inferno.healthit.gov/suites/custom/smart/launch as the App Launch URL. When using the Inferno Reference Server preset for the DTR Light EHR test suite, note that the sample patient used for testing (`dtr_bundle_patient_pat015.json`) is focused on DTR-specific data and does not have the complete set of US Core data needed to pass all the US Core tests. In addition, this preset does not test the `create` or `update` tests for DTR QuestionnaireResponse resources and PAS Task resources.
19
+ If you would like to try out the tests but don't have a Light DTR EHR implementation, you can run these tests against the [public instance of the Inferno Reference Server](https://inferno.healthit.gov/reference-server/r4/) by using the Inferno Reference Server preset in the test suite. In order to get the Inferno Reference Server to do an EHR launch, navigate to https://inferno.healthit.gov/reference-server/app/app-launch and use https://inferno.healthit.gov/suites/custom/smart/launch as the App Launch URL. When using the Inferno Reference Server preset for the DTR Light EHR test suite, note that the sample patient used for testing (`dtr_bundle_patient_pat015.json`) is focused on DTR-specific data and does not have the complete set of US Core data needed to pass all the US Core tests. In addition, this preset does not test the `create` or `update` tests for DTR QuestionnaireResponse resources and PAS Task resources.
20
+
21
+ In addition, if you would like to try out the DTR-specific SMART Launch tests, meaning the tests that check for DTR `fhirContext` conformance, but do not have a Light DTR EHR implementation, you can run these tests against an instance of Inferno running the DTR Smart App Test Suite as your Light DTR EHR. This process is described in the following steps:
22
+
23
+ 1. In the tab with the Light DTR EHR Test Suite open, click "1 Authorization" test group and click "Run all tests". The FHIR Server Base Url should be `[URL prefix]/custom/dtr_smart_app/fhir` where `[URL prefix]` comes from the URL of the test session which will be of the form `[URL prefix]/dtr_smart_app/[session id]` and the EHR Launch Client ID should be `sample`. Click "Submit". Take note of the launch_uri provided by the following prompt.
24
+ 2. In a separate tab from the DTR Light EHR Test Suite, pull up the Da Vinci DTR SMART App Test Suite and click "Run all tests".
25
+ 3. Start off by launching it with "EHR Launch from Inferno" with a client_id of `sample` and a launch_uri provided by the DTR Light EHR prompt in step 1. Before clicking "Submit", change the SMART App Launch fhirContext input to be an array of strings, rather than the default JSON object since the DTR Light EHR tests use STU2.0 version of SMART Launch. The input should be `["Coverage/cov015","DeviceRequest/devreqe0470"]`. Click "Submit".
26
+ 4. Right click on the link in the resulting popup and click "Open Link in New Window" to complete the Authorization Test Group of the DTR Light EHR Test Suite.
20
27
 
21
28
  ## Limitations
22
29
 
@@ -24,10 +31,6 @@ The DTR IG is a complex specification and these tests currently validate conform
24
31
  a subset of IG requirements. Future versions of the test suite will test further
25
32
  features.
26
33
 
27
- Specific limitations include:
28
- - *SMART Launch `fhirContext`*: Inferno does not currently verify the use of `fhirContext` to convey details
29
- about the DTR SMART App launch.
30
-
31
34
  ## DTR 2.0.1 Corrections
32
35
 
33
36
  The DTR 2.0.1 version of the [Light EHR CapabilityStatement](http://hl7.org/fhir/us/davinci-dtr/CapabilityStatement/light-dtr-ehr) includes two pieces of missing or misleading information that have been corrected:
@@ -1,5 +1,6 @@
1
- require_relative 'client_groups/dinner_static/dtr_full_ehr_questionnaire_workflow_group'
2
- require_relative 'client_groups/dinner_adaptive/dtr_full_ehr_adaptive_dinner_questionnaire_workflow_group'
1
+ require_relative 'client_groups/custom_static/dtr_full_ehr_custom_static_workflow_group'
2
+ require_relative 'client_groups/dinner_static/dtr_full_ehr_static_dinner_workflow_group'
3
+ require_relative 'client_groups/dinner_adaptive/dtr_full_ehr_adaptive_dinner_workflow_group'
3
4
  require_relative 'auth_groups/oauth2_authentication_group'
4
5
  require_relative 'endpoints/cors'
5
6
  require_relative 'endpoints/mock_authorization/simple_token_endpoint'
@@ -15,8 +16,6 @@ module DaVinciDTRTestKit
15
16
  title 'Da Vinci DTR Full EHR Test Suite'
16
17
  description File.read(File.join(__dir__, 'docs', 'dtr_full_ehr_suite_description_v201.md'))
17
18
 
18
- version VERSION
19
-
20
19
  links [
21
20
  {
22
21
  label: 'Report Issue',
@@ -61,7 +60,21 @@ module DaVinciDTRTestKit
61
60
  end
62
61
 
63
62
  group from: :oauth2_authentication
64
- group from: :dtr_full_ehr_static_dinner_questionnaire_workflow
65
- group from: :dtr_full_ehr_adaptive_dinner_questionnaire_workflow
63
+ group do
64
+ id :dtr_full_ehr_basic_workflows
65
+ title 'Basic Workflows'
66
+
67
+ group from: :dtr_full_ehr_custom_static_workflow
68
+ group from: :dtr_full_ehr_adaptive_dinner_workflow
69
+ end
70
+ group do
71
+ id :dtr_full_ehr_questionnaire_functionality
72
+ title 'Questionnaire Functionality Coverage'
73
+ description %(
74
+ Tests in this group validate that the client can complete additional DTR workflows
75
+ covering additional pre-population features of questionnaires.
76
+ )
77
+ group from: :dtr_full_ehr_static_dinner_workflow
78
+ end
66
79
  end
67
80
  end
@@ -12,6 +12,9 @@ require_relative 'profiles/nutrition_order_group'
12
12
  require_relative 'profiles/service_request_group'
13
13
  require_relative 'profiles/task_group'
14
14
  require_relative 'profiles/vision_prescription_group'
15
+ require_relative 'client_groups/light_ehr/dtr_smart_ehr_launch'
16
+ require_relative 'endpoints/mock_payer/light_ehr_supported_payer_endpoint'
17
+ require_relative 'client_groups/light_ehr/dtr_light_ehr_supported_endpoints_group'
15
18
  require 'smart_app_launch/smart_stu1_suite'
16
19
  require 'smart_app_launch/smart_stu2_suite'
17
20
 
@@ -21,8 +24,6 @@ module DaVinciDTRTestKit
21
24
  title 'Da Vinci DTR Light EHR Test Suite'
22
25
  description File.read(File.join(__dir__, 'docs', 'dtr_light_ehr_suite_description_v201.md'))
23
26
 
24
- version VERSION
25
-
26
27
  links [
27
28
  {
28
29
  label: 'Report Issue',
@@ -42,10 +43,6 @@ module DaVinciDTRTestKit
42
43
  }
43
44
  ]
44
45
 
45
- input :url,
46
- title: 'FHIR Server Base Url',
47
- description: 'URL of the target DTR Light EHR'
48
-
49
46
  # Hl7 Validator Wrapper:
50
47
  fhir_resource_validator do
51
48
  igs('hl7.fhir.us.davinci-dtr#2.0.1', 'hl7.fhir.us.davinci-pas#2.0.1', 'hl7.fhir.us.davinci-crd#2.0.1')
@@ -55,6 +52,16 @@ module DaVinciDTRTestKit
55
52
  end
56
53
  end
57
54
 
55
+ suite_endpoint :get, SUPPORTED_PAYER_PATH, LightEHRSupportedPayerEndpoint
56
+
57
+ resume_test_route :get, RESUME_PASS_PATH do |request|
58
+ request.query_parameters['token']
59
+ end
60
+
61
+ resume_test_route :get, RESUME_FAIL_PATH, result: 'fail' do |request|
62
+ request.query_parameters['token']
63
+ end
64
+
58
65
  group do
59
66
  title 'Authorization'
60
67
 
@@ -83,13 +90,18 @@ module DaVinciDTRTestKit
83
90
  end
84
91
  end
85
92
 
86
- group from: :smart_ehr_launch_stu2,
87
- required_suite_options: DTROptions::SMART_2_REQUIREMENT,
88
- run_as_group: true
89
-
90
- group from: :smart_standalone_launch_stu2,
93
+ group from: :dtr_smart_ehr_launch,
91
94
  required_suite_options: DTROptions::SMART_2_REQUIREMENT,
92
- run_as_group: true
95
+ run_as_group: true,
96
+ config: {
97
+ outputs: {
98
+ id_token: { name: :id_token },
99
+ client_id: { name: :client_id },
100
+ requested_scopes: { name: :requested_scopes },
101
+ access_token: { name: :access_token },
102
+ smart_credentials: { name: :smart_credentials }
103
+ }
104
+ }
93
105
  end
94
106
 
95
107
  group do
@@ -101,40 +113,48 @@ module DaVinciDTRTestKit
101
113
 
102
114
  )
103
115
 
116
+ input :url,
117
+ title: 'FHIR Server Base Url',
118
+ description: 'URL of the target DTR Light EHR'
119
+
104
120
  group from: :'us_core_v311-us_core_v311_fhir_api',
105
- run_as_group: true
106
- end
121
+ run_as_group: true,
122
+ verifies_requirements: ['hl7.fhir.us.davinci-dtr_2.0.1@2', 'hl7.fhir.us.davinci-dtr_2.0.1@281']
107
123
 
108
- group do
109
- title 'DTR Light EHR Profiles'
110
- description %(This test group tests system for their conformance to
111
- the RESTful capabilities by specified Resources/Profiles as defined by
112
- the DaVinci Documentation Templates and Rules (DTR) v2.0,1 Implementation
113
- Guide Light DTR EHR Capability Statement.
124
+ group do
125
+ title 'DTR Light EHR Profiles'
126
+ description %(This test group tests system for their conformance to
127
+ the RESTful capabilities by specified Resources/Profiles as defined by
128
+ the DaVinci Documentation Templates and Rules (DTR) v2.0,1 Implementation
129
+ Guide Light DTR EHR Capability Statement.
114
130
 
115
- )
131
+ )
132
+ run_as_group
116
133
 
117
- input :credentials,
118
- title: 'OAuth Credentials',
119
- type: :oauth_credentials,
120
- optional: true
134
+ input :smart_credentials,
135
+ title: 'OAuth Credentials',
136
+ type: :oauth_credentials,
137
+ optional: true
121
138
 
122
- # All FHIR requests in this suite will use this FHIR client
123
- fhir_client do
124
- url :url
125
- oauth_credentials :credentials
126
- end
139
+ # All FHIR requests in this suite will use this FHIR client
140
+ fhir_client do
141
+ url :url
142
+ oauth_credentials :smart_credentials
143
+ end
127
144
 
128
- group from: :questionnaire_response_group
129
- group from: :coverage_group
130
- group from: :communication_request_group
131
- group from: :device_request_group
132
- group from: :encounter_group
133
- group from: :medication_request_group
134
- group from: :nutrition_order_group
135
- group from: :service_request_group
136
- group from: :task_group
137
- group from: :vision_prescription_group
145
+ group from: :questionnaire_response_group
146
+ group from: :coverage_group
147
+ group from: :communication_request_group
148
+ group from: :device_request_group
149
+ group from: :encounter_group
150
+ group from: :medication_request_group
151
+ group from: :nutrition_order_group
152
+ group from: :service_request_group
153
+ group from: :task_group
154
+ group from: :vision_prescription_group
155
+ end
138
156
  end
157
+
158
+ group from: :dtr_light_ehr_supported_endpoints
139
159
  end
140
160
  end
@@ -15,8 +15,6 @@ module DaVinciDTRTestKit
15
15
  title 'Da Vinci DTR Payer Server Test Suite'
16
16
  description File.read(File.join(__dir__, 'docs', 'dtr_payer_server_suite_description_v201.md'))
17
17
 
18
- version VERSION
19
-
20
18
  links [
21
19
  {
22
20
  label: 'Report Issue',
@@ -1,13 +1,51 @@
1
- # frozen_string_literal: true
2
-
1
+ require_relative 'cql_test'
3
2
  module DaVinciDTRTestKit
4
3
  module DTRQuestionnaireResponseValidation
4
+ include DaVinciDTRTestKit::CQLTest
5
+
5
6
  CQL_EXPRESSION_EXTENSIONS = [
6
7
  'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression',
7
8
  'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-calculatedExpression',
8
9
  'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-candidateExpression'
9
10
  ].freeze
10
11
 
12
+ def validate_questionnaire_response_correctness(questionnaire_response_json, custom_response = nil)
13
+ check_is_questionnaire_response(questionnaire_response_json)
14
+ qr = FHIR.from_contents(questionnaire_response_json)
15
+ questionnaire = nil
16
+ expected_overrides = []
17
+ if custom_response.blank?
18
+ questionnaire = Fixtures.questionnaire_for_test(id)
19
+ expected_overrides = ['PBD.2']
20
+ else
21
+ assert_valid_json custom_response, 'Custom response provided is not a valid JSON'
22
+
23
+ # Find the questionnaire that is referenced in the QuestionnaireResponse
24
+ questionnaire = extract_questionnaire_from_questionnaire_package(
25
+ custom_response, qr.questionnaire
26
+ )
27
+
28
+ skip_if questionnaire.blank?,
29
+ "Couldn't find Questionnaire #{qr.questionnaire} in the provided custom questionnaire package
30
+ to validate the QuestionnaireResponse."
31
+
32
+ missing_origin_sources = ['auto', 'manual', 'override'] - extract_origin_sources(qr.item)
33
+ unless missing_origin_sources.empty?
34
+ add_message(
35
+ 'error',
36
+ 'All origin sources (auto, manual, override) must be present in the QuestionnaireResponse. ' \
37
+ "Missing #{missing_origin_sources.to_sentence}"
38
+ )
39
+ end
40
+ end
41
+
42
+ check_origin_sources(questionnaire.item, qr.item, expected_overrides:)
43
+
44
+ required_link_ids = extract_required_link_ids(questionnaire.item)
45
+ check_answer_presence(qr.item, required_link_ids)
46
+ assert(messages.none? { |m| m[:type] == 'error' }, 'QuestionnaireResponse is not correct, see error message(s)')
47
+ end
48
+
11
49
  def check_is_questionnaire_response(questionnaire_response_json)
12
50
  assert_valid_json(questionnaire_response_json)
13
51
  questionnaire_response = begin
@@ -55,6 +93,15 @@ module DaVinciDTRTestKit
55
93
  end
56
94
  end
57
95
 
96
+ def extract_origin_sources(items, origin_sources = [])
97
+ items&.each do |item|
98
+ extract_origin_sources(item&.item, origin_sources)
99
+ origin_sources << find_origin_source(item) if item&.answer&.any?
100
+ end
101
+
102
+ origin_sources
103
+ end
104
+
58
105
  # Ensures that all required questions have been answered.
59
106
  # If required_link_ids not provided, all questions are treated as optional.
60
107
  def check_answer_presence(response_items, required_link_ids = [])
@@ -108,7 +155,6 @@ module DaVinciDTRTestKit
108
155
 
109
156
  def validate_cql_executed(actual_items, questionnaire_cql_expression_link_ids, template_prepopulation_expectations,
110
157
  template_override_expectations)
111
-
112
158
  actual_items&.each do |item_to_validate|
113
159
  link_id = item_to_validate.linkId
114
160
  if questionnaire_cql_expression_link_ids.include?(link_id)
@@ -225,7 +271,7 @@ module DaVinciDTRTestKit
225
271
  end
226
272
 
227
273
  def item_is_cql_expression?(item)
228
- item.extension&.any? { |ext| CQL_EXPRESSION_EXTENSIONS.include?(ext.url) }
274
+ item&.extension&.any? { |ext| CQL_EXPRESSION_EXTENSIONS.include?(ext.url) }
229
275
  end
230
276
 
231
277
  def answer_value_equal?(expected, actual)
@@ -1,7 +1,8 @@
1
1
  require_relative 'auth_groups/oauth2_authentication_group'
2
- require_relative 'client_groups/resp_assist_device/dtr_smart_app_questionnaire_workflow_group'
3
- require_relative 'client_groups/dinner_static/dtr_smart_app_questionnaire_workflow_group'
4
- require_relative 'client_groups/dinner_adaptive/dtr_smart_app_questionnaire_workflow_group'
2
+ require_relative 'client_groups/respiratory/dtr_smart_app_respiratory_workflow_group'
3
+ require_relative 'client_groups/dinner_static/dtr_smart_app_static_dinner_workflow_group'
4
+ require_relative 'client_groups/dinner_adaptive/dtr_smart_app_adaptive_dinner_workflow_group'
5
+ require_relative 'client_groups/custom_static/dtr_smart_app_custom_static_workflow_group'
5
6
  require_relative 'endpoints/cors'
6
7
  require_relative 'endpoints/mock_authorization'
7
8
  require_relative 'endpoints/mock_authorization/authorize_endpoint'
@@ -21,8 +22,6 @@ module DaVinciDTRTestKit
21
22
  title 'Da Vinci DTR SMART App Test Suite'
22
23
  description File.read(File.join(__dir__, 'docs', 'dtr_smart_app_suite_description_v201.md'))
23
24
 
24
- version VERSION
25
-
26
25
  links [
27
26
  {
28
27
  label: 'Report Issue',
@@ -67,7 +66,7 @@ module DaVinciDTRTestKit
67
66
  suite_endpoint :post, NEXT_PATH, MockPayer::NextQuestionEndpoint
68
67
 
69
68
  # EHR
70
- route(:get, '/fhir/metadata', MockEHR.method(:metadata))
69
+ route(:get, METADATA_PATH, MockEHR.method(:metadata))
71
70
  suite_endpoint :post, QUESTIONNAIRE_RESPONSE_PATH, MockEHR::QuestionnaireResponseEndpoint
72
71
  suite_endpoint :get, FHIR_RESOURCE_PATH, MockEHR::FHIRGetEndpoint
73
72
  suite_endpoint :get, FHIR_SEARCH_PATH, MockEHR::FHIRGetEndpoint
@@ -90,8 +89,8 @@ module DaVinciDTRTestKit
90
89
  Tests in this group validate that the client can complete basic DTR workflows
91
90
  )
92
91
 
93
- group from: :dtr_smart_app_static_dinner_questionnaire_workflow
94
- group from: :dtr_smart_app_adaptive_dinner_questionnaire_workflow
92
+ group from: :dtr_smart_app_custom_static_workflow
93
+ group from: :dtr_smart_app_adaptive_dinner_workflow
95
94
  end
96
95
  group do
97
96
  id :dtr_smart_app_questionnaire_functionality
@@ -100,7 +99,8 @@ module DaVinciDTRTestKit
100
99
  Tests in this group validate that the client can complete additional DTR workflows
101
100
  covering additional must support features of questionnaires.
102
101
  )
103
- group from: :dtr_smart_app_questionnaire_workflow
102
+ group from: :dtr_smart_app_resp_workflow
103
+ group from: :dtr_smart_app_static_dinner_workflow
104
104
  end
105
105
  end
106
106
  end
@@ -62,8 +62,8 @@ module DaVinciDTRTestKit
62
62
  base_url = env_base_url(env, OPENID_CONFIG_PATH)
63
63
  response_body = {
64
64
  issuer: base_url + FHIR_BASE_PATH,
65
- authorization_endpoint: base_url + EHR_AUTHORIZE_PATH,
66
- token_endpoint: base_url + EHR_TOKEN_PATH,
65
+ authorization_endpoint: authorization_endpoint(base_url),
66
+ token_endpoint: token_endpoint(base_url),
67
67
  jwks_uri: base_url + JKWS_PATH,
68
68
  response_types_supported: ['id_token'],
69
69
  subject_types_supported: ['public'],
@@ -79,5 +79,13 @@ module DaVinciDTRTestKit
79
79
  path.gsub!(%r{#{endpoint_path}(/)?}, '')
80
80
  "#{protocol}://#{host + path}"
81
81
  end
82
+
83
+ def authorization_endpoint(base_url)
84
+ base_url + EHR_AUTHORIZE_PATH
85
+ end
86
+
87
+ def token_endpoint(base_url)
88
+ base_url + EHR_TOKEN_PATH
89
+ end
82
90
  end
83
91
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../endpoints/mock_authorization'
4
+
3
5
  module DaVinciDTRTestKit
4
6
  module MockEHR
5
7
  RESOURCE_SERVER_BASE = ENV.fetch('FHIR_REFERENCE_SERVER')
@@ -13,9 +15,23 @@ module DaVinciDTRTestKit
13
15
  client
14
16
  end
15
17
 
16
- def metadata(_env)
18
+ def metadata(env)
17
19
  cs = resource_server_client.capability_statement
18
20
  if cs.present?
21
+ # Overwrite the OAuth URIs returned by the reference server to point to the suite endpoints instead
22
+ oauth_uris_url = 'http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris'
23
+ base_url = MockAuthorization.env_base_url(env, METADATA_PATH)
24
+ sec_ext = cs.rest.first&.security&.extension&.delete_if { |e| e.url == oauth_uris_url }
25
+ sec_ext&.push(
26
+ FHIR::Extension.new(
27
+ url: oauth_uris_url,
28
+ extension: [
29
+ FHIR::Extension.new(url: 'authorize', valueUri: MockAuthorization.authorization_endpoint(base_url)),
30
+ FHIR::Extension.new(url: 'token', valueUri: MockAuthorization.token_endpoint(base_url))
31
+ ]
32
+ )
33
+ )
34
+
19
35
  [200, { 'Content-Type' => 'application/fhir+json', 'Access-Control-Allow-Origin' => '*' }, [cs.to_json]]
20
36
  else
21
37
  [500, { 'Access-Control-Allow-Origin' => '*' }, ['Unexpected error occurred while fetching metadata']]
@@ -0,0 +1,44 @@
1
+ require_relative '../../tags'
2
+
3
+ module DaVinciDTRTestKit
4
+ class LightEHRSupportedPayerEndpoint < Inferno::DSL::SuiteEndpoint
5
+ def name
6
+ 'light_ehr_supported_payer_endpoint'
7
+ end
8
+
9
+ def test_run_identifier
10
+ request.params[:tester_url_id]
11
+ end
12
+
13
+ def tags
14
+ [SUPPORTED_PAYER_TAG]
15
+ end
16
+
17
+ def make_response
18
+ user_response = JSON.parse(result.input_json)&.find { |input| input['name'] == 'user_response' }&.dig('value')
19
+
20
+ response.body = if user_response.present?
21
+ user_response
22
+ else
23
+ default_response
24
+ end
25
+ response.status = 200
26
+ response.headers['Content-Type'] = 'application/json'
27
+ end
28
+
29
+ private
30
+
31
+ def default_response
32
+ {
33
+ payers: [
34
+ { id: 'payer1', name: 'Payer One' },
35
+ { id: 'payer2', name: 'Payer Two' }
36
+ ]
37
+ }.to_json
38
+ end
39
+
40
+ def update_result
41
+ results_repo.update_result(result.id, 'pass')
42
+ end
43
+ end
44
+ end
@@ -19,7 +19,13 @@ module DaVinciDTRTestKit
19
19
  response.status = 200
20
20
  response.format = 'application/fhir+json'
21
21
  response.headers['Access-Control-Allow-Origin'] = '*'
22
- response.body = build_questionnaire_package_response.to_json
22
+ response.body = custom_response.presence || build_questionnaire_package_response.to_json
23
+ end
24
+
25
+ def custom_response
26
+ @custom_response ||= JSON.parse(result.input_json)
27
+ .find { |input| input['name'].include?('custom_questionnaire_package_response') }
28
+ &.dig('value')
23
29
  end
24
30
 
25
31
  def update_result
@@ -8,7 +8,7 @@ module DaVinciDTRTestKit
8
8
  FIXTURE_CONFIG = [
9
9
  {
10
10
  group_ids: [
11
- 'dtr_smart_app_questionnaire_workflow',
11
+ 'dtr_smart_app_resp_workflow',
12
12
  'dtr_full_ehr_questionnaire_workflow'
13
13
  ],
14
14
  questionnaire_package: File.join('respiratory_assist_device', 'questionnaire_package.json'),
@@ -16,23 +16,23 @@ module DaVinciDTRTestKit
16
16
  },
17
17
  {
18
18
  group_ids: [
19
- 'dtr_smart_app_static_dinner_questionnaire_workflow',
20
- 'dtr_full_ehr_static_dinner_questionnaire_workflow'
19
+ 'dtr_smart_app_static_dinner_workflow',
20
+ 'dtr_full_ehr_static_dinner_workflow'
21
21
  ],
22
22
  questionnaire_package: File.join('dinner_static', 'questionnaire_dinner_order_static.json'),
23
23
  questionnaire_response: File.join('dinner_static', 'questionnaire_response_dinner_order_static.json')
24
24
  },
25
25
  {
26
26
  group_ids: [
27
- 'dtr_full_ehr_adaptive_questionnaire_retrieval',
28
- 'dtr_smart_app_adaptive_questionnaire_retrieval'
27
+ 'dtr_full_ehr_adaptive_retrieval',
28
+ 'dtr_smart_app_adaptive_retrieval'
29
29
  ],
30
30
  questionnaire_package: File.join('dinner_adaptive', 'questionnaire_dinner_order_adaptive.json'),
31
31
  next_question: File.join('dinner_adaptive', 'dinner_order_adaptive_next_question_initial.json')
32
32
  },
33
33
  {
34
34
  group_ids: [
35
- 'dtr_adaptive_questionnaire_followup_questions'
35
+ 'dtr_adaptive_followup_questions'
36
36
  ],
37
37
  next_question: {
38
38
  bean_burrito: File.join('dinner_adaptive', 'dinner_order_adaptive_next_question_burrito.json'),