Module: DaVinciDTRTestKit::QuestionnaireHelper

Instance Method Summary collapse

Instance Method Details

#adaptive_questionnaire?(questionnaire) ⇒ Boolean

Categorizing Questionnaires

Returns:

  • (Boolean)


19
20
21
22
23
24
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 19

def adaptive_questionnaire?(questionnaire)
  questionnaire.extension.find do |extension|
    extension.valueBoolean != false &&
      extension.url == 'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-questionnaireAdaptive'
  end
end

#contained_questionnaire_from_questionnaire_response(questionnaire_response) ⇒ Object

$next-question extraction of QuestionnaireResponse and Questionnaire



78
79
80
81
82
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 78

def contained_questionnaire_from_questionnaire_response(questionnaire_response)
  questionnaire_response&.contained&.find do |contained_resource|
    contained_resource.is_a?(FHIR::Questionnaire)
  end
end

#no_questionnaires_returned?(requests) ⇒ Boolean

Generic Questionnaire Extraction ($questionnaire-package or $next-question)

Returns:

  • (Boolean)


45
46
47
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 45

def no_questionnaires_returned?(requests)
  questionnaires_from_operation_responses(requests).blank?
end

#questionnaire_canonical_url(questionnaire) ⇒ Object

Canonical URLs



7
8
9
10
11
12
13
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 7

def questionnaire_canonical_url(questionnaire)
  if questionnaire.version.present?
    "#{questionnaire.url}|#{questionnaire.version}"
  else
    questionnaire.url
  end
end

#questionnaire_display(questionnaire) ⇒ Object

Display for Questionnaires



30
31
32
33
34
35
36
37
38
39
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 30

def questionnaire_display(questionnaire)
  canonical_url = questionnaire_canonical_url(questionnaire)
  title = questionnaire.title.present? ? questionnaire.title : questionnaire.name

  if title.present?
    "#{title} (#{canonical_url})"
  else
    canonical_url
  end
end

#questionnaire_from_next_question_output_parameters(parameters) ⇒ Object



84
85
86
87
88
89
90
91
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 84

def questionnaire_from_next_question_output_parameters(parameters)
  return_parameter = parameters.parameter.find do |parameter|
    parameter.name == 'return' && parameter.resource.is_a?(FHIR::QuestionnaireResponse)
  end
  return nil unless return_parameter.present?

  contained_questionnaire_from_questionnaire_response(return_parameter.resource)
end

#questionnaire_from_package_bundle(bundle, include_standard: true, include_adaptive: true) ⇒ Object



143
144
145
146
147
148
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 143

def questionnaire_from_package_bundle(bundle, include_standard: true, include_adaptive: true)
  bundle.entry.find do |entry|
    entry.resource.is_a?(FHIR::Questionnaire) &&
      (adaptive_questionnaire?(entry.resource) ? include_adaptive : include_standard)
  end&.resource
end

#questionnaire_package_bundles(parameters) ⇒ Object



130
131
132
133
134
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 130

def questionnaire_package_bundles(parameters)
  parameters.parameter.filter_map do |parameter|
    parameter.resource if parameter.name == 'packagebundle' && parameter.resource.is_a?(FHIR::Bundle)
  end
end

#questionnaire_package_output_parameters_from_operation_responses(requests) ⇒ Object

$questionnaire-package extraction of Parameters, Bundle, Questionnaire



124
125
126
127
128
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 124

def questionnaire_package_output_parameters_from_operation_responses(requests)
  parsed_operation_responses(requests).filter_map do |_request, response|
    response if response.is_a?(FHIR::Parameters)
  end
end

#questionnaire_response_from_next_question_request(request_body) ⇒ Object



109
110
111
112
113
114
115
116
117
118
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 109

def questionnaire_response_from_next_question_request(request_body)
  case request_body
  when FHIR::QuestionnaireResponse
    request_body
  when FHIR::Parameters
    request_body.parameter.find do |parameter|
      parameter.name == 'questionnaire-response' && parameter.resource.is_a?(FHIR::QuestionnaireResponse)
    end&.resource
  end
end

#questionnaire_response_from_next_question_response(response_body) ⇒ Object

$next-question has a single "return" out parameter typed as a Resource, so per the FHIR spec (https://www.hl7.org/fhir/R4/operations.html#response) a conformant response is the raw QuestionnaireResponse rather than a Parameters wrapper (see dtr_next_question_response_validation_test); a Parameters-wrapped return is tolerated too. Expects an already-parsed response body (a FHIR resource), not a raw request/JSON string.



98
99
100
101
102
103
104
105
106
107
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 98

def questionnaire_response_from_next_question_response(response_body)
  case response_body
  when FHIR::QuestionnaireResponse
    response_body
  when FHIR::Parameters
    response_body.parameter.find do |parameter|
      parameter.name == 'return' && parameter.resource.is_a?(FHIR::QuestionnaireResponse)
    end&.resource
  end
end

#questionnaires_from_operation_response_parameters(parameters, request, include_standard: true, include_adaptive: true) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 65

def questionnaires_from_operation_response_parameters(parameters, request, include_standard: true,
                                                      include_adaptive: true)
  if request.url.include?('$questionnaire-package')
    questionnaires_from_questionnaire_package_output_parameters(parameters, include_standard:, include_adaptive:)
  elsif request.url.include?('$next-question')
    Array.wrap(include_adaptive ? questionnaire_from_next_question_output_parameters(parameters) : nil)
  end
end

#questionnaires_from_operation_responses(requests, include_standard: true, include_adaptive: true) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 49

def questionnaires_from_operation_responses(requests, include_standard: true, include_adaptive: true)
  questionnaires = []

  parsed_operation_responses(requests).each do |request, response|
    # pull out Questionnaires from requests ($q-p and $n-q)
    if response.is_a?(FHIR::QuestionnaireResponse)
      questionnaires << contained_questionnaire_from_questionnaire_response(response) if include_adaptive
    elsif response.is_a?(FHIR::Parameters)
      questionnaires.concat(questionnaires_from_operation_response_parameters(response, request, include_standard:,
                                                                                                 include_adaptive:))
    end
  end

  questionnaires.compact
end

#questionnaires_from_questionnaire_package_output_parameters(parameters, include_standard: true, include_adaptive: true) ⇒ Object



136
137
138
139
140
141
# File 'lib/davinci_dtr_test_kit/cross_suite/v2.2.0/questionnaire_helper.rb', line 136

def questionnaires_from_questionnaire_package_output_parameters(parameters, include_standard: true,
                                                                include_adaptive: true)
  questionnaire_package_bundles(parameters).filter_map do |bundle|
    questionnaire_from_package_bundle(bundle, include_standard:, include_adaptive:)
  end
end