Module: DaVinciCRDTestKit::PrefetchContentsValidation

Includes:
FhirpathOnCDSRequest, ReplaceTokens
Included in:
V201::HookRequestPrefetchEqualsQueriedTest
Defined in:
lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb

Constant Summary

Constants included from FhirpathOnCDSRequest

FhirpathOnCDSRequest::SUPPORTED_POST_RESOLVE_FUNCTIONS, FhirpathOnCDSRequest::TODAY_EXPRESSION_PATTERN

Instance Method Summary collapse

Methods included from FhirpathOnCDSRequest

#execute_fhirpath_on_cds_request

Methods included from ReplaceTokens

#replace_tokens, #replace_tokens_in_string

Instance Method Details

#check_prefetch_data_against_query(hook_request, advertized_prefetch_queries) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb', line 23

def check_prefetch_data_against_query(hook_request, advertized_prefetch_queries)
  request_body = JSON.parse(hook_request.request_body)
  request_body['prefetch']&.each do |key, value|
    next unless advertized_prefetch_queries[key].present?

    instantiated_query = replace_tokens_in_string(advertized_prefetch_queries[key], request_body)

    queried_resource_list = query_for_data(instantiated_query)
    prefetched_resource_list = prefetched_data_to_resource_list(value)

    next if prefetched_data_equals_queried_data?(prefetched_resource_list, queried_resource_list)

    add_message('error', "#{request_number}Prefetched data `#{key}` was different than " \
                         "data returned from requested query `#{instantiated_query}`.")
  end
end

#prefetched_data?(requests) ⇒ Boolean

Returns:

  • (Boolean)


17
18
19
20
21
# File 'lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb', line 17

def prefetched_data?(requests)
  requests.any? do |request|
    JSON.parse(request.request_body)['prefetch']&.keys.present?
  end
end

#prefetched_data_equals_queried_data?(prefetched_data, queried_data) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
66
67
68
# File 'lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb', line 63

def prefetched_data_equals_queried_data?(prefetched_data, queried_data)
  prefetched_id_list = prefetched_data.map { |resource| "#{resource.resourceType}/#{resource.id}" }.sort
  queried_id_list = queried_data.map { |resource| "#{resource.resourceType}/#{resource.id}" }.sort

  prefetched_id_list == queried_id_list
end

#prefetched_data_to_resource_list(prefetched_data) ⇒ Object



70
71
72
73
74
75
76
77
78
79
# File 'lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb', line 70

def prefetched_data_to_resource_list(prefetched_data)
  return [] unless prefetched_data.present?

  fhir_data = FHIR.from_contents(prefetched_data.to_json)
  if fhir_data.is_a?(FHIR::Bundle)
    fhir_data.entry.map(&:resource)
  else
    [fhir_data]
  end
end

#query_for_data(prefetch_query) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb', line 40

def query_for_data(prefetch_query)
  is_search = prefetch_query.include?('?')

  split_query = is_search ? prefetch_query.split('?') : prefetch_query.split('/')
  resource_type = split_query.first

  query_result =
    if is_search
      fhir_search(resource_type, params: Rack::Utils.parse_nested_query(split_query.last))
    else
      fhir_read(resource_type, split_query.last)
    end

  return [] unless query_result.status.to_s.starts_with?('2')
  return [] unless query_result.resource.present?

  if is_search
    fetch_all_bundled_resources(resource_type:, bundle: query_result.resource)
  else
    [query_result.resource]
  end
end

#request_numberObject



9
10
11
12
13
14
15
# File 'lib/davinci_crd_test_kit/cross_suite/prefetch_contents_validation.rb', line 9

def request_number
  if @request_number.blank?
    ''
  else
    "Request #{@request_number}: "
  end
end