us_core_test_kit 0.2.1 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|