onc_certification_g10_test_kit 7.2.3 → 7.2.4
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/config/presets/g10_reference_server_preset.json +2 -2
- data/lib/onc_certification_g10_test_kit/bulk_data_group_export_validation.rb +2 -0
- data/lib/onc_certification_g10_test_kit/configuration_checker.rb +1 -1
- data/lib/onc_certification_g10_test_kit/g10_certification_suite.rb +614 -0
- data/lib/onc_certification_g10_test_kit/requirements/(g)(10)-test-procedure_requirements.xlsx +0 -0
- data/lib/onc_certification_g10_test_kit/requirements/generated/g10_certification_requirements_coverage.csv +468 -0
- data/lib/onc_certification_g10_test_kit/requirements/onc_certification_g10_test_kit_requirements.csv +468 -0
- data/lib/onc_certification_g10_test_kit/smart_fine_grained_scopes_group.rb +5 -0
- data/lib/onc_certification_g10_test_kit/smart_fine_grained_scopes_group_stu2_2.rb +5 -0
- data/lib/onc_certification_g10_test_kit/smart_fine_grained_scopes_us_core_7_group.rb +5 -0
- data/lib/onc_certification_g10_test_kit/smart_fine_grained_scopes_us_core_7_group_stu2_2.rb +5 -0
- data/lib/onc_certification_g10_test_kit/test_procedure_requirements_manager.rb +83 -0
- data/lib/onc_certification_g10_test_kit/version.rb +2 -2
- data/lib/onc_certification_g10_test_kit.rb +1 -554
- metadata +14 -10
- data/lib/onc_certification_g10_test_kit/short_id_manager.rb +0 -48
- /data/lib/onc_certification_g10_test_kit/{short_id_map.yml → g10_certification_suite_short_id_map.yml} +0 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
require_relative 'tasks/test_procedure'
|
2
|
+
|
3
|
+
module ONCCertificationG10TestKit
|
4
|
+
# @private
|
5
|
+
# This module ensures that short test ids don't change
|
6
|
+
module TestProcedureRequirementsManager
|
7
|
+
class << self
|
8
|
+
def all_children(runnable)
|
9
|
+
runnable
|
10
|
+
.children
|
11
|
+
.flat_map { |child| [child] + all_children(child) }
|
12
|
+
end
|
13
|
+
|
14
|
+
def short_id_file_path
|
15
|
+
File.join(__dir__, 'g10_certification_suite_short_id_map.yml')
|
16
|
+
end
|
17
|
+
|
18
|
+
def short_id_map
|
19
|
+
@short_id_map ||= YAML.load_file(short_id_file_path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def assign_test_procedure_requirements
|
23
|
+
all_children(G10CertificationSuite).each do |runnable|
|
24
|
+
short_id = get_short_id(runnable)
|
25
|
+
test_procedure_requirements = current_procedure_requirements_map[short_id]
|
26
|
+
if test_procedure_requirements.present?
|
27
|
+
current_requirements = runnable.verifies_requirements
|
28
|
+
new_requirements = test_procedure_requirements.map do |req|
|
29
|
+
"170.315(g)(10)-test-procedure@#{req}"
|
30
|
+
end
|
31
|
+
updated_requirements = current_requirements + new_requirements
|
32
|
+
runnable.verifies_requirements(*updated_requirements)
|
33
|
+
end
|
34
|
+
rescue KeyError
|
35
|
+
Inferno::Application['logger'].warn(
|
36
|
+
"No test procedure map defined for id #{short_id} (from runnable #{runnable.id})"
|
37
|
+
)
|
38
|
+
end
|
39
|
+
rescue Errno::ENOENT
|
40
|
+
Inferno::Application['logger'].warn('No short id map found')
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_short_id(runnable)
|
44
|
+
short_id_map.fetch(runnable.id)
|
45
|
+
rescue KeyError
|
46
|
+
Inferno::Application['logger'].warn("No short id defined for #{runnable.id}")
|
47
|
+
end
|
48
|
+
|
49
|
+
def current_procedure_requirements_map
|
50
|
+
@current_procedure_requirements_map ||=
|
51
|
+
all_children(G10CertificationSuite).each_with_object({}) do |runnable, hash|
|
52
|
+
short_id = get_short_id(runnable)
|
53
|
+
test_procedure_requirement_list = requirements_for_short_id(short_id)
|
54
|
+
next unless test_procedure_requirement_list.present?
|
55
|
+
|
56
|
+
hash[short_id] = test_procedure_requirement_list
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def requirements_for_short_id(short_id)
|
61
|
+
test_procedure_definition.sections.each_with_object([]) do |section, requirement_list|
|
62
|
+
section.steps.each do |step|
|
63
|
+
next unless step.inferno_tests.include?(short_id)
|
64
|
+
|
65
|
+
requirement_list << step.id
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_procedure_definition
|
71
|
+
@test_procedure_definition ||=
|
72
|
+
Tasks::TestProcedure.new(
|
73
|
+
YAML.load_file(
|
74
|
+
File.join(
|
75
|
+
__dir__,
|
76
|
+
'onc_program_procedure.yml'
|
77
|
+
)
|
78
|
+
).deep_symbolize_keys
|
79
|
+
)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -3,557 +3,4 @@ require 'smart_app_launch/smart_stu2_suite'
|
|
3
3
|
require 'smart_app_launch/smart_stu2_2_suite'
|
4
4
|
require 'us_core_test_kit'
|
5
5
|
|
6
|
-
require_relative 'onc_certification_g10_test_kit/
|
7
|
-
require_relative 'onc_certification_g10_test_kit/configuration_checker'
|
8
|
-
require_relative 'onc_certification_g10_test_kit/urls'
|
9
|
-
|
10
|
-
require_relative 'onc_certification_g10_test_kit/feature'
|
11
|
-
require_relative 'onc_certification_g10_test_kit/g10_options'
|
12
|
-
require_relative 'onc_certification_g10_test_kit/multi_patient_api_stu1'
|
13
|
-
require_relative 'onc_certification_g10_test_kit/multi_patient_api_stu2'
|
14
|
-
require_relative 'onc_certification_g10_test_kit/single_patient_api_group'
|
15
|
-
require_relative 'onc_certification_g10_test_kit/single_patient_us_core_4_api_group'
|
16
|
-
require_relative 'onc_certification_g10_test_kit/single_patient_us_core_5_api_group'
|
17
|
-
require_relative 'onc_certification_g10_test_kit/single_patient_us_core_6_api_group'
|
18
|
-
require_relative 'onc_certification_g10_test_kit/single_patient_us_core_7_api_group'
|
19
|
-
require_relative 'onc_certification_g10_test_kit/smart_app_launch_invalid_aud_group'
|
20
|
-
require_relative 'onc_certification_g10_test_kit/smart_asymmetric_launch_group'
|
21
|
-
require_relative 'onc_certification_g10_test_kit/smart_granular_scope_selection_group'
|
22
|
-
require_relative 'onc_certification_g10_test_kit/smart_invalid_token_group'
|
23
|
-
require_relative 'onc_certification_g10_test_kit/smart_invalid_token_group_stu2'
|
24
|
-
require_relative 'onc_certification_g10_test_kit/smart_invalid_pkce_group'
|
25
|
-
require_relative 'onc_certification_g10_test_kit/smart_limited_app_group'
|
26
|
-
require_relative 'onc_certification_g10_test_kit/smart_standalone_patient_app_group'
|
27
|
-
require_relative 'onc_certification_g10_test_kit/smart_public_standalone_launch_group'
|
28
|
-
require_relative 'onc_certification_g10_test_kit/smart_public_standalone_launch_group_stu2'
|
29
|
-
require_relative 'onc_certification_g10_test_kit/smart_public_standalone_launch_group_stu2_2'
|
30
|
-
require_relative 'onc_certification_g10_test_kit/smart_ehr_patient_launch_group'
|
31
|
-
require_relative 'onc_certification_g10_test_kit/smart_ehr_patient_launch_group_stu2'
|
32
|
-
require_relative 'onc_certification_g10_test_kit/smart_ehr_patient_launch_group_stu2_2'
|
33
|
-
require_relative 'onc_certification_g10_test_kit/smart_ehr_practitioner_app_group'
|
34
|
-
require_relative 'onc_certification_g10_test_kit/smart_fine_grained_scopes_group'
|
35
|
-
require_relative 'onc_certification_g10_test_kit/smart_fine_grained_scopes_group_stu2_2'
|
36
|
-
require_relative 'onc_certification_g10_test_kit/smart_fine_grained_scopes_us_core_7_group'
|
37
|
-
require_relative 'onc_certification_g10_test_kit/smart_fine_grained_scopes_us_core_7_group_stu2_2'
|
38
|
-
require_relative 'onc_certification_g10_test_kit/smart_v1_scopes_group'
|
39
|
-
require_relative 'onc_certification_g10_test_kit/terminology_binding_validator'
|
40
|
-
require_relative 'onc_certification_g10_test_kit/token_introspection_group'
|
41
|
-
require_relative 'onc_certification_g10_test_kit/token_introspection_group_stu2_2'
|
42
|
-
require_relative 'onc_certification_g10_test_kit/token_revocation_group'
|
43
|
-
require_relative 'onc_certification_g10_test_kit/visual_inspection_and_attestations_group'
|
44
|
-
|
45
|
-
require_relative 'inferno/terminology'
|
46
|
-
require_relative 'onc_certification_g10_test_kit/short_id_manager'
|
47
|
-
|
48
|
-
Inferno::Terminology::Loader.load_validators
|
49
|
-
|
50
|
-
module ONCCertificationG10TestKit
|
51
|
-
class G10CertificationSuite < Inferno::TestSuite
|
52
|
-
title 'ONC Certification (g)(10) Standardized API'
|
53
|
-
short_title '(g)(10) Standardized API'
|
54
|
-
id :g10_certification
|
55
|
-
links [
|
56
|
-
{
|
57
|
-
label: 'Report Issue',
|
58
|
-
url: 'https://github.com/onc-healthit/onc-certification-g10-test-kit/issues/'
|
59
|
-
},
|
60
|
-
{
|
61
|
-
label: 'Open Source',
|
62
|
-
url: 'https://github.com/onc-healthit/onc-certification-g10-test-kit/'
|
63
|
-
},
|
64
|
-
{
|
65
|
-
label: 'Download',
|
66
|
-
url: 'https://github.com/onc-healthit/onc-certification-g10-test-kit/releases'
|
67
|
-
}
|
68
|
-
]
|
69
|
-
|
70
|
-
check_configuration do
|
71
|
-
ConfigurationChecker.new.configuration_messages
|
72
|
-
end
|
73
|
-
|
74
|
-
WARNING_INCLUSION_FILTERS = [
|
75
|
-
/Unknown CodeSystem/,
|
76
|
-
/Unknown ValueSet/
|
77
|
-
].freeze
|
78
|
-
|
79
|
-
ERROR_FILTERS = [
|
80
|
-
/\A\S+: \S+: Unknown [Cc]ode/,
|
81
|
-
/\A\S+: \S+: None of the codings provided are in the value set/,
|
82
|
-
/\A\S+: \S+: The code provided \(\S*\) is not in the value set/,
|
83
|
-
/\A\S+: \S+: The Coding provided \(\S*\) is not in the value set/,
|
84
|
-
/\A\S+: \S+: The Coding provided \(\S*\) was not found in the value set/,
|
85
|
-
/\A\S+: \S+: A definition for CodeSystem '.*' could not be found, so the code cannot be validated/,
|
86
|
-
/\A\S+: \S+: URL value '.*' does not resolve/,
|
87
|
-
/\A\S+: \S+: .*\[No server available\]/, # Catch-all for certain errors when TX server is disabled
|
88
|
-
%r{\A\S+: \S+: .*\[Error from http://tx.fhir.org/r4:} # Catch-all for TX server errors that slip through
|
89
|
-
].freeze
|
90
|
-
|
91
|
-
def self.setup_validator(us_core_version_requirement) # rubocop:disable Metrics/CyclomaticComplexity
|
92
|
-
fhir_resource_validator :default, required_suite_options: us_core_version_requirement do
|
93
|
-
cli_context do
|
94
|
-
txServer nil
|
95
|
-
displayWarnings true
|
96
|
-
disableDefaultResourceFetcher true
|
97
|
-
end
|
98
|
-
|
99
|
-
us_core_version_num = G10Options::US_CORE_VERSION_NUMBERS[us_core_version_requirement[:us_core_version]]
|
100
|
-
|
101
|
-
igs("hl7.fhir.us.core##{us_core_version_num}")
|
102
|
-
|
103
|
-
us_core_message_filters =
|
104
|
-
case (us_core_version_requirement[:us_core_version])
|
105
|
-
when G10Options::US_CORE_3
|
106
|
-
USCoreTestKit::USCoreV311::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
|
107
|
-
when G10Options::US_CORE_4
|
108
|
-
USCoreTestKit::USCoreV400::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
|
109
|
-
when G10Options::US_CORE_5
|
110
|
-
USCoreTestKit::USCoreV501::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
|
111
|
-
when G10Options::US_CORE_6
|
112
|
-
USCoreTestKit::USCoreV610::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
|
113
|
-
when G10Options::US_CORE_7
|
114
|
-
USCoreTestKit::USCoreV700::USCoreTestSuite::VALIDATION_MESSAGE_FILTERS
|
115
|
-
end
|
116
|
-
|
117
|
-
exclude_message do |message|
|
118
|
-
if message.type == 'info' ||
|
119
|
-
(message.type == 'warning' && WARNING_INCLUSION_FILTERS.none? do |filter|
|
120
|
-
filter.match? message.message
|
121
|
-
end) ||
|
122
|
-
us_core_message_filters.any? { |filter| filter.match? message.message } ||
|
123
|
-
(message.type == 'error' && ERROR_FILTERS.any? { |filter| message.message.match? filter })
|
124
|
-
true
|
125
|
-
else
|
126
|
-
false
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
perform_additional_validation do |resource, profile_url|
|
131
|
-
versionless_profile_url, profile_version = profile_url.split('|')
|
132
|
-
profile_version = case profile_version
|
133
|
-
when '6.1.0'
|
134
|
-
'610'
|
135
|
-
when '4.0.0'
|
136
|
-
'400'
|
137
|
-
when '5.0.1'
|
138
|
-
'501'
|
139
|
-
else
|
140
|
-
# This open-ended else is primarily for Vital Signs profiles in v3.1.1, which are tagged
|
141
|
-
# with the base FHIR version (4.0.1). The profiles were migrated to US Core in later
|
142
|
-
# versions.
|
143
|
-
'311'
|
144
|
-
end
|
145
|
-
|
146
|
-
us_core_suite = USCoreTestKit.const_get("USCoreV#{profile_version}")::USCoreTestSuite
|
147
|
-
metadata = us_core_suite.metadata.find do |metadata_candidate|
|
148
|
-
metadata_candidate.profile_url == versionless_profile_url
|
149
|
-
end
|
150
|
-
next if metadata.nil?
|
151
|
-
|
152
|
-
validation_messages = if resource.instance_of?(FHIR::Provenance)
|
153
|
-
USCoreTestKit::ProvenanceValidator.validate(resource)
|
154
|
-
else
|
155
|
-
[]
|
156
|
-
end
|
157
|
-
|
158
|
-
terminology_validation_messages = metadata.bindings
|
159
|
-
.select { |binding_definition| binding_definition[:strength] == 'required' }
|
160
|
-
.flat_map do |binding_definition|
|
161
|
-
TerminologyBindingValidator.validate(resource, binding_definition)
|
162
|
-
rescue Inferno::UnknownValueSetException, Inferno::UnknownCodeSystemException => e
|
163
|
-
{ type: 'warning', message: e.message }
|
164
|
-
end.compact
|
165
|
-
|
166
|
-
validation_messages.concat(terminology_validation_messages)
|
167
|
-
validation_messages
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
[
|
173
|
-
G10Options::US_CORE_3_REQUIREMENT,
|
174
|
-
G10Options::US_CORE_4_REQUIREMENT,
|
175
|
-
G10Options::US_CORE_5_REQUIREMENT,
|
176
|
-
G10Options::US_CORE_6_REQUIREMENT,
|
177
|
-
G10Options::US_CORE_7_REQUIREMENT
|
178
|
-
|
179
|
-
].each do |us_core_version_requirement|
|
180
|
-
setup_validator(us_core_version_requirement)
|
181
|
-
end
|
182
|
-
|
183
|
-
def self.jwks_json
|
184
|
-
bulk_data_jwks = JSON.parse(File.read(
|
185
|
-
ENV.fetch('G10_BULK_DATA_JWKS',
|
186
|
-
File.join(__dir__, 'onc_certification_g10_test_kit',
|
187
|
-
'bulk_data_jwks.json'))
|
188
|
-
))
|
189
|
-
@jwks_json ||= JSON.pretty_generate(
|
190
|
-
{ keys: bulk_data_jwks['keys'].select { |key| key['key_ops']&.include?('verify') } }
|
191
|
-
)
|
192
|
-
end
|
193
|
-
|
194
|
-
def self.well_known_route_handler
|
195
|
-
->(_env) { [200, { 'Content-Type' => 'application/json' }, [jwks_json]] }
|
196
|
-
end
|
197
|
-
|
198
|
-
route(
|
199
|
-
:get,
|
200
|
-
'/.well-known/jwks.json',
|
201
|
-
well_known_route_handler
|
202
|
-
)
|
203
|
-
|
204
|
-
suite_option :us_core_version,
|
205
|
-
title: 'US Core Version',
|
206
|
-
list_options: [
|
207
|
-
{
|
208
|
-
label: 'US Core 3.1.1 / USCDI v1',
|
209
|
-
value: G10Options::US_CORE_3
|
210
|
-
},
|
211
|
-
{
|
212
|
-
label: 'US Core 4.0.0 / USCDI v1',
|
213
|
-
value: G10Options::US_CORE_4
|
214
|
-
},
|
215
|
-
{
|
216
|
-
label: 'US Core 6.1.0 / USCDI v3',
|
217
|
-
value: G10Options::US_CORE_6
|
218
|
-
},
|
219
|
-
{
|
220
|
-
label: 'US Core 7.0.0 / USCDI v4',
|
221
|
-
value: G10Options::US_CORE_7
|
222
|
-
}
|
223
|
-
]
|
224
|
-
|
225
|
-
suite_option :smart_app_launch_version,
|
226
|
-
title: 'SMART App Launch Version',
|
227
|
-
list_options: [
|
228
|
-
{
|
229
|
-
label: 'SMART App Launch 1.0.0',
|
230
|
-
value: G10Options::SMART_1
|
231
|
-
},
|
232
|
-
{
|
233
|
-
label: 'SMART App Launch 2.0.0',
|
234
|
-
value: G10Options::SMART_2
|
235
|
-
},
|
236
|
-
{
|
237
|
-
label: 'SMART App Launch 2.2.0',
|
238
|
-
value: G10Options::SMART_2_2
|
239
|
-
}
|
240
|
-
]
|
241
|
-
|
242
|
-
suite_option :multi_patient_version,
|
243
|
-
title: 'Bulk Data Version',
|
244
|
-
list_options: [
|
245
|
-
{
|
246
|
-
label: 'Bulk Data 1.0.1',
|
247
|
-
value: G10Options::BULK_DATA_1
|
248
|
-
},
|
249
|
-
{
|
250
|
-
label: 'Bulk Data 2.0.0',
|
251
|
-
value: G10Options::BULK_DATA_2
|
252
|
-
}
|
253
|
-
]
|
254
|
-
|
255
|
-
config(
|
256
|
-
options: {
|
257
|
-
post_authorization_uri: "#{Inferno::Application['base_url']}/custom/smart_stu2/post_auth",
|
258
|
-
incorrectly_permitted_tls_version_message_type: 'warning'
|
259
|
-
}
|
260
|
-
)
|
261
|
-
|
262
|
-
description %(
|
263
|
-
The ONC Certification (g)(10) Standardized API Test Suite is a testing
|
264
|
-
tool for Health Level 7 (HL7®) Fast Healthcare Interoperability Resources
|
265
|
-
(FHIR®) services seeking to meet the requirements of the Standardized API
|
266
|
-
for Patient and Population Services criterion § 170.315(g)(10) in the ONC
|
267
|
-
Certification Program.
|
268
|
-
|
269
|
-
This test suite is organized into testing scenarios that in sum cover all
|
270
|
-
requirements within the § 170.315(g)(10) certification criterion. The
|
271
|
-
scenarios are intended to be run in order during certification, but can
|
272
|
-
be run out of order to support testing during development or certification
|
273
|
-
preparation. Some scenarios depend on data collected during previous
|
274
|
-
scenarios to function. In these cases, the scenario description describes
|
275
|
-
these dependencies.
|
276
|
-
|
277
|
-
The best way to learn about how to use these tests is the
|
278
|
-
[(g)(10) Standardized API Test Kit walkthrough](https://github.com/onc-healthit/onc-certification-g10-test-kit/wiki/Walkthrough),
|
279
|
-
which demonstrates the tests running against a simulated system.
|
280
|
-
|
281
|
-
The first three scenarios require the system under test to demonstrate
|
282
|
-
basic SMART App Launch functionality. The fourth uses a valid token
|
283
|
-
provided during earlier tests to verify support for the Single Patient API
|
284
|
-
as described in the criterion. The fifth verifies support for the Multi
|
285
|
-
Patient API, including Backend Services for authorization. Not all
|
286
|
-
authorization-related requirements are verified in the first three
|
287
|
-
scenarios, and the 'Additional Authorization Tests' verify these
|
288
|
-
additional requirements. The last scenario contains a list of
|
289
|
-
'attestations' and 'visual inspections' for requirements that could not
|
290
|
-
be verified through automated testing.
|
291
|
-
|
292
|
-
To get started with the first group of scenarios, please first register the
|
293
|
-
Inferno client as a SMART App with the following information:
|
294
|
-
|
295
|
-
* SMART Launch URI: `#{LAUNCH_URI}`
|
296
|
-
* OAuth Redirect URI: `#{REDIRECT_URI}`
|
297
|
-
|
298
|
-
For the multi-patient API, register Inferno with the following JWK Set
|
299
|
-
Url:
|
300
|
-
|
301
|
-
* `#{Inferno::Application[:base_url]}/custom/g10_certification/.well-known/jwks.json`
|
302
|
-
|
303
|
-
Systems must pass all tests to qualify for ONC certification.
|
304
|
-
)
|
305
|
-
|
306
|
-
suite_summary %(
|
307
|
-
The ONC Certification (g)(10) Standardized API Test Kit is a testing tool
|
308
|
-
for Health Level 7 (HL7®) Fast Healthcare Interoperability Resources
|
309
|
-
(FHIR®) services seeking to meet the requirements of the Standardized API
|
310
|
-
for Patient and Population Services criterion § 170.315(g)(10) in the ONC Certification Program.
|
311
|
-
|
312
|
-
Systems may adopt later versions of standards than those named in the rule
|
313
|
-
as approved by the ONC Standards Version Advancement Process (SVAP).
|
314
|
-
When using US Core v7, the tester must select SMART v2 or above
|
315
|
-
because SMART App Launch granular scopes are required by US Core v7
|
316
|
-
and are not available in SMART v1. Please select which approved version
|
317
|
-
of each standard to use, and click ‘Start Testing’ to begin testing.
|
318
|
-
)
|
319
|
-
|
320
|
-
input_instructions %(
|
321
|
-
Register Inferno as a SMART app using the following information:
|
322
|
-
|
323
|
-
* Launch URI: `#{LAUNCH_URI}`
|
324
|
-
* Redirect URI: `#{REDIRECT_URI}`
|
325
|
-
|
326
|
-
For the multi-patient API, register Inferno with the following JWK Set
|
327
|
-
Url:
|
328
|
-
|
329
|
-
* `#{Inferno::Application[:base_url]}/custom/g10_certification/.well-known/jwks.json`
|
330
|
-
)
|
331
|
-
|
332
|
-
group from: 'g10_smart_standalone_patient_app'
|
333
|
-
|
334
|
-
group from: 'g10_smart_limited_app' do
|
335
|
-
# This has to be configured here, otherwise the `smart_auth_info` config
|
336
|
-
# will get clobbered and will use `standalone_smart_auth_info` instead of
|
337
|
-
# `limited_smart_auth_info`
|
338
|
-
groups
|
339
|
-
.select { |group| group.id.include? 'smart_standalone_launch' }
|
340
|
-
.flat_map(&:tests)
|
341
|
-
.select { |test| test.id.include? 'g10_patient_context' }
|
342
|
-
.each do |test|
|
343
|
-
test
|
344
|
-
.config(
|
345
|
-
inputs: {
|
346
|
-
patient_id: { name: :limited_patient_id },
|
347
|
-
smart_auth_info: { name: :limited_smart_auth_info }
|
348
|
-
}
|
349
|
-
)
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
group from: 'g10_smart_ehr_practitioner_app'
|
354
|
-
|
355
|
-
group from: 'g10_single_patient_api',
|
356
|
-
required_suite_options: G10Options::US_CORE_3_REQUIREMENT
|
357
|
-
group from: 'g10_single_patient_us_core_4_api',
|
358
|
-
required_suite_options: G10Options::US_CORE_4_REQUIREMENT
|
359
|
-
group from: 'g10_single_patient_us_core_5_api',
|
360
|
-
required_suite_options: G10Options::US_CORE_5_REQUIREMENT
|
361
|
-
group from: 'g10_single_patient_us_core_6_api',
|
362
|
-
required_suite_options: G10Options::US_CORE_6_REQUIREMENT
|
363
|
-
group from: 'g10_single_patient_us_core_7_api',
|
364
|
-
required_suite_options: G10Options::US_CORE_7_REQUIREMENT
|
365
|
-
|
366
|
-
group from: 'multi_patient_api',
|
367
|
-
required_suite_options: G10Options::BULK_DATA_1_REQUIREMENT
|
368
|
-
group from: 'multi_patient_api_stu2',
|
369
|
-
required_suite_options: G10Options::BULK_DATA_2_REQUIREMENT
|
370
|
-
|
371
|
-
group do
|
372
|
-
title 'Additional Authorization Tests'
|
373
|
-
id 'Group06'
|
374
|
-
description %(
|
375
|
-
The (g)(10) Standardized Test Suite attempts to minimize effort required
|
376
|
-
by testers by creating scenarios that validate as many requirements as
|
377
|
-
possible with just a handful of SMART App Launches. However, not all
|
378
|
-
SMART App Launch and (g)(10) Standardized API criterion requirements
|
379
|
-
that need to be verified fit within the first few test scenarios in this
|
380
|
-
suite.
|
381
|
-
|
382
|
-
The scenarios contained in this section verify remaining testing
|
383
|
-
requirements for the (g)(10) Standardized API criterion relevant to
|
384
|
-
the SMART App Launch implementation specification. Each of these scenarios
|
385
|
-
need to be run independently. Please read the instructions for each in
|
386
|
-
the 'About' section, as they may require special setup on the part of
|
387
|
-
the tester.
|
388
|
-
)
|
389
|
-
|
390
|
-
default_redirect_message_proc = lambda do |auth_url|
|
391
|
-
%(
|
392
|
-
### #{self.class.parent.title}
|
393
|
-
|
394
|
-
[Follow this link to authorize with the SMART server](#{auth_url}).
|
395
|
-
|
396
|
-
Tests will resume once Inferno receives a request at
|
397
|
-
`#{REDIRECT_URI}` with a state of `#{state}`.
|
398
|
-
)
|
399
|
-
end
|
400
|
-
|
401
|
-
group from: :g10_public_standalone_launch,
|
402
|
-
required_suite_options: G10Options::SMART_1_REQUIREMENT,
|
403
|
-
config: { options: { redirect_message_proc: default_redirect_message_proc } }
|
404
|
-
group from: :g10_public_standalone_launch_stu2,
|
405
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT,
|
406
|
-
config: { options: { redirect_message_proc: default_redirect_message_proc } }
|
407
|
-
group from: :g10_public_standalone_launch_stu2_2, # rubocop:disable Naming/VariableNumber
|
408
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT,
|
409
|
-
config: { options: { redirect_message_proc: default_redirect_message_proc } }
|
410
|
-
|
411
|
-
group from: :g10_token_revocation
|
412
|
-
|
413
|
-
group from: :g10_smart_invalid_aud,
|
414
|
-
config: { options: { redirect_message_proc: default_redirect_message_proc } }
|
415
|
-
|
416
|
-
group from: :g10_smart_invalid_token_request,
|
417
|
-
required_suite_options: G10Options::SMART_1_REQUIREMENT,
|
418
|
-
config: { options: { redirect_message_proc: default_redirect_message_proc } }
|
419
|
-
group from: :g10_smart_invalid_token_request_stu2,
|
420
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT,
|
421
|
-
config: { options: { redirect_message_proc: default_redirect_message_proc } }
|
422
|
-
group from: :g10_smart_invalid_token_request_stu2,
|
423
|
-
id: :g10_smart_invalid_token_request_stu2_2, # rubocop:disable Naming/VariableNumber
|
424
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT,
|
425
|
-
config: { options: { redirect_message_proc: default_redirect_message_proc } }
|
426
|
-
|
427
|
-
group from: :g10_smart_invalid_pkce_code_verifier_group,
|
428
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT
|
429
|
-
group from: :g10_smart_invalid_pkce_code_verifier_group,
|
430
|
-
id: :g10_smart_invalid_pkce_code_verifier_group_stu2_2, # rubocop:disable Naming/VariableNumber
|
431
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT
|
432
|
-
|
433
|
-
group from: :g10_ehr_patient_launch,
|
434
|
-
required_suite_options: G10Options::SMART_1_REQUIREMENT
|
435
|
-
group from: :g10_ehr_patient_launch_stu2,
|
436
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT
|
437
|
-
group from: :g10_ehr_patient_launch_stu2_2, # rubocop:disable Naming/VariableNumber
|
438
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT
|
439
|
-
|
440
|
-
group from: :g10_token_introspection,
|
441
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT
|
442
|
-
group from: :g10_token_introspection_stu2_2, # rubocop:disable Naming/VariableNumber
|
443
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT
|
444
|
-
|
445
|
-
group from: :g10_asymmetric_launch,
|
446
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT
|
447
|
-
group from: :g10_asymmetric_launch,
|
448
|
-
id: :g10_asymmetric_launch_stu2_2, # rubocop:disable Naming/VariableNumber
|
449
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT
|
450
|
-
|
451
|
-
group from: :g10_smart_v1_scopes,
|
452
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT
|
453
|
-
group from: :g10_smart_v1_scopes,
|
454
|
-
id: :g10_smart_v1_scopes_stu2_2, # rubocop:disable Naming/VariableNumber
|
455
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT
|
456
|
-
|
457
|
-
group from: :g10_smart_fine_grained_scopes, exclude_optional: true do
|
458
|
-
required_suite_options G10Options::SMART_2_REQUIREMENT.merge(G10Options::US_CORE_6_REQUIREMENT)
|
459
|
-
groups.first.config(
|
460
|
-
inputs: {
|
461
|
-
smart_auth_info: { name: :granular_scopes_1_auth_info }
|
462
|
-
},
|
463
|
-
outputs: {
|
464
|
-
smart_auth_info: { name: :granular_scopes_1_auth_info }
|
465
|
-
}
|
466
|
-
)
|
467
|
-
|
468
|
-
groups.last.config(
|
469
|
-
inputs: {
|
470
|
-
smart_auth_info: { name: :granular_scopes_2_auth_info }
|
471
|
-
},
|
472
|
-
outputs: {
|
473
|
-
smart_auth_info: { name: :granular_scopes_2_auth_info }
|
474
|
-
}
|
475
|
-
)
|
476
|
-
end
|
477
|
-
|
478
|
-
group from: :g10_smart_fine_grained_scopes_stu2_2, exclude_optional: true do # rubocop:disable Naming/VariableNumber
|
479
|
-
required_suite_options G10Options::SMART_2_2_REQUIREMENT.merge(G10Options::US_CORE_6_REQUIREMENT)
|
480
|
-
groups.first.config(
|
481
|
-
inputs: {
|
482
|
-
smart_auth_info: { name: :granular_scopes_1_auth_info }
|
483
|
-
},
|
484
|
-
outputs: {
|
485
|
-
smart_auth_info: { name: :granular_scopes_1_auth_info }
|
486
|
-
}
|
487
|
-
)
|
488
|
-
|
489
|
-
groups.last.config(
|
490
|
-
inputs: {
|
491
|
-
smart_auth_info: { name: :granular_scopes_2_auth_info }
|
492
|
-
},
|
493
|
-
outputs: {
|
494
|
-
smart_auth_info: { name: :granular_scopes_2_auth_info }
|
495
|
-
}
|
496
|
-
)
|
497
|
-
end
|
498
|
-
|
499
|
-
group from: :g10_us_core_7_smart_fine_grained_scopes, exclude_optional: true do
|
500
|
-
required_suite_options G10Options::SMART_2_REQUIREMENT.merge(G10Options::US_CORE_7_REQUIREMENT)
|
501
|
-
groups.first.config(
|
502
|
-
inputs: {
|
503
|
-
smart_auth_info: { name: :granular_scopes_1_auth_info }
|
504
|
-
},
|
505
|
-
outputs: {
|
506
|
-
smart_auth_info: { name: :granular_scopes_1_auth_info }
|
507
|
-
}
|
508
|
-
)
|
509
|
-
|
510
|
-
groups.last.config(
|
511
|
-
inputs: {
|
512
|
-
smart_auth_info: { name: :granular_scopes_2_auth_info }
|
513
|
-
},
|
514
|
-
outputs: {
|
515
|
-
smart_auth_info: { name: :granular_scopes_2_auth_info }
|
516
|
-
}
|
517
|
-
)
|
518
|
-
end
|
519
|
-
|
520
|
-
group from: :g10_us_core_7_smart_fine_grained_scopes_stu2_2, exclude_optional: true do # rubocop:disable Naming/VariableNumber
|
521
|
-
required_suite_options G10Options::SMART_2_2_REQUIREMENT.merge(G10Options::US_CORE_7_REQUIREMENT)
|
522
|
-
groups.first.config(
|
523
|
-
inputs: {
|
524
|
-
smart_auth_info: { name: :granular_scopes_1_auth_info }
|
525
|
-
},
|
526
|
-
outputs: {
|
527
|
-
smart_auth_info: { name: :granular_scopes_1_auth_info }
|
528
|
-
}
|
529
|
-
)
|
530
|
-
|
531
|
-
groups.last.config(
|
532
|
-
inputs: {
|
533
|
-
smart_auth_info: { name: :granular_scopes_2_auth_info }
|
534
|
-
},
|
535
|
-
outputs: {
|
536
|
-
smart_auth_info: { name: :granular_scopes_2_auth_info }
|
537
|
-
}
|
538
|
-
)
|
539
|
-
end
|
540
|
-
|
541
|
-
group from: :g10_smart_granular_scope_selection,
|
542
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT.merge(G10Options::US_CORE_6_REQUIREMENT)
|
543
|
-
group from: :g10_smart_granular_scope_selection,
|
544
|
-
id: :g10_smart_granular_scope_selection_stu2_2, # rubocop:disable Naming/VariableNumber
|
545
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT.merge(G10Options::US_CORE_6_REQUIREMENT)
|
546
|
-
|
547
|
-
group from: :g10_smart_granular_scope_selection,
|
548
|
-
id: :g10_us_core_7_smart_granular_scope_selection,
|
549
|
-
required_suite_options: G10Options::SMART_2_REQUIREMENT.merge(G10Options::US_CORE_7_REQUIREMENT)
|
550
|
-
group from: :g10_smart_granular_scope_selection,
|
551
|
-
id: :g10_us_core_7_smart_granular_scope_selection_stu2_2, # rubocop:disable Naming/VariableNumber
|
552
|
-
required_suite_options: G10Options::SMART_2_2_REQUIREMENT.merge(G10Options::US_CORE_7_REQUIREMENT)
|
553
|
-
end
|
554
|
-
|
555
|
-
group from: :g10_visual_inspection_and_attestations
|
556
|
-
end
|
557
|
-
end
|
558
|
-
|
559
|
-
ONCCertificationG10TestKit::ShortIDManager.assign_short_ids
|
6
|
+
require_relative 'onc_certification_g10_test_kit/g10_certification_suite'
|