Module: SubscriptionsTestKit::SubscriptionConformanceVerification
Instance Method Summary
collapse
Methods included from URLs
#client_suite_base_url, #client_suite_id, #fhir_subscription_url, #resume_fail_url_client, #resume_fail_url_server, #resume_pass_url_client, #resume_pass_url_server, #server_suite_base_url, #server_suite_id, #subscription_channel_url
Instance Method Details
#channel_field_matches?(subscription_channel, field_name, expected_entry) ⇒ Boolean
11
12
13
|
# File 'lib/subscriptions_test_kit/common/subscription_conformance_verification.rb', line 11
def channel_field_matches?(subscription_channel, field_name, expected_entry)
subscription_channel[field_name].present? && subscription_channel[field_name] == expected_entry
end
|
#check_extension(extensions) ⇒ Object
19
20
21
22
23
24
25
26
27
28
|
# File 'lib/subscriptions_test_kit/common/subscription_conformance_verification.rb', line 19
def check_extension(extensions)
extensions.each do |extension|
next unless cross_version_extension?(extension['url'])
add_message('warning', %(
Cross-version extensions SHOULD NOT be used on R4 subscriptions to describe any elements also described by
this guide, but found the #{extension['url']} extension on the Subscription resource
))
end
end
|
#cross_version_extension?(url) ⇒ Boolean
15
16
17
|
# File 'lib/subscriptions_test_kit/common/subscription_conformance_verification.rb', line 15
def cross_version_extension?(url)
url.match?(%r{http://hl7\.org/fhir/[0-9]+\.[0-9]+/StructureDefinition/extension-Subscription\..+})
end
|
#cross_version_extension_check(subscription) ⇒ Object
30
31
32
33
34
35
36
37
38
|
# File 'lib/subscriptions_test_kit/common/subscription_conformance_verification.rb', line 30
def cross_version_extension_check(subscription)
subscription.each do |key, value|
if value.is_a?(Array) && key == 'extension'
check_extension(value)
elsif value.is_a?(Hash) || value.is_a?(Array)
cross_version_extension_check(value)
end
end
end
|
#no_error_verification(message) ⇒ Object
7
8
9
|
# File 'lib/subscriptions_test_kit/common/subscription_conformance_verification.rb', line 7
def no_error_verification(message)
assert messages.none? { |msg| msg[:type] == 'error' }, message
end
|
#server_check_channel(subscription, access_token) ⇒ Object
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'lib/subscriptions_test_kit/common/subscription_conformance_verification.rb', line 71
def server_check_channel(subscription, access_token)
subscription_channel = subscription['channel']
unless channel_field_matches?(subscription_channel, 'endpoint', subscription_channel_url)
add_message('warning', %(
The subscription url was changed from #{subscription_channel['endpoint']} to
#{subscription_channel_url}))
subscription_channel['endpoint'] = subscription_channel_url
end
unless channel_field_matches?(subscription_channel, 'payload', 'application/fhir+json')
update_message = if channel_field_matches?(subscription_channel, 'payload', 'application/json')
''
else
subscription_channel['payload'] = 'application/fhir+json'
' The requested Subscription has been updated to use this value.'
end
add_message('warning', %(
The `payload` element on the Subscription resource should be set to `application/fhir+json`, which is the
[correct mime type for FHIR JSON](https://hl7.org/fhir/R4/http.html#mime-type).#{update_message}
))
end
unless subscription_channel['header'].present? &&
subscription_channel['header'].include?("Authorization: Bearer #{access_token}")
add_message('warning', %(
Added the Authorization header field with a Bearer token set to #{access_token} to the `header` field on the
Subscription resource in order to connect successfully with the Inferno subscription channel.
))
subscription_channel['header'] = [] unless subscription_channel['header'].present?
subscription_channel['header'].append("Authorization: Bearer #{access_token}")
end
subscription['channel'] = subscription_channel
subscription
end
|
#subscription_verification(subscription_resource) ⇒ Object
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
# File 'lib/subscriptions_test_kit/common/subscription_conformance_verification.rb', line 47
def subscription_verification(subscription_resource)
assert_valid_json(subscription_resource)
subscription = JSON.parse(subscription_resource)
subscription_channel = subscription['channel']
assert(channel_field_matches?(subscription_channel, 'type', 'rest-hook'), %(
The `type` element on the Subscription resource must be set to `rest-hook`,
the `#{subscription_channel['type']}` channel type is unsupported.))
unless subscription['criteria'].present? && valid_url?(subscription['criteria'])
add_message('error',
%(
'The `criteria` element SHALL be populated and contain the canonical
URL for the Subscription Topic.'
))
end
subscription_resource = FHIR.from_contents(subscription.to_json)
assert_resource_type('Subscription', resource: subscription_resource)
assert_valid_resource(resource: subscription_resource,
profile_url: 'http://hl7.org/fhir/uv/subscriptions-backport/StructureDefinition/backport-subscription')
cross_version_extension_check(subscription)
end
|
#valid_url?(url) ⇒ Boolean
40
41
42
43
44
45
|
# File 'lib/subscriptions_test_kit/common/subscription_conformance_verification.rb', line 40
def valid_url?(url)
uri = URI.parse(url)
uri.is_a?(URI::HTTP) && !uri.host.nil?
rescue URI::InvalidURIError
false
end
|