Module: SubscriptionsTestKit::SubscriptionsR5BackportR4Client::SubscriptionSimulationUtils

Constant Summary collapse

DEFAULT_MIME_TYPE =

Per the IG this should only be application/fhir+xml and application/fhir+json, application/json, so we’ll allow that. Disallow XML for now.

'application/fhir+json'
ALLOWED_MIME_TYPES =
[DEFAULT_MIME_TYPE, 'application/json'].freeze

Instance Method Summary collapse

Instance Method Details

#actual_mime_type(subscription) ⇒ Object



101
102
103
104
105
106
107
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 101

def actual_mime_type(subscription)
  if ALLOWED_MIME_TYPES.include?(subscription&.channel&.payload)
    subscription&.channel&.payload
  else
    DEFAULT_MIME_TYPE
  end
end

#client_access_token_input(test_result) ⇒ Object



15
16
17
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 15

def client_access_token_input(test_result)
  JSON.parse(test_result.input_json).find { |i| i['name'] == 'client_endpoint_access_token' }['value']
end

#derive_event_notification(notification_json, subscription_url, subscription_topic, event_count) ⇒ Object



30
31
32
33
34
35
36
37
38
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 30

def derive_event_notification(notification_json, subscription_url, subscription_topic, event_count)
  notification_timestamp = Time.now.utc.iso8601
  notification_bundle = FHIR.from_contents(notification_json)
  subscription_status = update_subscription_status(notification_bundle, subscription_url, subscription_topic,
                                                   'active', event_count, 'event-notification')
  update_event_timestamps(subscription_status, notification_timestamp)
  notification_bundle.timestamp = notification_timestamp
  notification_bundle
end

#derive_handshake_notification(notification_json, subscription_url, subscription_topic) ⇒ Object



19
20
21
22
23
24
25
26
27
28
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 19

def derive_handshake_notification(notification_json, subscription_url, subscription_topic)
  notification_bundle = FHIR.from_contents(notification_json)
  subscription_status = update_subscription_status(notification_bundle, subscription_url, subscription_topic,
                                                   'requested', 0, 'handshake')
  subscription_status.parameter.delete(find_parameter(subscription_status, 'notification-event'))
  subscription_status.parameter.delete(find_parameter(subscription_status, 'error'))
  notification_bundle.entry = [find_subscription_status_entry(notification_bundle)]
  notification_bundle.timestamp = Time.now.utc.iso8601
  notification_bundle
end

#derive_status_bundle(notification_json, subscription_url, subscription_topic, status_code, event_count, request_url) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 40

def derive_status_bundle(notification_json, subscription_url, subscription_topic,
                         status_code, event_count, request_url)
  notification_bundle = FHIR.from_contents(notification_json)
  subscription_status = update_subscription_status(notification_bundle, subscription_url, subscription_topic,
                                                   status_code, event_count, 'query-status')
  subscription_status.parameter.delete(find_parameter(subscription_status, 'notification-event'))
  subscription_status_entry = find_subscription_status_entry(notification_bundle)
  FHIR::Bundle.new(
    entry: FHIR::Bundle::Entry.new(
      fullUrl: subscription_status_entry.fullUrl,
      resource: subscription_status,
      search: FHIR::Bundle::Entry::Search.new(mode: 'match', score: 1)
    ),
    link: FHIR::Bundle::Link.new(relation: 'self', url: request_url),
    total: 1,
    type: 'searchset',
    timestamp: Time.now.utc.iso8601
  )
end

#determine_event_count(test_session_id) ⇒ Object



97
98
99
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 97

def determine_event_count(test_session_id)
  requests_repo.tagged_requests(test_session_id, [REST_HOOK_EVENT_NOTIFICATION_TAG]).count
end

#determine_subscription_status_code(subscription_id) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 84

def determine_subscription_status_code(subscription_id)
  handshakes = requests_repo.tagged_requests(test_run.test_session_id, [REST_HOOK_HANDSHAKE_NOTIFICATION_TAG])
  handshake = handshakes.filter { |h| notification_subscription_id(h.request_body) == subscription_id }.last

  if handshake.nil?
    'requested'
  elsif handshake.status.between?(200, 299)
    'active'
  else
    'error'
  end
end

#find_subscription(test_session_id, as_json: false) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 66

def find_subscription(test_session_id, as_json: false)
  request = requests_repo.tagged_requests(test_session_id, [SUBSCRIPTION_CREATE_TAG])&.find do |r|
    r.status == 201
  end
  return unless request

  begin
    if as_json
      # needed to access primitive extensions
      JSON.parse(request.response_body)
    else
      FHIR.from_contents(request.response_body)
    end
  rescue StandardError
    nil
  end
end

#notification_bundle_input(test_result) ⇒ Object



11
12
13
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 11

def notification_bundle_input(test_result)
  JSON.parse(test_result.input_json).find { |i| i['name'] == 'notification_bundle' }['value']
end

#operation_outcome(severity, code, text = nil) ⇒ Object



60
61
62
63
64
# File 'lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/common/subscription_simulation_utils.rb', line 60

def operation_outcome(severity, code, text = nil)
  oo = FHIR::OperationOutcome.new(issue: FHIR::OperationOutcome::Issue.new(severity:, code:))
  oo.issue.first.details = FHIR::CodeableConcept.new(text:) if text.present?
  oo
end