us_core_test_kit 0.10.0 → 0.11.0

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_reference_server_311_preset.json +7 -35
  3. data/config/presets/inferno_reference_server_400_preset.json +7 -35
  4. data/config/presets/inferno_reference_server_501_preset.json +7 -35
  5. data/config/presets/inferno_reference_server_610_preset.json +25 -35
  6. data/config/presets/inferno_reference_server_700_preset.json +25 -35
  7. data/lib/us_core_test_kit/custom_groups/base_smart_granular_scopes_group.rb +20 -20
  8. data/lib/us_core_test_kit/custom_groups/smart_app_launch_group.rb +6 -42
  9. data/lib/us_core_test_kit/custom_groups/smart_ehr_launch_stu1.rb +26 -12
  10. data/lib/us_core_test_kit/custom_groups/smart_ehr_launch_stu2.rb +26 -12
  11. data/lib/us_core_test_kit/custom_groups/smart_ehr_launch_stu2_2.rb +26 -12
  12. data/lib/us_core_test_kit/custom_groups/smart_scopes_constants.rb +6 -0
  13. data/lib/us_core_test_kit/custom_groups/smart_standalone_launch_stu1_group.rb +27 -13
  14. data/lib/us_core_test_kit/custom_groups/smart_standalone_launch_stu2_2_group.rb +27 -13
  15. data/lib/us_core_test_kit/custom_groups/smart_standalone_launch_stu2_group.rb +27 -13
  16. data/lib/us_core_test_kit/custom_groups/v3.1.1/capability_statement_group.rb +1 -9
  17. data/lib/us_core_test_kit/custom_groups/v3.1.1/resource_support_test.rb +1 -1
  18. data/lib/us_core_test_kit/custom_groups/v4.0.0/capability_statement_group.rb +1 -9
  19. data/lib/us_core_test_kit/custom_groups/v5.0.1/capability_statement_group.rb +1 -9
  20. data/lib/us_core_test_kit/custom_groups/v6.1.0/capability_statement_group.rb +1 -9
  21. data/lib/us_core_test_kit/custom_groups/v6.1.0/smart_granular_scopes_group.rb +22 -6
  22. data/lib/us_core_test_kit/custom_groups/v7.0.0/capability_statement_group.rb +1 -9
  23. data/lib/us_core_test_kit/custom_groups/v7.0.0/smart_granular_scopes_group.rb +22 -6
  24. data/lib/us_core_test_kit/generated/v3.1.1/us_core_test_suite.rb +7 -5
  25. data/lib/us_core_test_kit/generated/v4.0.0/us_core_test_suite.rb +7 -5
  26. data/lib/us_core_test_kit/generated/v5.0.1/us_core_test_suite.rb +7 -5
  27. data/lib/us_core_test_kit/generated/v6.1.0/granular_scopes1_group.rb +3 -3
  28. data/lib/us_core_test_kit/generated/v6.1.0/granular_scopes2_group.rb +3 -3
  29. data/lib/us_core_test_kit/generated/v6.1.0/us_core_test_suite.rb +7 -5
  30. data/lib/us_core_test_kit/generated/v7.0.0/granular_scopes1_group.rb +3 -3
  31. data/lib/us_core_test_kit/generated/v7.0.0/granular_scopes2_group.rb +3 -3
  32. data/lib/us_core_test_kit/generated/v7.0.0/us_core_test_suite.rb +7 -5
  33. data/lib/us_core_test_kit/generator/templates/granular_scope_group.rb.erb +3 -3
  34. data/lib/us_core_test_kit/generator/templates/suite.rb.erb +7 -5
  35. data/lib/us_core_test_kit/granular_scope_search_test.rb +2 -1
  36. data/lib/us_core_test_kit/search_test.rb +26 -50
  37. data/lib/us_core_test_kit/version.rb +2 -2
  38. metadata +6 -6
@@ -19,9 +19,9 @@ based on the following granular scopes:
19
19
 
20
20
  )
21
21
 
22
- input :granular_scopes_1_credentials,
22
+ input :granular_scopes_1_auth_info,
23
23
  title: 'SMART Credentials for Granular Scopes 1',
24
- type: :oauth_credentials,
24
+ type: :auth_info,
25
25
  locked: true
26
26
 
27
27
  config(
@@ -40,7 +40,7 @@ based on the following granular scopes:
40
40
  )
41
41
 
42
42
  fhir_client do
43
- oauth_credentials :granular_scopes_1_credentials
43
+ auth_info :granular_scopes_1_auth_info
44
44
  url :url
45
45
  end
46
46
 
@@ -19,9 +19,9 @@ based on the following granular scopes:
19
19
 
20
20
  )
21
21
 
22
- input :granular_scopes_2_credentials,
22
+ input :granular_scopes_2_auth_info,
23
23
  title: 'SMART Credentials for Granular Scopes 2',
24
- type: :oauth_credentials,
24
+ type: :auth_info,
25
25
  locked: true
26
26
 
27
27
  config(
@@ -40,7 +40,7 @@ based on the following granular scopes:
40
40
  )
41
41
 
42
42
  fhir_client do
43
- oauth_credentials :granular_scopes_2_credentials
43
+ auth_info :granular_scopes_2_auth_info
44
44
  url :url
45
45
  end
46
46
 
@@ -90,7 +90,8 @@ module USCoreTestKit
90
90
  %r{Unknown Code System 'http://hl7.org/fhir/us/core/CodeSystem/us-core-tags'}, # Validator has an issue with this US Core 5 code system in US Core 6 resource
91
91
  %r{URL value 'http://hl7.org/fhir/us/core/CodeSystem/us-core-tags' does not resolve}, # Validator has an issue with this US Core 5 code system in US Core 6 resource
92
92
  /\A\S+: \S+: URL value '.*' does not resolve/,
93
- %r{Observation.component\[\d+\].value.ofType\(Quantity\): The code provided \(http://unitsofmeasure.org#L/min\) was not found in the value set 'Vital Signs Units'} # Known issue with the Pulse Oximetry Profile
93
+ %r{Observation.component\[\d+\].value.ofType\(Quantity\): The code provided \(http://unitsofmeasure.org#L/min\) was not found in the value set 'Vital Signs Units'}, # Known issue with the Pulse Oximetry Profile
94
+ %r{Slice 'Observation\.value\[x\]:valueQuantity': a matching slice is required, but not found \(from (http://hl7\.org/fhir/StructureDefinition/bmi\|4\.0\.1|http://hl7\.org/fhir/StructureDefinition/bmi\%7C4\.0\.1)\)}
94
95
  ].freeze
95
96
 
96
97
  VERSION_SPECIFIC_MESSAGE_FILTERS = [].freeze
@@ -125,6 +126,7 @@ module USCoreTestKit
125
126
 
126
127
  suite_option :smart_app_launch_version,
127
128
  title: 'SMART App Launch Version',
129
+ default: USCoreOptions::SMART_2,
128
130
  list_options: [
129
131
  {
130
132
  label: 'SMART App Launch 1.0.0',
@@ -132,7 +134,7 @@ module USCoreTestKit
132
134
  },
133
135
  {
134
136
  label: 'SMART App Launch 2.0.0',
135
- value: USCoreOptions::SMART_2
137
+ value: USCoreOptions::SMART_2,
136
138
  },
137
139
  {
138
140
  label: 'SMART App Launch 2.2.0',
@@ -149,14 +151,14 @@ module USCoreTestKit
149
151
  required_suite_options: USCoreOptions::SMART_2_2_REQUIREMENT
150
152
 
151
153
  group do
152
- input :smart_credentials,
154
+ input :smart_auth_info,
153
155
  title: 'OAuth Credentials',
154
- type: :oauth_credentials,
156
+ type: :auth_info,
155
157
  optional: true
156
158
 
157
159
  fhir_client do
158
160
  url :url
159
- oauth_credentials :smart_credentials
161
+ auth_info :smart_auth_info
160
162
  end
161
163
 
162
164
  title 'US Core FHIR API'
@@ -10,9 +10,9 @@ module USCoreTestKit
10
10
  <%= description %>
11
11
  )
12
12
 
13
- input :granular_scopes_<%= group_number %>_credentials,
13
+ input :granular_scopes_<%= group_number %>_auth_info,
14
14
  title: 'SMART Credentials for Granular Scopes <%= group_number %>',
15
- type: :oauth_credentials,
15
+ type: :auth_info,
16
16
  locked: true
17
17
 
18
18
  config(
@@ -31,7 +31,7 @@ module USCoreTestKit
31
31
  )
32
32
 
33
33
  fhir_client do
34
- oauth_credentials :granular_scopes_<%= group_number %>_credentials
34
+ auth_info :granular_scopes_<%= group_number %>_auth_info
35
35
  url :url
36
36
  end
37
37
  <% group_id_list.each do |group_id| %>
@@ -41,7 +41,8 @@ module USCoreTestKit
41
41
  %r{Unknown Code System 'http://hl7.org/fhir/us/core/CodeSystem/us-core-tags'}, # Validator has an issue with this US Core 5 code system in US Core 6 resource
42
42
  %r{URL value 'http://hl7.org/fhir/us/core/CodeSystem/us-core-tags' does not resolve}, # Validator has an issue with this US Core 5 code system in US Core 6 resource
43
43
  /\A\S+: \S+: URL value '.*' does not resolve/,
44
- %r{Observation.component\[\d+\].value.ofType\(Quantity\): The code provided \(http://unitsofmeasure.org#L/min\) was not found in the value set 'Vital Signs Units'} # Known issue with the Pulse Oximetry Profile
44
+ %r{Observation.component\[\d+\].value.ofType\(Quantity\): The code provided \(http://unitsofmeasure.org#L/min\) was not found in the value set 'Vital Signs Units'}, # Known issue with the Pulse Oximetry Profile
45
+ %r{Slice 'Observation\.value\[x\]:valueQuantity': a matching slice is required, but not found \(from (http://hl7\.org/fhir/StructureDefinition/bmi\|4\.0\.1|http://hl7\.org/fhir/StructureDefinition/bmi\%7C4\.0\.1)\)}
45
46
  ].freeze
46
47
  <% if version_specific_message_filters.empty? %>
47
48
  VERSION_SPECIFIC_MESSAGE_FILTERS = [].freeze
@@ -80,6 +81,7 @@ module USCoreTestKit
80
81
 
81
82
  suite_option :smart_app_launch_version,
82
83
  title: 'SMART App Launch Version',
84
+ default: USCoreOptions::SMART_2,
83
85
  list_options: [
84
86
  {
85
87
  label: 'SMART App Launch 1.0.0',
@@ -87,7 +89,7 @@ module USCoreTestKit
87
89
  },
88
90
  {
89
91
  label: 'SMART App Launch 2.0.0',
90
- value: USCoreOptions::SMART_2
92
+ value: USCoreOptions::SMART_2,
91
93
  },
92
94
  {
93
95
  label: 'SMART App Launch 2.2.0',
@@ -104,14 +106,14 @@ module USCoreTestKit
104
106
  required_suite_options: USCoreOptions::SMART_2_2_REQUIREMENT<% end %>
105
107
 
106
108
  group do
107
- input :smart_credentials,
109
+ input :smart_auth_info,
108
110
  title: 'OAuth Credentials',
109
- type: :oauth_credentials,
111
+ type: :auth_info,
110
112
  optional: true
111
113
 
112
114
  fhir_client do
113
115
  url :url
114
- oauth_credentials :smart_credentials
116
+ auth_info :smart_auth_info
115
117
  end
116
118
 
117
119
  title 'US Core FHIR API'
@@ -28,7 +28,8 @@ module USCoreTestKit
28
28
  if request.status != 200
29
29
  []
30
30
  else
31
- fetch_all_bundled_resources.select { |resource| resource.resourceType == resource_type }
31
+ fetch_all_bundled_resources(resource_type: resource_type, bundle: resource)
32
+ .select { |resource| resource.resourceType == resource_type }
32
33
  end
33
34
 
34
35
  mismatched_ids = mismatched_resource_ids(found_resources)
@@ -69,7 +69,7 @@ module USCoreTestKit
69
69
 
70
70
  # TODO: check that only provenance resources for resources matching
71
71
  # granular scopes returned
72
- fetch_all_bundled_resources(additional_resource_types: ['Provenance'], params:)
72
+ fetch_and_assert_all_bundled_resources(additional_resource_types: ['Provenance'], params:)
73
73
  .select { |resource| resource.resourceType == 'Provenance' }
74
74
  end
75
75
  end
@@ -104,7 +104,7 @@ module USCoreTestKit
104
104
  check_search_response
105
105
 
106
106
  resources_returned =
107
- fetch_all_bundled_resources(params:).select { |resource| resource.resourceType == resource_type }
107
+ fetch_and_assert_all_bundled_resources(params:).select { |resource| resource.resourceType == resource_type }
108
108
 
109
109
  return [] if resources_returned.blank?
110
110
 
@@ -139,7 +139,7 @@ module USCoreTestKit
139
139
 
140
140
  check_search_response
141
141
 
142
- post_search_resources = fetch_all_bundled_resources.select { |resource| resource.resourceType == resource_type }
142
+ post_search_resources = fetch_and_assert_all_bundled_resources.select { |resource| resource.resourceType == resource_type }
143
143
 
144
144
  filter_conditions(post_search_resources) if resource_type == 'Condition' && metadata.version == 'v5.0.1'
145
145
  filter_devices(post_search_resources) if resource_type == 'Device'
@@ -247,7 +247,7 @@ module USCoreTestKit
247
247
 
248
248
  search_and_check_response(params_with_comparator)
249
249
 
250
- comparator_resources = fetch_all_bundled_resources(params: params_with_comparator).each do |resource|
250
+ comparator_resources = fetch_and_assert_all_bundled_resources(params: params_with_comparator).each do |resource|
251
251
  check_resource_against_params(resource, params_with_comparator) if resource.resourceType == resource_type
252
252
  end
253
253
  end
@@ -264,7 +264,7 @@ module USCoreTestKit
264
264
  search_and_check_response(new_search_params)
265
265
 
266
266
  reference_with_type_resources =
267
- fetch_all_bundled_resources(params: new_search_params)
267
+ fetch_and_assert_all_bundled_resources(params: new_search_params)
268
268
  .select { |resource| resource.resourceType == resource_type }
269
269
 
270
270
  filter_conditions(reference_with_type_resources) if resource_type == 'Condition' && metadata.version == 'v5.0.1'
@@ -290,7 +290,7 @@ module USCoreTestKit
290
290
  search_and_check_response(search_params)
291
291
 
292
292
  resources_returned =
293
- fetch_all_bundled_resources(params: search_params)
293
+ fetch_and_assert_all_bundled_resources(params: search_params)
294
294
  .select { |resource| resource.resourceType == resource_type }
295
295
 
296
296
  assert resources_returned.present?, "No resources were returned when searching by `system|code`"
@@ -361,7 +361,7 @@ module USCoreTestKit
361
361
  search_and_check_response(search_params)
362
362
 
363
363
  resources_returned =
364
- fetch_all_bundled_resources(params: search_params)
364
+ fetch_and_assert_all_bundled_resources(params: search_params)
365
365
  .select { |resource| resource.resourceType == resource_type }
366
366
 
367
367
  multiple_or_search_params.each do |param_name|
@@ -409,7 +409,7 @@ module USCoreTestKit
409
409
  search_and_check_response(search_params)
410
410
 
411
411
  medications =
412
- fetch_all_bundled_resources(params: search_params)
412
+ fetch_and_assert_all_bundled_resources(params: search_params)
413
413
  .select { |resource| resource.resourceType == 'Medication' }
414
414
  assert medications.present?, 'No Medications were included in the search results'
415
415
 
@@ -546,56 +546,32 @@ module USCoreTestKit
546
546
  msg + ". Please use patients with more information"
547
547
  end
548
548
 
549
- def fetch_all_bundled_resources(
549
+ def fetch_and_assert_all_bundled_resources(
550
+ resource_type: self.resource_type,
550
551
  reply_handler: nil,
551
552
  max_pages: 20,
552
553
  additional_resource_types: [],
553
- resource_type: self.resource_type,
554
554
  params: nil
555
555
  )
556
- page_count = 1
557
- resources = []
558
- bundle = resource
559
-
560
- until bundle.nil? || page_count == max_pages
561
- resources += bundle&.entry&.map { |entry| entry&.resource }
562
- next_bundle_link = bundle&.link&.find { |link| link.relation == 'next' }&.url
563
- reply_handler&.call(response)
564
-
565
- break if next_bundle_link.blank?
566
-
567
- reply = fhir_client.raw_read_url(next_bundle_link)
568
-
569
- store_request('outgoing', tags: tags(params)) { reply }
570
- error_message = cant_resolve_next_bundle_message(next_bundle_link)
571
-
572
- assert_response_status(200)
573
- assert_valid_json(reply.body, error_message)
574
-
575
- bundle = fhir_client.parse_reply(FHIR::Bundle, fhir_client.default_format, reply)
576
-
577
- page_count += 1
578
- end
579
-
580
- valid_resource_types = [resource_type, 'OperationOutcome'].concat(additional_resource_types)
581
- valid_resource_types << 'Medication' if ['MedicationRequest', 'MedicationDispense'].include?(resource_type)
582
-
583
- invalid_resource_types =
584
- resources.reject { |entry| valid_resource_types.include? entry.resourceType }
585
- .map(&:resourceType)
586
- .uniq
556
+ tags = tags(params)
557
+ bundle = resource
558
+ additional_resource_types << 'Medication' if ['MedicationRequest', 'MedicationDispense'].include?(resource_type)
587
559
 
588
- if invalid_resource_types.any?
589
- info "Received resource type(s) #{invalid_resource_types.join(', ')} in search bundle, " \
590
- "but only expected resource types #{valid_resource_types.join(', ')}. " + \
591
- "This is unusual but allowed if the server believes additional resource types are relevant."
592
- end
560
+ assert_handler = Proc.new do |response|
561
+ assert_response_status(200, response: response)
562
+ assert_valid_json(response[:body], "Could not resolve bundle as JSON: #{response[:body]}")
563
+ end
593
564
 
594
- resources
595
- end
565
+ if reply_handler
566
+ reply_and_assert_handler = Proc.new do |response|
567
+ assert_handler.call(response)
568
+ reply_handler.call(response)
569
+ end
570
+ else
571
+ reply_and_assert_handler = assert_handler
572
+ end
596
573
 
597
- def cant_resolve_next_bundle_message(link)
598
- "Could not resolve next bundle: #{link}"
574
+ fetch_all_bundled_resources(resource_type:, bundle:, reply_handler: reply_and_assert_handler, max_pages:, additional_resource_types:, tags:)
599
575
  end
600
576
 
601
577
  def search_param_value(name, resource, include_system: false)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module USCoreTestKit
4
- VERSION = '0.10.0'
5
- LAST_UPDATED = '2024-02-10'
4
+ VERSION = '0.11.0'
5
+ LAST_UPDATED = '2025-03-18'
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: us_core_test_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen MacVicar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-10 00:00:00.000000000 Z
11
+ date: 2025-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inferno_core
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.6.1
19
+ version: 0.6.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.6.1
26
+ version: 0.6.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: smart_app_launch_test_kit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.5.0
33
+ version: 0.6.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.5.0
40
+ version: 0.6.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: tls_test_kit
43
43
  requirement: !ruby/object:Gem::Requirement