us_core_test_kit 0.9.3 → 0.10.1

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/config/presets/inferno_reference_server_311_preset.json +66 -0
  3. data/config/presets/inferno_reference_server_400_preset.json +66 -0
  4. data/config/presets/inferno_reference_server_501_preset.json +66 -0
  5. data/config/presets/inferno_reference_server_610_preset.json +66 -0
  6. data/config/presets/inferno_reference_server_700_preset.json +66 -0
  7. data/lib/us_core_test_kit/generated/v3.1.1/us_core_test_suite.rb +22 -3
  8. data/lib/us_core_test_kit/generated/v4.0.0/us_core_test_suite.rb +22 -3
  9. data/lib/us_core_test_kit/generated/v5.0.1/us_core_test_suite.rb +22 -3
  10. data/lib/us_core_test_kit/generated/v6.1.0/us_core_test_suite.rb +22 -3
  11. data/lib/us_core_test_kit/generated/v7.0.0/us_core_test_suite.rb +22 -3
  12. data/lib/us_core_test_kit/generator/templates/granular_scope_group.rb.erb +41 -0
  13. data/lib/us_core_test_kit/generator/templates/granular_scope_read_test.rb.erb +29 -0
  14. data/lib/us_core_test_kit/generator/templates/granular_scope_resource_type_group.rb.erb +19 -0
  15. data/lib/us_core_test_kit/generator/templates/granular_scope_test.rb.erb +38 -0
  16. data/lib/us_core_test_kit/generator/templates/group.rb.erb +24 -0
  17. data/lib/us_core_test_kit/generator/templates/must_support.rb.erb +41 -0
  18. data/lib/us_core_test_kit/generator/templates/practitioner_address_test.rb.erb +32 -0
  19. data/lib/us_core_test_kit/generator/templates/provenance_revinclude_search.rb.erb +50 -0
  20. data/lib/us_core_test_kit/generator/templates/read.rb.erb +26 -0
  21. data/lib/us_core_test_kit/generator/templates/reference_resolution.rb.erb +40 -0
  22. data/lib/us_core_test_kit/generator/templates/search.rb.erb +46 -0
  23. data/lib/us_core_test_kit/generator/templates/suite.rb.erb +162 -0
  24. data/lib/us_core_test_kit/generator/templates/validation.rb.erb +31 -0
  25. data/lib/us_core_test_kit/granular_scope_search_test.rb +2 -1
  26. data/lib/us_core_test_kit/igs/README.md +21 -0
  27. data/lib/us_core_test_kit/metadata.rb +70 -0
  28. data/lib/us_core_test_kit/reference_resolution_test.rb +1 -16
  29. data/lib/us_core_test_kit/search_test.rb +26 -50
  30. data/lib/us_core_test_kit/version.rb +2 -1
  31. data/lib/us_core_test_kit.rb +1 -0
  32. metadata +31 -10
@@ -0,0 +1,70 @@
1
+ require_relative 'version'
2
+
3
+ module USCoreTestKit
4
+ class Metadata < Inferno::TestKit
5
+ id :us_core_test_kit
6
+ title 'US Core Test Kit'
7
+ description <<~DESCRIPTION
8
+ The US Core Test Kit validates the conformance of a server implementation to a specific
9
+ version of the [US Core IG](http://hl7.org/fhir/us/core). Currently, Inferno can test
10
+ against implementations of following versions of the US Core IG:
11
+ [v3.1.1](http://hl7.org/fhir/us/core/STU3.1.1/),
12
+ [v4.0.0](http://hl7.org/fhir/us/core/STU4/),
13
+ [v5.0.1](http://hl7.org/fhir/us/core/STU5.0.1/),
14
+ [v6.1.0](https://hl7.org/fhir/us/core/STU6.1/),
15
+ and
16
+ [v7.0.0](https://hl7.org/fhir/us/core/STU7/).
17
+ <!-- break -->
18
+
19
+ This test kit is [open source](https://github.com/inferno-framework/us-core-test-kit#license)
20
+ and freely available for use or adoption by the health IT community including EHR vendors,
21
+ health app developers, and testing labs. It is built using the
22
+ [Inferno Framework](https://inferno-framework.github.io/inferno-core/).
23
+ The Inferno Framework is designed for reuse and aims to make it easier to build test kits
24
+ for any FHIR-based data exchange.
25
+
26
+ ## Status
27
+
28
+ The US Core Test Kit is actively developed and regularly updated. Starting with STU3,
29
+ each STU sequence is kept up-to-date with the latest version.
30
+
31
+ The test kit currently tests the following requirements:
32
+
33
+ - Support for Capability Statement
34
+ - Support for all US Core Profiles
35
+ - Searches required for each resource
36
+ - Support for Must Support Elements
37
+ - Profile Validation
38
+ - Reference Validation
39
+ - Clinical Notes Guidance
40
+ - Missing Data Guidance
41
+
42
+ See the test descriptions within the test kit for detail on the specific validations
43
+ performed as part of testing these requirements.
44
+
45
+ ## Repository
46
+
47
+ The US Core Test Kit GitHub repository can be [found here](https://github.com/inferno-framework/us-core-test-kit).
48
+
49
+ ## Providing Feedback and Reporting Issues
50
+
51
+ We welcome feedback on the tests, including but not limited to the following areas:
52
+
53
+ - Validation logic, such as potential bugs, lax checks, and unexpected failures.
54
+ - Requirements coverage, such as requirements that have been missed, tests that necessitate
55
+ features that the IG does not require, or other issues with the interpretation of the IG’s requirements.
56
+ - User experience, such as confusing or missing information in the test UI.
57
+
58
+ Please report any issues with this set of tests in the
59
+ [issues section](https://github.com/inferno-framework/us-core-test-kit/issues)
60
+ of the repository.
61
+ DESCRIPTION
62
+ suite_ids [:us_core_v311, :us_core_v400, :us_core_v501, :us_core_v610, :us_core_v700]
63
+ tags ['SMART App Launch', 'US Core']
64
+ last_updated LAST_UPDATED
65
+ version VERSION
66
+ maturity 'High'
67
+ authors ['Stephen MacVicar', 'Yunwei Wang']
68
+ repo 'https://github.com/inferno-framework/us-core-test-kit'
69
+ end
70
+ end
@@ -167,22 +167,7 @@ module USCoreTestKit
167
167
  def resource_is_valid_with_target_profile?(resource, target_profile)
168
168
  return true if target_profile.blank?
169
169
 
170
- # Only need to know if the resource is valid.
171
- # Calling resource_is_valid? causes validation errors to be logged.
172
- validator = find_validator(:default)
173
-
174
- target_profile_with_version = target_profile.include?('|') ? target_profile : "#{target_profile}|#{metadata.profile_version}"
175
-
176
- validator_response = validator.validate(resource, target_profile_with_version)
177
- outcome = validator.operation_outcome_from_hl7_wrapped_response(validator_response)
178
-
179
- message_hashes = outcome.issue&.map { |issue| validator.message_hash_from_issue(issue, resource) } || []
180
-
181
- message_hashes.concat(validator.additional_validation_messages(resource, target_profile_with_version))
182
-
183
- validator.filter_messages(message_hashes)
184
-
185
- message_hashes.none? { |message_hash| message_hash[:type] == 'error' }
170
+ resource_is_valid?(resource:, profile_url: target_profile, add_messages_to_runnable: false)
186
171
  end
187
172
  end
188
173
  end
@@ -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,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module USCoreTestKit
4
- VERSION = '0.9.3'
4
+ VERSION = '0.10.1'
5
+ LAST_UPDATED = '2025-02-25'
5
6
  end
@@ -1,3 +1,4 @@
1
+ require_relative 'us_core_test_kit/metadata'
1
2
  require_relative 'us_core_test_kit/generated/v3.1.1/us_core_test_suite'
2
3
  require_relative 'us_core_test_kit/generated/v4.0.0/us_core_test_suite'
3
4
  require_relative 'us_core_test_kit/generated/v5.0.1/us_core_test_suite'
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.9.3
4
+ version: 0.10.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen MacVicar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-05 00:00:00.000000000 Z
11
+ date: 2025-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inferno_core
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.5.0
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.5.0
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.4.6
33
+ version: 0.5.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.4.6
40
+ version: 0.5.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: tls_test_kit
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.2.0
47
+ version: 0.3.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.2.0
54
+ version: 0.3.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: database_cleaner-sequel
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +116,11 @@ extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
118
  - LICENSE
119
+ - config/presets/inferno_reference_server_311_preset.json
120
+ - config/presets/inferno_reference_server_400_preset.json
121
+ - config/presets/inferno_reference_server_501_preset.json
122
+ - config/presets/inferno_reference_server_610_preset.json
123
+ - config/presets/inferno_reference_server_700_preset.json
119
124
  - lib/us_core_test_kit.rb
120
125
  - lib/us_core_test_kit/custom_groups/base_smart_granular_scopes_group.rb
121
126
  - lib/us_core_test_kit/custom_groups/capability_statement/conformance_support_test.rb
@@ -2537,12 +2542,26 @@ files:
2537
2542
  - lib/us_core_test_kit/generator/search_test_generator.rb
2538
2543
  - lib/us_core_test_kit/generator/special_cases.rb
2539
2544
  - lib/us_core_test_kit/generator/suite_generator.rb
2545
+ - lib/us_core_test_kit/generator/templates/granular_scope_group.rb.erb
2546
+ - lib/us_core_test_kit/generator/templates/granular_scope_read_test.rb.erb
2547
+ - lib/us_core_test_kit/generator/templates/granular_scope_resource_type_group.rb.erb
2548
+ - lib/us_core_test_kit/generator/templates/granular_scope_test.rb.erb
2549
+ - lib/us_core_test_kit/generator/templates/group.rb.erb
2550
+ - lib/us_core_test_kit/generator/templates/must_support.rb.erb
2551
+ - lib/us_core_test_kit/generator/templates/practitioner_address_test.rb.erb
2552
+ - lib/us_core_test_kit/generator/templates/provenance_revinclude_search.rb.erb
2553
+ - lib/us_core_test_kit/generator/templates/read.rb.erb
2554
+ - lib/us_core_test_kit/generator/templates/reference_resolution.rb.erb
2555
+ - lib/us_core_test_kit/generator/templates/search.rb.erb
2556
+ - lib/us_core_test_kit/generator/templates/suite.rb.erb
2557
+ - lib/us_core_test_kit/generator/templates/validation.rb.erb
2540
2558
  - lib/us_core_test_kit/generator/terminology_binding_metadata_extractor.rb
2541
2559
  - lib/us_core_test_kit/generator/validation_test_generator.rb
2542
2560
  - lib/us_core_test_kit/generator/value_extractor.rb
2543
2561
  - lib/us_core_test_kit/granular_scope.rb
2544
2562
  - lib/us_core_test_kit/granular_scope_read_test.rb
2545
2563
  - lib/us_core_test_kit/granular_scope_search_test.rb
2564
+ - lib/us_core_test_kit/igs/README.md
2546
2565
  - lib/us_core_test_kit/igs/us_core_311.tgz
2547
2566
  - lib/us_core_test_kit/igs/us_core_311/StructureDefinition-bodyheight.json
2548
2567
  - lib/us_core_test_kit/igs/us_core_311/StructureDefinition-bodytemp.json
@@ -2564,6 +2583,7 @@ files:
2564
2583
  - lib/us_core_test_kit/igs/us_core_700/StructureDefinition-condition-assertedDate.json
2565
2584
  - lib/us_core_test_kit/igs/us_core_700/ValueSet-SmokingStatusType.json
2566
2585
  - lib/us_core_test_kit/igs/us_core_700/ValueSet-servicerequest-category.json
2586
+ - lib/us_core_test_kit/metadata.rb
2567
2587
  - lib/us_core_test_kit/must_support_test.rb
2568
2588
  - lib/us_core_test_kit/practitioner_address_test.rb
2569
2589
  - lib/us_core_test_kit/primitive_type.rb
@@ -2581,6 +2601,7 @@ homepage: https://github.com/inferno-framework/us-core-test-kit
2581
2601
  licenses:
2582
2602
  - Apache-2.0
2583
2603
  metadata:
2604
+ inferno_test_kit: 'true'
2584
2605
  homepage_uri: https://github.com/inferno-framework/us-core-test-kit
2585
2606
  source_code_uri: https://github.com/inferno-framework/us-core-test-kit
2586
2607
  post_install_message:
@@ -2591,14 +2612,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
2591
2612
  requirements:
2592
2613
  - - ">="
2593
2614
  - !ruby/object:Gem::Version
2594
- version: 3.1.2
2615
+ version: 3.3.6
2595
2616
  required_rubygems_version: !ruby/object:Gem::Requirement
2596
2617
  requirements:
2597
2618
  - - ">="
2598
2619
  - !ruby/object:Gem::Version
2599
2620
  version: '0'
2600
2621
  requirements: []
2601
- rubygems_version: 3.5.7
2622
+ rubygems_version: 3.5.22
2602
2623
  signing_key:
2603
2624
  specification_version: 4
2604
2625
  summary: US Core Inferno tests