us_core_test_kit 0.2.2 → 0.2.5

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 (154) hide show
  1. checksums.yaml +4 -4
  2. data/lib/us_core_test_kit/fhir_resource_navigation.rb +11 -3
  3. data/lib/us_core_test_kit/generated/v3.1.1/allergy_intolerance/allergy_intolerance_validation_test.rb +1 -0
  4. data/lib/us_core_test_kit/generated/v3.1.1/allergy_intolerance/metadata.yml +1 -0
  5. data/lib/us_core_test_kit/generated/v3.1.1/bodyheight/bodyheight_validation_test.rb +1 -0
  6. data/lib/us_core_test_kit/generated/v3.1.1/bodyheight/metadata.yml +1 -0
  7. data/lib/us_core_test_kit/generated/v3.1.1/bodytemp/bodytemp_validation_test.rb +1 -0
  8. data/lib/us_core_test_kit/generated/v3.1.1/bodytemp/metadata.yml +1 -0
  9. data/lib/us_core_test_kit/generated/v3.1.1/bodyweight/bodyweight_validation_test.rb +1 -0
  10. data/lib/us_core_test_kit/generated/v3.1.1/bodyweight/metadata.yml +1 -0
  11. data/lib/us_core_test_kit/generated/v3.1.1/bp/bp_validation_test.rb +1 -0
  12. data/lib/us_core_test_kit/generated/v3.1.1/bp/metadata.yml +1 -0
  13. data/lib/us_core_test_kit/generated/v3.1.1/care_plan/care_plan_validation_test.rb +1 -0
  14. data/lib/us_core_test_kit/generated/v3.1.1/care_plan/metadata.yml +1 -0
  15. data/lib/us_core_test_kit/generated/v3.1.1/care_team/care_team_validation_test.rb +1 -0
  16. data/lib/us_core_test_kit/generated/v3.1.1/care_team/metadata.yml +1 -0
  17. data/lib/us_core_test_kit/generated/v3.1.1/condition/condition_validation_test.rb +1 -0
  18. data/lib/us_core_test_kit/generated/v3.1.1/condition/metadata.yml +1 -0
  19. data/lib/us_core_test_kit/generated/v3.1.1/device/device_must_support_test.rb +1 -2
  20. data/lib/us_core_test_kit/generated/v3.1.1/device/device_validation_test.rb +1 -0
  21. data/lib/us_core_test_kit/generated/v3.1.1/device/metadata.yml +1 -0
  22. data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +1 -0
  23. data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_lab/metadata.yml +1 -0
  24. data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_note/diagnostic_report_note_validation_test.rb +1 -0
  25. data/lib/us_core_test_kit/generated/v3.1.1/diagnostic_report_note/metadata.yml +1 -0
  26. data/lib/us_core_test_kit/generated/v3.1.1/document_reference/document_reference_must_support_test.rb +1 -2
  27. data/lib/us_core_test_kit/generated/v3.1.1/document_reference/document_reference_validation_test.rb +1 -0
  28. data/lib/us_core_test_kit/generated/v3.1.1/document_reference/metadata.yml +1 -0
  29. data/lib/us_core_test_kit/generated/v3.1.1/encounter/encounter_validation_test.rb +1 -0
  30. data/lib/us_core_test_kit/generated/v3.1.1/encounter/metadata.yml +1 -0
  31. data/lib/us_core_test_kit/generated/v3.1.1/goal/goal_validation_test.rb +1 -0
  32. data/lib/us_core_test_kit/generated/v3.1.1/goal/metadata.yml +1 -0
  33. data/lib/us_core_test_kit/generated/v3.1.1/head_circumference/head_circumference_validation_test.rb +1 -0
  34. data/lib/us_core_test_kit/generated/v3.1.1/head_circumference/metadata.yml +1 -0
  35. data/lib/us_core_test_kit/generated/v3.1.1/heartrate/heartrate_validation_test.rb +1 -0
  36. data/lib/us_core_test_kit/generated/v3.1.1/heartrate/metadata.yml +1 -0
  37. data/lib/us_core_test_kit/generated/v3.1.1/immunization/immunization_validation_test.rb +1 -0
  38. data/lib/us_core_test_kit/generated/v3.1.1/immunization/metadata.yml +1 -0
  39. data/lib/us_core_test_kit/generated/v3.1.1/medication_request/medication_request_validation_test.rb +1 -0
  40. data/lib/us_core_test_kit/generated/v3.1.1/medication_request/medication_validation_test.rb +1 -0
  41. data/lib/us_core_test_kit/generated/v3.1.1/medication_request/metadata.yml +1 -0
  42. data/lib/us_core_test_kit/generated/v3.1.1/metadata.yml +32 -0
  43. data/lib/us_core_test_kit/generated/v3.1.1/observation_lab/metadata.yml +1 -0
  44. data/lib/us_core_test_kit/generated/v3.1.1/observation_lab/observation_lab_validation_test.rb +1 -0
  45. data/lib/us_core_test_kit/generated/v3.1.1/organization/metadata.yml +1 -0
  46. data/lib/us_core_test_kit/generated/v3.1.1/organization/organization_validation_test.rb +1 -0
  47. data/lib/us_core_test_kit/generated/v3.1.1/patient/metadata.yml +1 -0
  48. data/lib/us_core_test_kit/generated/v3.1.1/patient/patient_validation_test.rb +1 -0
  49. data/lib/us_core_test_kit/generated/v3.1.1/pediatric_bmi_for_age/metadata.yml +1 -0
  50. data/lib/us_core_test_kit/generated/v3.1.1/pediatric_bmi_for_age/pediatric_bmi_for_age_validation_test.rb +1 -0
  51. data/lib/us_core_test_kit/generated/v3.1.1/pediatric_weight_for_height/metadata.yml +1 -0
  52. data/lib/us_core_test_kit/generated/v3.1.1/pediatric_weight_for_height/pediatric_weight_for_height_validation_test.rb +1 -0
  53. data/lib/us_core_test_kit/generated/v3.1.1/practitioner/metadata.yml +1 -0
  54. data/lib/us_core_test_kit/generated/v3.1.1/practitioner/practitioner_validation_test.rb +1 -0
  55. data/lib/us_core_test_kit/generated/v3.1.1/procedure/metadata.yml +1 -0
  56. data/lib/us_core_test_kit/generated/v3.1.1/procedure/procedure_validation_test.rb +1 -0
  57. data/lib/us_core_test_kit/generated/v3.1.1/provenance/metadata.yml +1 -0
  58. data/lib/us_core_test_kit/generated/v3.1.1/provenance/provenance_validation_test.rb +1 -0
  59. data/lib/us_core_test_kit/generated/v3.1.1/pulse_oximetry/metadata.yml +1 -0
  60. data/lib/us_core_test_kit/generated/v3.1.1/pulse_oximetry/pulse_oximetry_validation_test.rb +1 -0
  61. data/lib/us_core_test_kit/generated/v3.1.1/resprate/metadata.yml +1 -0
  62. data/lib/us_core_test_kit/generated/v3.1.1/resprate/resprate_validation_test.rb +1 -0
  63. data/lib/us_core_test_kit/generated/v3.1.1/smokingstatus/metadata.yml +1 -0
  64. data/lib/us_core_test_kit/generated/v3.1.1/smokingstatus/smokingstatus_validation_test.rb +1 -0
  65. data/lib/us_core_test_kit/generated/v3.1.1/us_core_test_suite.rb +2 -2
  66. data/lib/us_core_test_kit/generated/v4.0.0/allergy_intolerance/allergy_intolerance_validation_test.rb +1 -0
  67. data/lib/us_core_test_kit/generated/v4.0.0/allergy_intolerance/metadata.yml +1 -0
  68. data/lib/us_core_test_kit/generated/v4.0.0/blood_pressure/blood_pressure_validation_test.rb +1 -0
  69. data/lib/us_core_test_kit/generated/v4.0.0/blood_pressure/metadata.yml +1 -0
  70. data/lib/us_core_test_kit/generated/v4.0.0/bmi/bmi_validation_test.rb +1 -0
  71. data/lib/us_core_test_kit/generated/v4.0.0/bmi/metadata.yml +1 -0
  72. data/lib/us_core_test_kit/generated/v4.0.0/body_height/body_height_validation_test.rb +1 -0
  73. data/lib/us_core_test_kit/generated/v4.0.0/body_height/metadata.yml +1 -0
  74. data/lib/us_core_test_kit/generated/v4.0.0/body_temperature/body_temperature_validation_test.rb +1 -0
  75. data/lib/us_core_test_kit/generated/v4.0.0/body_temperature/metadata.yml +1 -0
  76. data/lib/us_core_test_kit/generated/v4.0.0/body_weight/body_weight_validation_test.rb +1 -0
  77. data/lib/us_core_test_kit/generated/v4.0.0/body_weight/metadata.yml +1 -0
  78. data/lib/us_core_test_kit/generated/v4.0.0/care_plan/care_plan_validation_test.rb +1 -0
  79. data/lib/us_core_test_kit/generated/v4.0.0/care_plan/metadata.yml +1 -0
  80. data/lib/us_core_test_kit/generated/v4.0.0/care_team/care_team_validation_test.rb +1 -0
  81. data/lib/us_core_test_kit/generated/v4.0.0/care_team/metadata.yml +1 -0
  82. data/lib/us_core_test_kit/generated/v4.0.0/condition/condition_validation_test.rb +1 -0
  83. data/lib/us_core_test_kit/generated/v4.0.0/condition/metadata.yml +1 -0
  84. data/lib/us_core_test_kit/generated/v4.0.0/device/device_validation_test.rb +1 -0
  85. data/lib/us_core_test_kit/generated/v4.0.0/device/metadata.yml +1 -0
  86. data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_lab/diagnostic_report_lab_validation_test.rb +1 -0
  87. data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_lab/metadata.yml +1 -0
  88. data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_note/diagnostic_report_note_validation_test.rb +1 -0
  89. data/lib/us_core_test_kit/generated/v4.0.0/diagnostic_report_note/metadata.yml +1 -0
  90. data/lib/us_core_test_kit/generated/v4.0.0/document_reference/document_reference_must_support_test.rb +1 -2
  91. data/lib/us_core_test_kit/generated/v4.0.0/document_reference/document_reference_validation_test.rb +1 -0
  92. data/lib/us_core_test_kit/generated/v4.0.0/document_reference/metadata.yml +1 -0
  93. data/lib/us_core_test_kit/generated/v4.0.0/encounter/encounter_must_support_test.rb +2 -4
  94. data/lib/us_core_test_kit/generated/v4.0.0/encounter/encounter_validation_test.rb +1 -0
  95. data/lib/us_core_test_kit/generated/v4.0.0/encounter/metadata.yml +1 -0
  96. data/lib/us_core_test_kit/generated/v4.0.0/goal/goal_validation_test.rb +1 -0
  97. data/lib/us_core_test_kit/generated/v4.0.0/goal/metadata.yml +1 -0
  98. data/lib/us_core_test_kit/generated/v4.0.0/head_circumference/head_circumference_validation_test.rb +1 -0
  99. data/lib/us_core_test_kit/generated/v4.0.0/head_circumference/metadata.yml +1 -0
  100. data/lib/us_core_test_kit/generated/v4.0.0/head_circumference_percentile/head_circumference_percentile_validation_test.rb +1 -0
  101. data/lib/us_core_test_kit/generated/v4.0.0/head_circumference_percentile/metadata.yml +1 -0
  102. data/lib/us_core_test_kit/generated/v4.0.0/heart_rate/heart_rate_validation_test.rb +1 -0
  103. data/lib/us_core_test_kit/generated/v4.0.0/heart_rate/metadata.yml +1 -0
  104. data/lib/us_core_test_kit/generated/v4.0.0/immunization/immunization_validation_test.rb +1 -0
  105. data/lib/us_core_test_kit/generated/v4.0.0/immunization/metadata.yml +1 -0
  106. data/lib/us_core_test_kit/generated/v4.0.0/medication_request/medication_request_must_support_test.rb +1 -2
  107. data/lib/us_core_test_kit/generated/v4.0.0/medication_request/medication_request_validation_test.rb +1 -0
  108. data/lib/us_core_test_kit/generated/v4.0.0/medication_request/medication_validation_test.rb +1 -0
  109. data/lib/us_core_test_kit/generated/v4.0.0/medication_request/metadata.yml +1 -0
  110. data/lib/us_core_test_kit/generated/v4.0.0/metadata.yml +47 -2
  111. data/lib/us_core_test_kit/generated/v4.0.0/observation_lab/metadata.yml +1 -0
  112. data/lib/us_core_test_kit/generated/v4.0.0/observation_lab/observation_lab_validation_test.rb +1 -0
  113. data/lib/us_core_test_kit/generated/v4.0.0/organization/metadata.yml +1 -0
  114. data/lib/us_core_test_kit/generated/v4.0.0/organization/organization_validation_test.rb +1 -0
  115. data/lib/us_core_test_kit/generated/v4.0.0/patient/metadata.yml +13 -1
  116. data/lib/us_core_test_kit/generated/v4.0.0/patient/patient_must_support_test.rb +8 -6
  117. data/lib/us_core_test_kit/generated/v4.0.0/patient/patient_validation_test.rb +1 -0
  118. data/lib/us_core_test_kit/generated/v4.0.0/pediatric_bmi_for_age/metadata.yml +1 -0
  119. data/lib/us_core_test_kit/generated/v4.0.0/pediatric_bmi_for_age/pediatric_bmi_for_age_validation_test.rb +1 -0
  120. data/lib/us_core_test_kit/generated/v4.0.0/pediatric_weight_for_height/metadata.yml +1 -0
  121. data/lib/us_core_test_kit/generated/v4.0.0/pediatric_weight_for_height/pediatric_weight_for_height_validation_test.rb +1 -0
  122. data/lib/us_core_test_kit/generated/v4.0.0/practitioner/metadata.yml +1 -0
  123. data/lib/us_core_test_kit/generated/v4.0.0/practitioner/practitioner_validation_test.rb +1 -0
  124. data/lib/us_core_test_kit/generated/v4.0.0/procedure/metadata.yml +1 -0
  125. data/lib/us_core_test_kit/generated/v4.0.0/procedure/procedure_validation_test.rb +1 -0
  126. data/lib/us_core_test_kit/generated/v4.0.0/provenance/metadata.yml +1 -1
  127. data/lib/us_core_test_kit/generated/v4.0.0/provenance/provenance_validation_test.rb +1 -0
  128. data/lib/us_core_test_kit/generated/v4.0.0/pulse_oximetry/metadata.yml +1 -0
  129. data/lib/us_core_test_kit/generated/v4.0.0/pulse_oximetry/pulse_oximetry_validation_test.rb +1 -0
  130. data/lib/us_core_test_kit/generated/v4.0.0/respiratory_rate/metadata.yml +1 -0
  131. data/lib/us_core_test_kit/generated/v4.0.0/respiratory_rate/respiratory_rate_validation_test.rb +1 -0
  132. data/lib/us_core_test_kit/generated/v4.0.0/smokingstatus/metadata.yml +1 -0
  133. data/lib/us_core_test_kit/generated/v4.0.0/smokingstatus/smokingstatus_validation_test.rb +1 -0
  134. data/lib/us_core_test_kit/generated/v4.0.0/us_core_test_suite.rb +2 -2
  135. data/lib/us_core_test_kit/generator/group_metadata.rb +1 -0
  136. data/lib/us_core_test_kit/generator/group_metadata_extractor.rb +5 -0
  137. data/lib/us_core_test_kit/generator/ig_loader.rb +12 -5
  138. data/lib/us_core_test_kit/generator/must_support_metadata_extractor.rb +23 -22
  139. data/lib/us_core_test_kit/generator/must_support_test_generator.rb +26 -3
  140. data/lib/us_core_test_kit/generator/validation_test_generator.rb +4 -0
  141. data/lib/us_core_test_kit/generator.rb +9 -14
  142. data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-bodyheight.json +0 -0
  143. data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-bodytemp.json +0 -0
  144. data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-bodyweight.json +0 -0
  145. data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-bp.json +0 -0
  146. data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-heartrate.json +0 -0
  147. data/lib/us_core_test_kit/igs/{v311 → us_core_311}/StructureDefinition-resprate.json +0 -0
  148. data/lib/us_core_test_kit/igs/{v311/package.tgz → us_core_311.tgz} +0 -0
  149. data/lib/us_core_test_kit/igs/{v400/package.tgz → us_core_400.tgz} +0 -0
  150. data/lib/us_core_test_kit/must_support_test.rb +25 -3
  151. data/lib/us_core_test_kit/search_test.rb +107 -48
  152. data/lib/us_core_test_kit/validation_test.rb +4 -2
  153. data/lib/us_core_test_kit/version.rb +3 -1
  154. 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
- .each { |resource| check_resource_against_params(resource, params_with_comparator) }
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
- new_resource_count =
244
- fetch_all_bundled_resources
245
- .select { |resource| resource.resourceType == resource_type }
246
- .count
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.each_with_object({}) do |name, 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(',')] : [definition[:values]]
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
- search_param_names.each_with_object({}) do |name, params|
428
- value = patient_id_param?(name) ? patient_id : search_param_value(name, patient_id)
429
- params[name] = value
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
- "Please use patients with more information"
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
- all_valid_resource_types =
511
- resources.all? { |entry| valid_resource_types.include? entry.resourceType }
536
+ invalid_resource_types =
537
+ resources.reject { |entry| valid_resource_types.include? entry.resourceType }
538
+ .map(&:resourceType)
539
+ .uniq
512
540
 
513
- assert all_valid_resource_types,
514
- "All resources returned must be of the type: #{valid_resource_types.join(', ')}"
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, patient_id, include_system: false)
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(scratch_resources_for_patient(patient_id), path)
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
- coding.present? ? "#{coding.system}|#{coding.code}" : nil
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
- if include_system
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
- if include_system
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
- element
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: 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 #{profile_url}"
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)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module USCoreTestKit
2
- VERSION = '0.2.2'
4
+ VERSION = '0.2.5'
3
5
  end
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.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-09 00:00:00.000000000 Z
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/v311/StructureDefinition-bodyheight.json
822
- - lib/us_core_test_kit/igs/v311/StructureDefinition-bodytemp.json
823
- - lib/us_core_test_kit/igs/v311/StructureDefinition-bodyweight.json
824
- - lib/us_core_test_kit/igs/v311/StructureDefinition-bp.json
825
- - lib/us_core_test_kit/igs/v311/StructureDefinition-heartrate.json
826
- - lib/us_core_test_kit/igs/v311/StructureDefinition-resprate.json
827
- - lib/us_core_test_kit/igs/v311/package.tgz
828
- - lib/us_core_test_kit/igs/v400/package.tgz
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: []