Class: DaVinciDTRTestKit::DTRAdaptiveResponseValidationTest

Inherits:
Inferno::Test
  • Object
show all
Includes:
DTRQuestionnaireResponseValidation, URLs
Defined in:
lib/davinci_dtr_test_kit/client_groups/adaptive_questionnaire/dtr_adaptive_response_validation_test.rb

Constant Summary

Constants included from DTRQuestionnaireResponseValidation

DaVinciDTRTestKit::DTRQuestionnaireResponseValidation::CQL_EXPRESSION_EXTENSIONS

Constants included from CQLTest

CQLTest::ADAPTIVE_QUESTIONNAIRE_PACKAGE_BUNDLE_PROFILE, CQLTest::ADAPTIVE_QUESTIONNAIRE_PACKAGE_PARAMETER_PROFILE, CQLTest::STATIC_QUESTIONNAIRE_PACKAGE_BUNDLE_PROFILE, CQLTest::STATIC_QUESTIONNAIRE_PACKAGE_PARAMETER_PROFILE

Instance Method Summary collapse

Methods included from DTRQuestionnaireResponseValidation

#answer_value_equal?, #check_answer, #check_answer_presence, #check_is_questionnaire_response, #check_item_prepopulation, #check_missing_origin_sources, #check_origin_source, #check_origin_sources, #coding_equal?, #collect_questionnaire_cql_expression_link_ids, #extract_expected_answers_from_template, #extract_origin_sources, #extract_required_link_ids, #find_extension, #find_item_by_link_id, #find_origin_source, #item_is_cql_expression?, #origin_source_error, #validate_cql_executed, #validate_questionnaire_pre_population, #validate_questionnaire_response_correctness, #value_for_display, #verify_basic_conformance

Methods included from CQLTest

#add_formatting_messages, #add_item_messages, #add_launch_context_messages, #check_expression_format, #check_for_cql, #check_item_extension, #check_libraries, #check_library_references, #check_nested_items, #check_questionnaire_extensions, #check_questionnaire_items, #cqf_reference_libraries, #cql_presence, #evaluate_library, #extension_presence, #extract_bundles_from_parameter, #extract_contained_questionnaires, #extract_libraries_from_bundles, #extract_questionnaire_bundles, #extract_questionnaire_from_questionnaire_package, #extract_questionnaires_from_bundles, #found_duplicate_library_name, #found_non_cql_elm_library, #found_non_cql_expression, #found_questionnaire, #library_names, #library_urls, #perform_questionnaire_package_validation, #questionnaire_package_profile_urls, #reset_cql_tests, #total_cqf_libs, #validate_questionnaire_package, #verify_questionnaire_extensions, #verify_questionnaire_items

Methods included from URLs

#base_url, #ehr_authorize_url, #ehr_token_url, #fhir_base_url, #next_url, #payer_token_url, #questionnaire_package_url, #questionnaire_response_url, #registration_url, #resume_fail_url, #resume_pass_url, #suite_id, #supported_payer_url, #token_url, #udap_discovery_url

Instance Method Details

#next_request_tagObject



34
35
36
# File 'lib/davinci_dtr_test_kit/client_groups/adaptive_questionnaire/dtr_adaptive_response_validation_test.rb', line 34

def next_request_tag
  config.options[:next_tag]
end

#perform_questionnaire_reponses_validation(custom_questionnaires) ⇒ Object

rubocop:disable Metrics/CyclomaticComplexity



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/davinci_dtr_test_kit/client_groups/adaptive_questionnaire/dtr_adaptive_response_validation_test.rb', line 38

def perform_questionnaire_reponses_validation(custom_questionnaires) # rubocop:disable Metrics/CyclomaticComplexity
  requests.each_with_index do |r, index|
    if r.url != next_url
      add_message('warning',
                  "Request #{index} made to wrong URL: #{r.url}. Should instead be to #{next_url}")
    end

    assert_valid_json(r.request_body)
    input_params = FHIR.from_contents(r.request_body)
    assert input_params.present?, 'Request does not contain a recognized FHIR object'

    qr = nil
    if input_params.is_a?(FHIR::QuestionnaireResponse)
      qr = input_params
    elsif input_params.is_a?(FHIR::Parameters)
      qr = input_params.parameter&.find do |param|
        param.name == 'questionnaire-response'
      end&.resource
    end

    assert qr.present?, 'QuestionnaireResponse resource not provided.'
    verify_basic_conformance(qr.to_json, profile_url)

    questionnaire = qr.contained.find { |res| res.resourceType == 'Questionnaire' }
    assert questionnaire, 'QuestionnaireResponse does not contained a Questionnaire'

    scratch[:contained_questionnaires] ||= []
    scratch[:contained_questionnaires] << questionnaire

    verify_contained_questionnaire(questionnaire, index, custom_questionnaires)
    check_missing_origin_sources(qr, index) if index == requests.length - 1

    expected_overrides = next_request_tag&.include?('custom') ? [] : ['PBD.2']
    check_origin_sources(questionnaire.item, qr.item, expected_overrides:, index:)

    required_link_ids = extract_required_link_ids(questionnaire.item)
    check_answer_presence(qr.item, required_link_ids, index)
  rescue Inferno::Exceptions::AssertionException => e
    prefix = e.message.include?('Workflow not') ? '' : "Request #{index}: "
    add_message('error', "#{prefix}#{e.message}")
    next
  end
end

#profile_urlObject



30
31
32
# File 'lib/davinci_dtr_test_kit/client_groups/adaptive_questionnaire/dtr_adaptive_response_validation_test.rb', line 30

def profile_url
  'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse-adapt'
end

#verify_contained_questionnaire(questionnaire, index, custom_questionnaires) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/davinci_dtr_test_kit/client_groups/adaptive_questionnaire/dtr_adaptive_response_validation_test.rb', line 82

def verify_contained_questionnaire(questionnaire, index, custom_questionnaires)
  return unless next_request_tag&.include?('custom')
  return unless index.positive? && custom_questionnaires.present?

  expected_questionnaire = custom_questionnaires[index - 1]
  return unless expected_questionnaire

  actual_items = questionnaire.to_hash['item']
  expected_items = expected_questionnaire['item']

  assert actual_items == expected_items, %(
    Invalid QuestionnaireResponse: the contained Questionnaire `item` does not match the expected content.
    **Expected**: #{expected_items.inspect}
    **Received**: #{actual_items.inspect}
  )
end

#verify_workflow_completion(custom_questionnaires) ⇒ Object



99
100
101
102
103
104
105
106
# File 'lib/davinci_dtr_test_kit/client_groups/adaptive_questionnaire/dtr_adaptive_response_validation_test.rb', line 99

def verify_workflow_completion(custom_questionnaires)
  return unless next_request_tag&.include?('custom')

  assert requests.length > custom_questionnaires.length, %(
        Workflow not completed: expected #{custom_questionnaires.length + 1} next-question requests,
        but received #{requests.length}.
      )
end