onc_certification_g10_test_kit 3.0.1 → 3.2.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/expected_manifest.yml +36 -693
- data/lib/inferno/terminology/fhir_package_manager.rb +16 -14
- data/lib/inferno/terminology/loader.rb +24 -2
- data/lib/inferno/terminology/tasks/download_umls.rb +2 -1
- data/lib/inferno/terminology/tasks/expand_value_set_to_file.rb +1 -1
- data/lib/inferno/terminology/tasks/run_umls_jar.rb +2 -1
- data/lib/inferno/terminology/value_set.rb +58 -56
- data/lib/onc_certification_g10_test_kit/base_token_refresh_group.rb +2 -0
- data/lib/onc_certification_g10_test_kit/bulk_data_group_export_stu1.rb +2 -0
- data/lib/onc_certification_g10_test_kit/bulk_data_group_export_stu2.rb +1 -1
- data/lib/onc_certification_g10_test_kit/bulk_data_group_export_validation.rb +7 -4
- data/lib/onc_certification_g10_test_kit/bulk_export_validation_tester.rb +2 -11
- data/lib/onc_certification_g10_test_kit/configuration_checker.rb +22 -0
- data/lib/onc_certification_g10_test_kit/export_kick_off_performer.rb +3 -2
- data/lib/onc_certification_g10_test_kit/g10_options.rb +46 -0
- data/lib/onc_certification_g10_test_kit/incorrectly_permitted_tls_versions_messages_setup_test.rb +34 -0
- data/lib/onc_certification_g10_test_kit/limited_scope_grant_test.rb +3 -1
- data/lib/onc_certification_g10_test_kit/multi_patient_api_stu1.rb +11 -0
- data/lib/onc_certification_g10_test_kit/multi_patient_api_stu2.rb +10 -0
- data/lib/onc_certification_g10_test_kit/onc_program_procedure.yml +1502 -658
- data/lib/onc_certification_g10_test_kit/profile_selector.rb +34 -24
- data/lib/onc_certification_g10_test_kit/resource_access_test.rb +1 -2
- data/lib/onc_certification_g10_test_kit/restricted_resource_type_access_group.rb +2 -2
- data/lib/onc_certification_g10_test_kit/short_id_manager.rb +46 -0
- data/lib/onc_certification_g10_test_kit/short_id_map.yml +1536 -0
- data/lib/onc_certification_g10_test_kit/single_patient_api_group.rb +7 -0
- data/lib/onc_certification_g10_test_kit/single_patient_us_core_4_api_group.rb +7 -0
- data/lib/onc_certification_g10_test_kit/single_patient_us_core_5_api_group.rb +9 -2
- data/lib/onc_certification_g10_test_kit/smart_app_launch_invalid_aud_group.rb +2 -2
- data/lib/onc_certification_g10_test_kit/smart_ehr_practitioner_app_group.rb +61 -6
- data/lib/onc_certification_g10_test_kit/smart_invalid_token_refresh_test.rb +37 -0
- data/lib/onc_certification_g10_test_kit/smart_limited_app_group.rb +3 -2
- data/lib/onc_certification_g10_test_kit/smart_scopes_test.rb +4 -2
- data/lib/onc_certification_g10_test_kit/smart_standalone_patient_app_group.rb +60 -4
- data/lib/onc_certification_g10_test_kit/unrestricted_resource_type_access_group.rb +7 -4
- data/lib/onc_certification_g10_test_kit/version.rb +1 -1
- data/lib/onc_certification_g10_test_kit/visual_inspection_and_attestations_group.rb +88 -2
- data/lib/onc_certification_g10_test_kit/well_known_capabilities_test.rb +4 -2
- data/lib/onc_certification_g10_test_kit.rb +25 -20
- metadata +15 -10
@@ -1,5 +1,9 @@
|
|
1
|
+
require_relative 'g10_options'
|
2
|
+
|
1
3
|
module ONCCertificationG10TestKit
|
2
4
|
module ProfileSelector
|
5
|
+
include G10Options
|
6
|
+
|
3
7
|
def extract_profile(profile)
|
4
8
|
case profile
|
5
9
|
when 'Medication'
|
@@ -28,8 +32,8 @@ module ONCCertificationG10TestKit
|
|
28
32
|
def select_profile(resource) # rubocop:disable Metrics/CyclomaticComplexity
|
29
33
|
case resource.resourceType
|
30
34
|
when 'Condition'
|
31
|
-
case
|
32
|
-
when
|
35
|
+
case us_core_version
|
36
|
+
when US_CORE_5
|
33
37
|
if resource_contains_category(resource, 'encounter-diagnosis', 'http://terminology.hl7.org/CodeSystem/condition-category')
|
34
38
|
extract_profile('ConditionEncounterDiagnosis')
|
35
39
|
elsif resource_contains_category(resource, 'problem-list-item',
|
@@ -56,28 +60,28 @@ module ONCCertificationG10TestKit
|
|
56
60
|
return extract_profile('PulseOximetry') if observation_contains_code(resource, '59408-5')
|
57
61
|
|
58
62
|
if observation_contains_code(resource, '8289-1')
|
59
|
-
case
|
60
|
-
when
|
63
|
+
case us_core_version
|
64
|
+
when US_CORE_3
|
61
65
|
return extract_profile('HeadCircumference')
|
62
66
|
else
|
63
67
|
return extract_profile('HeadCircumferencePercentile')
|
64
68
|
end
|
65
69
|
end
|
66
70
|
|
67
|
-
|
71
|
+
if observation_contains_code(resource, '9843-4') && !using_us_core_3?
|
72
|
+
return extract_profile('HeadCircumference')
|
73
|
+
end
|
68
74
|
|
69
75
|
# FHIR Vital Signs profiles: https://www.hl7.org/fhir/observation-vitalsigns.html
|
70
76
|
# Vital Signs Panel, Oxygen Saturation are not required by USCDI
|
71
77
|
# Body Mass Index is replaced by :pediatric_bmi_age Profile
|
72
78
|
# Systolic Blood Pressure, Diastolic Blood Pressure are covered by :blood_pressure Profile
|
73
79
|
# Head Circumference is replaced by US Core Head Occipital-frontal Circumference Percentile Profile
|
74
|
-
if observation_contains_code(resource, '39156-5') &&
|
75
|
-
return extract_profile('Bmi')
|
76
|
-
end
|
80
|
+
return extract_profile('Bmi') if observation_contains_code(resource, '39156-5') && !using_us_core_3?
|
77
81
|
|
78
82
|
if observation_contains_code(resource, '85354-9')
|
79
|
-
case
|
80
|
-
when
|
83
|
+
case us_core_version
|
84
|
+
when US_CORE_3
|
81
85
|
return extract_profile('Bp')
|
82
86
|
else
|
83
87
|
return extract_profile('BloodPressure')
|
@@ -85,8 +89,8 @@ module ONCCertificationG10TestKit
|
|
85
89
|
end
|
86
90
|
|
87
91
|
if observation_contains_code(resource, '8302-2')
|
88
|
-
case
|
89
|
-
when
|
92
|
+
case us_core_version
|
93
|
+
when US_CORE_3
|
90
94
|
return extract_profile('Bodyheight')
|
91
95
|
else
|
92
96
|
return extract_profile('BodyHeight')
|
@@ -94,8 +98,8 @@ module ONCCertificationG10TestKit
|
|
94
98
|
end
|
95
99
|
|
96
100
|
if observation_contains_code(resource, '8310-5')
|
97
|
-
case
|
98
|
-
when
|
101
|
+
case us_core_version
|
102
|
+
when US_CORE_3
|
99
103
|
return extract_profile('Bodytemp')
|
100
104
|
else
|
101
105
|
return extract_profile('BodyTemperature')
|
@@ -103,8 +107,8 @@ module ONCCertificationG10TestKit
|
|
103
107
|
end
|
104
108
|
|
105
109
|
if observation_contains_code(resource, '29463-7')
|
106
|
-
case
|
107
|
-
when
|
110
|
+
case us_core_version
|
111
|
+
when US_CORE_3
|
108
112
|
return extract_profile('Bodyweight')
|
109
113
|
else
|
110
114
|
return extract_profile('BodyWeight')
|
@@ -112,8 +116,8 @@ module ONCCertificationG10TestKit
|
|
112
116
|
end
|
113
117
|
|
114
118
|
if observation_contains_code(resource, '8867-4')
|
115
|
-
case
|
116
|
-
when
|
119
|
+
case us_core_version
|
120
|
+
when US_CORE_3
|
117
121
|
return extract_profile('Heartrate')
|
118
122
|
else
|
119
123
|
return extract_profile('HeartRate')
|
@@ -121,31 +125,37 @@ module ONCCertificationG10TestKit
|
|
121
125
|
end
|
122
126
|
|
123
127
|
if observation_contains_code(resource, '9279-1')
|
124
|
-
case
|
125
|
-
when
|
128
|
+
case us_core_version
|
129
|
+
when US_CORE_3
|
126
130
|
return extract_profile('Resprate')
|
127
131
|
else
|
128
132
|
return extract_profile('RespiratoryRate')
|
129
133
|
end
|
130
134
|
end
|
131
135
|
|
132
|
-
if
|
136
|
+
if using_us_core_5? &&
|
133
137
|
resource_contains_category(
|
134
138
|
resource, 'clinical-test', 'http://terminology.hl7.org/CodeSystem/observation-category'
|
135
139
|
)
|
136
140
|
return extract_profile('ObservationClinicalTest')
|
137
141
|
end
|
138
142
|
|
139
|
-
if
|
143
|
+
if using_us_core_5? && observation_contains_code(resource, '76690-7')
|
140
144
|
return extract_profile('ObservationSexualOrientation')
|
141
145
|
end
|
142
146
|
|
143
|
-
if
|
147
|
+
if using_us_core_5? &&
|
144
148
|
resource_contains_category(resource, 'social-history',
|
145
149
|
'http://terminology.hl7.org/CodeSystem/observation-category')
|
146
150
|
return extract_profile('ObservationSocialHistory')
|
147
151
|
end
|
148
152
|
|
153
|
+
if using_us_core_5? &&
|
154
|
+
resource_contains_category(resource, 'imaging',
|
155
|
+
'http://terminology.hl7.org/CodeSystem/observation-category')
|
156
|
+
return extract_profile('ObservationImaging')
|
157
|
+
end
|
158
|
+
|
149
159
|
# We will simply match all Observations of category "survey" to SDOH,
|
150
160
|
# and do not look at the category "sdoh". US Core spec team says that
|
151
161
|
# support for the "sdoh" category is limited, and the validation rules
|
@@ -157,7 +167,7 @@ module ONCCertificationG10TestKit
|
|
157
167
|
# `resource_contains_category(resource, 'sdoh',
|
158
168
|
# 'http://terminology.hl7.org/CodeSystem/observation-category') &&`
|
159
169
|
# along with a specific extract_profile('ObservationSurvey') to catch non-sdoh.
|
160
|
-
if
|
170
|
+
if using_us_core_5? &&
|
161
171
|
resource_contains_category(resource, 'survey',
|
162
172
|
'http://terminology.hl7.org/CodeSystem/observation-category')
|
163
173
|
|
@@ -74,10 +74,9 @@ module ONCCertificationG10TestKit
|
|
74
74
|
body of the response.
|
75
75
|
)
|
76
76
|
begin
|
77
|
+
assert_valid_json(response[:body])
|
77
78
|
parsed_body = JSON.parse(response[:body])
|
78
79
|
assert parsed_body['resourceType'] == 'OperationOutcome', error_message
|
79
|
-
rescue JSON::ParserError
|
80
|
-
assert false, error_message
|
81
80
|
end
|
82
81
|
fhir_search(
|
83
82
|
resource_type,
|
@@ -323,7 +323,7 @@ module ONCCertificationG10TestKit
|
|
323
323
|
)
|
324
324
|
id :g10_encounter_restricted_access
|
325
325
|
|
326
|
-
required_suite_options
|
326
|
+
required_suite_options G10Options::US_CORE_5_REQUIREMENT
|
327
327
|
|
328
328
|
def resource_group
|
329
329
|
USCoreTestKit::USCoreV501::EncounterGroup
|
@@ -343,7 +343,7 @@ module ONCCertificationG10TestKit
|
|
343
343
|
)
|
344
344
|
id :g10_service_request_restricted_access
|
345
345
|
|
346
|
-
required_suite_options
|
346
|
+
required_suite_options G10Options::US_CORE_5_REQUIREMENT
|
347
347
|
|
348
348
|
def resource_group
|
349
349
|
USCoreTestKit::USCoreV501::ServiceRequestGroup
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module ONCCertificationG10TestKit
|
2
|
+
# @private
|
3
|
+
# This module ensures that short test ids don't change
|
4
|
+
module ShortIDManager
|
5
|
+
class << self
|
6
|
+
def all_children(runnable)
|
7
|
+
runnable
|
8
|
+
.children
|
9
|
+
.flat_map { |child| [child] + all_children(child) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def short_id_file_path
|
13
|
+
File.join(__dir__, 'short_id_map.yml')
|
14
|
+
end
|
15
|
+
|
16
|
+
def short_id_map
|
17
|
+
@short_id_map ||= YAML.load_file(short_id_file_path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def assign_short_ids
|
21
|
+
all_children(G10CertificationSuite).each do |runnable|
|
22
|
+
short_id = short_id_map.fetch(runnable.id)
|
23
|
+
runnable.define_singleton_method(:short_id) do
|
24
|
+
short_id
|
25
|
+
end
|
26
|
+
rescue KeyError
|
27
|
+
Inferno::Application['logger'].warn("No short id defined for #{runnable.id}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
### The methods below are only for creating an initial list of short ids
|
32
|
+
|
33
|
+
# Run this in an inferno console to save the current short ids
|
34
|
+
def save_current_short_id_map
|
35
|
+
File.write(short_id_file_path, current_short_id_map.to_yaml)
|
36
|
+
end
|
37
|
+
|
38
|
+
def current_short_id_map
|
39
|
+
@current_short_id_map ||=
|
40
|
+
all_children(G10CertificationSuite).each_with_object({}) do |runnable, mapping|
|
41
|
+
mapping[runnable.id] = runnable.short_id
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|