onc_certification_g10_test_kit 2.0.0.rc3 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/inferno/terminology/tasks/check_built_terminology.rb +14 -12
- data/lib/onc_certification_g10_test_kit/bulk_data_authorization.rb +7 -4
- data/lib/onc_certification_g10_test_kit/bulk_data_group_export.rb +60 -17
- data/lib/onc_certification_g10_test_kit/bulk_data_group_export_validation.rb +10 -6
- data/lib/onc_certification_g10_test_kit/bulk_export_validation_tester.rb +48 -18
- data/lib/onc_certification_g10_test_kit/configuration_checker.rb +6 -5
- data/lib/onc_certification_g10_test_kit/multi_patient_api.rb +11 -0
- data/lib/onc_certification_g10_test_kit/onc_program_procedure.yml +1451 -0
- data/lib/onc_certification_g10_test_kit/profile_guesser.rb +2 -2
- data/lib/onc_certification_g10_test_kit/restricted_resource_type_access_group.rb +13 -13
- data/lib/onc_certification_g10_test_kit/single_patient_api_group.rb +89 -0
- data/lib/onc_certification_g10_test_kit/smart_app_launch_invalid_aud_group.rb +13 -12
- data/lib/onc_certification_g10_test_kit/smart_ehr_practitioner_app_group.rb +11 -5
- data/lib/onc_certification_g10_test_kit/smart_invalid_launch_group.rb +13 -16
- data/lib/onc_certification_g10_test_kit/smart_invalid_token_group.rb +11 -4
- data/lib/onc_certification_g10_test_kit/smart_limited_app_group.rb +18 -4
- data/lib/onc_certification_g10_test_kit/smart_public_standalone_launch_group.rb +15 -3
- data/lib/onc_certification_g10_test_kit/smart_standalone_patient_app_group.rb +8 -3
- data/lib/onc_certification_g10_test_kit/tasks/generate_matrix.rb +247 -0
- data/lib/onc_certification_g10_test_kit/tasks/test_procedure.rb +65 -0
- data/lib/onc_certification_g10_test_kit/token_revocation_group.rb +60 -60
- data/lib/onc_certification_g10_test_kit/unrestricted_resource_type_access_group.rb +13 -13
- data/lib/onc_certification_g10_test_kit/version.rb +1 -1
- data/lib/onc_certification_g10_test_kit/visual_inspection_and_attestations_group.rb +7 -6
- data/lib/onc_certification_g10_test_kit.rb +15 -82
- metadata +16 -12
@@ -0,0 +1,247 @@
|
|
1
|
+
require 'rubyXL'
|
2
|
+
require 'rubyXL/convenience_methods'
|
3
|
+
require 'inferno'
|
4
|
+
require_relative '../../onc_certification_g10_test_kit'
|
5
|
+
require_relative 'test_procedure'
|
6
|
+
|
7
|
+
module ONCCertificationG10TestKit
|
8
|
+
module Tasks
|
9
|
+
class GenerateMatrix
|
10
|
+
include ONCCertificationG10TestKit
|
11
|
+
|
12
|
+
FILE_NAME = 'onc_certification_g10_matrix.xlsx'.freeze
|
13
|
+
|
14
|
+
def inferno_to_procedure_map
|
15
|
+
@inferno_to_procedure_map ||= Hash.new { |h, k| h[k] = [] }
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_procedure
|
19
|
+
@test_procedure ||=
|
20
|
+
if File.file? File.join('lib', 'onc_certification_g10_test_kit', 'onc_program_procedure.yml')
|
21
|
+
TestProcedure.new(
|
22
|
+
YAML.load_file(File.join('lib', 'onc_certification_g10_test_kit',
|
23
|
+
'onc_program_procedure.yml')).deep_symbolize_keys
|
24
|
+
)
|
25
|
+
else
|
26
|
+
TestProcedure.new
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_suite
|
31
|
+
ONCCertificationG10TestKit::G10CertificationSuite
|
32
|
+
end
|
33
|
+
|
34
|
+
def workbook
|
35
|
+
@workbook ||= RubyXL::Workbook.new
|
36
|
+
end
|
37
|
+
|
38
|
+
def run
|
39
|
+
generate_matrix_worksheet
|
40
|
+
generate_test_procedure_worksheet
|
41
|
+
generate_inferno_test_worksheet
|
42
|
+
|
43
|
+
Inferno.logger.info "Writing to #{FILE_NAME}"
|
44
|
+
workbook.write(FILE_NAME)
|
45
|
+
end
|
46
|
+
|
47
|
+
def generate_matrix_worksheet # rubocop:disable Metrics/CyclomaticComplexity
|
48
|
+
matrix_worksheet = workbook.worksheets[0]
|
49
|
+
matrix_worksheet.sheet_name = 'Matrix'
|
50
|
+
|
51
|
+
col = 2
|
52
|
+
matrix_worksheet.add_cell(0, 1, "ONC Certification (g)(10) Test Kit (v#{ONCCertificationG10TestKit::VERSION})")
|
53
|
+
matrix_worksheet.change_row_height(0, 20)
|
54
|
+
matrix_worksheet.change_row_vertical_alignment(0, 'distributed')
|
55
|
+
column_map = {}
|
56
|
+
matrix_worksheet.change_column_width(1, 25)
|
57
|
+
matrix_worksheet.change_row_height(1, 20)
|
58
|
+
matrix_worksheet.change_row_horizontal_alignment(1, 'center')
|
59
|
+
matrix_worksheet.change_row_vertical_alignment(1, 'distributed')
|
60
|
+
matrix_worksheet.change_row_height(2, 70)
|
61
|
+
column_borders = []
|
62
|
+
|
63
|
+
test_suite.groups.each do |group|
|
64
|
+
matrix_worksheet.add_cell(1, col, group.title).change_text_wrap(true)
|
65
|
+
matrix_worksheet.merge_cells(1, col, 1, col + group.groups.length - 1)
|
66
|
+
matrix_worksheet.change_column_border(col, :left, 'medium')
|
67
|
+
matrix_worksheet.change_column_border_color(col, :left, '000000')
|
68
|
+
column_borders << col
|
69
|
+
|
70
|
+
group.groups.each do |test_case|
|
71
|
+
matrix_worksheet.change_column_width(col, 4.2)
|
72
|
+
|
73
|
+
cell = matrix_worksheet.add_cell(2, col,
|
74
|
+
"#{test_case.short_id} #{test_case.short_title || test_case.title}")
|
75
|
+
cell.change_text_rotation(90)
|
76
|
+
cell.change_border_color(:bottom, '000000')
|
77
|
+
cell.change_border(:bottom, 'medium')
|
78
|
+
matrix_worksheet.change_column_border(col, :right, 'thin')
|
79
|
+
matrix_worksheet.change_column_border_color(col, :right, '666666')
|
80
|
+
|
81
|
+
test_case.tests.each do |test|
|
82
|
+
# tests << { test_case: test_case, test: test }
|
83
|
+
# full_test_id = "#{test_case.prefix}#{test.id}"
|
84
|
+
column_map[test.short_id] = col
|
85
|
+
end
|
86
|
+
col += 1
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
total_width = col - 1
|
91
|
+
matrix_worksheet.merge_cells(0, 1, 0, total_width)
|
92
|
+
matrix_worksheet.change_row_horizontal_alignment(0, 'center')
|
93
|
+
|
94
|
+
matrix_worksheet.add_cell(2, total_width + 2, 'Supported?')
|
95
|
+
row = 3
|
96
|
+
|
97
|
+
test_procedure.sections.each do |section|
|
98
|
+
section.steps.each do |step|
|
99
|
+
step_id = step.id.upcase
|
100
|
+
matrix_worksheet.add_cell(row, 1, "#{step_id} ")
|
101
|
+
matrix_worksheet.change_row_height(row, 13)
|
102
|
+
matrix_worksheet.change_row_vertical_alignment(row, 'distributed')
|
103
|
+
|
104
|
+
(2..total_width).each do |column|
|
105
|
+
matrix_worksheet.add_cell(row, column, '')
|
106
|
+
end
|
107
|
+
|
108
|
+
step.inferno_tests.each do |test_id|
|
109
|
+
column = column_map[test_id]
|
110
|
+
inferno_to_procedure_map[test_id].push(step_id)
|
111
|
+
if column.nil?
|
112
|
+
puts "No such test found: #{test_id}"
|
113
|
+
next
|
114
|
+
end
|
115
|
+
|
116
|
+
matrix_worksheet.add_cell(row, column, '').change_fill('3C63FF')
|
117
|
+
end
|
118
|
+
|
119
|
+
matrix_worksheet.add_cell(row, total_width + 2, step.inferno_supported.upcase)
|
120
|
+
|
121
|
+
row += 1
|
122
|
+
end
|
123
|
+
end
|
124
|
+
matrix_worksheet.change_column_horizontal_alignment(1, 'right')
|
125
|
+
matrix_worksheet.change_row_horizontal_alignment(0, 'center')
|
126
|
+
|
127
|
+
column_borders.each do |column|
|
128
|
+
matrix_worksheet.change_column_border(column, :left, 'medium')
|
129
|
+
matrix_worksheet.change_column_border_color(column, :left, '000000')
|
130
|
+
end
|
131
|
+
matrix_worksheet.change_column_border_color(total_width, :right, '000000')
|
132
|
+
matrix_worksheet.change_column_border(total_width, :right, 'medium')
|
133
|
+
matrix_worksheet.change_column_width(total_width + 1, 3)
|
134
|
+
|
135
|
+
matrix_worksheet.change_column_width(total_width + 3, 6)
|
136
|
+
matrix_worksheet.change_column_width(total_width + 4, 2)
|
137
|
+
matrix_worksheet.change_column_width(total_width + 5, 60)
|
138
|
+
matrix_worksheet.add_cell(1, total_width + 3, '').change_fill('3C63FF')
|
139
|
+
this_text = 'Blue boxes indicate that the Inferno test (top) covers this test procedure step (left).'
|
140
|
+
matrix_worksheet.add_cell(1, total_width + 5, this_text).change_text_wrap(true)
|
141
|
+
matrix_worksheet.change_column_horizontal_alignment(total_width + 5, :left)
|
142
|
+
end
|
143
|
+
|
144
|
+
def generate_test_procedure_worksheet # rubocop:disable Metrics/CyclomaticComplexity
|
145
|
+
workbook.add_worksheet('Test Procedure')
|
146
|
+
tp_worksheet = workbook.worksheets[1]
|
147
|
+
|
148
|
+
[3, 3, 22, 65, 65, 3, 15, 30, 65, 65].each_with_index do |width, index|
|
149
|
+
tp_worksheet.change_column_width(index, width)
|
150
|
+
end
|
151
|
+
['',
|
152
|
+
'',
|
153
|
+
'ID',
|
154
|
+
'System Under Test',
|
155
|
+
'Test Lab Verifies',
|
156
|
+
'',
|
157
|
+
'Inferno Supports?',
|
158
|
+
'Inferno Tests',
|
159
|
+
'Inferno Notes',
|
160
|
+
'Alternate Test Methodology'].each_with_index { |text, index| tp_worksheet.add_cell(0, index, text) }
|
161
|
+
|
162
|
+
row = 2
|
163
|
+
|
164
|
+
test_procedure.sections.each do |section|
|
165
|
+
tp_worksheet.add_cell(row, 0, section.name)
|
166
|
+
row += 1
|
167
|
+
section.steps.group_by(&:group).each do |group_name, steps|
|
168
|
+
tp_worksheet.add_cell(row, 1, group_name)
|
169
|
+
row += 1
|
170
|
+
steps.each do |step|
|
171
|
+
longest_line = [step.s_u_t, step.t_l_v, step.inferno_notes, step.alternate_test].map do |text|
|
172
|
+
text&.lines&.count || 0
|
173
|
+
end.max
|
174
|
+
tp_worksheet.change_row_height(row, (longest_line * 10) + 10)
|
175
|
+
tp_worksheet.change_row_vertical_alignment(row, 'top')
|
176
|
+
tp_worksheet.add_cell(row, 2, "#{step.id.upcase} ")
|
177
|
+
tp_worksheet.add_cell(row, 3, step.s_u_t).change_text_wrap(true)
|
178
|
+
tp_worksheet.add_cell(row, 4, step.t_l_v).change_text_wrap(true)
|
179
|
+
tp_worksheet.add_cell(row, 5, '')
|
180
|
+
tp_worksheet.add_cell(row, 6, step.inferno_supported)
|
181
|
+
tp_worksheet.add_cell(row, 7, step.inferno_tests.join(', ')).change_text_wrap(true)
|
182
|
+
tp_worksheet.add_cell(row, 8, step.inferno_notes).change_text_wrap(true)
|
183
|
+
tp_worksheet.add_cell(row, 9, step.alternate_test).change_text_wrap(true)
|
184
|
+
row += 1
|
185
|
+
end
|
186
|
+
end
|
187
|
+
row += 1
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def generate_inferno_test_worksheet # rubocop:disable Metrics/CyclomaticComplexity
|
192
|
+
workbook.add_worksheet('Inferno Tests')
|
193
|
+
inferno_worksheet = workbook.worksheets[2]
|
194
|
+
|
195
|
+
columns = [
|
196
|
+
['', 3, ->(_test) { '' }],
|
197
|
+
['', 3, ->(_test) { '' }],
|
198
|
+
['Inferno Test ID', 22, ->(test) { test.short_id.to_s }],
|
199
|
+
['Inferno Test Name', 65, ->(test) { test.title }],
|
200
|
+
['Inferno Test Description', 65, lambda do |test|
|
201
|
+
description = test.description || ''
|
202
|
+
natural_indent =
|
203
|
+
description
|
204
|
+
.lines
|
205
|
+
.collect { |l| l.index(/[^ ]/) }
|
206
|
+
.select { |l| !l.nil? && l.positive? }
|
207
|
+
.min || 0
|
208
|
+
description.lines.map { |l| l[natural_indent..] || "\n" }.join.strip
|
209
|
+
end],
|
210
|
+
['Test Procedure Steps', 30, ->(test) { inferno_to_procedure_map[test.short_id].join(', ') }]
|
211
|
+
]
|
212
|
+
|
213
|
+
columns.each_with_index do |row_name, index|
|
214
|
+
inferno_worksheet.add_cell(0, index, row_name.first)
|
215
|
+
end
|
216
|
+
|
217
|
+
row = 1
|
218
|
+
|
219
|
+
test_suite.groups.each do |group|
|
220
|
+
row += 1
|
221
|
+
inferno_worksheet.add_cell(row, 0, group.title)
|
222
|
+
row += 1
|
223
|
+
group.groups.each do |test_case|
|
224
|
+
inferno_worksheet.add_cell(row, 1, "#{test_case.short_id}: #{test_case.title}")
|
225
|
+
row += 1
|
226
|
+
test_case.tests.each do |test|
|
227
|
+
this_row = columns.map do |column|
|
228
|
+
column[2].call(test)
|
229
|
+
end
|
230
|
+
|
231
|
+
this_row.each_with_index do |value, index|
|
232
|
+
inferno_worksheet.add_cell(row, index, value).change_text_wrap(true)
|
233
|
+
end
|
234
|
+
inferno_worksheet.change_row_height(row, [26, ((test.description || '').strip.lines.count * 10) + 10].max)
|
235
|
+
inferno_worksheet.change_row_vertical_alignment(row, 'top')
|
236
|
+
row += 1
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
columns.each_with_index do |column, index|
|
242
|
+
inferno_worksheet.change_column_width(index, column[1])
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ONCCertificationG10TestKit
|
4
|
+
module Tasks
|
5
|
+
class TestProcedure
|
6
|
+
# procedure -> section -> steps
|
7
|
+
attr_accessor :sections
|
8
|
+
|
9
|
+
def initialize(data)
|
10
|
+
@sections = data[:procedure].map { |section| Section.new(section) }
|
11
|
+
end
|
12
|
+
|
13
|
+
class Section
|
14
|
+
attr_accessor :name, :steps
|
15
|
+
|
16
|
+
def initialize(data)
|
17
|
+
@name = data[:section]
|
18
|
+
|
19
|
+
group = nil
|
20
|
+
@steps = data[:steps].map do |step|
|
21
|
+
if step[:group].nil?
|
22
|
+
step[:group] = group
|
23
|
+
else
|
24
|
+
group = step[:group]
|
25
|
+
end
|
26
|
+
|
27
|
+
Step.new(step)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Step
|
33
|
+
attr_accessor :group, :id, :s_u_t, :t_l_v, :inferno_supported, :inferno_notes, :inferno_tests, :alternate_test
|
34
|
+
|
35
|
+
def initialize(data)
|
36
|
+
@group = data[:group]
|
37
|
+
@id = data[:id]
|
38
|
+
@s_u_t = data[:SUT]
|
39
|
+
@t_l_v = data[:TLV]
|
40
|
+
@inferno_supported = data[:inferno_supported]
|
41
|
+
@inferno_notes = data[:inferno_notes]
|
42
|
+
@alternate_test = data[:alternate_test]
|
43
|
+
@inferno_tests = expand_tests(data[:inferno_tests]).flatten
|
44
|
+
end
|
45
|
+
|
46
|
+
def expand_tests(test_list)
|
47
|
+
return [] if test_list.nil?
|
48
|
+
|
49
|
+
test_list.map do |test|
|
50
|
+
if test.include?(' - ')
|
51
|
+
first, second = test.split(' - ')
|
52
|
+
prefix, _, beginning = first.rpartition('.')
|
53
|
+
second_prefix, _, ending = second.rpartition('.')
|
54
|
+
raise "'#{prefix}' != '#{second_prefix}' in #{@group} #{@id}" unless prefix == second_prefix
|
55
|
+
|
56
|
+
(beginning.to_i..ending.to_i).map { |index| "#{prefix}.#{format('%02<index>d', { index: index })}" }
|
57
|
+
else
|
58
|
+
[test]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -4,67 +4,16 @@ module ONCCertificationG10TestKit
|
|
4
4
|
description 'Demonstrate the Health IT module is capable of revoking access granted to an application.'
|
5
5
|
id :g10_token_revocation
|
6
6
|
run_as_group
|
7
|
-
input :token_revocation_attestation,
|
8
|
-
title: 'Prior to executing test, Health IT developer demonstrated revoking tokens provided during patient standalone launch.', # rubocop:disable Layout/LineLength
|
9
|
-
type: 'radio',
|
10
|
-
default: 'false',
|
11
|
-
options: {
|
12
|
-
list_options: [
|
13
|
-
{
|
14
|
-
label: 'Yes',
|
15
|
-
value: 'true'
|
16
|
-
},
|
17
|
-
{
|
18
|
-
label: 'No',
|
19
|
-
value: 'false'
|
20
|
-
}
|
21
|
-
]
|
22
|
-
}
|
23
|
-
input :token_revocation_notes,
|
24
|
-
title: 'Notes, if applicable:',
|
25
|
-
type: 'textarea',
|
26
|
-
optional: true
|
27
|
-
input :url, :access_token, :refresh_token, :smart_token_url, :patient_id, :client_id, :client_secret
|
28
7
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
},
|
39
|
-
access_token: {
|
40
|
-
name: :standalone_access_token,
|
41
|
-
title: 'Revoked Bearer Token',
|
42
|
-
description: 'Prior to the test, please revoke this bearer token from patient standalone launch.'
|
43
|
-
},
|
44
|
-
refresh_token: {
|
45
|
-
name: :standalone_refresh_token,
|
46
|
-
title: 'Revoked Refresh Token',
|
47
|
-
description: 'Prior to the test, please revoke this refresh token from patient standalone launch.'
|
48
|
-
},
|
49
|
-
patient_id: {
|
50
|
-
name: :standalone_patient_id,
|
51
|
-
title: 'Patient ID',
|
52
|
-
description: 'Patient ID associated with revoked tokens provided as context in the patient standalone launch. This will be used to verify access is no longer granted using the revoked token.' # rubocop:disable Layout/LineLength
|
53
|
-
},
|
54
|
-
client_id: {
|
55
|
-
name: :standalone_client_id,
|
56
|
-
title: 'Standalone Client ID',
|
57
|
-
description: 'Client ID provided during registration of Inferno as a standalone application',
|
58
|
-
locked: true
|
59
|
-
},
|
60
|
-
client_secret: {
|
61
|
-
name: :standalone_client_secret,
|
62
|
-
title: 'Standalone Client Secret',
|
63
|
-
description: 'Client Secret provided during registration of Inferno as a standalone application',
|
64
|
-
locked: true
|
65
|
-
}
|
66
|
-
}
|
67
|
-
)
|
8
|
+
input_order :token_revocation_attestation,
|
9
|
+
:token_revocation_notes,
|
10
|
+
:standalone_access_token,
|
11
|
+
:standalone_refresh_token,
|
12
|
+
:standalone_patient_id,
|
13
|
+
:url,
|
14
|
+
:smart_token_url,
|
15
|
+
:standalone_client_id,
|
16
|
+
:standalone_client_secret
|
68
17
|
|
69
18
|
test do
|
70
19
|
title 'Health IT developer demonstrated the ability of the Health IT Module to revoke tokens.'
|
@@ -73,6 +22,27 @@ module ONCCertificationG10TestKit
|
|
73
22
|
authorization server to revoke tokens.
|
74
23
|
)
|
75
24
|
|
25
|
+
input :token_revocation_attestation,
|
26
|
+
title: 'Prior to executing test, Health IT developer demonstrated revoking tokens provided during patient standalone launch.', # rubocop:disable Layout/LineLength
|
27
|
+
type: 'radio',
|
28
|
+
default: 'false',
|
29
|
+
options: {
|
30
|
+
list_options: [
|
31
|
+
{
|
32
|
+
label: 'Yes',
|
33
|
+
value: 'true'
|
34
|
+
},
|
35
|
+
{
|
36
|
+
label: 'No',
|
37
|
+
value: 'false'
|
38
|
+
}
|
39
|
+
]
|
40
|
+
}
|
41
|
+
input :token_revocation_notes,
|
42
|
+
title: 'Notes, if applicable:',
|
43
|
+
type: 'textarea',
|
44
|
+
optional: true
|
45
|
+
|
76
46
|
run do
|
77
47
|
assert token_revocation_attestation == 'true',
|
78
48
|
'Health IT Module did not demonstrate support for application registration for single patients.'
|
@@ -86,6 +56,18 @@ module ONCCertificationG10TestKit
|
|
86
56
|
This test checks that the Patient resource returns unuathorized after token revocation.
|
87
57
|
)
|
88
58
|
|
59
|
+
input :url,
|
60
|
+
title: 'FHIR Endpoint',
|
61
|
+
description: 'URL of the FHIR endpoint used by standalone applications'
|
62
|
+
input :patient_id,
|
63
|
+
name: :standalone_patient_id,
|
64
|
+
title: 'Patient ID',
|
65
|
+
description: 'Patient ID associated with revoked tokens provided as context in the patient standalone launch. This will be used to verify access is no longer granted using the revoked token.' # rubocop:disable Layout/LineLength
|
66
|
+
input :access_token,
|
67
|
+
name: :standalone_access_token,
|
68
|
+
title: 'Revoked Bearer Token',
|
69
|
+
description: 'Prior to the test, please revoke this bearer token from patient standalone launch.'
|
70
|
+
|
89
71
|
fhir_client :revoked_token do
|
90
72
|
url :url
|
91
73
|
bearer_token :access_token
|
@@ -111,6 +93,24 @@ module ONCCertificationG10TestKit
|
|
111
93
|
This test checks that refreshing token fails after token revokation.
|
112
94
|
)
|
113
95
|
|
96
|
+
input :smart_token_url,
|
97
|
+
title: 'OAuth 2.0 Token Endpoint',
|
98
|
+
description: 'OAuth token endpoint provided during the patient standalone launch'
|
99
|
+
input :refresh_token,
|
100
|
+
name: :standalone_refresh_token,
|
101
|
+
title: 'Revoked Refresh Token',
|
102
|
+
description: 'Prior to the test, please revoke this refresh token from patient standalone launch.'
|
103
|
+
input :client_id,
|
104
|
+
name: :standalone_client_id,
|
105
|
+
title: 'Standalone Client ID',
|
106
|
+
description: 'Client ID provided during registration of Inferno as a standalone application',
|
107
|
+
locked: true
|
108
|
+
input :client_secret,
|
109
|
+
name: :standalone_client_secret,
|
110
|
+
title: 'Standalone Client Secret',
|
111
|
+
description: 'Client Secret provided during registration of Inferno as a standalone application',
|
112
|
+
locked: true
|
113
|
+
|
114
114
|
run do
|
115
115
|
skip_if refresh_token.blank?,
|
116
116
|
'Refresh token not provided to test.'
|
@@ -152,7 +152,7 @@ module ONCCertificationG10TestKit
|
|
152
152
|
id :g10_patient_unrestricted_access
|
153
153
|
|
154
154
|
def resource_group
|
155
|
-
USCoreTestKit::PatientGroup
|
155
|
+
USCoreTestKit::USCoreV311::PatientGroup
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
@@ -170,7 +170,7 @@ module ONCCertificationG10TestKit
|
|
170
170
|
id :g10_allergy_intolerance_unrestricted_access
|
171
171
|
|
172
172
|
def resource_group
|
173
|
-
USCoreTestKit::AllergyIntoleranceGroup
|
173
|
+
USCoreTestKit::USCoreV311::AllergyIntoleranceGroup
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
@@ -188,7 +188,7 @@ module ONCCertificationG10TestKit
|
|
188
188
|
id :g10_care_plan_unrestricted_access
|
189
189
|
|
190
190
|
def resource_group
|
191
|
-
USCoreTestKit::CarePlanGroup
|
191
|
+
USCoreTestKit::USCoreV311::CarePlanGroup
|
192
192
|
end
|
193
193
|
end
|
194
194
|
|
@@ -206,7 +206,7 @@ module ONCCertificationG10TestKit
|
|
206
206
|
id :g10_care_team_unrestricted_access
|
207
207
|
|
208
208
|
def resource_group
|
209
|
-
USCoreTestKit::CareTeamGroup
|
209
|
+
USCoreTestKit::USCoreV311::CareTeamGroup
|
210
210
|
end
|
211
211
|
end
|
212
212
|
|
@@ -224,7 +224,7 @@ module ONCCertificationG10TestKit
|
|
224
224
|
id :g10_condition_unrestricted_access
|
225
225
|
|
226
226
|
def resource_group
|
227
|
-
USCoreTestKit::ConditionGroup
|
227
|
+
USCoreTestKit::USCoreV311::ConditionGroup
|
228
228
|
end
|
229
229
|
end
|
230
230
|
|
@@ -242,7 +242,7 @@ module ONCCertificationG10TestKit
|
|
242
242
|
id :g10_device_unrestricted_access
|
243
243
|
|
244
244
|
def resource_group
|
245
|
-
USCoreTestKit::DeviceGroup
|
245
|
+
USCoreTestKit::USCoreV311::DeviceGroup
|
246
246
|
end
|
247
247
|
end
|
248
248
|
|
@@ -260,7 +260,7 @@ module ONCCertificationG10TestKit
|
|
260
260
|
id :g10_diagnostic_report_unrestricted_access
|
261
261
|
|
262
262
|
def resource_group
|
263
|
-
USCoreTestKit::DiagnosticReportLabGroup
|
263
|
+
USCoreTestKit::USCoreV311::DiagnosticReportLabGroup
|
264
264
|
end
|
265
265
|
end
|
266
266
|
|
@@ -278,7 +278,7 @@ module ONCCertificationG10TestKit
|
|
278
278
|
id :g10_document_reference_unrestricted_access
|
279
279
|
|
280
280
|
def resource_group
|
281
|
-
USCoreTestKit::DocumentReferenceGroup
|
281
|
+
USCoreTestKit::USCoreV311::DocumentReferenceGroup
|
282
282
|
end
|
283
283
|
end
|
284
284
|
|
@@ -296,7 +296,7 @@ module ONCCertificationG10TestKit
|
|
296
296
|
id :g10_goal_unrestricted_access
|
297
297
|
|
298
298
|
def resource_group
|
299
|
-
USCoreTestKit::GoalGroup
|
299
|
+
USCoreTestKit::USCoreV311::GoalGroup
|
300
300
|
end
|
301
301
|
end
|
302
302
|
|
@@ -314,7 +314,7 @@ module ONCCertificationG10TestKit
|
|
314
314
|
id :g10_immunization_unrestricted_access
|
315
315
|
|
316
316
|
def resource_group
|
317
|
-
USCoreTestKit::ImmunizationGroup
|
317
|
+
USCoreTestKit::USCoreV311::ImmunizationGroup
|
318
318
|
end
|
319
319
|
end
|
320
320
|
|
@@ -332,7 +332,7 @@ module ONCCertificationG10TestKit
|
|
332
332
|
id :g10_medication_request_access
|
333
333
|
|
334
334
|
def resource_group
|
335
|
-
USCoreTestKit::MedicationRequestGroup
|
335
|
+
USCoreTestKit::USCoreV311::MedicationRequestGroup
|
336
336
|
end
|
337
337
|
end
|
338
338
|
|
@@ -350,7 +350,7 @@ module ONCCertificationG10TestKit
|
|
350
350
|
id :g10_observation_unrestricted_access
|
351
351
|
|
352
352
|
def resource_group
|
353
|
-
USCoreTestKit::PulseOximetryGroup
|
353
|
+
USCoreTestKit::USCoreV311::PulseOximetryGroup
|
354
354
|
end
|
355
355
|
end
|
356
356
|
|
@@ -368,7 +368,7 @@ module ONCCertificationG10TestKit
|
|
368
368
|
id :g10_procedure_unrestricted_access
|
369
369
|
|
370
370
|
def resource_group
|
371
|
-
USCoreTestKit::ProcedureGroup
|
371
|
+
USCoreTestKit::USCoreV311::ProcedureGroup
|
372
372
|
end
|
373
373
|
end
|
374
374
|
end
|
@@ -144,13 +144,14 @@ module ONCCertificationG10TestKit
|
|
144
144
|
end
|
145
145
|
|
146
146
|
test do
|
147
|
-
title 'Health IT Module attested that
|
147
|
+
title 'Health IT Module attested that it is capable of issuing refresh tokens ' \
|
148
|
+
'that are valid for a period of no shorter than three months.'
|
148
149
|
description %(
|
149
|
-
Health IT Module attested that
|
150
|
-
no shorter than three months.
|
150
|
+
Health IT Module attested that it is capable of issuing refresh tokens
|
151
|
+
that are valid for a period of no shorter than three months.
|
151
152
|
)
|
152
153
|
input :refresh_token_period_attestation,
|
153
|
-
title: 'Health IT Module attested that refresh tokens are valid for a period of no shorter than three months.', # rubocop:disable Layout/LineLength
|
154
|
+
title: 'Health IT Module attested that it is capable of issuing refresh tokens that are valid for a period of no shorter than three months.', # rubocop:disable Layout/LineLength
|
154
155
|
type: 'radio',
|
155
156
|
default: 'false',
|
156
157
|
options: {
|
@@ -172,8 +173,8 @@ module ONCCertificationG10TestKit
|
|
172
173
|
|
173
174
|
run do
|
174
175
|
assert refresh_token_period_attestation == 'true',
|
175
|
-
'Health IT Module did not attest that refresh tokens
|
176
|
-
'for a period of no shorter than three months.'
|
176
|
+
'Health IT Module did not attest that it is capable of issuing refresh tokens ' \
|
177
|
+
'that are valid for a period of no shorter than three months.'
|
177
178
|
pass refresh_token_period_notes if refresh_token_period_notes.present?
|
178
179
|
end
|
179
180
|
end
|