Module: DaVinciDTRTestKit::ResponseSelectionUtils

Included in:
MockPayer::FullEHRV220NextQuestionEndpoint, MockPayer::FullEHRV220QuestionnairePackageEndpoint
Defined in:
lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb

Constant Summary collapse

INFERNO_CONTROL_EXTENSION_URLS =
[
  'urn:inferno:dtr:inclusion-criteria',
  'urn:inferno:dtr:request-range'
].freeze

Instance Method Summary collapse

Instance Method Details

#count_previous_successful_requests(operation) ⇒ Object



59
60
61
62
63
# File 'lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb', line 59

def count_previous_successful_requests(operation)
  requests_repo = Inferno::Repositories::Requests.new
  previous_requests = requests_repo.requests_for_result(result.id)
  previous_requests.select { |req| req.url.include?(operation) && req.status == 200 }.count
end

#entity_has_inclusion_criteria?(entity) ⇒ Boolean


FHIRPath-based selection criteria


Returns:

  • (Boolean)


30
31
32
# File 'lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb', line 30

def entity_has_inclusion_criteria?(entity)
  entity.extension.any? { |ext| ext.url == 'urn:inferno:dtr:inclusion-criteria' }
end

#entity_has_request_range_criteria?(entity) ⇒ Boolean


request index-based selection criteria


Returns:

  • (Boolean)


48
49
50
# File 'lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb', line 48

def entity_has_request_range_criteria?(entity)
  entity.extension.any? { |ext| ext.url == 'urn:inferno:dtr:request-range' }
end

#include_entity?(entity, parsed_request_body, operation) ⇒ Boolean


Selection of entries from the Template


Returns:

  • (Boolean)


12
13
14
15
16
17
18
19
# File 'lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb', line 12

def include_entity?(entity, parsed_request_body, operation)
  return false if entity_has_request_range_criteria?(entity) &&
                  !request_meets_request_range_criteria?(entity, operation)
  return false if entity_has_inclusion_criteria?(entity) &&
                  !request_meets_inclusion_criteria?(entity, parsed_request_body)

  true
end

#ranges_cover_value?(value, ranges_string) ⇒ Boolean

Returns:

  • (Boolean)


65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb', line 65

def ranges_cover_value?(value, ranges_string)
  unless /\A(\d+(-\d+)?,)*\d+(-\d+)?\z/.match?(ranges_string)
    raise ArgumentError,
          "Invalid range string: #{ranges_string.inspect}"
  end

  ranges_string.split(',').any? do |part|
    if part.include?('-')
      a, b = part.split('-').map(&:to_i)
      raise ArgumentError, "Inverted range in: #{part.inspect}" if a > b

      (a..b).cover?(value)
    else
      part.to_i == value
    end
  end
rescue ArgumentError => e
  raise Inferno::Exceptions::TestSuiteImplementationException.new('dtr response range criteria', e.message)
end

#request_meets_inclusion_criteria?(entity, parsed_request_body) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
37
38
39
40
41
42
# File 'lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb', line 34

def request_meets_inclusion_criteria?(entity, parsed_request_body)
  criteria = entity.extension.find do |ext|
    ext.url == 'urn:inferno:dtr:inclusion-criteria'
  end&.valueExpression&.expression
  return false unless criteria.present?

  fhirpath_result = execute_fhirpath(parsed_request_body, criteria)
  interpret_fhirpath_result_as_boolean(fhirpath_result)
end

#request_meets_request_range_criteria?(entity, operation) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
55
56
57
# File 'lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb', line 52

def request_meets_request_range_criteria?(entity, operation)
  criteria = entity.extension.find { |ext| ext.url == 'urn:inferno:dtr:request-range' }&.valueString
  return false unless criteria.present?

  ranges_cover_value?(count_previous_successful_requests(operation) + 1, criteria)
end

#strip_inferno_extensions(entity) ⇒ Object



21
22
23
24
# File 'lib/davinci_dtr_test_kit/cross_suite/response_selection_utils.rb', line 21

def strip_inferno_extensions(entity)
  entity.extension.reject! { |ext| INFERNO_CONTROL_EXTENSION_URLS.include?(ext.url) }
  entity
end