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
- #count_previous_successful_requests(operation) ⇒ Object
-
#entity_has_inclusion_criteria?(entity) ⇒ Boolean
*********************************************************************** FHIRPath-based selection criteria ***********************************************************************.
-
#entity_has_request_range_criteria?(entity) ⇒ Boolean
*********************************************************************** request index-based selection criteria ***********************************************************************.
-
#include_entity?(entity, parsed_request_body, operation) ⇒ Boolean
*********************************************************************** Selection of entries from the Template ***********************************************************************.
- #ranges_cover_value?(value, ranges_string) ⇒ Boolean
- #request_meets_inclusion_criteria?(entity, parsed_request_body) ⇒ Boolean
- #request_meets_request_range_criteria?(entity, operation) ⇒ Boolean
- #strip_inferno_extensions(entity) ⇒ Object
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
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
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
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
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.) end |
#request_meets_inclusion_criteria?(entity, parsed_request_body) ⇒ 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
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 |