subscriptions_test_kit 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/subscriptions_test_kit/common/notification_conformance_verification.rb +36 -0
- data/lib/subscriptions_test_kit/metadata.rb +2 -2
- data/lib/subscriptions_test_kit/requirements/generated/subscriptions-test-kit_requirements_coverage.csv +2 -2
- data/lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/workflow/conformance_verification/processing_attestation_test.rb +2 -2
- data/lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_client/workflow/interaction_test.rb +2 -2
- data/lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_server/common/interaction/notification_delivery_test.rb +2 -2
- data/lib/subscriptions_test_kit/suites/subscriptions_r5_backport_r4_server/common/interaction_verification/notification_conformance_test.rb +6 -0
- data/lib/subscriptions_test_kit/urls.rb +26 -10
- data/lib/subscriptions_test_kit/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b0d106312b06065683c721f242cdf245652dd5b14278a933c68ebbd85d10cca
|
4
|
+
data.tar.gz: 20d796f12f6c84e6f332a0b9bc990d8674077a17b927cab550d4913d1e79963d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29543919ba760e5227ac5a72b27467e9b3d3f23b475d39d7c99d4e96a13467edbacefa1f5f1754f12251c25758e4109996e3cca4d703f921d7f0aed36537abc2
|
7
|
+
data.tar.gz: 9b2dbbb0563af958aca05c08c3e1894c61343b3ed9a5b0dd6f86cf087f36a44a4bc3385f75d41a8577acaf0ba59db377f09ab5cdffd70d1d5775bb36132e3c95
|
@@ -305,5 +305,41 @@ module SubscriptionsTestKit
|
|
305
305
|
|
306
306
|
verify_id_only_notification_bundle_entries(bundle_entries)
|
307
307
|
end
|
308
|
+
|
309
|
+
def notification_header_verification(request_headers, subscription)
|
310
|
+
mime_type = subscription&.dig('channel', 'payload')
|
311
|
+
# Verification for hl7.fhir.uv.subscriptions_1.1.0@26
|
312
|
+
if mime_type.present?
|
313
|
+
content_type_header = request_headers.find { |header| header.name.downcase == 'content-type' }
|
314
|
+
handle_content_type_header_errors(mime_type, content_type_header)
|
315
|
+
end
|
316
|
+
# Verification for hl7.fhir.uv.subscriptions_1.1.0@27
|
317
|
+
subscription.dig('channel', 'header').each do |requested_header|
|
318
|
+
handle_sent_header_errors(request_headers, requested_header)
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
def handle_content_type_header_errors(mime_type, content_type_header)
|
323
|
+
if content_type_header.blank?
|
324
|
+
add_message('error', "Content type header not sent, subscription requested #{mime_type}\n")
|
325
|
+
elsif !content_type_header.value.start_with?(mime_type)
|
326
|
+
add_message('error',
|
327
|
+
'Content type of request does not match the Subscription MIME type. ' \
|
328
|
+
"Expected #{mime_type}, received #{content_type_header.value}")
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
def handle_sent_header_errors(request_headers, requested_header)
|
333
|
+
requested_name = requested_header.partition(': ').first.downcase
|
334
|
+
requested_value = requested_header.partition(': ').last
|
335
|
+
sent_header = request_headers.find { |header| header.name.downcase == requested_name }
|
336
|
+
if sent_header.blank?
|
337
|
+
add_message('error', "Requested header not sent: #{requested_header}\n")
|
338
|
+
elsif sent_header.value != requested_value
|
339
|
+
add_message('error',
|
340
|
+
"Requested value for header #{requested_name} does not match the request sent. " \
|
341
|
+
"Expected #{requested_value}, received #{sent_header.value}")
|
342
|
+
end
|
343
|
+
end
|
308
344
|
end
|
309
345
|
end
|
@@ -3,9 +3,9 @@ require_relative 'version'
|
|
3
3
|
module SubscriptionsTestKit
|
4
4
|
class Metadata < Inferno::TestKit
|
5
5
|
id :subscriptions_test_kit
|
6
|
-
title '
|
6
|
+
title 'Subscriptions Test Kit'
|
7
7
|
description <<~DESCRIPTION
|
8
|
-
The Subscriptions Test
|
8
|
+
The Subscriptions Test Kit verifies the conformance of systems to the FHIR Subscriptions
|
9
9
|
framework as specified in the [HL7® FHIR® R5 version](https://www.hl7.org/fhir/R5/subscriptions.html)
|
10
10
|
and above. For systems using the R4 and R4B releases of FHIR, it verifies Subscription
|
11
11
|
functionality against the [Subscriptions R5 Backport
|
@@ -25,8 +25,8 @@ hl7.fhir.uv.subscriptions_1.1.0,22,https://hl7.org/fhir/uv/subscriptions-backpor
|
|
25
25
|
hl7.fhir.uv.subscriptions_1.1.0,23,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,"To receive notifications via HTTP/S POST, a client should request a subscription with the channel type of rest-hook and set the endpoint to the appropriate client URL.",SHALL,Client,,,1.1.01,subscriptions_r5_backport_r4_client-subscriptions_r4_client_workflow-Group01-subscriptions_r4_client_interaction,NA,NA
|
26
26
|
hl7.fhir.uv.subscriptions_1.1.0,24,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,This URL [for the subscription notification endpoint] must be accessible by the hosting server.,SHALL,Client,,,1.2.02,subscriptions_r5_backport_r4_client-subscriptions_r4_client_workflow-subscriptions_r4_client_interaction_verification-subscriptions_r4_client_event_notification_verification,NA,NA
|
27
27
|
hl7.fhir.uv.subscriptions_1.1.0,25,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,"To convey an event notification, the server POSTs a Bundle to the client’s nominated endpoint URL",SHALL,Server,,,NA,NA,"1.1.03, 3.1.1.03, 3.2.1.03, 3.3.1.03, 4.01","subscriptions_r5_backport_r4_server-subscriptions_r4_server_workflow-subscriptions_r4_server_interaction-subscriptions_r4_server_creation_response_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_empty_content-subscriptions_r4_server_empty_content_interaction-subscriptions_r4_server_creation_response_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_id_only_content-subscriptions_r4_server_id_only_content_interaction-subscriptions_r4_server_creation_response_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_full_resource_content-subscriptions_r4_server_full_resource_content_interaction-subscriptions_r4_server_creation_response_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_handshake_heartbeat-subscriptions_r4_server_handshake_conformance"
|
28
|
-
hl7.fhir.uv.subscriptions_1.1.0,26,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,The content-type of the POST SHALL match the MIME type on the Subscription (Subscription.channel.payload).,SHALL,Server,,,NA,NA
|
29
|
-
hl7.fhir.uv.subscriptions_1.1.0,27,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,Each Subscription.channel.header value SHALL be conveyed as an HTTP request header.,SHALL,Server,,,NA,NA
|
28
|
+
hl7.fhir.uv.subscriptions_1.1.0,26,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,The content-type of the POST SHALL match the MIME type on the Subscription (Subscription.channel.payload).,SHALL,Server,,,NA,NA,"1.2.02, 3.1.2.02, 3.2.2.02, 3.3.2.02","subscriptions_r5_backport_r4_server-subscriptions_r4_server_workflow-subscriptions_r4_server_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_empty_content-subscriptions_r4_server_empty_content_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_id_only_content-subscriptions_r4_server_id_only_content_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_full_resource_content-subscriptions_r4_server_full_resource_content_interaction_verification-subscriptions_r4_server_notification_conformance"
|
29
|
+
hl7.fhir.uv.subscriptions_1.1.0,27,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,Each Subscription.channel.header value SHALL be conveyed as an HTTP request header.,SHALL,Server,,,NA,NA,"1.2.02, 3.1.2.02, 3.2.2.02, 3.3.2.02","subscriptions_r5_backport_r4_server-subscriptions_r4_server_workflow-subscriptions_r4_server_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_empty_content-subscriptions_r4_server_empty_content_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_id_only_content-subscriptions_r4_server_id_only_content_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_full_resource_content-subscriptions_r4_server_full_resource_content_interaction_verification-subscriptions_r4_server_notification_conformance"
|
30
30
|
hl7.fhir.uv.subscriptions_1.1.0,28,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,The bundle SHALL comply with the Backported R5 Notification Bundle Profile.,SHALL,Server,,,NA,NA,"1.2.02, 3.1.2.02, 3.1.2.03, 3.2.2.02, 3.2.2.03, 3.3.2.02, 3.3.2.03, 4.01, 4.02","subscriptions_r5_backport_r4_server-subscriptions_r4_server_workflow-subscriptions_r4_server_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_empty_content-subscriptions_r4_server_empty_content_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_empty_content-subscriptions_r4_server_empty_content_interaction_verification-subscriptions_r4_server_empty_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_id_only_content-subscriptions_r4_server_id_only_content_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_id_only_content-subscriptions_r4_server_id_only_content_interaction_verification-subscriptions_r4_server_id_only_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_full_resource_content-subscriptions_r4_server_full_resource_content_interaction_verification-subscriptions_r4_server_notification_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_full_resource_content-subscriptions_r4_server_full_resource_content_interaction_verification-subscriptions_r4_server_full_resource_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_handshake_heartbeat-subscriptions_r4_server_handshake_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_handshake_heartbeat-subscriptions_r4_server_heartbeat_conformance"
|
31
31
|
hl7.fhir.uv.subscriptions_1.1.0,29,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,"When a Subscription is created for a REST Hook channel type, the server SHALL set initial status to requested, pending verification of the nominated endpoint URL.",SHALL,Server,,,NA,NA,"1.1.03, 3.1.1.03, 3.2.1.03, 3.3.1.03","subscriptions_r5_backport_r4_server-subscriptions_r4_server_workflow-subscriptions_r4_server_interaction-subscriptions_r4_server_creation_response_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_empty_content-subscriptions_r4_server_empty_content_interaction-subscriptions_r4_server_creation_response_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_id_only_content-subscriptions_r4_server_id_only_content_interaction-subscriptions_r4_server_creation_response_conformance, subscriptions_r5_backport_r4_server-subscriptions_r4_server_event_notification-subscriptions_r4_server_full_resource_content-subscriptions_r4_server_full_resource_content_interaction-subscriptions_r4_server_creation_response_conformance"
|
32
32
|
hl7.fhir.uv.subscriptions_1.1.0,30,https://hl7.org/fhir/uv/subscriptions-backport/STU1.1/channels.html#rest-hook-1,"After a successful handshake notification has been sent and accepted [for a REST Hook channel type], the server SHALL update the status to active.",SHALL,Server,,,NA,NA,5.01,subscriptions_r5_backport_r4_server-subscriptions_r4_server_status_operation-subscriptions_r4_server_status_invocation
|
@@ -27,9 +27,9 @@ module SubscriptionsTestKit
|
|
27
27
|
message: %(
|
28
28
|
I attest that the client application successfully processed the event notification sent by Inferno.
|
29
29
|
|
30
|
-
[Click here](#{
|
30
|
+
[Click here](#{resume_pass_url_client}?test_run_identifier=#{token}) if the above statement is **true**.
|
31
31
|
|
32
|
-
[Click here](#{
|
32
|
+
[Click here](#{resume_fail_url_client}?test_run_identifier=#{token}) if the above statement is **false**.
|
33
33
|
)
|
34
34
|
)
|
35
35
|
end
|
@@ -101,10 +101,10 @@ module SubscriptionsTestKit
|
|
101
101
|
At any point while this test is waiting, Inferno will respond to Subscription GET and $status requests.
|
102
102
|
|
103
103
|
Once the client has received an event notification and has made any additional requests,
|
104
|
-
[click here to complete the test](#{
|
104
|
+
[click here to complete the test](#{resume_pass_url_client}?test_run_identifier=#{access_token})
|
105
105
|
|
106
106
|
If at any point something has gone wrong and the client is unable to continue,
|
107
|
-
[click here to fail the test](#{
|
107
|
+
[click here to fail the test](#{resume_fail_url_client}?test_run_identifier=#{access_token})
|
108
108
|
|
109
109
|
NOTE: The test must be completed or failed using the links above within 10 minutes. After that,
|
110
110
|
attempts to send requests or to complete or fail the tests using the links above
|
@@ -45,8 +45,8 @@ module SubscriptionsTestKit
|
|
45
45
|
|
46
46
|
`#{subscription_channel_url}`
|
47
47
|
|
48
|
-
[Click here](#{
|
49
|
-
requests.
|
48
|
+
[Click here](#{resume_pass_url_server}?token=notification%20#{access_token}) when you have finished
|
49
|
+
submitting requests.
|
50
50
|
|
51
51
|
)
|
52
52
|
)
|
@@ -23,6 +23,8 @@ module SubscriptionsTestKit
|
|
23
23
|
|
24
24
|
verifies_requirements 'hl7.fhir.uv.subscriptions_1.1.0@14',
|
25
25
|
'hl7.fhir.uv.subscriptions_1.1.0@15',
|
26
|
+
'hl7.fhir.uv.subscriptions_1.1.0@26',
|
27
|
+
'hl7.fhir.uv.subscriptions_1.1.0@27',
|
26
28
|
'hl7.fhir.uv.subscriptions_1.1.0@28',
|
27
29
|
'hl7.fhir.uv.subscriptions_1.1.0@69',
|
28
30
|
'hl7.fhir.uv.subscriptions_1.1.0@70',
|
@@ -80,6 +82,10 @@ module SubscriptionsTestKit
|
|
80
82
|
subscription_id: subscription['id'],
|
81
83
|
status: 'active'
|
82
84
|
)
|
85
|
+
notification_header_verification(
|
86
|
+
request.request_headers,
|
87
|
+
subscription
|
88
|
+
)
|
83
89
|
end
|
84
90
|
|
85
91
|
no_error_verification("Received event-notifications for Subscription #{subscription['id']} are not conformant.")
|
@@ -10,28 +10,44 @@ module SubscriptionsTestKit
|
|
10
10
|
RESUME_FAIL_PATH = '/resume_fail'
|
11
11
|
|
12
12
|
module URLs
|
13
|
-
def
|
14
|
-
@
|
13
|
+
def server_suite_base_url
|
14
|
+
@server_suite_base_url ||= "#{Inferno::Application['base_url']}/custom/#{server_suite_id}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def client_suite_base_url
|
18
|
+
@client_suite_base_url ||= "#{Inferno::Application['base_url']}/custom/#{client_suite_id}"
|
15
19
|
end
|
16
20
|
|
17
21
|
def subscription_channel_url
|
18
|
-
@subscription_channel_url ||=
|
22
|
+
@subscription_channel_url ||= server_suite_base_url + SUBSCRIPTION_CHANNEL_PATH
|
23
|
+
end
|
24
|
+
|
25
|
+
def resume_pass_url_server
|
26
|
+
@resume_pass_url_server ||= server_suite_base_url + RESUME_PASS_PATH
|
27
|
+
end
|
28
|
+
|
29
|
+
def resume_fail_url_server
|
30
|
+
@resume_fail_url_server ||= server_suite_base_url + RESUME_FAIL_PATH
|
19
31
|
end
|
20
32
|
|
21
33
|
def fhir_subscription_url
|
22
|
-
@fhir_subscription_url ||=
|
34
|
+
@fhir_subscription_url ||= client_suite_base_url + FHIR_SUBSCRIPTION_PATH
|
35
|
+
end
|
36
|
+
|
37
|
+
def resume_pass_url_client
|
38
|
+
@resume_pass_url_client ||= client_suite_base_url + RESUME_PASS_PATH
|
23
39
|
end
|
24
40
|
|
25
|
-
def
|
26
|
-
@
|
41
|
+
def resume_fail_url_client
|
42
|
+
@resume_fail_url_client ||= client_suite_base_url + RESUME_FAIL_PATH
|
27
43
|
end
|
28
44
|
|
29
|
-
def
|
30
|
-
|
45
|
+
def server_suite_id
|
46
|
+
SubscriptionsR5BackportR4Server::SubscriptionsR5BackportR4ServerSuite.id
|
31
47
|
end
|
32
48
|
|
33
|
-
def
|
34
|
-
|
49
|
+
def client_suite_id
|
50
|
+
SubscriptionsR5BackportR4Client::SubscriptionsR5BackportR4ClientSuite.id
|
35
51
|
end
|
36
52
|
end
|
37
53
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: subscriptions_test_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Naden, Emily Semple, Tom Strassner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inferno_core
|