us_core_test_kit 0.2.2 → 0.2.5
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/fhir_resource_navigation.rb +11 -3
- data/lib/us_core_test_kit/generated/v3.1.1/allergy_intolerance/allergy_intolerance_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/allergy_intolerance/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/bodyheight/bodyheight_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/bodyheight/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/bodytemp/bodytemp_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/bodytemp/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/bodyweight/bodyweight_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/bodyweight/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/bp/bp_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/bp/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/care_plan/care_plan_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/care_plan/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/care_team/care_team_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/care_team/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/condition/condition_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/condition/metadata.yml +1 -0
- 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 +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/device/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_lab/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_note/diagnostic_report_note_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_note/metadata.yml +1 -0
- 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 +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/document_reference/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/encounter/encounter_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/encounter/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/goal/goal_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/goal/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/head_circumference/head_circumference_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/head_circumference/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/heartrate/heartrate_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/heartrate/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/immunization/immunization_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/immunization/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/medication_request/medication_request_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/medication_request/medication_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/medication_request/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/metadata.yml +32 -0
- data/lib/us_core_test_kit/generated/v3.1.1/observation_lab/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/observation_lab/observation_lab_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/organization/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/organization/organization_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/patient/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/patient/patient_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/pediatric_bmi_for_age/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/pediatric_bmi_for_age/pediatric_bmi_for_age_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/pediatric_weight_for_height/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/pediatric_weight_for_height/pediatric_weight_for_height_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/practitioner/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/practitioner/practitioner_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/procedure/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/procedure/procedure_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/provenance/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/provenance/provenance_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/pulse_oximetry/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/pulse_oximetry/pulse_oximetry_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/resprate/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/resprate/resprate_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/smokingstatus/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v3.1.1/smokingstatus/smokingstatus_validation_test.rb +1 -0
- 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 +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/allergy_intolerance/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/blood_pressure/blood_pressure_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/blood_pressure/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/bmi/bmi_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/bmi/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/body_height/body_height_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/body_height/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/body_temperature/body_temperature_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/body_temperature/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/body_weight/body_weight_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/body_weight/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/care_plan/care_plan_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/care_plan/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/care_team/care_team_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/care_team/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/condition/condition_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/condition/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/device/device_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/device/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_lab/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_note/diagnostic_report_note_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_note/metadata.yml +1 -0
- 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 +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/document_reference/metadata.yml +1 -0
- 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 +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/encounter/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/goal/goal_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/goal/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/head_circumference/head_circumference_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/head_circumference/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/head_circumference_percentile/head_circumference_percentile_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/head_circumference_percentile/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/heart_rate/heart_rate_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/heart_rate/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/immunization/immunization_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/immunization/metadata.yml +1 -0
- 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 +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/medication_request/medication_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/medication_request/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/metadata.yml +47 -2
- data/lib/us_core_test_kit/generated/v4.0.0/observation_lab/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/observation_lab/observation_lab_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/organization/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/organization/organization_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/patient/metadata.yml +13 -1
- data/lib/us_core_test_kit/generated/v4.0.0/patient/patient_must_support_test.rb +8 -6
- data/lib/us_core_test_kit/generated/v4.0.0/patient/patient_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/pediatric_bmi_for_age/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/pediatric_bmi_for_age/pediatric_bmi_for_age_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/pediatric_weight_for_height/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/pediatric_weight_for_height/pediatric_weight_for_height_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/practitioner/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/practitioner/practitioner_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/procedure/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/procedure/procedure_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/provenance/metadata.yml +1 -1
- data/lib/us_core_test_kit/generated/v4.0.0/provenance/provenance_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/pulse_oximetry/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/pulse_oximetry/pulse_oximetry_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/respiratory_rate/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/respiratory_rate/respiratory_rate_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/smokingstatus/metadata.yml +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/smokingstatus/smokingstatus_validation_test.rb +1 -0
- data/lib/us_core_test_kit/generated/v4.0.0/us_core_test_suite.rb +2 -2
- data/lib/us_core_test_kit/generator/group_metadata.rb +1 -0
- data/lib/us_core_test_kit/generator/group_metadata_extractor.rb +5 -0
- data/lib/us_core_test_kit/generator/ig_loader.rb +12 -5
- data/lib/us_core_test_kit/generator/must_support_metadata_extractor.rb +23 -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 +4 -0
- data/lib/us_core_test_kit/generator.rb +9 -14
- data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-bodyheight.json +0 -0
- data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-bodytemp.json +0 -0
- data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-bodyweight.json +0 -0
- data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-bp.json +0 -0
- data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-heartrate.json +0 -0
- data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-resprate.json +0 -0
- data/lib/us_core_test_kit/igs/{v311/package.tgz → us_core_311.tgz} +0 -0
- data/lib/us_core_test_kit/igs/{v400/package.tgz → us_core_400.tgz} +0 -0
- data/lib/us_core_test_kit/must_support_test.rb +25 -3
- data/lib/us_core_test_kit/search_test.rb +107 -48
- data/lib/us_core_test_kit/validation_test.rb +4 -2
- data/lib/us_core_test_kit/version.rb +3 -1
- metadata +13 -13
@@ -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
|
|
@@ -225,8 +228,9 @@ module USCoreTestKit
|
|
225
228
|
|
226
229
|
search_and_check_response(params_with_comparator)
|
227
230
|
|
228
|
-
fetch_all_bundled_resources
|
229
|
-
|
231
|
+
fetch_all_bundled_resources.each do |resource|
|
232
|
+
check_resource_against_params(resource, params_with_comparator) if resource.resourceType == resource_type
|
233
|
+
end
|
230
234
|
end
|
231
235
|
|
232
236
|
search_variant_test_records[:comparator_searches] << name
|
@@ -240,10 +244,11 @@ module USCoreTestKit
|
|
240
244
|
new_search_params = params.merge('patient' => "Patient/#{params['patient']}")
|
241
245
|
search_and_check_response(new_search_params)
|
242
246
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
+
reference_with_type_resources = fetch_all_bundled_resources.select { |resource| resource.resourceType == resource_type }
|
248
|
+
|
249
|
+
filter_devices(reference_with_type_resources) if resource_type == 'Device'
|
250
|
+
|
251
|
+
new_resource_count = reference_with_type_resources.count
|
247
252
|
|
248
253
|
assert new_resource_count == resource_count,
|
249
254
|
"Expected search by `#{params['patient']}` to to return the same results as searching " \
|
@@ -256,9 +261,7 @@ module USCoreTestKit
|
|
256
261
|
def perform_search_with_system(params, patient_id)
|
257
262
|
return if search_variant_test_records[:token_variants]
|
258
263
|
|
259
|
-
new_search_params = token_search_params
|
260
|
-
search_params[name] = search_param_value(name, patient_id, include_system: true)
|
261
|
-
end
|
264
|
+
new_search_params = search_params_with_values(token_search_params, patient_id, include_system: true)
|
262
265
|
return if new_search_params.any? { |_name, value| value.blank? }
|
263
266
|
|
264
267
|
search_params = params.merge(new_search_params)
|
@@ -308,7 +311,7 @@ module USCoreTestKit
|
|
308
311
|
definition = metadata.search_definitions[param_name]
|
309
312
|
return [] if definition.blank?
|
310
313
|
|
311
|
-
definition[:multiple_or] == 'SHALL' ? [definition[:values].join(',')] :
|
314
|
+
definition[:multiple_or] == 'SHALL' ? [definition[:values].join(',')] : Array.wrap(definition[:values])
|
312
315
|
end
|
313
316
|
|
314
317
|
|
@@ -317,7 +320,7 @@ module USCoreTestKit
|
|
317
320
|
|
318
321
|
all_search_params.each do |patient_id, params_list|
|
319
322
|
next unless params_list.present?
|
320
|
-
|
323
|
+
|
321
324
|
search_params = params_list.first
|
322
325
|
existing_values = {}
|
323
326
|
missing_values = {}
|
@@ -423,11 +426,29 @@ module USCoreTestKit
|
|
423
426
|
end
|
424
427
|
end
|
425
428
|
|
426
|
-
def search_params_with_values(patient_id)
|
427
|
-
|
428
|
-
|
429
|
-
|
429
|
+
def search_params_with_values(search_param_names, patient_id, include_system: false)
|
430
|
+
resources = scratch_resources_for_patient(patient_id)
|
431
|
+
|
432
|
+
if resources.empty?
|
433
|
+
return search_param_names.each_with_object({}) do |name, params|
|
434
|
+
value = patient_id_param?(name) ? patient_id : nil
|
435
|
+
params[name] = value
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
params_with_partial_value = resources.each_with_object({}) do |resource, outer_params|
|
440
|
+
results_from_one_resource = search_param_names.each_with_object({}) do |name, params|
|
441
|
+
value = patient_id_param?(name) ? patient_id : search_param_value(name, resource, include_system: include_system)
|
442
|
+
params[name] = value
|
443
|
+
end
|
444
|
+
|
445
|
+
outer_params.merge!(results_from_one_resource)
|
446
|
+
|
447
|
+
# stop if all parameter values are found
|
448
|
+
return outer_params if outer_params.all? { |_key, value| value.present? }
|
430
449
|
end
|
450
|
+
|
451
|
+
params_with_partial_value
|
431
452
|
end
|
432
453
|
|
433
454
|
def patient_id_list
|
@@ -446,10 +467,10 @@ module USCoreTestKit
|
|
446
467
|
|
447
468
|
def search_param_paths(name)
|
448
469
|
paths = metadata.search_definitions[name.to_sym][:paths]
|
449
|
-
if paths.first =='class'
|
470
|
+
if paths.first =='class'
|
450
471
|
paths[0] = 'local_class'
|
451
472
|
end
|
452
|
-
|
473
|
+
|
453
474
|
paths
|
454
475
|
end
|
455
476
|
|
@@ -470,8 +491,13 @@ module USCoreTestKit
|
|
470
491
|
end
|
471
492
|
|
472
493
|
def no_resources_skip_message(resource_type = self.resource_type)
|
473
|
-
"No #{resource_type} resources appear to be available
|
474
|
-
|
494
|
+
msg = "No #{resource_type} resources appear to be available"
|
495
|
+
|
496
|
+
if (resource_type == 'Device' && implantable_device_codes.present?)
|
497
|
+
msg.concat(" with the following Device Type Code filter: #{implantable_device_codes}")
|
498
|
+
end
|
499
|
+
|
500
|
+
msg + ". Please use patients with more information"
|
475
501
|
end
|
476
502
|
|
477
503
|
def fetch_all_bundled_resources(
|
@@ -507,11 +533,16 @@ module USCoreTestKit
|
|
507
533
|
valid_resource_types = [resource_type, 'OperationOutcome'].concat(additional_resource_types)
|
508
534
|
valid_resource_types << 'Medication' if resource_type == 'MedicationRequest'
|
509
535
|
|
510
|
-
|
511
|
-
resources.
|
536
|
+
invalid_resource_types =
|
537
|
+
resources.reject { |entry| valid_resource_types.include? entry.resourceType }
|
538
|
+
.map(&:resourceType)
|
539
|
+
.uniq
|
512
540
|
|
513
|
-
|
514
|
-
|
541
|
+
if invalid_resource_types.any?
|
542
|
+
info "Received resource type(s) #{invalid_resource_types.join(', ')} in search bundle, " \
|
543
|
+
"but only expected resource types #{valid_resource_types.join(', ')}. " + \
|
544
|
+
"This is unusual but allowed if the server believes additional resource types are relevant."
|
545
|
+
end
|
515
546
|
|
516
547
|
resources
|
517
548
|
end
|
@@ -520,11 +551,11 @@ module USCoreTestKit
|
|
520
551
|
"Could not resolve next bundle: #{link}"
|
521
552
|
end
|
522
553
|
|
523
|
-
def search_param_value(name,
|
554
|
+
def search_param_value(name, resource, include_system: false)
|
524
555
|
paths = search_param_paths(name)
|
525
556
|
search_value = nil
|
526
557
|
paths.each do |path|
|
527
|
-
element = find_a_value_at(
|
558
|
+
element = find_a_value_at(resource, path) { |element| element_has_valid_value?(element, include_system) }
|
528
559
|
|
529
560
|
search_value =
|
530
561
|
case element
|
@@ -541,34 +572,37 @@ module USCoreTestKit
|
|
541
572
|
if include_system
|
542
573
|
coding =
|
543
574
|
find_a_value_at(element, 'coding') { |coding| coding.code.present? && coding.system.present? }
|
544
|
-
|
575
|
+
"#{coding.system}|#{coding.code}"
|
545
576
|
else
|
546
577
|
find_a_value_at(element, 'coding.code')
|
547
578
|
end
|
548
579
|
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
|
580
|
+
include_system ? "#{element.system}|#{element.value}" : element.value
|
557
581
|
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
|
582
|
+
include_system ? "#{element.system}|#{element.code}" : element.code
|
566
583
|
when FHIR::HumanName
|
567
584
|
element.family || element.given&.first || element.text
|
568
585
|
when FHIR::Address
|
569
586
|
element.text || element.city || element.state || element.postalCode || element.country
|
570
587
|
else
|
571
|
-
|
588
|
+
if metadata.version != 'v3.1.1' &&
|
589
|
+
metadata.search_definitions[name.to_sym][:type] == 'date' &&
|
590
|
+
params_with_comparators&.include?(name)
|
591
|
+
# convert date search to greath-than comparator search with correct precision
|
592
|
+
# For all date search parameters:
|
593
|
+
# Patient.birthDate does not mandate comparators so cannot be converted
|
594
|
+
# Goal.target-date has day precision
|
595
|
+
# All others have second + time offset precision
|
596
|
+
if /^\d{4}$/.match?(element) || # YYYY
|
597
|
+
/^\d{4}-\d{2}$/.match?(element) || # YYYY-MM
|
598
|
+
(/^\d{4}-\d{2}-\d{2}$/.match?(element) && resource_type != "Goal") # YYYY-MM-DD AND Resource is NOT Goal
|
599
|
+
"gt#{(DateTime.xmlschema(element)-1).xmlschema}"
|
600
|
+
else
|
601
|
+
element
|
602
|
+
end
|
603
|
+
else
|
604
|
+
element
|
605
|
+
end
|
572
606
|
end
|
573
607
|
|
574
608
|
break if search_value.present?
|
@@ -578,6 +612,31 @@ module USCoreTestKit
|
|
578
612
|
escaped_value
|
579
613
|
end
|
580
614
|
|
615
|
+
def element_has_valid_value?(element, include_system)
|
616
|
+
case element
|
617
|
+
when FHIR::Reference
|
618
|
+
element.reference.present?
|
619
|
+
when FHIR::CodeableConcept
|
620
|
+
if include_system
|
621
|
+
coding =
|
622
|
+
find_a_value_at(element, 'coding') { |coding| coding.code.present? && coding.system.present? }
|
623
|
+
coding.present?
|
624
|
+
else
|
625
|
+
find_a_value_at(element, 'coding.code').present?
|
626
|
+
end
|
627
|
+
when FHIR::Identifier
|
628
|
+
include_system ? element.value.present? && element.system.present? : element.value.present?
|
629
|
+
when FHIR::Coding
|
630
|
+
include_system ? element.code.present? && element.system.present? : element.code.present?
|
631
|
+
when FHIR::HumanName
|
632
|
+
(element.family || element.given&.first || element.text).present?
|
633
|
+
when FHIR::Address
|
634
|
+
(element.text || element.city || element.state || element.postalCode || element.country).present?
|
635
|
+
else
|
636
|
+
true
|
637
|
+
end
|
638
|
+
end
|
639
|
+
|
581
640
|
def save_resource_reference(resource_type, reference)
|
582
641
|
scratch[:references] ||= {}
|
583
642
|
scratch[:references][resource_type] ||= Set.new
|
@@ -647,9 +706,9 @@ module USCoreTestKit
|
|
647
706
|
address&.country&.downcase&.start_with?(search_value_downcase)
|
648
707
|
end
|
649
708
|
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".
|
709
|
+
# FHIR token search (https://www.hl7.org/fhir/search.html#token): "When in doubt, servers SHOULD
|
710
|
+
# treat tokens in a case-insensitive manner, on the grounds that including undesired data has
|
711
|
+
# less safety implications than excluding desired behavior".
|
653
712
|
codings = values_found.flat_map(&:coding)
|
654
713
|
if search_value.include? '|'
|
655
714
|
system = search_value.split('|').first
|
@@ -691,7 +750,7 @@ module USCoreTestKit
|
|
691
750
|
values_found.any? { |value_found| search_values.include? value_found }
|
692
751
|
end
|
693
752
|
end
|
694
|
-
|
753
|
+
|
695
754
|
break if match_found
|
696
755
|
end
|
697
756
|
|
@@ -5,6 +5,7 @@ module USCoreTestKit
|
|
5
5
|
|
6
6
|
def perform_validation_test(resources,
|
7
7
|
profile_url,
|
8
|
+
profile_version,
|
8
9
|
skip_if_empty: true)
|
9
10
|
|
10
11
|
skip_if skip_if_empty && resources.blank?,
|
@@ -13,14 +14,15 @@ module USCoreTestKit
|
|
13
14
|
omit_if resources.blank?,
|
14
15
|
"No #{resource_type} resources provided so the #{profile_url} profile does not apply"
|
15
16
|
|
17
|
+
profile_with_version = "#{profile_url}|#{profile_version}"
|
16
18
|
resources.each do |resource|
|
17
|
-
resource_is_valid?(resource: resource, profile_url:
|
19
|
+
resource_is_valid?(resource: resource, profile_url: profile_with_version)
|
18
20
|
check_for_dar(resource)
|
19
21
|
end
|
20
22
|
|
21
23
|
errors_found = messages.any? { |message| message[:type] == 'error' }
|
22
24
|
|
23
|
-
assert !errors_found, "Resource does not conform to the profile #{
|
25
|
+
assert !errors_found, "Resource does not conform to the profile #{profile_with_version}"
|
24
26
|
end
|
25
27
|
|
26
28
|
def check_for_dar(resource)
|
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.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen MacVicar
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05
|
11
|
+
date: 2022-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inferno_core
|
@@ -818,14 +818,14 @@ files:
|
|
818
818
|
- lib/us_core_test_kit/generator/suite_generator.rb
|
819
819
|
- lib/us_core_test_kit/generator/terminology_binding_metadata_extractor.rb
|
820
820
|
- lib/us_core_test_kit/generator/validation_test_generator.rb
|
821
|
-
- lib/us_core_test_kit/igs/
|
822
|
-
- lib/us_core_test_kit/igs/
|
823
|
-
- lib/us_core_test_kit/igs/
|
824
|
-
- lib/us_core_test_kit/igs/
|
825
|
-
- lib/us_core_test_kit/igs/
|
826
|
-
- lib/us_core_test_kit/igs/
|
827
|
-
- lib/us_core_test_kit/igs/
|
828
|
-
- lib/us_core_test_kit/igs/
|
821
|
+
- lib/us_core_test_kit/igs/us_core_311.tgz
|
822
|
+
- lib/us_core_test_kit/igs/us_core_311/StructureDefinition-bodyheight.json
|
823
|
+
- lib/us_core_test_kit/igs/us_core_311/StructureDefinition-bodytemp.json
|
824
|
+
- lib/us_core_test_kit/igs/us_core_311/StructureDefinition-bodyweight.json
|
825
|
+
- lib/us_core_test_kit/igs/us_core_311/StructureDefinition-bp.json
|
826
|
+
- lib/us_core_test_kit/igs/us_core_311/StructureDefinition-heartrate.json
|
827
|
+
- lib/us_core_test_kit/igs/us_core_311/StructureDefinition-resprate.json
|
828
|
+
- lib/us_core_test_kit/igs/us_core_400.tgz
|
829
829
|
- lib/us_core_test_kit/must_support_test.rb
|
830
830
|
- lib/us_core_test_kit/read_test.rb
|
831
831
|
- lib/us_core_test_kit/reference_resolution_test.rb
|
@@ -840,7 +840,7 @@ licenses:
|
|
840
840
|
metadata:
|
841
841
|
homepage_uri: https://github.com/inferno_framework/us-core-test-kit
|
842
842
|
source_code_uri: https://github.com/inferno_framework/us-core-test-kit
|
843
|
-
post_install_message:
|
843
|
+
post_install_message:
|
844
844
|
rdoc_options: []
|
845
845
|
require_paths:
|
846
846
|
- lib
|
@@ -856,7 +856,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
856
856
|
version: '0'
|
857
857
|
requirements: []
|
858
858
|
rubygems_version: 3.1.6
|
859
|
-
signing_key:
|
859
|
+
signing_key:
|
860
860
|
specification_version: 4
|
861
861
|
summary: US Core Inferno tests
|
862
862
|
test_files: []
|