us_core_test_kit 0.2.1 → 0.2.4
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.
- checksums.yaml +4 -4
- data/lib/us_core_test_kit/custom_groups/clinical_note_attachment_test.rb +2 -2
- data/lib/us_core_test_kit/custom_groups/clinical_note_type_test.rb +11 -6
- data/lib/us_core_test_kit/fhir_resource_navigation.rb +11 -3
- data/lib/us_core_test_kit/generated/v3.1.1/allergy_intolerance/allergy_intolerance_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/bodyheight/bodyheight_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/bodytemp/bodytemp_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/bodyweight/bodyweight_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/bp/bp_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/care_plan/care_plan_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/care_team/care_team_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/condition/condition_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/device/device_must_support_test.rb +1 -2
- data/lib/us_core_test_kit/generated/v3.1.1/device/device_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_note/diagnostic_report_note_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/document_reference/document_reference_must_support_test.rb +1 -2
- data/lib/us_core_test_kit/generated/v3.1.1/document_reference/document_reference_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/encounter/encounter_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/goal/goal_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/head_circumference/head_circumference_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/heartrate/heartrate_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/immunization/immunization_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/medication_request/medication_request_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/medication_request/medication_validation_test.rb +4 -2
- data/lib/us_core_test_kit/generated/v3.1.1/observation_lab/observation_lab_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/organization/organization_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/patient/patient_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/pediatric_bmi_for_age/pediatric_bmi_for_age_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/pediatric_weight_for_height/pediatric_weight_for_height_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/practitioner/practitioner_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/procedure/procedure_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/provenance/provenance_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/pulse_oximetry/pulse_oximetry_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/resprate/resprate_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/smokingstatus/smokingstatus_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v3.1.1/us_core_test_suite.rb +2 -2
- data/lib/us_core_test_kit/generated/v4.0.0/allergy_intolerance/allergy_intolerance_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/blood_pressure/blood_pressure_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/bmi/bmi_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/body_height/body_height_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/body_temperature/body_temperature_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/body_weight/body_weight_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/care_plan/care_plan_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/care_team/care_team_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/condition/condition_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/device/device_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_note/diagnostic_report_note_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/document_reference/document_reference_must_support_test.rb +1 -2
- data/lib/us_core_test_kit/generated/v4.0.0/document_reference/document_reference_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/encounter/encounter_must_support_test.rb +2 -4
- data/lib/us_core_test_kit/generated/v4.0.0/encounter/encounter_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/goal/goal_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/head_circumference/head_circumference_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/head_circumference_percentile/head_circumference_percentile_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/heart_rate/heart_rate_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/immunization/immunization_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/medication_request/medication_request_must_support_test.rb +1 -2
- data/lib/us_core_test_kit/generated/v4.0.0/medication_request/medication_request_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/medication_request/medication_validation_test.rb +4 -2
- data/lib/us_core_test_kit/generated/v4.0.0/metadata.yml +20 -2
- data/lib/us_core_test_kit/generated/v4.0.0/observation_lab/observation_lab_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/organization/organization_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/patient/metadata.yml +20 -1
- data/lib/us_core_test_kit/generated/v4.0.0/patient/patient_must_support_test.rb +9 -5
- data/lib/us_core_test_kit/generated/v4.0.0/patient/patient_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/pediatric_bmi_for_age/pediatric_bmi_for_age_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/pediatric_weight_for_height/pediatric_weight_for_height_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/practitioner/practitioner_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/procedure/procedure_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/provenance/metadata.yml +0 -1
- data/lib/us_core_test_kit/generated/v4.0.0/provenance/provenance_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/pulse_oximetry/pulse_oximetry_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/respiratory_rate/respiratory_rate_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/smokingstatus/smokingstatus_validation_test.rb +5 -2
- data/lib/us_core_test_kit/generated/v4.0.0/us_core_test_suite.rb +2 -2
- data/lib/us_core_test_kit/generator/must_support_metadata_extractor.rb +35 -22
- data/lib/us_core_test_kit/generator/must_support_test_generator.rb +26 -3
- data/lib/us_core_test_kit/generator/validation_test_generator.rb +7 -0
- data/lib/us_core_test_kit/must_support_test.rb +19 -3
- data/lib/us_core_test_kit/search_test.rb +104 -46
- data/lib/us_core_test_kit/validation_test.rb +9 -3
- data/lib/us_core_test_kit/version.rb +3 -1
- metadata +2 -2
|
@@ -84,6 +84,12 @@ module USCoreTestKit
|
|
|
84
84
|
read_interaction[:expectation]
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
+
def skip_if_empty
|
|
88
|
+
# Return true if a system must demonstrate at least one example of the resource type.
|
|
89
|
+
# This drives omit vs. skip result statuses in this test.
|
|
90
|
+
resource_type != 'Medication'
|
|
91
|
+
end
|
|
92
|
+
|
|
87
93
|
def generate
|
|
88
94
|
FileUtils.mkdir_p(output_file_directory)
|
|
89
95
|
File.open(output_file_name, 'w') { |f| f.write(output) }
|
|
@@ -121,6 +127,7 @@ module USCoreTestKit
|
|
|
121
127
|
<<~GENERIC_INTRO
|
|
122
128
|
This test verifies resources returned from the first search conform to
|
|
123
129
|
the [#{profile_name}](#{profile_url}).
|
|
130
|
+
Systems must demonstrate at least one valid example in order to pass this test.
|
|
124
131
|
GENERIC_INTRO
|
|
125
132
|
end
|
|
126
133
|
end
|
|
@@ -36,8 +36,16 @@ module USCoreTestKit
|
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
def include_uscdi_only_test?
|
|
40
|
+
config.options[:include_uscdi_only_test] == true
|
|
41
|
+
end
|
|
42
|
+
|
|
39
43
|
def must_support_extensions
|
|
40
|
-
|
|
44
|
+
if include_uscdi_only_test?
|
|
45
|
+
metadata.must_supports[:extensions]
|
|
46
|
+
else
|
|
47
|
+
metadata.must_supports[:extensions].reject{ |extension| extension[:uscdi_only] }
|
|
48
|
+
end
|
|
41
49
|
end
|
|
42
50
|
|
|
43
51
|
def missing_extensions(resources = [])
|
|
@@ -50,7 +58,11 @@ module USCoreTestKit
|
|
|
50
58
|
end
|
|
51
59
|
|
|
52
60
|
def must_support_elements
|
|
53
|
-
|
|
61
|
+
if include_uscdi_only_test?
|
|
62
|
+
metadata.must_supports[:elements]
|
|
63
|
+
else
|
|
64
|
+
metadata.must_supports[:elements].reject{ |element| element[:uscdi_only] }
|
|
65
|
+
end
|
|
54
66
|
end
|
|
55
67
|
|
|
56
68
|
def missing_elements(resources = [])
|
|
@@ -85,7 +97,11 @@ module USCoreTestKit
|
|
|
85
97
|
end
|
|
86
98
|
|
|
87
99
|
def must_support_slices
|
|
88
|
-
|
|
100
|
+
if include_uscdi_only_test?
|
|
101
|
+
metadata.must_supports[:slices]
|
|
102
|
+
else
|
|
103
|
+
metadata.must_supports[:slices].reject{ |slice| slice[:uscdi_only] }
|
|
104
|
+
end
|
|
89
105
|
end
|
|
90
106
|
|
|
91
107
|
def missing_slices(resources = [])
|
|
@@ -31,7 +31,7 @@ module USCoreTestKit
|
|
|
31
31
|
if fixed_value_search?
|
|
32
32
|
fixed_value_search_param_values.map { |value| fixed_value_search_params(value, patient_id) }
|
|
33
33
|
else
|
|
34
|
-
[search_params_with_values(patient_id)]
|
|
34
|
+
[search_params_with_values(search_param_names, patient_id)]
|
|
35
35
|
end
|
|
36
36
|
new_params.reject! do |params|
|
|
37
37
|
params.any? { |_key, value| value.blank? }
|
|
@@ -135,6 +135,9 @@ module USCoreTestKit
|
|
|
135
135
|
check_search_response
|
|
136
136
|
|
|
137
137
|
post_search_resources = fetch_all_bundled_resources.select { |resource| resource.resourceType == resource_type }
|
|
138
|
+
|
|
139
|
+
filter_devices(post_search_resources) if resource_type == 'Device'
|
|
140
|
+
|
|
138
141
|
get_resource_count = get_search_resources.length
|
|
139
142
|
post_resource_count = post_search_resources.length
|
|
140
143
|
|
|
@@ -240,10 +243,11 @@ module USCoreTestKit
|
|
|
240
243
|
new_search_params = params.merge('patient' => "Patient/#{params['patient']}")
|
|
241
244
|
search_and_check_response(new_search_params)
|
|
242
245
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
246
|
+
reference_with_type_resources = fetch_all_bundled_resources.select { |resource| resource.resourceType == resource_type }
|
|
247
|
+
|
|
248
|
+
filter_devices(reference_with_type_resources) if resource_type == 'Device'
|
|
249
|
+
|
|
250
|
+
new_resource_count = reference_with_type_resources.count
|
|
247
251
|
|
|
248
252
|
assert new_resource_count == resource_count,
|
|
249
253
|
"Expected search by `#{params['patient']}` to to return the same results as searching " \
|
|
@@ -256,9 +260,7 @@ module USCoreTestKit
|
|
|
256
260
|
def perform_search_with_system(params, patient_id)
|
|
257
261
|
return if search_variant_test_records[:token_variants]
|
|
258
262
|
|
|
259
|
-
new_search_params = token_search_params
|
|
260
|
-
search_params[name] = search_param_value(name, patient_id, include_system: true)
|
|
261
|
-
end
|
|
263
|
+
new_search_params = search_params_with_values(token_search_params, patient_id, include_system: true)
|
|
262
264
|
return if new_search_params.any? { |_name, value| value.blank? }
|
|
263
265
|
|
|
264
266
|
search_params = params.merge(new_search_params)
|
|
@@ -308,7 +310,7 @@ module USCoreTestKit
|
|
|
308
310
|
definition = metadata.search_definitions[param_name]
|
|
309
311
|
return [] if definition.blank?
|
|
310
312
|
|
|
311
|
-
definition[:multiple_or] == 'SHALL' ? [definition[:values].join(',')] :
|
|
313
|
+
definition[:multiple_or] == 'SHALL' ? [definition[:values].join(',')] : Array.wrap(definition[:values])
|
|
312
314
|
end
|
|
313
315
|
|
|
314
316
|
|
|
@@ -317,7 +319,7 @@ module USCoreTestKit
|
|
|
317
319
|
|
|
318
320
|
all_search_params.each do |patient_id, params_list|
|
|
319
321
|
next unless params_list.present?
|
|
320
|
-
|
|
322
|
+
|
|
321
323
|
search_params = params_list.first
|
|
322
324
|
existing_values = {}
|
|
323
325
|
missing_values = {}
|
|
@@ -423,11 +425,29 @@ module USCoreTestKit
|
|
|
423
425
|
end
|
|
424
426
|
end
|
|
425
427
|
|
|
426
|
-
def search_params_with_values(patient_id)
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
428
|
+
def search_params_with_values(search_param_names, patient_id, include_system: false)
|
|
429
|
+
resources = scratch_resources_for_patient(patient_id)
|
|
430
|
+
|
|
431
|
+
if resources.empty?
|
|
432
|
+
return search_param_names.each_with_object({}) do |name, params|
|
|
433
|
+
value = patient_id_param?(name) ? patient_id : nil
|
|
434
|
+
params[name] = value
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
params_with_partial_value = resources.each_with_object({}) do |resource, outer_params|
|
|
439
|
+
results_from_one_resource = search_param_names.each_with_object({}) do |name, params|
|
|
440
|
+
value = patient_id_param?(name) ? patient_id : search_param_value(name, resource, include_system: include_system)
|
|
441
|
+
params[name] = value
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
outer_params.merge!(results_from_one_resource)
|
|
445
|
+
|
|
446
|
+
# stop if all parameter values are found
|
|
447
|
+
return outer_params if outer_params.all? { |_key, value| value.present? }
|
|
430
448
|
end
|
|
449
|
+
|
|
450
|
+
params_with_partial_value
|
|
431
451
|
end
|
|
432
452
|
|
|
433
453
|
def patient_id_list
|
|
@@ -446,10 +466,10 @@ module USCoreTestKit
|
|
|
446
466
|
|
|
447
467
|
def search_param_paths(name)
|
|
448
468
|
paths = metadata.search_definitions[name.to_sym][:paths]
|
|
449
|
-
if paths.first =='class'
|
|
469
|
+
if paths.first =='class'
|
|
450
470
|
paths[0] = 'local_class'
|
|
451
471
|
end
|
|
452
|
-
|
|
472
|
+
|
|
453
473
|
paths
|
|
454
474
|
end
|
|
455
475
|
|
|
@@ -470,8 +490,13 @@ module USCoreTestKit
|
|
|
470
490
|
end
|
|
471
491
|
|
|
472
492
|
def no_resources_skip_message(resource_type = self.resource_type)
|
|
473
|
-
"No #{resource_type} resources appear to be available
|
|
474
|
-
|
|
493
|
+
msg = "No #{resource_type} resources appear to be available"
|
|
494
|
+
|
|
495
|
+
if (resource_type == 'Device' && implantable_device_codes.present?)
|
|
496
|
+
msg.concat(" with the following Device Type Code filter: #{implantable_device_codes}")
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
msg + ". Please use patients with more information"
|
|
475
500
|
end
|
|
476
501
|
|
|
477
502
|
def fetch_all_bundled_resources(
|
|
@@ -507,11 +532,16 @@ module USCoreTestKit
|
|
|
507
532
|
valid_resource_types = [resource_type, 'OperationOutcome'].concat(additional_resource_types)
|
|
508
533
|
valid_resource_types << 'Medication' if resource_type == 'MedicationRequest'
|
|
509
534
|
|
|
510
|
-
|
|
511
|
-
resources.
|
|
535
|
+
invalid_resource_types =
|
|
536
|
+
resources.reject { |entry| valid_resource_types.include? entry.resourceType }
|
|
537
|
+
.map(&:resourceType)
|
|
538
|
+
.uniq
|
|
512
539
|
|
|
513
|
-
|
|
514
|
-
|
|
540
|
+
if invalid_resource_types.any?
|
|
541
|
+
info "Received resource type(s) #{invalid_resource_types.join(', ')} in search bundle, " \
|
|
542
|
+
"but only expected resource types #{valid_resource_types.join(', ')}. " + \
|
|
543
|
+
"This is unusual but allowed if the server believes additional resource types are relevant."
|
|
544
|
+
end
|
|
515
545
|
|
|
516
546
|
resources
|
|
517
547
|
end
|
|
@@ -520,11 +550,11 @@ module USCoreTestKit
|
|
|
520
550
|
"Could not resolve next bundle: #{link}"
|
|
521
551
|
end
|
|
522
552
|
|
|
523
|
-
def search_param_value(name,
|
|
553
|
+
def search_param_value(name, resource, include_system: false)
|
|
524
554
|
paths = search_param_paths(name)
|
|
525
555
|
search_value = nil
|
|
526
556
|
paths.each do |path|
|
|
527
|
-
element = find_a_value_at(
|
|
557
|
+
element = find_a_value_at(resource, path) { |element| element_has_valid_value?(element, include_system) }
|
|
528
558
|
|
|
529
559
|
search_value =
|
|
530
560
|
case element
|
|
@@ -541,34 +571,37 @@ module USCoreTestKit
|
|
|
541
571
|
if include_system
|
|
542
572
|
coding =
|
|
543
573
|
find_a_value_at(element, 'coding') { |coding| coding.code.present? && coding.system.present? }
|
|
544
|
-
|
|
574
|
+
"#{coding.system}|#{coding.code}"
|
|
545
575
|
else
|
|
546
576
|
find_a_value_at(element, 'coding.code')
|
|
547
577
|
end
|
|
548
578
|
when FHIR::Identifier
|
|
549
|
-
|
|
550
|
-
identifier = find_a_value_at(scratch_resources_for_patient(patient_id), path) do |identifier|
|
|
551
|
-
identifier.value.present? && identifier.system.present?
|
|
552
|
-
end
|
|
553
|
-
identifier.present? ? "#{identifier.system}|#{identifier.value}" : nil
|
|
554
|
-
else
|
|
555
|
-
element.value
|
|
556
|
-
end
|
|
579
|
+
include_system ? "#{element.system}|#{element.value}" : element.value
|
|
557
580
|
when FHIR::Coding
|
|
558
|
-
|
|
559
|
-
coding = find_a_value_at(scratch_resources_for_patient(patient_id), path) do |coding|
|
|
560
|
-
coding.code.present? && coding.system.present?
|
|
561
|
-
end
|
|
562
|
-
coding.present? ? "#{coding.system}|#{coding.code}" : nil
|
|
563
|
-
else
|
|
564
|
-
element.code
|
|
565
|
-
end
|
|
581
|
+
include_system ? "#{element.system}|#{element.code}" : element.code
|
|
566
582
|
when FHIR::HumanName
|
|
567
583
|
element.family || element.given&.first || element.text
|
|
568
584
|
when FHIR::Address
|
|
569
585
|
element.text || element.city || element.state || element.postalCode || element.country
|
|
570
586
|
else
|
|
571
|
-
|
|
587
|
+
if metadata.version != 'v3.1.1' &&
|
|
588
|
+
metadata.search_definitions[name.to_sym][:type] == 'date' &&
|
|
589
|
+
params_with_comparators&.include?(name)
|
|
590
|
+
# convert date search to greath-than comparator search with correct precision
|
|
591
|
+
# For all date search parameters:
|
|
592
|
+
# Patient.birthDate does not mandate comparators so cannot be converted
|
|
593
|
+
# Goal.target-date has day precision
|
|
594
|
+
# All others have second + time offset precision
|
|
595
|
+
if /^\d{4}$/.match?(element) || # YYYY
|
|
596
|
+
/^\d{4}-\d{2}$/.match?(element) || # YYYY-MM
|
|
597
|
+
(/^\d{4}-\d{2}-\d{2}$/.match?(element) && resource_type != "Goal") # YYYY-MM-DD AND Resource is NOT Goal
|
|
598
|
+
"gt#{(DateTime.xmlschema(element)-1).xmlschema}"
|
|
599
|
+
else
|
|
600
|
+
element
|
|
601
|
+
end
|
|
602
|
+
else
|
|
603
|
+
element
|
|
604
|
+
end
|
|
572
605
|
end
|
|
573
606
|
|
|
574
607
|
break if search_value.present?
|
|
@@ -578,6 +611,31 @@ module USCoreTestKit
|
|
|
578
611
|
escaped_value
|
|
579
612
|
end
|
|
580
613
|
|
|
614
|
+
def element_has_valid_value?(element, include_system)
|
|
615
|
+
case element
|
|
616
|
+
when FHIR::Reference
|
|
617
|
+
element.reference.present?
|
|
618
|
+
when FHIR::CodeableConcept
|
|
619
|
+
if include_system
|
|
620
|
+
coding =
|
|
621
|
+
find_a_value_at(element, 'coding') { |coding| coding.code.present? && coding.system.present? }
|
|
622
|
+
coding.present?
|
|
623
|
+
else
|
|
624
|
+
find_a_value_at(element, 'coding.code').present?
|
|
625
|
+
end
|
|
626
|
+
when FHIR::Identifier
|
|
627
|
+
include_system ? element.value.present? && element.system.present? : element.value.present?
|
|
628
|
+
when FHIR::Coding
|
|
629
|
+
include_system ? element.code.present? && element.system.present? : element.code.present?
|
|
630
|
+
when FHIR::HumanName
|
|
631
|
+
(element.family || element.given&.first || element.text).present?
|
|
632
|
+
when FHIR::Address
|
|
633
|
+
(element.text || element.city || element.state || element.postalCode || element.country).present?
|
|
634
|
+
else
|
|
635
|
+
true
|
|
636
|
+
end
|
|
637
|
+
end
|
|
638
|
+
|
|
581
639
|
def save_resource_reference(resource_type, reference)
|
|
582
640
|
scratch[:references] ||= {}
|
|
583
641
|
scratch[:references][resource_type] ||= Set.new
|
|
@@ -647,9 +705,9 @@ module USCoreTestKit
|
|
|
647
705
|
address&.country&.downcase&.start_with?(search_value_downcase)
|
|
648
706
|
end
|
|
649
707
|
when 'CodeableConcept'
|
|
650
|
-
# FHIR token search (https://www.hl7.org/fhir/search.html#token): "When in doubt, servers SHOULD
|
|
651
|
-
# treat tokens in a case-insensitive manner, on the grounds that including undesired data has
|
|
652
|
-
# less safety implications than excluding desired behavior".
|
|
708
|
+
# FHIR token search (https://www.hl7.org/fhir/search.html#token): "When in doubt, servers SHOULD
|
|
709
|
+
# treat tokens in a case-insensitive manner, on the grounds that including undesired data has
|
|
710
|
+
# less safety implications than excluding desired behavior".
|
|
653
711
|
codings = values_found.flat_map(&:coding)
|
|
654
712
|
if search_value.include? '|'
|
|
655
713
|
system = search_value.split('|').first
|
|
@@ -691,7 +749,7 @@ module USCoreTestKit
|
|
|
691
749
|
values_found.any? { |value_found| search_values.include? value_found }
|
|
692
750
|
end
|
|
693
751
|
end
|
|
694
|
-
|
|
752
|
+
|
|
695
753
|
break if match_found
|
|
696
754
|
end
|
|
697
755
|
|
|
@@ -3,9 +3,15 @@ module USCoreTestKit
|
|
|
3
3
|
DAR_CODE_SYSTEM_URL = 'http://terminology.hl7.org/CodeSystem/data-absent-reason'.freeze
|
|
4
4
|
DAR_EXTENSION_URL = 'http://hl7.org/fhir/StructureDefinition/data-absent-reason'.freeze
|
|
5
5
|
|
|
6
|
-
def perform_validation_test(resources,
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
def perform_validation_test(resources,
|
|
7
|
+
profile_url,
|
|
8
|
+
skip_if_empty: true)
|
|
9
|
+
|
|
10
|
+
skip_if skip_if_empty && resources.blank?,
|
|
11
|
+
"No #{resource_type} resources conforming to the #{profile_url} profile were returned"
|
|
12
|
+
|
|
13
|
+
omit_if resources.blank?,
|
|
14
|
+
"No #{resource_type} resources provided so the #{profile_url} profile does not apply"
|
|
9
15
|
|
|
10
16
|
resources.each do |resource|
|
|
11
17
|
resource_is_valid?(resource: resource, profile_url: profile_url)
|
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.2.
|
|
4
|
+
version: 0.2.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Stephen MacVicar
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-07-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: inferno_core
|