us_core_test_kit 0.4.4 → 0.4.6

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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/us_core_test_kit/custom_groups/capability_statement/profile_support_test.rb +14 -17
  3. data/lib/us_core_test_kit/custom_groups/v3.1.1/capability_statement_group.rb +1 -1
  4. data/lib/us_core_test_kit/custom_groups/v4.0.0/capability_statement_group.rb +1 -1
  5. data/lib/us_core_test_kit/custom_groups/v5.0.1/capability_statement_group.rb +1 -1
  6. data/lib/us_core_test_kit/generated/v3.1.1/us_core_test_suite.rb +2 -2
  7. data/lib/us_core_test_kit/generated/v4.0.0/device/metadata.yml +0 -2
  8. data/lib/us_core_test_kit/generated/v4.0.0/device_group.rb +0 -2
  9. data/lib/us_core_test_kit/generated/v4.0.0/medication_request/medication_request_reference_resolution_test.rb +1 -0
  10. data/lib/us_core_test_kit/generated/v4.0.0/medication_request/metadata.yml +1 -1
  11. data/lib/us_core_test_kit/generated/v4.0.0/metadata.yml +1 -1
  12. data/lib/us_core_test_kit/generated/v4.0.0/us_core_test_suite.rb +2 -2
  13. data/lib/us_core_test_kit/generated/v5.0.1/device/metadata.yml +0 -2
  14. data/lib/us_core_test_kit/generated/v5.0.1/device_group.rb +0 -2
  15. data/lib/us_core_test_kit/generated/v5.0.1/medication_request/medication_request_reference_resolution_test.rb +1 -0
  16. data/lib/us_core_test_kit/generated/v5.0.1/medication_request/metadata.yml +1 -1
  17. data/lib/us_core_test_kit/generated/v5.0.1/metadata.yml +6 -1
  18. data/lib/us_core_test_kit/generated/v5.0.1/service_request/metadata.yml +5 -0
  19. data/lib/us_core_test_kit/generated/v5.0.1/us_core_test_suite.rb +2 -2
  20. data/lib/us_core_test_kit/generator/group_generator.rb +0 -5
  21. data/lib/us_core_test_kit/generator/must_support_metadata_extractor.rb +7 -167
  22. data/lib/us_core_test_kit/generator/must_support_metadata_extractor_us_core_3.rb +39 -0
  23. data/lib/us_core_test_kit/generator/must_support_metadata_extractor_us_core_4.rb +90 -0
  24. data/lib/us_core_test_kit/generator/must_support_metadata_extractor_us_core_5.rb +108 -0
  25. data/lib/us_core_test_kit/generator.rb +1 -1
  26. data/lib/us_core_test_kit/version.rb +1 -1
  27. data/lib/us_core_test_kit.rb +0 -1
  28. metadata +5 -4
  29. data/lib/us_core_test_kit/custom_groups/v4.0.0/device_udi_pi_test.rb +0 -40
  30. data/lib/us_core_test_kit/ext/fhir_models.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aac6a564a32ae165aafa5464db0cf48406798016af086d3f27eb3b89c7c6358a
4
- data.tar.gz: 5dfd9dec3bc2559f5c02d985d08bcd8766673c5b292114c4f225d950125c35d3
3
+ metadata.gz: 827607a65eeb7956db852bbf500ad1d9d55f03403e6eb9075d2adb6186e69b2f
4
+ data.tar.gz: efabaf62e09af2fed1de8a5e15e5bcc104ff744dbcfe4976577774a92700a700
5
5
  SHA512:
6
- metadata.gz: 55352a177a081274e200990644114ba019c09d7e684b4d40edf3c1ce3e2138434058bd7b9c7eea21361c77d08f5010a51b06cf774a2a5ac97db08421d8f0700d
7
- data.tar.gz: c1aa7c927b0cc9a3c3181ebc122a17f85bf8d9a9c8b411292a13bccd42520f3cdd5fe01da347f7a9e4121d17404df56cedfac2c686d37dec11ef743c669b02d9
6
+ metadata.gz: 07a7bffbc53564983eb5c28944f98983108abf34be06f96eafff061edfc6bc4f800db1634b7e2414d452c063e926a97d834429c762825c0d72dd83eae58eb3be
7
+ data.tar.gz: 4dcfe3c97fb35c3319f466936a3c09ea84d9c887b02d487ce1b0a14de2e999c0097b9d6d55e9e319f10f102693b0e58d8ccdcdb26861e35b51c39cdb35a3c931
@@ -9,7 +9,9 @@ module USCoreTestKit
9
9
  The US Core Server SHALL:
10
10
  1. Support the US Core Patient resource profile.
11
11
  2. Support at least one additional resource profile from the list of US
12
- Core Profiles.
12
+ Core Profiles.
13
+
14
+ In order to support USCDI, servers must support all USCDI resources.
13
15
  ```
14
16
  )
15
17
  uses_request :capability_statement
@@ -23,30 +25,25 @@ module USCoreTestKit
23
25
  &.each_with_object([]) do |rest, resources|
24
26
  rest.resource.each { |resource| resources << resource.type }
25
27
  end.uniq
26
- supported_profiles =
27
- capability_statement.rest
28
- &.flat_map(&:resource)
29
- &.flat_map { |resource| resource.supportedProfile + [resource.profile] }
30
- &.compact || []
31
- supported_profiles.map! { |profile_url| profile_url.split('|').first }
32
28
 
33
29
  assert supported_resources.include?('Patient'), 'US Core Patient profile not supported'
34
30
 
35
- target_profiles = config.options[:target_profiles]
31
+ us_core_resources = config.options[:us_core_resources]
36
32
 
37
- other_resources = target_profiles.keys.reject { |resource_type| resource_type == 'Patient' }
33
+ other_resources = us_core_resources.reject { |resource_type| resource_type == 'Patient' }
38
34
  other_resources_supported = other_resources.any? { |resource| supported_resources.include? resource }
39
35
  assert other_resources_supported, 'No US Core resources other than Patient are supported'
40
36
 
41
- target_profiles.each do |resource_type, profiles|
42
- next unless supported_resources.include? resource_type
37
+ if config.options[:required_resources].present?
38
+ missing_resources = config.options[:required_resources] - supported_resources
39
+
40
+ missing_resource_list =
41
+ missing_resources
42
+ .map { |resource| "`#{resource}`" }
43
+ .join(', ')
43
44
 
44
- profiles.each do |profile|
45
- warning do
46
- assert supported_profiles&.include?(profile),
47
- "CapabilityStatement does not claim support for US Core #{resource_type} profile: #{profile}"
48
- end
49
- end
45
+ assert missing_resources.empty?,
46
+ "The CapabilityStatement did not list support for the following resources: #{missing_resource_list}"
50
47
  end
51
48
  end
52
49
  end
@@ -102,7 +102,7 @@ module USCoreTestKit
102
102
 
103
103
  test from: :us_core_profile_support do
104
104
  config(
105
- options: { target_profiles: PROFILES }
105
+ options: { us_core_resources: PROFILES.keys }
106
106
  )
107
107
  end
108
108
  end
@@ -106,7 +106,7 @@ module USCoreTestKit
106
106
 
107
107
  test from: :us_core_profile_support do
108
108
  config(
109
- options: { target_profiles: PROFILES }
109
+ options: { us_core_resources: PROFILES.keys }
110
110
  )
111
111
  end
112
112
 
@@ -118,7 +118,7 @@ module USCoreTestKit
118
118
 
119
119
  test from: :us_core_profile_support do
120
120
  config(
121
- options: { target_profiles: PROFILES }
121
+ options: { us_core_resources: PROFILES.keys }
122
122
  )
123
123
  end
124
124
 
@@ -54,8 +54,8 @@ module USCoreTestKit
54
54
  version VERSION
55
55
 
56
56
  VALIDATION_MESSAGE_FILTERS = [
57
- %r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris$},
58
- %r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris$},
57
+ %r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
58
+ %r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
59
59
  /Observation\.effective\.ofType\(Period\): .*vs-1:/, # Invalid invariant in FHIR v4.0.1
60
60
  /Observation\.effective\.ofType\(Period\): .*us-core-1:/, # Invalid invariant in US Core v3.1.1
61
61
  /Provenance.agent\[\d*\]: Rule provenance-1/ #Invalid invariant in US Core v5.0.1
@@ -136,8 +136,6 @@
136
136
  :file_name: device_must_support_test.rb
137
137
  - :id: us_core_v400_device_reference_resolution_test
138
138
  :file_name: device_reference_resolution_test.rb
139
- - :id: us_core_v400_device_udi_pi_test
140
- :file_name: "../../custom_groups/v4.0.0/device_udi_pi_test.rb"
141
139
  :id: us_core_v400_device
142
140
  :file_name: device_group.rb
143
141
  :delayed_references: []
@@ -5,7 +5,6 @@ require_relative 'device/device_provenance_revinclude_search_test'
5
5
  require_relative 'device/device_validation_test'
6
6
  require_relative 'device/device_must_support_test'
7
7
  require_relative 'device/device_reference_resolution_test'
8
- require_relative '../../custom_groups/v4.0.0/device_udi_pi_test'
9
8
 
10
9
  module USCoreTestKit
11
10
  module USCoreV400
@@ -84,7 +83,6 @@ read succeeds.
84
83
  test from: :us_core_v400_device_validation_test
85
84
  test from: :us_core_v400_device_must_support_test
86
85
  test from: :us_core_v400_device_reference_resolution_test
87
- test from: :us_core_v400_device_udi_pi_test
88
86
  end
89
87
  end
90
88
  end
@@ -19,6 +19,7 @@ module USCoreTestKit
19
19
 
20
20
  * MedicationRequest.encounter
21
21
  * MedicationRequest.medication[x]
22
+ * MedicationRequest.reportedReference
22
23
  * MedicationRequest.requester
23
24
  * MedicationRequest.subject
24
25
  )
@@ -150,7 +150,7 @@
150
150
  :original_path: reported[x]
151
151
  - :path: reportedReference
152
152
  :original_path: reported[x]
153
- :type:
153
+ :types:
154
154
  - Reference
155
155
  :target_profiles:
156
156
  - http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitioner
@@ -2529,7 +2529,7 @@
2529
2529
  :original_path: reported[x]
2530
2530
  - :path: reportedReference
2531
2531
  :original_path: reported[x]
2532
- :type:
2532
+ :types:
2533
2533
  - Reference
2534
2534
  :target_profiles:
2535
2535
  - http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitioner
@@ -56,8 +56,8 @@ module USCoreTestKit
56
56
  version VERSION
57
57
 
58
58
  VALIDATION_MESSAGE_FILTERS = [
59
- %r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris$},
60
- %r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris$},
59
+ %r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
60
+ %r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
61
61
  /Observation\.effective\.ofType\(Period\): .*vs-1:/, # Invalid invariant in FHIR v4.0.1
62
62
  /Observation\.effective\.ofType\(Period\): .*us-core-1:/, # Invalid invariant in US Core v3.1.1
63
63
  /Provenance.agent\[\d*\]: Rule provenance-1/ #Invalid invariant in US Core v5.0.1
@@ -136,8 +136,6 @@
136
136
  :file_name: device_must_support_test.rb
137
137
  - :id: us_core_v501_device_reference_resolution_test
138
138
  :file_name: device_reference_resolution_test.rb
139
- - :id: us_core_v400_device_udi_pi_test
140
- :file_name: "../../custom_groups/v4.0.0/device_udi_pi_test.rb"
141
139
  :id: us_core_v501_device
142
140
  :file_name: device_group.rb
143
141
  :delayed_references: []
@@ -5,7 +5,6 @@ require_relative 'device/device_provenance_revinclude_search_test'
5
5
  require_relative 'device/device_validation_test'
6
6
  require_relative 'device/device_must_support_test'
7
7
  require_relative 'device/device_reference_resolution_test'
8
- require_relative '../../custom_groups/v4.0.0/device_udi_pi_test'
9
8
 
10
9
  module USCoreTestKit
11
10
  module USCoreV501
@@ -84,7 +83,6 @@ read succeeds.
84
83
  test from: :us_core_v501_device_validation_test
85
84
  test from: :us_core_v501_device_must_support_test
86
85
  test from: :us_core_v501_device_reference_resolution_test
87
- test from: :us_core_v400_device_udi_pi_test
88
86
  end
89
87
  end
90
88
  end
@@ -19,6 +19,7 @@ module USCoreTestKit
19
19
 
20
20
  * MedicationRequest.encounter
21
21
  * MedicationRequest.medication[x]
22
+ * MedicationRequest.reportedReference
22
23
  * MedicationRequest.requester
23
24
  * MedicationRequest.subject
24
25
  )
@@ -161,7 +161,7 @@
161
161
  :original_path: reported[x]
162
162
  - :path: reportedReference
163
163
  :original_path: reported[x]
164
- :type:
164
+ :types:
165
165
  - Reference
166
166
  :target_profiles:
167
167
  - http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitioner
@@ -3079,7 +3079,7 @@
3079
3079
  :original_path: reported[x]
3080
3080
  - :path: reportedReference
3081
3081
  :original_path: reported[x]
3082
- :type:
3082
+ :types:
3083
3083
  - Reference
3084
3084
  :target_profiles:
3085
3085
  - http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitioner
@@ -10047,6 +10047,11 @@
10047
10047
  - sdoh
10048
10048
  - '386053000'
10049
10049
  - '410606002'
10050
+ - '108252007'
10051
+ - '363679005'
10052
+ - '409063005'
10053
+ - '409073007'
10054
+ - '387713003'
10050
10055
  :elements:
10051
10056
  - :path: status
10052
10057
  - :path: intent
@@ -170,6 +170,11 @@
170
170
  - sdoh
171
171
  - '386053000'
172
172
  - '410606002'
173
+ - '108252007'
174
+ - '363679005'
175
+ - '409063005'
176
+ - '409073007'
177
+ - '387713003'
173
178
  :elements:
174
179
  - :path: status
175
180
  - :path: intent
@@ -65,8 +65,8 @@ module USCoreTestKit
65
65
  version VERSION
66
66
 
67
67
  VALIDATION_MESSAGE_FILTERS = [
68
- %r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris$},
69
- %r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris$},
68
+ %r{Sub-extension url 'introspect' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
69
+ %r{Sub-extension url 'revoke' is not defined by the Extension http://fhir-registry\.smarthealthit\.org/StructureDefinition/oauth-uris},
70
70
  /Observation\.effective\.ofType\(Period\): .*vs-1:/, # Invalid invariant in FHIR v4.0.1
71
71
  /Observation\.effective\.ofType\(Period\): .*us-core-1:/, # Invalid invariant in US Core v3.1.1
72
72
  /Provenance.agent\[\d*\]: Rule provenance-1/ #Invalid invariant in US Core v5.0.1
@@ -110,11 +110,6 @@ module USCoreTestKit
110
110
  return if group_metadata.reformatted_version == 'v311'
111
111
 
112
112
  case group_metadata.resource
113
- when 'Device'
114
- group_metadata.add_test(
115
- id: 'us_core_v400_device_udi_pi_test',
116
- file_name: '../../custom_groups/v4.0.0/device_udi_pi_test.rb'
117
- )
118
113
  when 'DocumentReference'
119
114
  group_metadata.add_test(
120
115
  id: 'us_core_v400_document_reference_custodian_test',
@@ -1,4 +1,7 @@
1
1
  require_relative 'value_extractor'
2
+ require_relative 'must_support_metadata_extractor_us_core_3'
3
+ require_relative 'must_support_metadata_extractor_us_core_4'
4
+ require_relative 'must_support_metadata_extractor_us_core_5'
2
5
 
3
6
  module USCoreTestKit
4
7
  class Generator
@@ -218,7 +221,7 @@ module USCoreTestKit
218
221
  path: "#{current_metadata[:path].delete_suffix('[x]')}#{type.code.upcase_first}",
219
222
  original_path: current_metadata[:path]
220
223
  }
221
- metadata[:type] = [type.code] if save_type_code?(type)
224
+ metadata[:types] = [type.code] if save_type_code?(type)
222
225
  handle_type_must_support_target_profiles(type, metadata) if type.code == 'Reference'
223
226
 
224
227
  metadata
@@ -288,18 +291,14 @@ module USCoreTestKit
288
291
  remove_vital_sign_component
289
292
  remove_blood_pressure_value
290
293
  remove_observation_data_absent_reason
291
- add_must_support_choices
292
294
 
293
295
  case profile.version
294
296
  when '3.1.1'
295
- remove_document_reference_custodian
297
+ MustSupportMetadataExtractorUsCore3.new(profile, @must_supports).handle_special_cases
296
298
  when '4.0.0'
297
- add_device_distinct_identifier
298
- add_patient_uscdi_elements
299
+ MustSupportMetadataExtractorUsCore4.new(profile, @must_supports).handle_special_cases
299
300
  when '5.0.1'
300
- add_patient_uscdi_elements
301
- add_document_reference_category_values
302
- remove_survey_questionnaire_response
301
+ MustSupportMetadataExtractorUsCore5.new(profile, @must_supports).handle_special_cases
303
302
  end
304
303
  end
305
304
 
@@ -346,165 +345,6 @@ module USCoreTestKit
346
345
  end
347
346
  end
348
347
  end
349
-
350
- def remove_device_carrier
351
- if profile.type == 'Device'
352
- @must_supports[:elements].delete_if do |element|
353
- ['udiCarrier.carrierAIDC', 'udiCarrier.carrierHRF'].include?(element[:path])
354
- end
355
- end
356
- end
357
-
358
- # US Core clarified that server implmentation is not required to support DocumentReference.custodian (FHIR-28393)
359
- def remove_document_reference_custodian
360
- if profile.type == 'DocumentReference'
361
- @must_supports[:elements].delete_if do |element|
362
- element[:path] == 'custodian'
363
- end
364
- end
365
- end
366
-
367
- def remove_document_reference_attachment_data_url
368
- if profile.type == 'DocumentReference'
369
- @must_supports[:elements].delete_if do |element|
370
- ['content.attachment.data', 'content.attachment.url'].include?(element[:path])
371
- end
372
- end
373
- end
374
-
375
- def add_must_support_choices
376
- choices = []
377
-
378
- choices << { paths: ['content.attachment.data', 'content.attachment.url'] } if profile.type == 'DocumentReference'
379
-
380
- case profile.version
381
- when '3.1.1'
382
- choices << { paths: ['udiCarrier.carrierAIDC', 'udiCarrier.carrierHRF'] } if profile.type == 'Device'
383
- when '4.0.0'
384
- case profile.type
385
- when 'Encounter'
386
- choices << { paths: ['reasonCode', 'reasonReference'] }
387
- choices << { paths: ['location.location', 'serviceProvider'] }
388
- when 'MedicationRequest'
389
- choices << { paths: ['reportedBoolean', 'reportedReference'] }
390
- end
391
- when '5.0.1'
392
- case profile.type
393
- when 'CareTeam'
394
- choices << {
395
- target_profiles: [
396
- 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitioner',
397
- 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitionerrole'
398
- ]
399
- }
400
- when 'Condition'
401
- choices << {
402
- paths: ['onsetDateTime'],
403
- extension_ids: ['Condition.extension:assertedDate']
404
- }
405
- when 'Encounter'
406
- choices << { paths: ['reasonCode', 'reasonReference'] }
407
- choices << { paths: ['location.location', 'serviceProvider'] }
408
- when 'MedicationRequest'
409
- choices << { paths: ['reportedBoolean', 'reportedReference'] }
410
- end
411
- end
412
-
413
- @must_supports[:choices] = choices if choices.present?
414
- end
415
-
416
- def add_device_distinct_identifier
417
- if profile.type == 'Device'
418
- # FHIR-36303 US Core 4.0.0 mistakenly removed MS from Device.distinctIdentifier
419
- # This will be fixed in US Core 5.0.0
420
- @must_supports[:elements] << {
421
- path: 'distinctIdentifier'
422
- }
423
- end
424
- end
425
-
426
- def add_patient_uscdi_elements
427
- return unless profile.type == 'Patient'
428
-
429
- #US Core 4.0.0 Section 10.112.1.1 Additional USCDI v1 Requirement:
430
- @must_supports[:extensions] << {
431
- id: 'Patient.extension:race',
432
- url: 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race',
433
- uscdi_only: true
434
- }
435
- @must_supports[:extensions] << {
436
- id: 'Patient.extension:ethnicity',
437
- url: 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity',
438
- uscdi_only: true
439
- }
440
- @must_supports[:extensions] << {
441
- id: 'Patient.extension:birthsex',
442
- url: 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex',
443
- uscdi_only: true
444
- }
445
- @must_supports[:elements] << {
446
- path: 'name.suffix',
447
- uscdi_only: true
448
- }
449
- @must_supports[:elements] << {
450
- path: 'name.period.end',
451
- uscdi_only: true
452
- }
453
- @must_supports[:elements] << {
454
- path: 'telecom',
455
- uscdi_only: true
456
- }
457
- @must_supports[:elements] << {
458
- path: 'communication',
459
- uscdi_only: true
460
- }
461
- # Though telecom.system, telecom.value, telecom.use, and communication.language are marked as MustSupport since US Core v4.0.0,
462
- # their parent elements telecom, and communication are not MustSupport but listed under "Additional USCDI requirements"
463
- # According to the updated FHIR spec that "When a child element is defined as Must Support and the parent element isn't,
464
- # a system must support the child if it support the parent, but there's no expectation that the system must support the parent.",
465
- # We add uscdi_only tag to these elements
466
- @must_supports[:elements].each do |element|
467
- path = element[:path]
468
- element[:uscdi_only] = true if path.include?('telecom.') || path.include?('communication.')
469
- end
470
-
471
- if profile.version == '5.0.1'
472
- @must_supports[:extensions] << {
473
- id: 'Patient.extension:genderIdentity',
474
- url: 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-genderIdentity',
475
- uscdi_only: true
476
- }
477
- @must_supports[:elements] << {
478
- path: 'address.use',
479
- fixed_value: 'old',
480
- uscdi_only: true
481
- }
482
- @must_supports[:elements] << {
483
- path: 'name.use',
484
- fixed_value: 'old',
485
- uscdi_only: true
486
- }
487
- end
488
- end
489
-
490
- def add_document_reference_category_values
491
- return unless profile.type == 'DocumentReference'
492
-
493
- slice = @must_supports[:slices].find{|slice| slice[:path] == 'category'}
494
-
495
- slice[:discriminator][:values] = ['clinical-note'] if slice.present?
496
- end
497
-
498
- # FHIR-37794 Server systems are not required to support US Core QuestionnaireResponse
499
- def remove_survey_questionnaire_response
500
- return unless profile.type == 'Observation' &&
501
- ['us-core-observation-survey', 'us-core-observation-sdoh-assessment'].include?(profile.id)
502
-
503
- element = @must_supports[:elements].find { |element| element[:path] == 'derivedFrom' }
504
- element[:target_profiles].delete_if do |url|
505
- url == 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-questionnaireresponse'
506
- end
507
- end
508
348
  end
509
349
  end
510
350
  end
@@ -0,0 +1,39 @@
1
+ module USCoreTestKit
2
+ class Generator
3
+ class MustSupportMetadataExtractorUsCore3
4
+ attr_accessor :profile, :must_supports
5
+
6
+ def initialize(profile, must_supports)
7
+ self.profile = profile
8
+ self.must_supports = must_supports
9
+ end
10
+
11
+ def handle_special_cases
12
+ add_must_support_choices
13
+ remove_document_reference_custodian
14
+ end
15
+
16
+ def add_must_support_choices
17
+ choices = []
18
+
19
+ case profile.type
20
+ when 'Device'
21
+ choices << { paths: ['udiCarrier.carrierAIDC', 'udiCarrier.carrierHRF'] }
22
+ when 'DocumentReference'
23
+ choices << { paths: ['content.attachment.data', 'content.attachment.url'] }
24
+ end
25
+
26
+ must_supports[:choices] = choices if choices.present?
27
+ end
28
+
29
+ # US Core clarified that server implmentation is not required to support DocumentReference.custodian (FHIR-28393)
30
+ def remove_document_reference_custodian
31
+ return unless profile.type == 'DocumentReference'
32
+
33
+ must_supports[:elements].delete_if do |element|
34
+ element[:path] == 'custodian'
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,90 @@
1
+ module USCoreTestKit
2
+ class Generator
3
+ class MustSupportMetadataExtractorUsCore4
4
+ attr_accessor :profile, :must_supports
5
+
6
+ def initialize(profile, must_supports)
7
+ self.profile = profile
8
+ self.must_supports = must_supports
9
+ end
10
+
11
+ def handle_special_cases
12
+ add_must_support_choices
13
+ add_device_distinct_identifier
14
+ add_patient_uscdi_elements
15
+ end
16
+
17
+ def add_must_support_choices
18
+ choices = []
19
+
20
+ case profile.type
21
+ when 'DocumentReference'
22
+ choices << { paths: ['content.attachment.data', 'content.attachment.url'] }
23
+ when 'Encounter'
24
+ choices << { paths: ['reasonCode', 'reasonReference'] }
25
+ choices << { paths: ['location.location', 'serviceProvider'] }
26
+ when 'MedicationRequest'
27
+ choices << { paths: ['reportedBoolean', 'reportedReference'] }
28
+ end
29
+
30
+ must_supports[:choices] = choices if choices.present?
31
+ end
32
+
33
+ def add_device_distinct_identifier
34
+ if profile.type == 'Device'
35
+ # FHIR-36303 US Core 4.0.0 mistakenly removed MS from Device.distinctIdentifier
36
+ # This will be fixed in US Core 5.0.0
37
+ must_supports[:elements] << {
38
+ path: 'distinctIdentifier'
39
+ }
40
+ end
41
+ end
42
+
43
+ def add_patient_uscdi_elements
44
+ return unless profile.type == 'Patient'
45
+
46
+ #US Core 4.0.0 Section 10.112.1.1 Additional USCDI v1 Requirement:
47
+ must_supports[:extensions] << {
48
+ id: 'Patient.extension:race',
49
+ url: 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race',
50
+ uscdi_only: true
51
+ }
52
+ must_supports[:extensions] << {
53
+ id: 'Patient.extension:ethnicity',
54
+ url: 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity',
55
+ uscdi_only: true
56
+ }
57
+ must_supports[:extensions] << {
58
+ id: 'Patient.extension:birthsex',
59
+ url: 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex',
60
+ uscdi_only: true
61
+ }
62
+ must_supports[:elements] << {
63
+ path: 'name.suffix',
64
+ uscdi_only: true
65
+ }
66
+ must_supports[:elements] << {
67
+ path: 'name.period.end',
68
+ uscdi_only: true
69
+ }
70
+ must_supports[:elements] << {
71
+ path: 'telecom',
72
+ uscdi_only: true
73
+ }
74
+ must_supports[:elements] << {
75
+ path: 'communication',
76
+ uscdi_only: true
77
+ }
78
+ # Though telecom.system, telecom.value, telecom.use, and communication.language are marked as MustSupport since US Core v4.0.0,
79
+ # their parent elements telecom, and communication are not MustSupport but listed under "Additional USCDI requirements"
80
+ # According to the updated FHIR spec that "When a child element is defined as Must Support and the parent element isn't,
81
+ # a system must support the child if it support the parent, but there's no expectation that the system must support the parent.",
82
+ # We add uscdi_only tag to these elements
83
+ must_supports[:elements].each do |element|
84
+ path = element[:path]
85
+ element[:uscdi_only] = true if path.include?('telecom.') || path.include?('communication.')
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,108 @@
1
+ require_relative 'must_support_metadata_extractor_us_core_4'
2
+
3
+ module USCoreTestKit
4
+ class Generator
5
+ class MustSupportMetadataExtractorUsCore5
6
+ attr_accessor :profile, :must_supports
7
+
8
+ def initialize(profile, must_supports)
9
+ self.profile = profile
10
+ self.must_supports = must_supports
11
+ end
12
+
13
+
14
+ def us_core_4_extractor
15
+ @us_core_4_extractor ||= MustSupportMetadataExtractorUsCore4.new(profile, must_supports)
16
+ end
17
+
18
+ def handle_special_cases
19
+ add_must_support_choices
20
+ add_patient_uscdi_elements
21
+ add_value_set_expansion
22
+ remove_survey_questionnaire_response
23
+ end
24
+
25
+ def add_must_support_choices
26
+ us_core_4_extractor.add_must_support_choices
27
+
28
+ more_choices = []
29
+
30
+ case profile.type
31
+ when 'CareTeam'
32
+ more_choices << {
33
+ target_profiles: [
34
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitioner',
35
+ 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-practitionerrole'
36
+ ]
37
+ }
38
+ when 'Condition'
39
+ more_choices << {
40
+ paths: ['onsetDateTime'],
41
+ extension_ids: ['Condition.extension:assertedDate']
42
+ }
43
+ end
44
+
45
+ if more_choices.present?
46
+ must_supports[:choices] ||= []
47
+ must_supports[:choices].concat(more_choices)
48
+ end
49
+ end
50
+
51
+ def add_patient_uscdi_elements
52
+ return unless profile.type == 'Patient'
53
+
54
+ us_core_4_extractor.add_patient_uscdi_elements
55
+
56
+ must_supports[:extensions] << {
57
+ id: 'Patient.extension:genderIdentity',
58
+ url: 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-genderIdentity',
59
+ uscdi_only: true
60
+ }
61
+ must_supports[:elements] << {
62
+ path: 'address.use',
63
+ fixed_value: 'old',
64
+ uscdi_only: true
65
+ }
66
+ must_supports[:elements] << {
67
+ path: 'name.use',
68
+ fixed_value: 'old',
69
+ uscdi_only: true
70
+ }
71
+ end
72
+
73
+ def add_value_set_expansion
74
+ add_document_reference_category_values
75
+ add_service_request_category_values
76
+ end
77
+
78
+ def add_document_reference_category_values
79
+ return unless profile.type == 'DocumentReference'
80
+
81
+ slice = must_supports[:slices].find{|slice| slice[:path] == 'category'}
82
+
83
+ slice[:discriminator][:values] = ['clinical-note'] if slice.present?
84
+ end
85
+
86
+ def add_service_request_category_values
87
+ return unless profile.type == 'ServiceRequest'
88
+
89
+ slice = must_supports[:slices].find{|slice| slice[:path] == 'category'}
90
+
91
+ if slice.present?
92
+ slice[:discriminator][:values].concat(['108252007', '363679005', '409063005', '409073007', '387713003'])
93
+ end
94
+ end
95
+
96
+ # FHIR-37794 Server systems are not required to support US Core QuestionnaireResponse
97
+ def remove_survey_questionnaire_response
98
+ return unless profile.type == 'Observation' &&
99
+ ['us-core-observation-survey', 'us-core-observation-sdoh-assessment'].include?(profile.id)
100
+
101
+ element = must_supports[:elements].find { |element| element[:path] == 'derivedFrom' }
102
+ element[:target_profiles].delete_if do |url|
103
+ url == 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-questionnaireresponse'
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -1,6 +1,6 @@
1
1
  require 'fhir_models'
2
+ require 'inferno/ext/fhir_models'
2
3
 
3
- require_relative 'ext/fhir_models'
4
4
  require_relative 'generator/ig_loader'
5
5
  require_relative 'generator/ig_metadata_extractor'
6
6
  require_relative 'generator/group_generator'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module USCoreTestKit
4
- VERSION = '0.4.4'
4
+ VERSION = '0.4.6'
5
5
  end
@@ -1,4 +1,3 @@
1
- require_relative 'us_core_test_kit/ext/fhir_models'
2
1
  require_relative 'us_core_test_kit/generated/v3.1.1/us_core_test_suite'
3
2
  require_relative 'us_core_test_kit/generated/v4.0.0/us_core_test_suite'
4
3
  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.4.4
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen MacVicar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-06 00:00:00.000000000 Z
11
+ date: 2023-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inferno_core
@@ -115,11 +115,9 @@ files:
115
115
  - lib/us_core_test_kit/custom_groups/v3.1.1/clinical_notes_guidance_group.rb
116
116
  - lib/us_core_test_kit/custom_groups/v4.0.0/capability_statement_group.rb
117
117
  - lib/us_core_test_kit/custom_groups/v4.0.0/clinical_notes_guidance_group.rb
118
- - lib/us_core_test_kit/custom_groups/v4.0.0/device_udi_pi_test.rb
119
118
  - lib/us_core_test_kit/custom_groups/v4.0.0/document_reference_custodian_test.rb
120
119
  - lib/us_core_test_kit/custom_groups/v5.0.1/capability_statement_group.rb
121
120
  - lib/us_core_test_kit/date_search_validation.rb
122
- - lib/us_core_test_kit/ext/fhir_models.rb
123
121
  - lib/us_core_test_kit/fhir_resource_navigation.rb
124
122
  - lib/us_core_test_kit/generated/v3.1.1/allergy_intolerance/allergy_intolerance_must_support_test.rb
125
123
  - lib/us_core_test_kit/generated/v3.1.1/allergy_intolerance/allergy_intolerance_patient_clinical_status_search_test.rb
@@ -1279,6 +1277,9 @@ files:
1279
1277
  - lib/us_core_test_kit/generator/ig_metadata_extractor.rb
1280
1278
  - lib/us_core_test_kit/generator/ig_resources.rb
1281
1279
  - lib/us_core_test_kit/generator/must_support_metadata_extractor.rb
1280
+ - lib/us_core_test_kit/generator/must_support_metadata_extractor_us_core_3.rb
1281
+ - lib/us_core_test_kit/generator/must_support_metadata_extractor_us_core_4.rb
1282
+ - lib/us_core_test_kit/generator/must_support_metadata_extractor_us_core_5.rb
1282
1283
  - lib/us_core_test_kit/generator/must_support_test_generator.rb
1283
1284
  - lib/us_core_test_kit/generator/naming.rb
1284
1285
  - lib/us_core_test_kit/generator/provenance_revinclude_search_test_generator.rb
@@ -1,40 +0,0 @@
1
- module USCoreTestKit
2
- module USCoreV400
3
- class DeviceUdiPiTest < Inferno::Test
4
- id :us_core_v400_device_udi_pi_test
5
- title 'Device resources returned during previous tests have UDI-PI elements'
6
- description %(
7
- This test verifies implantable medical devices that have UDI information represent all of the UDI-PI elements that are present in the UDI code
8
- in the corresponding US Core Implantable Device Profile element.
9
- )
10
-
11
- def scratch_resources
12
- scratch[:device_resources] ||= {}
13
- end
14
-
15
- run do
16
- resources = scratch_resources[:all] || []
17
-
18
- skip_if resources.blank?,
19
- 'No Devices resources appear to be available. ' \
20
- 'Please use patients with more information.'
21
-
22
- resources.each do |device|
23
- if device.udiCarrier&.first&.carrierHRF.present? &&
24
- !(
25
- device.manufactureDate.present? ||
26
- device.expirationDate.present? ||
27
- device.lotNumber.present? ||
28
- device.serialNumber.present? ||
29
- device.distinctIdentifier.present?
30
- )
31
- add_message('error',
32
- "Device/#{device.id} has UDI information but does not have any UDI-PI elements presented")
33
- end
34
- end
35
-
36
- assert messages.blank?, "Resource has UDI information but does not have any UDI-PI elements presented"
37
- end
38
- end
39
- end
40
- end
@@ -1,59 +0,0 @@
1
- require 'json'
2
-
3
- # Extension to FHIR::Model. Prepending this into FHIR::Model (done below)
4
- # allows us to call super() on initialize when we overriding it,
5
- # while also defining new methods and attributes
6
- module InfernoFHIRModelExtensions
7
- attr_accessor :source_hash, :source_text
8
-
9
- def initialize(hash = {})
10
- super(hash)
11
- @source_hash = hash
12
- end
13
-
14
- def source_contents
15
- @source_text || JSON.generate(@source_hash)
16
- end
17
- end
18
-
19
- module FHIR
20
- class Model
21
- prepend ::InfernoFHIRModelExtensions
22
- end
23
- end
24
-
25
- # Extension to FHIR::Json. Prepending this into FHIR::Json (done below)
26
- # allows us to call super() on from_json
27
- module InfernoJson
28
- def from_json(json)
29
- resource = super(json)
30
- resource.source_text = json
31
- resource
32
- end
33
- end
34
-
35
- # Extension to FHIR::Xml. Prepending this into FHIR::Xml (done below)
36
- # allows us to call super() on from_xml
37
- module InfernoXml
38
- def from_xml(xml)
39
- resource = super(xml)
40
- resource.source_text = xml
41
- resource
42
- end
43
- end
44
-
45
- module FHIR
46
- module Json
47
- class << self
48
- prepend InfernoJson
49
- end
50
- end
51
- end
52
-
53
- module FHIR
54
- module Xml
55
- class << self
56
- prepend InfernoXml
57
- end
58
- end
59
- end