davinci_crd_test_kit 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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_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/coverage_information_system_action_received_test'
|
11
|
+
require_relative 'server_tests/coverage_information_system_action_validation_test'
|
12
|
+
require_relative 'server_tests/form_completion_response_validation_test'
|
13
|
+
require_relative 'server_tests/create_or_update_coverage_info_response_validation_test'
|
14
|
+
|
15
|
+
module DaVinciCRDTestKit
|
16
|
+
class ServerOrderDispatchGroup < Inferno::TestGroup
|
17
|
+
title 'order-dispatch'
|
18
|
+
id :crd_server_order_dispatch
|
19
|
+
description %(
|
20
|
+
This group of tests invokes the order-dispatch hook and ensures that
|
21
|
+
the user-provided requests are valid as per the requirements described
|
22
|
+
in the [CRD IG section on order-dispatch hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-dispatch)
|
23
|
+
and the [CDS Hooks specification section on order-dispatch context](https://cds-hooks.hl7.org/hooks/order-dispatch/2023SepSTU1Ballot/order-dispatch/).
|
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 order-dispatch hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-dispatch)
|
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 order-dispatch hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-dispatch)
|
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: 'order-dispatch' }
|
45
|
+
run_as_group
|
46
|
+
|
47
|
+
test from: :crd_service_call_test,
|
48
|
+
config: {
|
49
|
+
inputs: {
|
50
|
+
service_ids: {
|
51
|
+
name: :order_dispatch_service_ids,
|
52
|
+
title: 'Service id for the service that invokes `order-dispatch` hook'
|
53
|
+
},
|
54
|
+
service_request_bodies: {
|
55
|
+
name: :order_dispatch_request_bodies,
|
56
|
+
title: 'Request bodies collection to use to invoke the `order-dispatch` hook'
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
test from: :crd_service_request_required_fields_validation,
|
62
|
+
config: {
|
63
|
+
outputs: {
|
64
|
+
contexts: {
|
65
|
+
name: :order_dispatch_contexts
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
test from: :crd_service_request_context_validation,
|
70
|
+
config: {
|
71
|
+
inputs: {
|
72
|
+
contexts: {
|
73
|
+
name: :order_dispatch_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: :order_dispatch_valid_cards
|
83
|
+
},
|
84
|
+
valid_system_actions: {
|
85
|
+
name: :order_dispatch_valid_system_actions
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
test from: :crd_card_optional_fields_validation,
|
90
|
+
config: {
|
91
|
+
inputs: {
|
92
|
+
valid_cards: {
|
93
|
+
name: :order_dispatch_valid_cards
|
94
|
+
}
|
95
|
+
},
|
96
|
+
outputs: {
|
97
|
+
valid_cards_with_links: {
|
98
|
+
name: :order_dispatch_valid_cards_with_links
|
99
|
+
},
|
100
|
+
valid_cards_with_suggestions: {
|
101
|
+
name: :order_dispatch_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: :order_dispatch_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: :order_dispatch_valid_cards_with_links
|
118
|
+
}
|
119
|
+
}
|
120
|
+
}
|
121
|
+
test from: :crd_valid_instructions_card_received,
|
122
|
+
config: {
|
123
|
+
inputs: {
|
124
|
+
valid_cards: {
|
125
|
+
name: :order_dispatch_valid_cards
|
126
|
+
}
|
127
|
+
}
|
128
|
+
}
|
129
|
+
test from: :crd_coverage_info_system_action_received,
|
130
|
+
config: {
|
131
|
+
inputs: {
|
132
|
+
valid_system_actions: {
|
133
|
+
name: :order_dispatch_valid_system_actions
|
134
|
+
}
|
135
|
+
},
|
136
|
+
outputs: {
|
137
|
+
coverage_info: {
|
138
|
+
name: :order_dispatch_coverage_info
|
139
|
+
}
|
140
|
+
}
|
141
|
+
}
|
142
|
+
test from: :crd_coverage_info_system_action_validation,
|
143
|
+
config: {
|
144
|
+
inputs: {
|
145
|
+
coverage_info: {
|
146
|
+
name: :order_dispatch_coverage_info
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
test from: :crd_request_form_completion_response_validation,
|
151
|
+
config: {
|
152
|
+
inputs: {
|
153
|
+
valid_system_actions: {
|
154
|
+
name: :order_dispatch_valid_system_actions
|
155
|
+
},
|
156
|
+
valid_cards_with_suggestions: {
|
157
|
+
name: :order_dispatch_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: :order_dispatch_valid_system_actions
|
166
|
+
},
|
167
|
+
valid_cards_with_suggestions: {
|
168
|
+
name: :order_dispatch_valid_cards_with_suggestions
|
169
|
+
}
|
170
|
+
}
|
171
|
+
}
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,169 @@
|
|
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/propose_alternate_request_card_validation_test'
|
11
|
+
require_relative 'server_tests/additional_orders_validation_test'
|
12
|
+
require_relative 'server_tests/form_completion_response_validation_test'
|
13
|
+
require_relative 'server_tests/create_or_update_coverage_info_response_validation_test'
|
14
|
+
|
15
|
+
module DaVinciCRDTestKit
|
16
|
+
class ServerOrderSelectGroup < Inferno::TestGroup
|
17
|
+
title 'order-select'
|
18
|
+
id :crd_server_order_select
|
19
|
+
description %(
|
20
|
+
This group of tests invokes the order-select hook and ensures that
|
21
|
+
the user-provided requests are valid as per the requirements described
|
22
|
+
in the [CRD IG section on order-select hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-select)
|
23
|
+
and the [CDS Hooks specification section on order-select context](https://cds-hooks.hl7.org/hooks/order-select/2023SepSTU1Ballot/order-select/).
|
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 order-select hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-select)
|
26
|
+
and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
|
27
|
+
|
28
|
+
This group includes tests to validate the following CRD response types:
|
29
|
+
- [additional orders as companions/prerequisites](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#identify-additional-orders-as-companionsprerequisites-for-current-order)\
|
30
|
+
- optional
|
31
|
+
- [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
|
32
|
+
- optional
|
33
|
+
- [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
|
34
|
+
- [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions) - optional
|
35
|
+
- [Launch SMART application](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application) -
|
36
|
+
optional
|
37
|
+
- [Propose alternate request](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#propose-alternate-request) -
|
38
|
+
optional
|
39
|
+
- [Request form completion](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion) -
|
40
|
+
optional
|
41
|
+
)
|
42
|
+
|
43
|
+
config options: { hook_name: 'order-select' }
|
44
|
+
run_as_group
|
45
|
+
|
46
|
+
test from: :crd_service_call_test,
|
47
|
+
config: {
|
48
|
+
inputs: {
|
49
|
+
service_ids: {
|
50
|
+
name: :order_select_service_ids,
|
51
|
+
title: 'Service id for the service that invokes `order-select` hook'
|
52
|
+
},
|
53
|
+
service_request_bodies: {
|
54
|
+
name: :order_select_request_bodies,
|
55
|
+
title: 'Request bodies collection to use to invoke the `order-select` hook'
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
test from: :crd_service_request_required_fields_validation,
|
60
|
+
config: {
|
61
|
+
outputs: {
|
62
|
+
contexts: {
|
63
|
+
name: :order_select_contexts
|
64
|
+
}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
test from: :crd_service_request_context_validation,
|
68
|
+
config: {
|
69
|
+
inputs: {
|
70
|
+
contexts: {
|
71
|
+
name: :order_select_contexts
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
test from: :crd_service_request_optional_fields_validation
|
76
|
+
test from: :crd_service_response_validation,
|
77
|
+
config: {
|
78
|
+
outputs: {
|
79
|
+
valid_cards: {
|
80
|
+
name: :order_select_valid_cards
|
81
|
+
},
|
82
|
+
valid_system_actions: {
|
83
|
+
name: :order_select_valid_system_actions
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
test from: :crd_card_optional_fields_validation,
|
88
|
+
config: {
|
89
|
+
inputs: {
|
90
|
+
valid_cards: {
|
91
|
+
name: :order_select_valid_cards
|
92
|
+
}
|
93
|
+
},
|
94
|
+
outputs: {
|
95
|
+
valid_cards_with_links: {
|
96
|
+
name: :order_select_valid_cards_with_links
|
97
|
+
},
|
98
|
+
valid_cards_with_suggestions: {
|
99
|
+
name: :order_select_valid_cards_with_suggestions
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
test from: :crd_external_reference_card_validation,
|
104
|
+
config: {
|
105
|
+
inputs: {
|
106
|
+
valid_cards_with_links: {
|
107
|
+
name: :order_select_valid_cards_with_links
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
test from: :crd_launch_smart_app_card_validation,
|
112
|
+
config: {
|
113
|
+
inputs: {
|
114
|
+
valid_cards_with_links: {
|
115
|
+
name: :order_select_valid_cards_with_links
|
116
|
+
}
|
117
|
+
}
|
118
|
+
}
|
119
|
+
test from: :crd_valid_instructions_card_received,
|
120
|
+
config: {
|
121
|
+
inputs: {
|
122
|
+
valid_cards: {
|
123
|
+
name: :order_select_valid_cards
|
124
|
+
}
|
125
|
+
}
|
126
|
+
}
|
127
|
+
test from: :crd_propose_alternate_request_card_validation,
|
128
|
+
config: {
|
129
|
+
inputs: {
|
130
|
+
valid_cards_with_suggestions: {
|
131
|
+
name: :order_select_valid_cards_with_suggestions
|
132
|
+
},
|
133
|
+
contexts: {
|
134
|
+
name: :order_select_contexts
|
135
|
+
}
|
136
|
+
}
|
137
|
+
}
|
138
|
+
test from: :crd_additional_orders_card_validation,
|
139
|
+
config: {
|
140
|
+
inputs: {
|
141
|
+
valid_cards_with_suggestions: {
|
142
|
+
name: :order_select_valid_cards_with_suggestions
|
143
|
+
}
|
144
|
+
}
|
145
|
+
}
|
146
|
+
test from: :crd_request_form_completion_response_validation,
|
147
|
+
config: {
|
148
|
+
inputs: {
|
149
|
+
valid_system_actions: {
|
150
|
+
name: :order_select_valid_system_actions
|
151
|
+
},
|
152
|
+
valid_cards_with_suggestions: {
|
153
|
+
name: :order_select_valid_cards_with_suggestions
|
154
|
+
}
|
155
|
+
}
|
156
|
+
}
|
157
|
+
test from: :crd_create_or_update_coverage_info_response_validation,
|
158
|
+
config: {
|
159
|
+
inputs: {
|
160
|
+
valid_system_actions: {
|
161
|
+
name: :order_select_valid_system_actions
|
162
|
+
},
|
163
|
+
valid_cards_with_suggestions: {
|
164
|
+
name: :order_select_valid_cards_with_suggestions
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,198 @@
|
|
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/coverage_information_system_action_received_test'
|
11
|
+
require_relative 'server_tests/coverage_information_system_action_validation_test'
|
12
|
+
require_relative 'server_tests/propose_alternate_request_card_validation_test'
|
13
|
+
require_relative 'server_tests/additional_orders_validation_test'
|
14
|
+
require_relative 'server_tests/form_completion_response_validation_test'
|
15
|
+
require_relative 'server_tests/create_or_update_coverage_info_response_validation_test'
|
16
|
+
|
17
|
+
module DaVinciCRDTestKit
|
18
|
+
class ServerOrderSignGroup < Inferno::TestGroup
|
19
|
+
title 'order-sign'
|
20
|
+
id :crd_server_order_sign
|
21
|
+
description %(
|
22
|
+
This group of tests invokes the order-sign hook and ensures that
|
23
|
+
the user-provided requests are valid as per the requirements described
|
24
|
+
in the [CRD IG section on order-sign hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
|
25
|
+
and the [CDS Hooks specification section on order-sign context](https://cds-hooks.hl7.org/hooks/order-sign/2023SepSTU1Ballot/order-sign/).
|
26
|
+
It also ensures that the contents of the server's response are valid as per the requirements described in
|
27
|
+
the [CRD IG section on order-sign hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
|
28
|
+
and the [CDS Hooks section on CDS Service Response](https://cds-hooks.hl7.org/2.0/#cds-service-response).
|
29
|
+
|
30
|
+
The [CRD IG section on order-sign hook](https://hl7.org/fhir/us/davinci-crd/STU2/hooks.html#order-sign)
|
31
|
+
states that "servers SHALL, at minimum, support returning and processing the Coverage Information
|
32
|
+
system action for all invocations of this hook."
|
33
|
+
|
34
|
+
This group includes tests to validate the following CRD response types:
|
35
|
+
- [additional orders as companions/prerequisites](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#identify-additional-orders-as-companionsprerequisites-for-current-order)\
|
36
|
+
- optional
|
37
|
+
- [Coverage Information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#coverage-information)
|
38
|
+
- [Create or update coverage information](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#create-or-update-coverage-information)\
|
39
|
+
- optional
|
40
|
+
- [External Reference](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#external-reference) - optional
|
41
|
+
- [Instructions](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#instructions) - optional
|
42
|
+
- [Launch SMART application](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#launch-smart-application) -
|
43
|
+
optional
|
44
|
+
- [Propose alternate request](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#propose-alternate-request) -
|
45
|
+
optional
|
46
|
+
- [Request form completion](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#request-form-completion) -
|
47
|
+
optional
|
48
|
+
)
|
49
|
+
|
50
|
+
config options: { hook_name: 'order-sign' }
|
51
|
+
run_as_group
|
52
|
+
|
53
|
+
test from: :crd_service_call_test,
|
54
|
+
config: {
|
55
|
+
inputs: {
|
56
|
+
service_ids: {
|
57
|
+
name: :order_sign_service_ids,
|
58
|
+
title: 'Service id for the service that invokes `order-sign` hook'
|
59
|
+
},
|
60
|
+
service_request_bodies: {
|
61
|
+
name: :order_sign_request_bodies,
|
62
|
+
title: 'Request bodies collection to use to invoke the `order-sign` hook'
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
test from: :crd_service_request_required_fields_validation,
|
68
|
+
config: {
|
69
|
+
outputs: {
|
70
|
+
contexts: {
|
71
|
+
name: :order_sign_contexts
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
test from: :crd_service_request_context_validation,
|
76
|
+
config: {
|
77
|
+
inputs: {
|
78
|
+
contexts: {
|
79
|
+
name: :order_sign_contexts
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
test from: :crd_service_request_optional_fields_validation
|
84
|
+
test from: :crd_service_response_validation,
|
85
|
+
config: {
|
86
|
+
outputs: {
|
87
|
+
valid_cards: {
|
88
|
+
name: :order_sign_valid_cards
|
89
|
+
},
|
90
|
+
valid_system_actions: {
|
91
|
+
name: :order_sign_valid_system_actions
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
test from: :crd_card_optional_fields_validation,
|
96
|
+
config: {
|
97
|
+
inputs: {
|
98
|
+
valid_cards: {
|
99
|
+
name: :order_sign_valid_cards
|
100
|
+
}
|
101
|
+
},
|
102
|
+
outputs: {
|
103
|
+
valid_cards_with_links: {
|
104
|
+
name: :order_sign_valid_cards_with_links
|
105
|
+
},
|
106
|
+
valid_cards_with_suggestions: {
|
107
|
+
name: :order_sign_valid_cards_with_suggestions
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
test from: :crd_external_reference_card_validation,
|
112
|
+
config: {
|
113
|
+
inputs: {
|
114
|
+
valid_cards_with_links: {
|
115
|
+
name: :order_sign_valid_cards_with_links
|
116
|
+
}
|
117
|
+
}
|
118
|
+
}
|
119
|
+
test from: :crd_launch_smart_app_card_validation,
|
120
|
+
config: {
|
121
|
+
inputs: {
|
122
|
+
valid_cards_with_links: {
|
123
|
+
name: :order_sign_valid_cards_with_links
|
124
|
+
}
|
125
|
+
}
|
126
|
+
}
|
127
|
+
test from: :crd_valid_instructions_card_received,
|
128
|
+
config: {
|
129
|
+
inputs: {
|
130
|
+
valid_cards: {
|
131
|
+
name: :order_sign_valid_cards
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
test from: :crd_coverage_info_system_action_received,
|
136
|
+
config: {
|
137
|
+
inputs: {
|
138
|
+
valid_system_actions: {
|
139
|
+
name: :order_sign_valid_system_actions
|
140
|
+
}
|
141
|
+
},
|
142
|
+
outputs: {
|
143
|
+
coverage_info: {
|
144
|
+
name: :order_sign_coverage_info
|
145
|
+
}
|
146
|
+
}
|
147
|
+
}
|
148
|
+
test from: :crd_coverage_info_system_action_validation,
|
149
|
+
config: {
|
150
|
+
inputs: {
|
151
|
+
coverage_info: {
|
152
|
+
name: :order_sign_coverage_info
|
153
|
+
}
|
154
|
+
}
|
155
|
+
}
|
156
|
+
test from: :crd_propose_alternate_request_card_validation,
|
157
|
+
config: {
|
158
|
+
inputs: {
|
159
|
+
valid_cards_with_suggestions: {
|
160
|
+
name: :order_sign_valid_cards_with_suggestions
|
161
|
+
},
|
162
|
+
contexts: {
|
163
|
+
name: :order_sign_contexts
|
164
|
+
}
|
165
|
+
}
|
166
|
+
}
|
167
|
+
test from: :crd_additional_orders_card_validation,
|
168
|
+
config: {
|
169
|
+
inputs: {
|
170
|
+
valid_cards_with_suggestions: {
|
171
|
+
name: :order_sign_valid_cards_with_suggestions
|
172
|
+
}
|
173
|
+
}
|
174
|
+
}
|
175
|
+
test from: :crd_request_form_completion_response_validation,
|
176
|
+
config: {
|
177
|
+
inputs: {
|
178
|
+
valid_system_actions: {
|
179
|
+
name: :order_sign_valid_system_actions
|
180
|
+
},
|
181
|
+
valid_cards_with_suggestions: {
|
182
|
+
name: :order_sign_valid_cards_with_suggestions
|
183
|
+
}
|
184
|
+
}
|
185
|
+
}
|
186
|
+
test from: :crd_create_or_update_coverage_info_response_validation,
|
187
|
+
config: {
|
188
|
+
inputs: {
|
189
|
+
valid_system_actions: {
|
190
|
+
name: :order_sign_valid_system_actions
|
191
|
+
},
|
192
|
+
valid_cards_with_suggestions: {
|
193
|
+
name: :order_sign_valid_cards_with_suggestions
|
194
|
+
}
|
195
|
+
}
|
196
|
+
}
|
197
|
+
end
|
198
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'server_tests/external_reference_card_across_hooks_validation_test'
|
2
|
+
require_relative 'server_tests/instructions_card_received_across_hooks_test'
|
3
|
+
require_relative 'server_tests/coverage_information_system_action_across_hooks_validation_test'
|
4
|
+
|
5
|
+
module DaVinciCRDTestKit
|
6
|
+
class ServerRequiredCardResponseValidationGroup < Inferno::TestGroup
|
7
|
+
title 'Required Card Response Validation'
|
8
|
+
description %(
|
9
|
+
This group contains tests to verify the presence and validity of required response types
|
10
|
+
across all hooks invoked. As per the [Da Vinci CRD Implementation Guide](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#potential-crd-response-types),
|
11
|
+
CRD Servers SHALL, at minimum, demonstrate an ability to return the following response types:
|
12
|
+
- Coverage Information System Action
|
13
|
+
- External Reference Card
|
14
|
+
- Instructions Card
|
15
|
+
)
|
16
|
+
id :crd_server_required_card_response_validation
|
17
|
+
run_as_group
|
18
|
+
|
19
|
+
test from: :crd_external_reference_card_across_hooks_validation
|
20
|
+
test from: :crd_valid_instructions_card_received_across_hooks
|
21
|
+
test from: :crd_coverage_info_system_action_across_hooks_validation
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require_relative '../suggestion_actions_validation'
|
3
|
+
|
4
|
+
module DaVinciCRDTestKit
|
5
|
+
class AdditionalOrdersValidationTest < Inferno::Test
|
6
|
+
include DaVinciCRDTestKit::TestHelper
|
7
|
+
include DaVinciCRDTestKit::SuggestionActionsValidation
|
8
|
+
|
9
|
+
title 'Valid Additional Orders as companions/prerequisites cards received'
|
10
|
+
id :crd_additional_orders_card_validation
|
11
|
+
description %(
|
12
|
+
This test validates that an [Additional Orders as companions/prerequisites](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#identify-additional-orders-as-companionsprerequisites-for-current-order)
|
13
|
+
card was received. It does so by:
|
14
|
+
- Filtering cards with the following criteria:
|
15
|
+
- For each suggestion in the card's suggestions array, all actions have a type of 'create'
|
16
|
+
and the action's resource type is one of the expected types: CommunicationRequest, Device,
|
17
|
+
DeviceRequest, Medication, MedicationRequest, NutritionOrder, ServiceRequest, or VisionPrescription.
|
18
|
+
- Then, for each valid Additional Orders card retrieved, verifying that each action within the
|
19
|
+
card's suggestions complies with their respective profiles as specified in the
|
20
|
+
[CRD IG section on Additional Orders as companions/prerequisites](https://hl7.org/fhir/us/davinci-crd/STU2/cards.html#identify-additional-orders-as-companionsprerequisites-for-current-order):
|
21
|
+
- [crd-profile-communicationrequest](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-communicationrequest.html)
|
22
|
+
- [crd-profile-device](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-device.html)
|
23
|
+
- [crd-profile-deviceRequest](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-devicerequest.html)
|
24
|
+
- [us-core-medication](http://hl7.org/fhir/us/core/STU3.1.1/StructureDefinition-us-core-medication.html)
|
25
|
+
- [crd-profile-medicationRequest](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-medicationrequest.html)
|
26
|
+
- [crd-profile-nutritionOrder](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-nutritionorder.html)
|
27
|
+
- [crd-profile-serviceRequest](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-servicerequest.html)
|
28
|
+
- [crd-profile-visionPrescription](https://hl7.org/fhir/us/davinci-crd/STU2/StructureDefinition-profile-visionprescription.html).
|
29
|
+
|
30
|
+
The test will skip if no Additional Orders cards are found.
|
31
|
+
)
|
32
|
+
|
33
|
+
optional
|
34
|
+
input :valid_cards_with_suggestions
|
35
|
+
|
36
|
+
EXPECTED_RESOURCE_TYPES = %w[
|
37
|
+
CommunicationRequest Device DeviceRequest Medication
|
38
|
+
MedicationRequest NutritionOrder ServiceRequest
|
39
|
+
VisionPrescription
|
40
|
+
].freeze
|
41
|
+
|
42
|
+
def hook_name
|
43
|
+
config.options[:hook_name]
|
44
|
+
end
|
45
|
+
|
46
|
+
def additional_orders_card?(card)
|
47
|
+
card['suggestions'].all? do |suggestion|
|
48
|
+
actions = suggestion['actions']
|
49
|
+
actions&.all? do |action|
|
50
|
+
action['type'] == 'create' && action_resource_type_check(action, EXPECTED_RESOURCE_TYPES)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
run do
|
56
|
+
parsed_cards = parse_json(valid_cards_with_suggestions)
|
57
|
+
additional_orders_cards = parsed_cards.filter { |card| additional_orders_card?(card) }
|
58
|
+
skip_if additional_orders_cards.blank?,
|
59
|
+
"#{hook_name} hook response does not contain an Additional Orders as companions/prerequisites card."
|
60
|
+
|
61
|
+
additional_orders_cards.each do |card|
|
62
|
+
card['suggestions'].each do |suggestion|
|
63
|
+
actions_check(suggestion['actions'])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
no_error_validation('Some Additional Orders as companions/prerequisites cards are not valid.')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require_relative '../cards_validation'
|
3
|
+
|
4
|
+
module DaVinciCRDTestKit
|
5
|
+
class CardOptionalFieldsValidationTest < Inferno::Test
|
6
|
+
include DaVinciCRDTestKit::TestHelper
|
7
|
+
include DaVinciCRDTestKit::CardsValidation
|
8
|
+
|
9
|
+
title 'Cards contain valid optional fields'
|
10
|
+
id :crd_card_optional_fields_validation
|
11
|
+
description %(
|
12
|
+
This test checks for the presence and validity of optional fields in a card,
|
13
|
+
but only if the card's required fields are valid. As specified in the
|
14
|
+
[CDS Hooks specification section on Card Attributes](https://cds-hooks.hl7.org/2.0/#card-attributes),
|
15
|
+
the optional fields include `uuid`, `detail`, `suggestions`, `overrideReasons`, and `links`.
|
16
|
+
|
17
|
+
Additionally, the test validates the presence of the conditional field `selectionBehavior`
|
18
|
+
only if the `suggestions` field is present.
|
19
|
+
)
|
20
|
+
optional
|
21
|
+
input :valid_cards
|
22
|
+
output :valid_cards_with_links, :valid_cards_with_suggestions
|
23
|
+
|
24
|
+
def cards_with_suggestions
|
25
|
+
@cards_with_suggestions ||= []
|
26
|
+
end
|
27
|
+
|
28
|
+
def cards_with_links
|
29
|
+
@cards_with_links ||= []
|
30
|
+
end
|
31
|
+
|
32
|
+
run do
|
33
|
+
parsed_cards = parse_json(valid_cards)
|
34
|
+
parsed_cards.each do |card|
|
35
|
+
if valid_card_with_optionals?(card)
|
36
|
+
cards_with_links << card if card['links']
|
37
|
+
cards_with_suggestions << card if card['suggestions']
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
output valid_cards_with_links: cards_with_links.to_json
|
42
|
+
output valid_cards_with_suggestions: cards_with_suggestions.to_json
|
43
|
+
|
44
|
+
no_error_validation('Some cards with valid required fields have invalid optional fields.')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|