davinci_crd_test_kit 0.9.0
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 +7 -0
- data/LICENSE +201 -0
- data/lib/davinci_crd_test_kit/card_responses/companions_prerequisites.json +58 -0
- data/lib/davinci_crd_test_kit/card_responses/create_update_coverage_information.json +20 -0
- data/lib/davinci_crd_test_kit/card_responses/external_reference.json +21 -0
- data/lib/davinci_crd_test_kit/card_responses/instructions.json +14 -0
- data/lib/davinci_crd_test_kit/card_responses/launch_smart_app.json +21 -0
- data/lib/davinci_crd_test_kit/card_responses/propose_alternate_request.json +71 -0
- data/lib/davinci_crd_test_kit/card_responses/request_form_completion.json +227 -0
- data/lib/davinci_crd_test_kit/cards_validation.rb +234 -0
- data/lib/davinci_crd_test_kit/client_fhir_api_group.rb +762 -0
- data/lib/davinci_crd_test_kit/client_hook_request_validation.rb +15 -0
- data/lib/davinci_crd_test_kit/client_hooks_group.rb +706 -0
- data/lib/davinci_crd_test_kit/client_tests/appointment_book_receive_request_test.rb +71 -0
- data/lib/davinci_crd_test_kit/client_tests/client_display_cards_attest.rb +48 -0
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_create_test.rb +40 -0
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_read_test.rb +39 -0
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_search_test.rb +232 -0
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_update_test.rb +40 -0
- data/lib/davinci_crd_test_kit/client_tests/client_fhir_api_validation_test.rb +60 -0
- data/lib/davinci_crd_test_kit/client_tests/decode_auth_token_test.rb +40 -0
- data/lib/davinci_crd_test_kit/client_tests/encounter_discharge_receive_request_test.rb +68 -0
- data/lib/davinci_crd_test_kit/client_tests/encounter_start_receive_request_test.rb +68 -0
- data/lib/davinci_crd_test_kit/client_tests/hook_request_optional_fields_test.rb +41 -0
- data/lib/davinci_crd_test_kit/client_tests/hook_request_required_fields_test.rb +40 -0
- data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_context_test.rb +63 -0
- data/lib/davinci_crd_test_kit/client_tests/hook_request_valid_prefetch_test.rb +151 -0
- data/lib/davinci_crd_test_kit/client_tests/order_dispatch_receive_request_test.rb +79 -0
- data/lib/davinci_crd_test_kit/client_tests/order_select_receive_request_test.rb +76 -0
- data/lib/davinci_crd_test_kit/client_tests/order_sign_receive_request_test.rb +79 -0
- data/lib/davinci_crd_test_kit/client_tests/retrieve_jwks_test.rb +65 -0
- data/lib/davinci_crd_test_kit/client_tests/token_header_test.rb +34 -0
- data/lib/davinci_crd_test_kit/client_tests/token_payload_test.rb +61 -0
- data/lib/davinci_crd_test_kit/crd_client_suite.rb +156 -0
- data/lib/davinci_crd_test_kit/crd_jwks.json +59 -0
- data/lib/davinci_crd_test_kit/crd_options.rb +9 -0
- data/lib/davinci_crd_test_kit/crd_server_suite.rb +115 -0
- data/lib/davinci_crd_test_kit/ext/inferno_core/runnable.rb +22 -0
- data/lib/davinci_crd_test_kit/hook_request_field_validation.rb +410 -0
- data/lib/davinci_crd_test_kit/jwks.rb +25 -0
- data/lib/davinci_crd_test_kit/jwt_helper.rb +74 -0
- data/lib/davinci_crd_test_kit/mock_service_response.rb +421 -0
- data/lib/davinci_crd_test_kit/routes/cds-services.json +74 -0
- data/lib/davinci_crd_test_kit/routes/cds_services_discovery_handler.rb +18 -0
- data/lib/davinci_crd_test_kit/routes/hook_request_endpoint.rb +93 -0
- data/lib/davinci_crd_test_kit/routes/jwk_set_endpoint_handler.rb +15 -0
- data/lib/davinci_crd_test_kit/server_appointment_book_group.rb +173 -0
- data/lib/davinci_crd_test_kit/server_discovery_group.rb +59 -0
- data/lib/davinci_crd_test_kit/server_encounter_discharge_group.rb +144 -0
- data/lib/davinci_crd_test_kit/server_encounter_start_group.rb +144 -0
- data/lib/davinci_crd_test_kit/server_hook_request_validation.rb +15 -0
- data/lib/davinci_crd_test_kit/server_hooks_group.rb +69 -0
- data/lib/davinci_crd_test_kit/server_order_dispatch_group.rb +173 -0
- data/lib/davinci_crd_test_kit/server_order_select_group.rb +169 -0
- data/lib/davinci_crd_test_kit/server_order_sign_group.rb +198 -0
- data/lib/davinci_crd_test_kit/server_required_card_response_validation_group.rb +23 -0
- data/lib/davinci_crd_test_kit/server_tests/additional_orders_validation_test.rb +70 -0
- data/lib/davinci_crd_test_kit/server_tests/card_optional_fields_validation_test.rb +47 -0
- data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_across_hooks_validation_test.rb +32 -0
- data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_received_test.rb +58 -0
- data/lib/davinci_crd_test_kit/server_tests/coverage_information_system_action_validation_test.rb +121 -0
- data/lib/davinci_crd_test_kit/server_tests/create_or_update_coverage_info_response_validation_test.rb +72 -0
- data/lib/davinci_crd_test_kit/server_tests/discovery_endpoint_test.rb +88 -0
- data/lib/davinci_crd_test_kit/server_tests/discovery_services_validation_test.rb +65 -0
- data/lib/davinci_crd_test_kit/server_tests/external_reference_card_across_hooks_validation_test.rb +28 -0
- data/lib/davinci_crd_test_kit/server_tests/external_reference_card_validation_test.rb +36 -0
- data/lib/davinci_crd_test_kit/server_tests/form_completion_response_validation_test.rb +79 -0
- data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_across_hooks_test.rb +25 -0
- data/lib/davinci_crd_test_kit/server_tests/instructions_card_received_test.rb +28 -0
- data/lib/davinci_crd_test_kit/server_tests/launch_smart_app_card_validation_test.rb +38 -0
- data/lib/davinci_crd_test_kit/server_tests/propose_alternate_request_card_validation_test.rb +65 -0
- data/lib/davinci_crd_test_kit/server_tests/service_call_test.rb +86 -0
- data/lib/davinci_crd_test_kit/server_tests/service_request_context_validation_test.rb +30 -0
- data/lib/davinci_crd_test_kit/server_tests/service_request_optional_fields_validation_test.rb +41 -0
- data/lib/davinci_crd_test_kit/server_tests/service_request_required_fields_validation_test.rb +43 -0
- data/lib/davinci_crd_test_kit/server_tests/service_response_validation_test.rb +82 -0
- data/lib/davinci_crd_test_kit/suggestion_actions_validation.rb +123 -0
- data/lib/davinci_crd_test_kit/tags.rb +8 -0
- data/lib/davinci_crd_test_kit/test_helper.rb +23 -0
- data/lib/davinci_crd_test_kit/urls.rb +52 -0
- data/lib/davinci_crd_test_kit/version.rb +3 -0
- data/lib/davinci_crd_test_kit.rb +2 -0
- metadata +170 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
require_relative 'server_tests/service_call_test'
|
|
2
|
+
require_relative 'server_tests/service_response_validation_test'
|
|
3
|
+
require_relative 'server_tests/card_optional_fields_validation_test'
|
|
4
|
+
require_relative 'server_tests/external_reference_card_validation_test'
|
|
5
|
+
require_relative 'server_tests/coverage_information_system_action_received_test'
|
|
6
|
+
require_relative 'server_tests/coverage_information_system_action_validation_test'
|
|
7
|
+
require_relative 'server_tests/instructions_card_received_test'
|
|
8
|
+
require_relative 'server_tests/service_request_required_fields_validation_test'
|
|
9
|
+
require_relative 'server_tests/service_request_optional_fields_validation_test'
|
|
10
|
+
require_relative 'server_tests/service_request_context_validation_test'
|
|
11
|
+
require_relative 'server_tests/form_completion_response_validation_test'
|
|
12
|
+
require_relative 'server_tests/launch_smart_app_card_validation_test'
|
|
13
|
+
require_relative 'server_tests/create_or_update_coverage_info_response_validation_test'
|
|
14
|
+
|
|
15
|
+
module DaVinciCRDTestKit
|
|
16
|
+
class ServerAppointmentBookGroup < Inferno::TestGroup
|
|
17
|
+
title 'appointment-book'
|
|
18
|
+
id :crd_server_appointment_book
|
|
19
|
+
description %(
|
|
20
|
+
This group of tests invokes the appointment-book hook and ensures that
|
|
21
|
+
the user-provided requests are valid as per the requirements described
|
|
22
|
+
in the [CRD IG section on appointment-book hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#appointment-book)
|
|
23
|
+
and the [CDS Hooks specification section on appointment-book context](https://cds-hooks.hl7.org/hooks/appointment-book/2023SepSTU1Ballot/appointment-book/).
|
|
24
|
+
It also ensures that the contents of the server's response are valid as per the requirements described in
|
|
25
|
+
the [CRD IG section on appointment-book hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#appointment-book)
|
|
26
|
+
and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
|
|
27
|
+
|
|
28
|
+
The [CRD IG section on appointment-book hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#appointment-book)
|
|
29
|
+
states that "servers SHALL, at minimum, support returning and processing the Coverage Information
|
|
30
|
+
system action for all invocations of this hook."
|
|
31
|
+
|
|
32
|
+
This group includes tests to validate the following CRD response types:
|
|
33
|
+
- [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
|
|
34
|
+
- [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
|
|
35
|
+
- optional
|
|
36
|
+
- [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
|
|
37
|
+
- [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions) - optional
|
|
38
|
+
- [Launch SMART application](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application) -
|
|
39
|
+
optional
|
|
40
|
+
- [Request form completion](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion) -
|
|
41
|
+
optional
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
config options: { hook_name: 'appointment-book' }
|
|
45
|
+
run_as_group
|
|
46
|
+
|
|
47
|
+
test from: :crd_service_call_test,
|
|
48
|
+
config: {
|
|
49
|
+
inputs: {
|
|
50
|
+
service_ids: {
|
|
51
|
+
name: :appointment_book_service_ids,
|
|
52
|
+
title: 'Service id for the service that invokes `appointment-book` hook'
|
|
53
|
+
},
|
|
54
|
+
service_request_bodies: {
|
|
55
|
+
name: :appointment_book_request_bodies,
|
|
56
|
+
title: 'Request bodies collection to use to invoke the `appointment-book` hook'
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
test from: :crd_service_request_required_fields_validation,
|
|
62
|
+
config: {
|
|
63
|
+
outputs: {
|
|
64
|
+
contexts: {
|
|
65
|
+
name: :appointment_book_contexts
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
test from: :crd_service_request_context_validation,
|
|
70
|
+
config: {
|
|
71
|
+
inputs: {
|
|
72
|
+
contexts: {
|
|
73
|
+
name: :appointment_book_contexts
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
test from: :crd_service_request_optional_fields_validation
|
|
78
|
+
test from: :crd_service_response_validation,
|
|
79
|
+
config: {
|
|
80
|
+
outputs: {
|
|
81
|
+
valid_cards: {
|
|
82
|
+
name: :appointment_book_valid_cards
|
|
83
|
+
},
|
|
84
|
+
valid_system_actions: {
|
|
85
|
+
name: :appointment_book_valid_system_actions
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
test from: :crd_card_optional_fields_validation,
|
|
90
|
+
config: {
|
|
91
|
+
inputs: {
|
|
92
|
+
valid_cards: {
|
|
93
|
+
name: :appointment_book_valid_cards
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
outputs: {
|
|
97
|
+
valid_cards_with_links: {
|
|
98
|
+
name: :appointment_book_valid_cards_with_links
|
|
99
|
+
},
|
|
100
|
+
valid_cards_with_suggestions: {
|
|
101
|
+
name: :appointment_book_valid_cards_with_suggestions
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
test from: :crd_external_reference_card_validation,
|
|
106
|
+
config: {
|
|
107
|
+
inputs: {
|
|
108
|
+
valid_cards_with_links: {
|
|
109
|
+
name: :appointment_book_valid_cards_with_links
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
test from: :crd_launch_smart_app_card_validation,
|
|
114
|
+
config: {
|
|
115
|
+
inputs: {
|
|
116
|
+
valid_cards_with_links: {
|
|
117
|
+
name: :appointment_book_valid_cards_with_links
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
test from: :crd_valid_instructions_card_received,
|
|
122
|
+
config: {
|
|
123
|
+
inputs: {
|
|
124
|
+
valid_cards: {
|
|
125
|
+
name: :appointment_book_valid_cards
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
test from: :crd_coverage_info_system_action_received,
|
|
130
|
+
config: {
|
|
131
|
+
inputs: {
|
|
132
|
+
valid_system_actions: {
|
|
133
|
+
name: :appointment_book_valid_system_actions
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
outputs: {
|
|
137
|
+
coverage_info: {
|
|
138
|
+
name: :appointment_book_coverage_info
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
test from: :crd_coverage_info_system_action_validation,
|
|
143
|
+
config: {
|
|
144
|
+
inputs: {
|
|
145
|
+
coverage_info: {
|
|
146
|
+
name: :appointment_book_coverage_info
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
test from: :crd_request_form_completion_response_validation,
|
|
151
|
+
config: {
|
|
152
|
+
inputs: {
|
|
153
|
+
valid_system_actions: {
|
|
154
|
+
name: :appointment_book_valid_system_actions
|
|
155
|
+
},
|
|
156
|
+
valid_cards_with_suggestions: {
|
|
157
|
+
name: :appointment_book_valid_cards_with_suggestions
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
test from: :crd_create_or_update_coverage_info_response_validation,
|
|
162
|
+
config: {
|
|
163
|
+
inputs: {
|
|
164
|
+
valid_system_actions: {
|
|
165
|
+
name: :appointment_book_valid_system_actions
|
|
166
|
+
},
|
|
167
|
+
valid_cards_with_suggestions: {
|
|
168
|
+
name: :appointment_book_valid_cards_with_suggestions
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
end
|
|
173
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'tls_test_kit'
|
|
2
|
+
require_relative 'server_tests/discovery_endpoint_test'
|
|
3
|
+
require_relative 'server_tests/discovery_services_validation_test'
|
|
4
|
+
|
|
5
|
+
module DaVinciCRDTestKit
|
|
6
|
+
class ServerDiscoveryGroup < Inferno::TestGroup
|
|
7
|
+
title 'Discovery'
|
|
8
|
+
id :crd_server_discovery_group
|
|
9
|
+
description %(
|
|
10
|
+
# Background
|
|
11
|
+
|
|
12
|
+
The #{title} Group checks for a CDS Service's Discovery endpoint as described by the
|
|
13
|
+
[CDS Hooks Specification](https://cds-hooks.hl7.org/2.0/#discovery).
|
|
14
|
+
A CDS Service is discoverable via a stable endpoint by CDS Clients. The Discovery endpoint
|
|
15
|
+
includes information such as a description of the CDS Service, when it should be invoked,
|
|
16
|
+
and any data that is requested to be prefetched.
|
|
17
|
+
The Discovery endpoint SHALL always be available at `{baseUrl}/cds-services`.
|
|
18
|
+
|
|
19
|
+
# Test Methodology
|
|
20
|
+
|
|
21
|
+
This test sequence accesses the CRD server Dicovery endpoint at /cds-services using a GET request.
|
|
22
|
+
It parses the response and verifies that:
|
|
23
|
+
- The Discovery endpoint is TLS secured.
|
|
24
|
+
- The Discovery endpoint is available at `{baseURL}/cds-services`.
|
|
25
|
+
- Each CDS Service in the response contains the required fields as specified in the [CDS Hooks Spec](https://cds-hooks.hl7.org/2.0/#response).
|
|
26
|
+
|
|
27
|
+
It collects the following information that is saved in the testing session for use by later tests:
|
|
28
|
+
- List of supported CDS Services/Hooks
|
|
29
|
+
- List of service IDs for each supported Hook.
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
run_as_group
|
|
33
|
+
|
|
34
|
+
test from: :tls_version_test do
|
|
35
|
+
title 'CRD Server is secured by transport layer security'
|
|
36
|
+
description <<~DESCRIPTION
|
|
37
|
+
Under [Privacy, Security, and Safety](https://hl7.org/fhir/us/davinci-crd/STU2/security.html),
|
|
38
|
+
the CRD Implementation Guide imposes the following rule about TLS:
|
|
39
|
+
|
|
40
|
+
As per the [CDS Hook specification](https://cds-hooks.hl7.org/2.0/#security-and-safety),
|
|
41
|
+
communications between CRD Clients and CRD Servers SHALL
|
|
42
|
+
use TLS. Mutual TLS is not required by this specification but is permitted. CRD Servers and
|
|
43
|
+
CRD Clients SHOULD enforce a minimum version and other TLS configuration requirements based
|
|
44
|
+
on HRex rules for PHI exchange.
|
|
45
|
+
|
|
46
|
+
This test verifies that the CRD server is using TLS 1.2 or higher.
|
|
47
|
+
DESCRIPTION
|
|
48
|
+
id :crd_server_tls_version_stu2
|
|
49
|
+
|
|
50
|
+
config(
|
|
51
|
+
options: { minimum_allowed_version: OpenSSL::SSL::TLS1_2_VERSION },
|
|
52
|
+
inputs: { url: { name: :base_url } }
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
test from: :crd_discovery_endpoint_test
|
|
57
|
+
test from: :crd_discovery_services_validation
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
require_relative 'server_tests/service_call_test'
|
|
2
|
+
require_relative 'server_tests/service_request_required_fields_validation_test'
|
|
3
|
+
require_relative 'server_tests/service_request_context_validation_test'
|
|
4
|
+
require_relative 'server_tests/service_request_optional_fields_validation_test'
|
|
5
|
+
require_relative 'server_tests/service_response_validation_test'
|
|
6
|
+
require_relative 'server_tests/card_optional_fields_validation_test'
|
|
7
|
+
require_relative 'server_tests/external_reference_card_validation_test'
|
|
8
|
+
require_relative 'server_tests/launch_smart_app_card_validation_test'
|
|
9
|
+
require_relative 'server_tests/instructions_card_received_test'
|
|
10
|
+
require_relative 'server_tests/form_completion_response_validation_test'
|
|
11
|
+
require_relative 'server_tests/create_or_update_coverage_info_response_validation_test'
|
|
12
|
+
|
|
13
|
+
module DaVinciCRDTestKit
|
|
14
|
+
class ServerEncounterDischargeGroup < Inferno::TestGroup
|
|
15
|
+
title 'encounter-discharge'
|
|
16
|
+
id :crd_server_encounter_discharge
|
|
17
|
+
description %(
|
|
18
|
+
This group of tests invokes the encounter-discharge hook and ensures that
|
|
19
|
+
the user-provided requests are valid as per the requirements described
|
|
20
|
+
in the [CRD IG section on encounter-discharge hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-discharge)
|
|
21
|
+
and the [CDS Hooks specification section on encounter-discharge context](https://cds-hooks.hl7.org/hooks/encounter-discharge/2023SepSTU1Ballot/encounter-discharge/).
|
|
22
|
+
It also ensures that the contents of the server's response are valid as per the requirements described in
|
|
23
|
+
the [CRD IG section on encounter-discharge hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-discharge)
|
|
24
|
+
and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
|
|
25
|
+
|
|
26
|
+
This group includes tests to validate the following CRD response types:
|
|
27
|
+
- [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
|
|
28
|
+
- optional
|
|
29
|
+
- [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
|
|
30
|
+
- [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions) - optional
|
|
31
|
+
- [Launch SMART application](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application) -
|
|
32
|
+
optional
|
|
33
|
+
- [Request form completion](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion) -
|
|
34
|
+
optional
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
config options: { hook_name: 'encounter-discharge' }
|
|
38
|
+
run_as_group
|
|
39
|
+
|
|
40
|
+
test from: :crd_service_call_test,
|
|
41
|
+
config: {
|
|
42
|
+
inputs: {
|
|
43
|
+
service_ids: {
|
|
44
|
+
name: :encounter_discharge_service_ids,
|
|
45
|
+
title: 'Service id for the service that invokes `encounter-discharge` hook'
|
|
46
|
+
},
|
|
47
|
+
service_request_bodies: {
|
|
48
|
+
name: :encounter_discharge_request_bodies,
|
|
49
|
+
title: 'Request bodies collection to use to invoke the `encounter-discharge` hook'
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
test from: :crd_service_request_required_fields_validation,
|
|
54
|
+
config: {
|
|
55
|
+
outputs: {
|
|
56
|
+
contexts: {
|
|
57
|
+
name: :encounter_discharge_contexts
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
test from: :crd_service_request_context_validation,
|
|
62
|
+
config: {
|
|
63
|
+
inputs: {
|
|
64
|
+
contexts: {
|
|
65
|
+
name: :encounter_discharge_contexts
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
test from: :crd_service_request_optional_fields_validation
|
|
70
|
+
test from: :crd_service_response_validation,
|
|
71
|
+
config: {
|
|
72
|
+
outputs: {
|
|
73
|
+
valid_cards: {
|
|
74
|
+
name: :encounter_discharge_valid_cards
|
|
75
|
+
},
|
|
76
|
+
valid_system_actions: {
|
|
77
|
+
name: :encounter_discharge_valid_system_actions
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
test from: :crd_card_optional_fields_validation,
|
|
82
|
+
config: {
|
|
83
|
+
inputs: {
|
|
84
|
+
valid_cards: {
|
|
85
|
+
name: :encounter_discharge_valid_cards
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
outputs: {
|
|
89
|
+
valid_cards_with_links: {
|
|
90
|
+
name: :encounter_discharge_valid_cards_with_links
|
|
91
|
+
},
|
|
92
|
+
valid_cards_with_suggestions: {
|
|
93
|
+
name: :encounter_discharge_valid_cards_with_suggestions
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
test from: :crd_external_reference_card_validation,
|
|
98
|
+
config: {
|
|
99
|
+
inputs: {
|
|
100
|
+
valid_cards_with_links: {
|
|
101
|
+
name: :encounter_discharge_valid_cards_with_links
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
test from: :crd_launch_smart_app_card_validation,
|
|
106
|
+
config: {
|
|
107
|
+
inputs: {
|
|
108
|
+
valid_cards_with_links: {
|
|
109
|
+
name: :encounter_discharge_valid_cards_with_links
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
test from: :crd_valid_instructions_card_received,
|
|
114
|
+
config: {
|
|
115
|
+
inputs: {
|
|
116
|
+
valid_cards: {
|
|
117
|
+
name: :encounter_discharge_valid_cards
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
test from: :crd_request_form_completion_response_validation,
|
|
122
|
+
config: {
|
|
123
|
+
inputs: {
|
|
124
|
+
valid_system_actions: {
|
|
125
|
+
name: :encounter_discharge_valid_system_actions
|
|
126
|
+
},
|
|
127
|
+
valid_cards_with_suggestions: {
|
|
128
|
+
name: :encounter_discharge_valid_cards_with_suggestions
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
test from: :crd_create_or_update_coverage_info_response_validation,
|
|
133
|
+
config: {
|
|
134
|
+
inputs: {
|
|
135
|
+
valid_system_actions: {
|
|
136
|
+
name: :encounter_discharge_valid_system_actions
|
|
137
|
+
},
|
|
138
|
+
valid_cards_with_suggestions: {
|
|
139
|
+
name: :encounter_discharge_valid_cards_with_suggestions
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
require_relative 'server_tests/service_call_test'
|
|
2
|
+
require_relative 'server_tests/service_request_required_fields_validation_test'
|
|
3
|
+
require_relative 'server_tests/service_request_context_validation_test'
|
|
4
|
+
require_relative 'server_tests/service_request_optional_fields_validation_test'
|
|
5
|
+
require_relative 'server_tests/service_response_validation_test'
|
|
6
|
+
require_relative 'server_tests/card_optional_fields_validation_test'
|
|
7
|
+
require_relative 'server_tests/external_reference_card_validation_test'
|
|
8
|
+
require_relative 'server_tests/launch_smart_app_card_validation_test'
|
|
9
|
+
require_relative 'server_tests/instructions_card_received_test'
|
|
10
|
+
require_relative 'server_tests/form_completion_response_validation_test'
|
|
11
|
+
require_relative 'server_tests/create_or_update_coverage_info_response_validation_test'
|
|
12
|
+
|
|
13
|
+
module DaVinciCRDTestKit
|
|
14
|
+
class ServerEncounterStartGroup < Inferno::TestGroup
|
|
15
|
+
title 'encounter-start'
|
|
16
|
+
id :crd_server_encounter_start
|
|
17
|
+
description %(
|
|
18
|
+
This group of tests invokes the encounter-start hook and ensures that
|
|
19
|
+
the user-provided requests are valid as per the requirements described
|
|
20
|
+
in the [CRD IG section on encounter-start hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-start)
|
|
21
|
+
and the [CDS Hooks specification section on encounter-start context](https://cds-hooks.hl7.org/hooks/encounter-start/2023SepSTU1Ballot/encounter-start/).
|
|
22
|
+
It also ensures that the contents of the server's response are valid as per the requirements described in
|
|
23
|
+
the [CRD IG section on encounter-start hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-start)
|
|
24
|
+
and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
|
|
25
|
+
|
|
26
|
+
This group includes tests to validate the following CRD response types:
|
|
27
|
+
- [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
|
|
28
|
+
- optional
|
|
29
|
+
- [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
|
|
30
|
+
- [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions) - optional
|
|
31
|
+
- [Launch SMART application](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application) -
|
|
32
|
+
optional
|
|
33
|
+
- [Request form completion](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion) -
|
|
34
|
+
optional
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
config options: { hook_name: 'encounter-start' }
|
|
38
|
+
run_as_group
|
|
39
|
+
|
|
40
|
+
test from: :crd_service_call_test,
|
|
41
|
+
config: {
|
|
42
|
+
inputs: {
|
|
43
|
+
service_ids: {
|
|
44
|
+
name: :encounter_start_service_ids,
|
|
45
|
+
title: 'Service id for the service that invokes `encounter-start` hook'
|
|
46
|
+
},
|
|
47
|
+
service_request_bodies: {
|
|
48
|
+
name: :encounter_start_request_bodies,
|
|
49
|
+
title: 'Request bodies collection to use to invoke the `encounter-start` hook'
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
test from: :crd_service_request_required_fields_validation,
|
|
54
|
+
config: {
|
|
55
|
+
outputs: {
|
|
56
|
+
contexts: {
|
|
57
|
+
name: :encounter_start_contexts
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
test from: :crd_service_request_context_validation,
|
|
62
|
+
config: {
|
|
63
|
+
inputs: {
|
|
64
|
+
contexts: {
|
|
65
|
+
name: :encounter_start_contexts
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
test from: :crd_service_request_optional_fields_validation
|
|
70
|
+
test from: :crd_service_response_validation,
|
|
71
|
+
config: {
|
|
72
|
+
outputs: {
|
|
73
|
+
valid_cards: {
|
|
74
|
+
name: :encounter_start_valid_cards
|
|
75
|
+
},
|
|
76
|
+
valid_system_actions: {
|
|
77
|
+
name: :encounter_start_valid_system_actions
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
test from: :crd_card_optional_fields_validation,
|
|
82
|
+
config: {
|
|
83
|
+
inputs: {
|
|
84
|
+
valid_cards: {
|
|
85
|
+
name: :encounter_start_valid_cards
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
outputs: {
|
|
89
|
+
valid_cards_with_links: {
|
|
90
|
+
name: :encounter_start_valid_cards_with_links
|
|
91
|
+
},
|
|
92
|
+
valid_cards_with_suggestions: {
|
|
93
|
+
name: :encounter_start_valid_cards_with_suggestions
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
test from: :crd_external_reference_card_validation,
|
|
98
|
+
config: {
|
|
99
|
+
inputs: {
|
|
100
|
+
valid_cards_with_links: {
|
|
101
|
+
name: :encounter_start_valid_cards_with_links
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
test from: :crd_launch_smart_app_card_validation,
|
|
106
|
+
config: {
|
|
107
|
+
inputs: {
|
|
108
|
+
valid_cards_with_links: {
|
|
109
|
+
name: :encounter_start_valid_cards_with_links
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
test from: :crd_valid_instructions_card_received,
|
|
114
|
+
config: {
|
|
115
|
+
inputs: {
|
|
116
|
+
valid_cards: {
|
|
117
|
+
name: :encounter_start_valid_cards
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
test from: :crd_request_form_completion_response_validation,
|
|
122
|
+
config: {
|
|
123
|
+
inputs: {
|
|
124
|
+
valid_system_actions: {
|
|
125
|
+
name: :encounter_start_valid_system_actions
|
|
126
|
+
},
|
|
127
|
+
valid_cards_with_suggestions: {
|
|
128
|
+
name: :encounter_start_valid_cards_with_suggestions
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
test from: :crd_create_or_update_coverage_info_response_validation,
|
|
133
|
+
config: {
|
|
134
|
+
inputs: {
|
|
135
|
+
valid_system_actions: {
|
|
136
|
+
name: :encounter_start_valid_system_actions
|
|
137
|
+
},
|
|
138
|
+
valid_cards_with_suggestions: {
|
|
139
|
+
name: :encounter_start_valid_cards_with_suggestions
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require_relative 'hook_request_field_validation'
|
|
2
|
+
|
|
3
|
+
module DaVinciCRDTestKit
|
|
4
|
+
module ServerHookRequestValidation
|
|
5
|
+
include DaVinciCRDTestKit::HookRequestFieldValidation
|
|
6
|
+
|
|
7
|
+
def client_test?
|
|
8
|
+
false
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def server_test?
|
|
12
|
+
true
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require_relative 'server_appointment_book_group'
|
|
2
|
+
require_relative 'server_encounter_start_group'
|
|
3
|
+
require_relative 'server_encounter_discharge_group'
|
|
4
|
+
require_relative 'server_order_select_group'
|
|
5
|
+
require_relative 'server_order_dispatch_group'
|
|
6
|
+
require_relative 'server_order_sign_group'
|
|
7
|
+
require_relative 'server_required_card_response_validation_group'
|
|
8
|
+
|
|
9
|
+
module DaVinciCRDTestKit
|
|
10
|
+
class ServerHooksGroup < Inferno::TestGroup
|
|
11
|
+
title 'Hook Tests'
|
|
12
|
+
id :crd_server_hooks
|
|
13
|
+
description %(
|
|
14
|
+
# Background
|
|
15
|
+
|
|
16
|
+
The #{title} Group verifies that a [CRD Server](https://hl7.org/fhir/us/davinci-crd/STU2/CapabilityStatement-crd-server.html)
|
|
17
|
+
supports at least one of the hooks supported by the [CRD IG](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#supported-hooks).
|
|
18
|
+
The supported hooks include:
|
|
19
|
+
- [appointment-book](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#appointment-book)
|
|
20
|
+
- [encounter-start](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-start)
|
|
21
|
+
- [encounter-discharge](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#encounter-discharge)
|
|
22
|
+
- [order-select](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-select)
|
|
23
|
+
- [order-dispatch](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-dispatch)
|
|
24
|
+
- [order-sign](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
|
|
25
|
+
|
|
26
|
+
The [CRD STU2 IG section on Supported Hooks](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#supported-hooks)
|
|
27
|
+
states that "CRD Servers conforming to this implementation guide
|
|
28
|
+
SHALL provide a service for all hooks and order resource types required of
|
|
29
|
+
CRD clients by this implementation guide unless the server has determined that
|
|
30
|
+
the hook will not be reasonably useful in determining coverage or documentation
|
|
31
|
+
expectations for the types of coverage provided."
|
|
32
|
+
|
|
33
|
+
# Test Methodology
|
|
34
|
+
|
|
35
|
+
In these tests, Inferno acts as a [CRD Client](https://hl7.org/fhir/us/davinci-crd/STU2/CapabilityStatement-crd-client.html)
|
|
36
|
+
that initiates CDS Hooks calls. This test sequence is broken up into groups,
|
|
37
|
+
each group corresponding to a supported hook and defining a set of tests verifying
|
|
38
|
+
the ability of the server to respond to the given hook invocation. Additionally, an additional
|
|
39
|
+
group checks the required [response types](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#potential-crd-response-types)
|
|
40
|
+
across all hooks invoked.
|
|
41
|
+
|
|
42
|
+
Each hook group test verifies that:
|
|
43
|
+
- The hook can be invoked.
|
|
44
|
+
- The user-provided request payload contains the required fields as specified
|
|
45
|
+
in the [CDS Hooks section on HTTP request requirements](https://cds-hooks.hl7.org/2.0/#http-request_1).
|
|
46
|
+
- The user-provided request payload contains the optional fields as specified
|
|
47
|
+
in the [CDS Hooks section on HTTP request requirements](https://cds-hooks.hl7.org/2.0/#http-request_1) -
|
|
48
|
+
optional.
|
|
49
|
+
- Each card and system action returned by the server is valid as described in the
|
|
50
|
+
[CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
|
|
51
|
+
- Each [CRD response type](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#potential-crd-response-types)
|
|
52
|
+
returned is valid - optional for some response types. See the individual test groups for more details.
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
group from: :crd_server_appointment_book,
|
|
56
|
+
optional: true
|
|
57
|
+
group from: :crd_server_encounter_start,
|
|
58
|
+
optional: true
|
|
59
|
+
group from: :crd_server_encounter_discharge,
|
|
60
|
+
optional: true
|
|
61
|
+
group from: :crd_server_order_select,
|
|
62
|
+
optional: true
|
|
63
|
+
group from: :crd_server_order_dispatch,
|
|
64
|
+
optional: true
|
|
65
|
+
group from: :crd_server_order_sign,
|
|
66
|
+
optional: true
|
|
67
|
+
group from: :crd_server_required_card_response_validation
|
|
68
|
+
end
|
|
69
|
+
end
|