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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/inferno/terminology/expected_manifest.yml +36 -693
  3. data/lib/inferno/terminology/fhir_package_manager.rb +16 -14
  4. data/lib/inferno/terminology/loader.rb +24 -2
  5. data/lib/inferno/terminology/tasks/download_umls.rb +2 -1
  6. data/lib/inferno/terminology/tasks/expand_value_set_to_file.rb +1 -1
  7. data/lib/inferno/terminology/tasks/run_umls_jar.rb +2 -1
  8. data/lib/inferno/terminology/value_set.rb +58 -56
  9. data/lib/onc_certification_g10_test_kit/base_token_refresh_group.rb +2 -0
  10. data/lib/onc_certification_g10_test_kit/bulk_data_group_export_stu1.rb +2 -0
  11. data/lib/onc_certification_g10_test_kit/bulk_data_group_export_stu2.rb +1 -1
  12. data/lib/onc_certification_g10_test_kit/bulk_data_group_export_validation.rb +7 -4
  13. data/lib/onc_certification_g10_test_kit/bulk_export_validation_tester.rb +2 -11
  14. data/lib/onc_certification_g10_test_kit/configuration_checker.rb +22 -0
  15. data/lib/onc_certification_g10_test_kit/export_kick_off_performer.rb +3 -2
  16. data/lib/onc_certification_g10_test_kit/g10_options.rb +46 -0
  17. data/lib/onc_certification_g10_test_kit/incorrectly_permitted_tls_versions_messages_setup_test.rb +34 -0
  18. data/lib/onc_certification_g10_test_kit/limited_scope_grant_test.rb +3 -1
  19. data/lib/onc_certification_g10_test_kit/multi_patient_api_stu1.rb +11 -0
  20. data/lib/onc_certification_g10_test_kit/multi_patient_api_stu2.rb +10 -0
  21. data/lib/onc_certification_g10_test_kit/onc_program_procedure.yml +1502 -658
  22. data/lib/onc_certification_g10_test_kit/profile_selector.rb +34 -24
  23. data/lib/onc_certification_g10_test_kit/resource_access_test.rb +1 -2
  24. data/lib/onc_certification_g10_test_kit/restricted_resource_type_access_group.rb +2 -2
  25. data/lib/onc_certification_g10_test_kit/short_id_manager.rb +46 -0
  26. data/lib/onc_certification_g10_test_kit/short_id_map.yml +1536 -0
  27. data/lib/onc_certification_g10_test_kit/single_patient_api_group.rb +7 -0
  28. data/lib/onc_certification_g10_test_kit/single_patient_us_core_4_api_group.rb +7 -0
  29. data/lib/onc_certification_g10_test_kit/single_patient_us_core_5_api_group.rb +9 -2
  30. data/lib/onc_certification_g10_test_kit/smart_app_launch_invalid_aud_group.rb +2 -2
  31. data/lib/onc_certification_g10_test_kit/smart_ehr_practitioner_app_group.rb +61 -6
  32. data/lib/onc_certification_g10_test_kit/smart_invalid_token_refresh_test.rb +37 -0
  33. data/lib/onc_certification_g10_test_kit/smart_limited_app_group.rb +3 -2
  34. data/lib/onc_certification_g10_test_kit/smart_scopes_test.rb +4 -2
  35. data/lib/onc_certification_g10_test_kit/smart_standalone_patient_app_group.rb +60 -4
  36. data/lib/onc_certification_g10_test_kit/unrestricted_resource_type_access_group.rb +7 -4
  37. data/lib/onc_certification_g10_test_kit/version.rb +1 -1
  38. data/lib/onc_certification_g10_test_kit/visual_inspection_and_attestations_group.rb +88 -2
  39. data/lib/onc_certification_g10_test_kit/well_known_capabilities_test.rb +4 -2
  40. data/lib/onc_certification_g10_test_kit.rb +25 -20
  41. metadata +15 -10
@@ -11,28 +11,30 @@ module Inferno
11
11
  class << self
12
12
  REGISTRY_SERVER_URL = 'https://packages.fhir.org'.freeze
13
13
  REQUIRED_VSAC_VALUE_SET_URLS = [
14
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.8',
15
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1099.30',
16
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.6',
17
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.4',
18
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.11.20.9.38',
19
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.1066',
20
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.1.11.10267',
21
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1099.27',
22
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.88.12.80.17',
23
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.5',
24
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1021.32',
25
14
  'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.836',
26
15
  'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.1.11.14914',
27
16
  'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.837',
28
17
  'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.877',
29
18
  'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1',
30
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.1',
31
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.88.12.80.17',
32
19
  'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1021.102',
33
20
  'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1021.103',
34
- 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.2',
35
21
  'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.2074.1.1.3'
22
+ # The ValueSets below are needed when building all of the terminology
23
+ # rather than only the terminology for required bindings.
24
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.8',
25
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1099.30',
26
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.6',
27
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.4',
28
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.11.20.9.38',
29
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.1066',
30
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.1.11.10267',
31
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1099.27',
32
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.88.12.80.17',
33
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1010.5',
34
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1021.32',
35
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.1',
36
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.88.12.80.17',
37
+ # 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1186.2'
36
38
  ].freeze
37
39
 
38
40
  # Get the FHIR Package from the registry.
@@ -57,7 +57,6 @@ module Inferno
57
57
  code_systems << 'urn:oid:2.16.840.1.113883.6.13'
58
58
  end
59
59
  code_systems << 'urn:oid:2.16.840.1.113883.6.101' if code_systems.include? 'http://nucc.org/provider-taxonomy'
60
- code_systems << 'urn:oid:2.16.840.1.113883.6.101' if code_systems.include? 'http://hl7.org/fhir/questionnaire-answers-status'
61
60
  code_systems.uniq!
62
61
  end
63
62
 
@@ -184,11 +183,34 @@ module Inferno
184
183
  File.write(metadata_path, metadata.to_yaml)
185
184
  end
186
185
 
186
+ def value_sets_to_load
187
+ @value_sets_to_load ||=
188
+ YAML.load_file(File.join('resources', 'value_sets.yml'))
189
+ end
190
+
191
+ # Run this method in an inferno console to update the list of value set
192
+ # bindings. This is not done automatically during the build because
193
+ # Inferno isn't loaded during the build process.
194
+ def save_new_value_set_list
195
+ all_metadata =
196
+ USCoreTestKit::USCoreV311::USCoreTestSuite.metadata +
197
+ USCoreTestKit::USCoreV400::USCoreTestSuite.metadata +
198
+ USCoreTestKit::USCoreV501::USCoreTestSuite.metadata
199
+
200
+ all_metadata =
201
+ all_metadata
202
+ .flat_map { |metadata| metadata.bindings.map { |bind| bind.merge(profile_url: metadata.profile_url) } }
203
+ .select { |metadata| metadata[:strength] == 'required' }
204
+ .uniq
205
+
206
+ File.write(File.join('resources', 'value_sets.yml'), all_metadata.to_yaml)
207
+ end
208
+
187
209
  # NOTE: resources/value_sets.yml controls which value sets get loaded.
188
210
  # It is currently manually generated from the US Core metadata.
189
211
  def get_value_sets(strengths)
190
212
  expected_vs_urls =
191
- YAML.load_file(File.join('resources', 'value_sets.yml'))
213
+ value_sets_to_load
192
214
  .select { |vs| strengths.include? vs[:strength] }
193
215
  .map! { |vs| vs[:system] }
194
216
  .compact
@@ -11,7 +11,8 @@ module Inferno
11
11
  UMLS_FILE_URLS = {
12
12
  '2019' => 'https://download.nlm.nih.gov/umls/kss/2019AB/umls-2019AB-full.zip',
13
13
  '2020' => 'https://download.nlm.nih.gov/umls/kss/2020AB/umls-2020AB-full.zip',
14
- '2021' => 'https://download.nlm.nih.gov/umls/kss/2021AA/umls-2021AA-full.zip'
14
+ '2021' => 'https://download.nlm.nih.gov/umls/kss/2021AA/umls-2021AA-full.zip',
15
+ '2022' => 'https://download.nlm.nih.gov/umls/kss/2022AA/umls-2022AA-full.zip'
15
16
  }.freeze
16
17
  TICKET_GRANTING_TICKET_URL = 'https://utslogin.nlm.nih.gov/cas/v1/api-key'.freeze
17
18
 
@@ -16,7 +16,7 @@ module Inferno
16
16
  # Before writing the JSON to a file at the end
17
17
  end_vs = nil if type == 'json'
18
18
 
19
- %w[2019 2020 2021].each do |version|
19
+ %w[2022].each do |version|
20
20
  Loader.register_umls_db File.join(TEMP_DIR, version, 'umls.db')
21
21
  Loader.load_value_sets_from_directory(PACKAGE_DIR, true)
22
22
  vs = Repositories::ValueSets.new.find(value_set_url)
@@ -11,7 +11,8 @@ module Inferno
11
11
  VERSIONED_PROPS = {
12
12
  '2019' => 'inferno_2019.prop',
13
13
  '2020' => 'inferno_2020.prop',
14
- '2021' => 'inferno_2021.prop'
14
+ '2021' => 'inferno_2021.prop',
15
+ '2022' => 'inferno_2022.prop'
15
16
  }.freeze
16
17
 
17
18
  attr_reader :version
@@ -32,9 +32,9 @@ module Inferno
32
32
 
33
33
  # UMLS Vocabulary: https://www.nlm.nih.gov/research/umls/sourcereleasedocs/index.html
34
34
  SAB = {
35
- 'http://www.nlm.nih.gov/research/umls/rxnorm' => {
36
- abbreviation: 'RXNORM',
37
- name: 'RxNorm Vocabulary'
35
+ 'http://unitsofmeasure.org' => {
36
+ abbreviation: 'NCI_UCUM',
37
+ name: 'Unified Code for Units of Measure (UCUM)'
38
38
  }.freeze,
39
39
  'http://loinc.org' => {
40
40
  abbreviation: 'LNC',
@@ -43,59 +43,61 @@ module Inferno
43
43
  'http://snomed.info/sct' => {
44
44
  abbreviation: 'SNOMEDCT_US',
45
45
  name: 'Systematized Nomenclature of Medicine-Clinical Terms (SNOMED CT), US Edition'
46
- }.freeze,
47
- 'http://www.cms.gov/Medicare/Coding/ICD10' => {
48
- abbreviation: 'ICD10PCS',
49
- name: 'ICD-10 Procedure Coding System (ICD-10-PCS)'
50
- }.freeze,
51
- 'http://hl7.org/fhir/sid/cvx' => {
52
- abbreviation: 'CVX',
53
- name: 'Vaccines Administered (CVX)'
54
- }.freeze,
55
- 'http://hl7.org/fhir/sid/icd-10-cm' => {
56
- abbreviation: 'ICD10CM',
57
- name: 'International Classification of Diseases, Tenth Revision, Clinical Modification (ICD-10-CM)'
58
- }.freeze,
59
- 'http://hl7.org/fhir/sid/icd-9-cm' => {
60
- abbreviation: 'ICD9CM',
61
- name: 'International Classification of Diseases, Ninth Revision, Clinical Modification (ICD-9-CM)'
62
- }.freeze,
63
- 'http://unitsofmeasure.org' => {
64
- abbreviation: 'NCI_UCUM',
65
- name: 'Unified Code for Units of Measure (UCUM)'
66
- }.freeze,
67
- 'urn:oid:2.16.840.1.113883.6.101' => {
68
- abbreviation: 'NUCCHCPT',
69
- name: 'National Uniform Claim Committee - Health Care Provider Taxonomy (NUCCHCPT)'
70
- },
71
- 'http://nucc.org/provider-taxonomy' => {
72
- abbreviation: 'NUCCHCPT',
73
- name: 'National Uniform Claim Committee - Health Care Provider Taxonomy (NUCCHCPT)'
74
- }.freeze,
75
- 'http://www.ama-assn.org/go/cpt' => {
76
- abbreviation: 'CPT',
77
- name: 'Current Procedural Terminology (CPT)'
78
- }.freeze,
79
- 'http://www.cms.gov/Medicare/Coding/HCPCSReleaseCodeSets' => {
80
- abbreviation: 'HCPCS',
81
- name: 'Healthcare Common Procedure Coding System (HCPCS)'
82
- }.freeze,
83
- 'urn:oid:2.16.840.1.113883.6.285' => {
84
- abbreviation: 'HCPCS',
85
- name: 'Healthcare Common Procedure Coding System (HCPCS)'
86
- }.freeze,
87
- 'urn:oid:2.16.840.1.113883.6.13' => {
88
- abbreviation: 'CDT',
89
- name: 'Code on Dental Procedures and Nomenclature (CDT)'
90
- }.freeze,
91
- 'http://ada.org/cdt' => {
92
- abbreviation: 'CDT',
93
- name: 'Code on Dental Procedures and Nomenclature (CDT)'
94
- },
95
- 'http://www.ada.org/cdt' => {
96
- abbreviation: 'CDT',
97
- name: 'Code on Dental Procedures and Nomenclature (CDT)'
98
- }
46
+ }.freeze
47
+ # The systems below are needed if building all terminology rather than
48
+ # only the required bindings.
49
+ # 'http://www.nlm.nih.gov/research/umls/rxnorm' => {
50
+ # abbreviation: 'RXNORM',
51
+ # name: 'RxNorm Vocabulary'
52
+ # }.freeze,
53
+ # 'http://www.cms.gov/Medicare/Coding/ICD10' => {
54
+ # abbreviation: 'ICD10PCS',
55
+ # name: 'ICD-10 Procedure Coding System (ICD-10-PCS)'
56
+ # }.freeze,
57
+ # 'http://hl7.org/fhir/sid/cvx' => {
58
+ # abbreviation: 'CVX',
59
+ # name: 'Vaccines Administered (CVX)'
60
+ # }.freeze,
61
+ # 'http://hl7.org/fhir/sid/icd-10-cm' => {
62
+ # abbreviation: 'ICD10CM',
63
+ # name: 'International Classification of Diseases, Tenth Revision, Clinical Modification (ICD-10-CM)'
64
+ # }.freeze,
65
+ # 'http://hl7.org/fhir/sid/icd-9-cm' => {
66
+ # abbreviation: 'ICD9CM',
67
+ # name: 'International Classification of Diseases, Ninth Revision, Clinical Modification (ICD-9-CM)'
68
+ # }.freeze,
69
+ # 'urn:oid:2.16.840.1.113883.6.101' => {
70
+ # abbreviation: 'NUCCHCPT',
71
+ # name: 'National Uniform Claim Committee - Health Care Provider Taxonomy (NUCCHCPT)'
72
+ # },
73
+ # 'http://nucc.org/provider-taxonomy' => {
74
+ # abbreviation: 'NUCCHCPT',
75
+ # name: 'National Uniform Claim Committee - Health Care Provider Taxonomy (NUCCHCPT)'
76
+ # }.freeze,
77
+ # 'http://www.ama-assn.org/go/cpt' => {
78
+ # abbreviation: 'CPT',
79
+ # name: 'Current Procedural Terminology (CPT)'
80
+ # }.freeze,
81
+ # 'http://www.cms.gov/Medicare/Coding/HCPCSReleaseCodeSets' => {
82
+ # abbreviation: 'HCPCS',
83
+ # name: 'Healthcare Common Procedure Coding System (HCPCS)'
84
+ # }.freeze,
85
+ # 'urn:oid:2.16.840.1.113883.6.285' => {
86
+ # abbreviation: 'HCPCS',
87
+ # name: 'Healthcare Common Procedure Coding System (HCPCS)'
88
+ # }.freeze,
89
+ # 'urn:oid:2.16.840.1.113883.6.13' => {
90
+ # abbreviation: 'CDT',
91
+ # name: 'Code on Dental Procedures and Nomenclature (CDT)'
92
+ # }.freeze,
93
+ # 'http://ada.org/cdt' => {
94
+ # abbreviation: 'CDT',
95
+ # name: 'Code on Dental Procedures and Nomenclature (CDT)'
96
+ # },
97
+ # 'http://www.ada.org/cdt' => {
98
+ # abbreviation: 'CDT',
99
+ # name: 'Code on Dental Procedures and Nomenclature (CDT)'
100
+ # }
99
101
  }.freeze
100
102
 
101
103
  CODE_SYS = {
@@ -1,3 +1,5 @@
1
+ require_relative 'smart_invalid_token_refresh_test'
2
+
1
3
  module ONCCertificationG10TestKit
2
4
  class BaseTokenRefreshGroup < Inferno::TestGroup
3
5
  title 'Token Refresh'
@@ -221,6 +221,7 @@ module ONCCertificationG10TestKit
221
221
  assert request.response_header('content-type')&.value&.include?('application/json'),
222
222
  'Content-Type not application/json'
223
223
 
224
+ assert_valid_json(response[:body])
224
225
  response_body = JSON.parse(response[:body])
225
226
 
226
227
  ['transactionTime', 'request', 'requiresAccessToken', 'output', 'error'].each do |key|
@@ -255,6 +256,7 @@ module ONCCertificationG10TestKit
255
256
  run do
256
257
  assert status_response.present?, 'Bulk Data Server status response not found'
257
258
 
259
+ assert_valid_json(status_response)
258
260
  status_output = JSON.parse(status_response)['output']
259
261
  assert status_output, 'Bulk Data Server status response does not contain output'
260
262
 
@@ -32,7 +32,7 @@ module ONCCertificationG10TestKit
32
32
 
33
33
  run do
34
34
  ['application/fhir+ndjson', 'application/ndjson', 'ndjson'].each do |format|
35
- perform_export_kick_off_request(params: "_outputFormat=#{format}")
35
+ perform_export_kick_off_request(params: { _outputFormat: format })
36
36
  assert_response_status(202)
37
37
 
38
38
  delete_export_kick_off_request
@@ -578,7 +578,7 @@ module ONCCertificationG10TestKit
578
578
  for missing data elements and value set verification.
579
579
  DESCRIPTION
580
580
 
581
- required_suite_options us_core_version: 'us_core_5'
581
+ required_suite_options G10Options::US_CORE_5_REQUIREMENT
582
582
 
583
583
  include BulkExportValidationTester
584
584
 
@@ -598,7 +598,8 @@ module ONCCertificationG10TestKit
598
598
  conform to the US Core RelatedPerson profile. This includes checking
599
599
  for missing data elements and value set verification.
600
600
  DESCRIPTION
601
- required_suite_options us_core_version: 'us_core_5'
601
+
602
+ required_suite_options G10Options::US_CORE_5_REQUIREMENT
602
603
 
603
604
  include BulkExportValidationTester
604
605
 
@@ -620,7 +621,8 @@ module ONCCertificationG10TestKit
620
621
  data elements and value set verification. This test is omitted if bulk
621
622
  data export does not return any QuestionnaireResponse resources.
622
623
  DESCRIPTION
623
- required_suite_options us_core_version: 'us_core_5'
624
+
625
+ required_suite_options G10Options::US_CORE_5_REQUIREMENT
624
626
 
625
627
  include BulkExportValidationTester
626
628
 
@@ -642,7 +644,8 @@ module ONCCertificationG10TestKit
642
644
  data elements and value set verification. This test is omitted if bulk
643
645
  data export does not return any resources.
644
646
  DESCRIPTION
645
- required_suite_options us_core_version: 'us_core_5'
647
+
648
+ required_suite_options G10Options::US_CORE_5_REQUIREMENT
646
649
 
647
650
  include BulkExportValidationTester
648
651
 
@@ -4,6 +4,7 @@ module ONCCertificationG10TestKit
4
4
  module BulkExportValidationTester
5
5
  include USCoreTestKit::MustSupportTest
6
6
  include ProfileSelector
7
+ include G10Options
7
8
 
8
9
  attr_reader :metadata
9
10
 
@@ -11,17 +12,6 @@ module ONCCertificationG10TestKit
11
12
  MIN_RESOURCE_COUNT = 2
12
13
  OMIT_KLASS = ['Medication', 'Location', 'QuestionnaireResponse', 'PractitionerRole'].freeze
13
14
 
14
- def versioned_us_core_module
15
- case suite_options[:us_core_version]
16
- when 'us_core_5'
17
- USCoreTestKit::USCoreV501
18
- when 'us_core_4'
19
- USCoreTestKit::USCoreV400
20
- else
21
- USCoreTestKit::USCoreV311
22
- end
23
- end
24
-
25
15
  def metadata_list
26
16
  @metadata_list ||=
27
17
  versioned_us_core_module::USCoreTestSuite
@@ -197,6 +187,7 @@ module ONCCertificationG10TestKit
197
187
  skip_if (requires_access_token == 'true' && bearer_token.blank?),
198
188
  'Could not verify this functionality when Bearer Token is required and not provided'
199
189
 
190
+ assert_valid_json(status_output)
200
191
  file_list = JSON.parse(status_output).select { |file| file['type'] == resource_type }
201
192
  if file_list.empty?
202
193
  message = "No #{resource_type} resource file item returned by server."
@@ -42,6 +42,19 @@ module ONCCertificationG10TestKit
42
42
  }]
43
43
  end
44
44
 
45
+ def code_system_version_messages
46
+ path = File.join('resources', 'terminology', 'validators', 'bloom', 'metadata.yml')
47
+ return '' unless File.exist? path
48
+
49
+ cs_metadata = YAML.load_file(path)
50
+ message = "Terminology was generated based on the following code system versions:\n"
51
+ cs_metadata.each do |_url, metadata|
52
+ message += "* #{metadata[:name]}: version #{metadata[:versions].join(', ')}\n"
53
+ end
54
+
55
+ message
56
+ end
57
+
45
58
  def terminology_messages # rubocop:disable Metrics/CyclomaticComplexity
46
59
  success_messages = []
47
60
  warning_messages = []
@@ -64,6 +77,15 @@ module ONCCertificationG10TestKit
64
77
  end
65
78
  end
66
79
 
80
+ code_system_messages = code_system_version_messages
81
+
82
+ if code_system_version_messages.present?
83
+ messages << {
84
+ type: 'info',
85
+ message: code_system_messages
86
+ }
87
+ end
88
+
67
89
  if success_messages.present?
68
90
  messages << {
69
91
  type: 'info',
@@ -1,13 +1,14 @@
1
1
  module ONCCertificationG10TestKit
2
2
  module ExportKickOffPerformer
3
- def perform_export_kick_off_request(use_token: true, params: '')
3
+ def perform_export_kick_off_request(use_token: true, params: {})
4
4
  skip_if use_token && bearer_token.blank?, 'Could not verify this functionality when bearer token is not set'
5
5
 
6
6
  headers = { accept: 'application/fhir+json', prefer: 'respond-async' }
7
7
  headers.merge!({ authorization: "Bearer #{bearer_token}" }) if use_token
8
8
 
9
9
  url = "Group/#{group_id}/$export"
10
- url.concat("?#{params}") unless params.empty?
10
+ param_str = params.map { |k, v| URI.encode_www_form(k => v) }.join('&')
11
+ url.concat("?#{param_str}") unless param_str.empty?
11
12
  get(url, client: :bulk_server, name: :export, headers: headers)
12
13
  end
13
14
 
@@ -0,0 +1,46 @@
1
+ module ONCCertificationG10TestKit
2
+ module G10Options
3
+ US_CORE_3 = 'us_core_3'.freeze
4
+ US_CORE_4 = 'us_core_4'.freeze
5
+ US_CORE_5 = 'us_core_5'.freeze
6
+
7
+ BULK_DATA_1 = 'multi_patient_api_stu1'.freeze
8
+ BULK_DATA_2 = 'multi_patient_api_stu2'.freeze
9
+
10
+ SMART_1 = 'smart_app_launch_1'.freeze
11
+ SMART_2 = 'smart_app_launch_2'.freeze
12
+
13
+ US_CORE_3_REQUIREMENT = { us_core_version: US_CORE_3 }.freeze
14
+ US_CORE_4_REQUIREMENT = { us_core_version: US_CORE_4 }.freeze
15
+ US_CORE_5_REQUIREMENT = { us_core_version: US_CORE_5 }.freeze
16
+
17
+ BULK_DATA_1_REQUIREMENT = { multi_patient_version: BULK_DATA_1 }.freeze
18
+ BULK_DATA_2_REQUIREMENT = { multi_patient_version: BULK_DATA_2 }.freeze
19
+
20
+ SMART_1_REQUIREMENT = { smart_app_launch_version: SMART_1 }.freeze
21
+ SMART_2_REQUIREMENT = { smart_app_launch_version: SMART_2 }.freeze
22
+
23
+ def us_core_version
24
+ suite_options[:us_core_version]
25
+ end
26
+
27
+ def using_us_core_3?
28
+ us_core_version == US_CORE_3
29
+ end
30
+
31
+ def using_us_core_5?
32
+ us_core_version == US_CORE_5
33
+ end
34
+
35
+ def versioned_us_core_module
36
+ case us_core_version
37
+ when US_CORE_5
38
+ USCoreTestKit::USCoreV501
39
+ when US_CORE_4
40
+ USCoreTestKit::USCoreV400
41
+ else
42
+ USCoreTestKit::USCoreV311
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,34 @@
1
+ module ONCCertificationG10TestKit
2
+ class IncorrectlyPermittedTLSVersionsMessagesSetupTest < Inferno::Test
3
+ id :g10_incorrectly_permitted_tls_versions_messages_setup
4
+ title 'Handle TLS Warning Messages'
5
+
6
+ input :incorrectly_permitted_tls_versions_messages
7
+ output :unique_incorrectly_permitted_tls_versions_messages,
8
+ :tls_documentation_required
9
+
10
+ run do
11
+ pass_if incorrectly_permitted_tls_versions_messages.blank?
12
+
13
+ warning do
14
+ new_warning_messages = incorrectly_permitted_tls_versions_messages&.split("\n")
15
+
16
+ pass_if new_warning_messages.blank?
17
+
18
+ raw_previous_warning_messages =
19
+ Inferno::Repositories::SessionData.new.load(
20
+ test_session_id: test_session_id,
21
+ name: 'unique_incorrectly_permitted_tls_versions_messages'
22
+ )
23
+
24
+ previous_warning_messages =
25
+ raw_previous_warning_messages.blank? ? [] : raw_previous_warning_messages.split("\n")
26
+
27
+ warning_messages = (previous_warning_messages + new_warning_messages).uniq
28
+
29
+ output unique_incorrectly_permitted_tls_versions_messages: warning_messages.join("\n"),
30
+ tls_documentation_required: 'true'
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,7 @@
1
1
  module ONCCertificationG10TestKit
2
2
  class LimitedScopeGrantTest < Inferno::Test
3
+ include G10Options
4
+
3
5
  title 'OAuth token exchange response grants scope that is limited to those selected by user'
4
6
  description %(
5
7
  The ONC certification criteria requires that patients are capable of
@@ -33,7 +35,7 @@ module ONCCertificationG10TestKit
33
35
  (POSSIBLE_RESOURCES + ['Encounter', 'ServiceRequest']).freeze
34
36
 
35
37
  def possible_resources
36
- return V5_POSSIBLE_RESOURCES if suite_options[:us_core_version] == 'us_core_5'
38
+ return V5_POSSIBLE_RESOURCES if using_us_core_5?
37
39
 
38
40
  POSSIBLE_RESOURCES
39
41
  end
@@ -1,6 +1,7 @@
1
1
  require_relative 'bulk_data_authorization'
2
2
  require_relative 'bulk_data_group_export_stu1'
3
3
  require_relative 'bulk_data_group_export_validation'
4
+ require_relative 'incorrectly_permitted_tls_versions_messages_setup_test'
4
5
 
5
6
  module ONCCertificationG10TestKit
6
7
  class MultiPatientAPIGroupSTU1 < Inferno::TestGroup
@@ -62,7 +63,17 @@ module ONCCertificationG10TestKit
62
63
  This test returns an access token.
63
64
  DESCRIPTION
64
65
 
66
+ test from: :g10_incorrectly_permitted_tls_versions_messages_setup,
67
+ id: :g10_bulk_auth_tls_messages_setup
68
+
65
69
  group from: :bulk_data_group_export
70
+
71
+ test from: :g10_incorrectly_permitted_tls_versions_messages_setup,
72
+ id: :g10_bulk_group_export_tls_messages_setup
73
+
66
74
  group from: :bulk_data_group_export_validation
75
+
76
+ test from: :g10_incorrectly_permitted_tls_versions_messages_setup,
77
+ id: :g10_bulk_group_export_validation_messages_setup
67
78
  end
68
79
  end
@@ -62,7 +62,17 @@ module ONCCertificationG10TestKit
62
62
  This test returns an access token.
63
63
  DESCRIPTION
64
64
 
65
+ test from: :g10_incorrectly_permitted_tls_versions_messages_setup,
66
+ id: :g10_bulk_auth_tls_messages_setup
67
+
65
68
  group from: :bulk_data_group_export_stu2
69
+
70
+ test from: :g10_incorrectly_permitted_tls_versions_messages_setup,
71
+ id: :g10_bulk_group_export_tls_messages_setup
72
+
66
73
  group from: :bulk_data_group_export_validation
74
+
75
+ test from: :g10_incorrectly_permitted_tls_versions_messages_setup,
76
+ id: :g10_bulk_group_export_validation_messages_setup
67
77
  end
68
78
  end