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.
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: []