us_core_test_kit 0.6.5 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/lib/us_core_test_kit/custom_groups/base_smart_granular_scopes_group.rb +44 -12
  3. data/lib/us_core_test_kit/custom_groups/granted_granular_scopes_test.rb +61 -0
  4. data/lib/us_core_test_kit/custom_groups/screening_assessment_category_test.rb +75 -0
  5. data/lib/us_core_test_kit/custom_groups/smart_scopes_constants.rb +5 -8
  6. data/lib/us_core_test_kit/custom_groups/v6.1.0/screening_assessment_group.rb +45 -0
  7. data/lib/us_core_test_kit/custom_groups/v6.1.0/smart_granular_scopes_group.rb +94 -41
  8. data/lib/us_core_test_kit/custom_groups/v7.0.0-ballot/screening_assessment_group.rb +48 -0
  9. data/lib/us_core_test_kit/custom_groups/v7.0.0-ballot/smart_granular_scopes_group.rb +6 -0
  10. data/lib/us_core_test_kit/fhir_resource_navigation.rb +16 -1
  11. data/lib/us_core_test_kit/generated/v3.1.1/metadata.yml +3 -0
  12. data/lib/us_core_test_kit/generated/v3.1.1/patient/metadata.yml +3 -0
  13. data/lib/us_core_test_kit/generated/v3.1.1/us_core_test_suite.rb +5 -4
  14. data/lib/us_core_test_kit/generated/v4.0.0/metadata.yml +3 -0
  15. data/lib/us_core_test_kit/generated/v4.0.0/patient/metadata.yml +3 -0
  16. data/lib/us_core_test_kit/generated/v4.0.0/us_core_test_suite.rb +5 -4
  17. data/lib/us_core_test_kit/generated/v5.0.1/condition_encounter_diagnosis/metadata.yml +1 -0
  18. data/lib/us_core_test_kit/generated/v5.0.1/condition_problems_health_concerns/metadata.yml +1 -0
  19. data/lib/us_core_test_kit/generated/v5.0.1/metadata.yml +8 -0
  20. data/lib/us_core_test_kit/generated/v5.0.1/patient/metadata.yml +4 -0
  21. data/lib/us_core_test_kit/generated/v5.0.1/questionnaire_response/metadata.yml +2 -0
  22. data/lib/us_core_test_kit/generated/v5.0.1/us_core_test_suite.rb +5 -4
  23. data/lib/us_core_test_kit/generated/v6.1.0/condition_encounter_diagnosis/metadata.yml +23 -20
  24. data/lib/us_core_test_kit/generated/v6.1.0/condition_granular_scope1_group.rb +24 -20
  25. data/lib/us_core_test_kit/generated/v6.1.0/condition_problems_health_concerns/metadata.yml +1 -0
  26. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/condition_granular_scope_read_test.rb +32 -0
  27. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_abatement_date_granular_scope_test.rb → condition_patient_abatement_date_granular_scope_search_test.rb} +5 -5
  28. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_asserted_date_granular_scope_test.rb → condition_patient_asserted_date_granular_scope_search_test.rb} +5 -5
  29. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_category_clinical_status_granular_scope_test.rb → condition_patient_category_clinical_status_granular_scope_search_test.rb} +5 -5
  30. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_category_encounter_granular_scope_test.rb → condition_patient_category_encounter_granular_scope_search_test.rb} +5 -5
  31. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_category_granular_scope_test.rb → condition_patient_category_granular_scope_search_test.rb} +5 -5
  32. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_clinical_status_granular_scope_test.rb → condition_patient_clinical_status_granular_scope_search_test.rb} +5 -5
  33. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_code_granular_scope_test.rb → condition_patient_code_granular_scope_search_test.rb} +5 -5
  34. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_granular_scope_test.rb → condition_patient_granular_scope_search_test.rb} +5 -5
  35. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_onset_date_granular_scope_test.rb → condition_patient_onset_date_granular_scope_search_test.rb} +5 -5
  36. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/{condition_patient_recorded_date_granular_scope_test.rb → condition_patient_recorded_date_granular_scope_search_test.rb} +5 -5
  37. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/condition/metadata.yml +25 -22
  38. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/observation/metadata.yml +14 -12
  39. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/observation/observation_granular_scope_read_test.rb +32 -0
  40. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/observation/{observation_patient_category_date_granular_scope_test.rb → observation_patient_category_date_granular_scope_search_test.rb} +5 -5
  41. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/observation/{observation_patient_category_granular_scope_test.rb → observation_patient_category_granular_scope_search_test.rb} +5 -5
  42. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/observation/{observation_patient_category_status_granular_scope_test.rb → observation_patient_category_status_granular_scope_search_test.rb} +5 -5
  43. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/observation/{observation_patient_code_date_granular_scope_test.rb → observation_patient_code_date_granular_scope_search_test.rb} +5 -5
  44. data/lib/us_core_test_kit/generated/v6.1.0/granular_scope_tests/observation/{observation_patient_code_granular_scope_test.rb → observation_patient_code_granular_scope_search_test.rb} +5 -5
  45. data/lib/us_core_test_kit/generated/v6.1.0/granular_scopes1_group.rb +5 -1
  46. data/lib/us_core_test_kit/generated/v6.1.0/metadata.yml +43 -36
  47. data/lib/us_core_test_kit/generated/v6.1.0/observation_granular_scope1_group.rb +15 -11
  48. data/lib/us_core_test_kit/generated/v6.1.0/observation_lab/metadata.yml +12 -10
  49. data/lib/us_core_test_kit/generated/v6.1.0/patient/metadata.yml +5 -0
  50. data/lib/us_core_test_kit/generated/v6.1.0/questionnaire_response/metadata.yml +2 -0
  51. data/lib/us_core_test_kit/generated/v6.1.0/us_core_test_suite.rb +9 -6
  52. data/lib/us_core_test_kit/generated/v7.0.0-ballot/condition_encounter_diagnosis/metadata.yml +23 -20
  53. data/lib/us_core_test_kit/generated/v7.0.0-ballot/condition_granular_scope1_group.rb +22 -20
  54. data/lib/us_core_test_kit/generated/v7.0.0-ballot/condition_granular_scope2_group.rb +22 -20
  55. data/lib/us_core_test_kit/generated/v7.0.0-ballot/condition_problems_health_concerns/metadata.yml +1 -0
  56. data/lib/us_core_test_kit/generated/v7.0.0-ballot/diagnostic_report_granular_scope1_group.rb +14 -12
  57. data/lib/us_core_test_kit/generated/v7.0.0-ballot/diagnostic_report_granular_scope2_group.rb +14 -12
  58. data/lib/us_core_test_kit/generated/v7.0.0-ballot/diagnostic_report_note/metadata.yml +14 -12
  59. data/lib/us_core_test_kit/generated/v7.0.0-ballot/document_reference/metadata.yml +16 -14
  60. data/lib/us_core_test_kit/generated/v7.0.0-ballot/document_reference_granular_scope1_group.rb +16 -14
  61. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/condition_granular_scope_read_test.rb +32 -0
  62. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_abatement_date_granular_scope_test.rb → condition_patient_abatement_date_granular_scope_search_test.rb} +5 -5
  63. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_asserted_date_granular_scope_test.rb → condition_patient_asserted_date_granular_scope_search_test.rb} +5 -5
  64. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_category_clinical_status_granular_scope_test.rb → condition_patient_category_clinical_status_granular_scope_search_test.rb} +5 -5
  65. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_category_encounter_granular_scope_test.rb → condition_patient_category_encounter_granular_scope_search_test.rb} +5 -5
  66. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_category_granular_scope_test.rb → condition_patient_category_granular_scope_search_test.rb} +5 -5
  67. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_clinical_status_granular_scope_test.rb → condition_patient_clinical_status_granular_scope_search_test.rb} +5 -5
  68. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_code_granular_scope_test.rb → condition_patient_code_granular_scope_search_test.rb} +5 -5
  69. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_granular_scope_test.rb → condition_patient_granular_scope_search_test.rb} +5 -5
  70. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_onset_date_granular_scope_test.rb → condition_patient_onset_date_granular_scope_search_test.rb} +5 -5
  71. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/{condition_patient_recorded_date_granular_scope_test.rb → condition_patient_recorded_date_granular_scope_search_test.rb} +5 -5
  72. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/condition/metadata.yml +23 -20
  73. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/diagnostic_report/diagnostic_report_granular_scope_read_test.rb +32 -0
  74. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/diagnostic_report/{diagnostic_report_patient_category_date_granular_scope_test.rb → diagnostic_report_patient_category_date_granular_scope_search_test.rb} +5 -5
  75. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/diagnostic_report/{diagnostic_report_patient_category_granular_scope_test.rb → diagnostic_report_patient_category_granular_scope_search_test.rb} +5 -5
  76. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/diagnostic_report/{diagnostic_report_patient_code_date_granular_scope_test.rb → diagnostic_report_patient_code_date_granular_scope_search_test.rb} +5 -5
  77. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/diagnostic_report/{diagnostic_report_patient_code_granular_scope_test.rb → diagnostic_report_patient_code_granular_scope_search_test.rb} +5 -5
  78. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/diagnostic_report/{diagnostic_report_patient_granular_scope_test.rb → diagnostic_report_patient_granular_scope_search_test.rb} +5 -5
  79. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/diagnostic_report/{diagnostic_report_patient_status_granular_scope_test.rb → diagnostic_report_patient_status_granular_scope_search_test.rb} +5 -5
  80. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/diagnostic_report/metadata.yml +14 -12
  81. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/document_reference_granular_scope_read_test.rb +32 -0
  82. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/{document_reference_id_granular_scope_test.rb → document_reference_id_granular_scope_search_test.rb} +5 -5
  83. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/{document_reference_patient_category_date_granular_scope_test.rb → document_reference_patient_category_date_granular_scope_search_test.rb} +5 -5
  84. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/{document_reference_patient_category_granular_scope_test.rb → document_reference_patient_category_granular_scope_search_test.rb} +5 -5
  85. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/{document_reference_patient_granular_scope_test.rb → document_reference_patient_granular_scope_search_test.rb} +5 -5
  86. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/{document_reference_patient_status_granular_scope_test.rb → document_reference_patient_status_granular_scope_search_test.rb} +5 -5
  87. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/{document_reference_patient_type_granular_scope_test.rb → document_reference_patient_type_granular_scope_search_test.rb} +5 -5
  88. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/{document_reference_patient_type_period_granular_scope_test.rb → document_reference_patient_type_period_granular_scope_search_test.rb} +5 -5
  89. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/document_reference/metadata.yml +16 -14
  90. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/observation/metadata.yml +12 -10
  91. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/observation/observation_granular_scope_read_test.rb +32 -0
  92. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/observation/{observation_patient_category_date_granular_scope_test.rb → observation_patient_category_date_granular_scope_search_test.rb} +5 -5
  93. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/observation/{observation_patient_category_granular_scope_test.rb → observation_patient_category_granular_scope_search_test.rb} +5 -5
  94. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/observation/{observation_patient_category_status_granular_scope_test.rb → observation_patient_category_status_granular_scope_search_test.rb} +5 -5
  95. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/observation/{observation_patient_code_date_granular_scope_test.rb → observation_patient_code_date_granular_scope_search_test.rb} +5 -5
  96. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/observation/{observation_patient_code_granular_scope_test.rb → observation_patient_code_granular_scope_search_test.rb} +5 -5
  97. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/metadata.yml +16 -14
  98. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/service_request_granular_scope_read_test.rb +32 -0
  99. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/{service_request_id_granular_scope_test.rb → service_request_id_granular_scope_search_test.rb} +5 -5
  100. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/{service_request_patient_category_authored_granular_scope_test.rb → service_request_patient_category_authored_granular_scope_search_test.rb} +5 -5
  101. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/{service_request_patient_category_granular_scope_test.rb → service_request_patient_category_granular_scope_search_test.rb} +5 -5
  102. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/{service_request_patient_code_authored_granular_scope_test.rb → service_request_patient_code_authored_granular_scope_search_test.rb} +5 -5
  103. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/{service_request_patient_code_granular_scope_test.rb → service_request_patient_code_granular_scope_search_test.rb} +5 -5
  104. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/{service_request_patient_granular_scope_test.rb → service_request_patient_granular_scope_search_test.rb} +5 -5
  105. data/lib/us_core_test_kit/generated/v7.0.0-ballot/granular_scope_tests/service_request/{service_request_patient_status_granular_scope_test.rb → service_request_patient_status_granular_scope_search_test.rb} +5 -5
  106. data/lib/us_core_test_kit/generated/v7.0.0-ballot/medication_request/metadata.yml +1 -0
  107. data/lib/us_core_test_kit/generated/v7.0.0-ballot/metadata.yml +90 -70
  108. data/lib/us_core_test_kit/generated/v7.0.0-ballot/observation_granular_scope1_group.rb +12 -10
  109. data/lib/us_core_test_kit/generated/v7.0.0-ballot/observation_granular_scope2_group.rb +12 -10
  110. data/lib/us_core_test_kit/generated/v7.0.0-ballot/observation_lab/metadata.yml +12 -10
  111. data/lib/us_core_test_kit/generated/v7.0.0-ballot/patient/metadata.yml +5 -0
  112. data/lib/us_core_test_kit/generated/v7.0.0-ballot/questionnaire_response/metadata.yml +2 -0
  113. data/lib/us_core_test_kit/generated/v7.0.0-ballot/service_request/metadata.yml +16 -14
  114. data/lib/us_core_test_kit/generated/v7.0.0-ballot/service_request_granular_scope1_group.rb +16 -14
  115. data/lib/us_core_test_kit/generated/v7.0.0-ballot/service_request_granular_scope2_group.rb +16 -14
  116. data/lib/us_core_test_kit/generated/v7.0.0-ballot/us_core_test_suite.rb +8 -5
  117. data/lib/us_core_test_kit/generator/granular_scope_group_generator.rb +7 -0
  118. data/lib/us_core_test_kit/generator/granular_scope_read_test_generator.rb +102 -0
  119. data/lib/us_core_test_kit/generator/granular_scope_resource_type_group_generator.rb +1 -1
  120. data/lib/us_core_test_kit/generator/granular_scope_test_generator.rb +4 -4
  121. data/lib/us_core_test_kit/generator/group_metadata.rb +1 -1
  122. data/lib/us_core_test_kit/generator/must_support_metadata_extractor.rb +1 -0
  123. data/lib/us_core_test_kit/generator/must_support_metadata_extractor_us_core_4.rb +3 -0
  124. data/lib/us_core_test_kit/generator/must_support_metadata_extractor_us_core_5.rb +1 -0
  125. data/lib/us_core_test_kit/generator/special_cases.rb +3 -5
  126. data/lib/us_core_test_kit/generator/suite_generator.rb +14 -3
  127. data/lib/us_core_test_kit/generator.rb +2 -0
  128. data/lib/us_core_test_kit/granular_scope.rb +63 -0
  129. data/lib/us_core_test_kit/granular_scope_read_test.rb +71 -0
  130. data/lib/us_core_test_kit/{granular_scope_checker.rb → granular_scope_search_test.rb} +8 -47
  131. data/lib/us_core_test_kit/must_support_test.rb +27 -7
  132. data/lib/us_core_test_kit/primitive_type.rb +5 -0
  133. data/lib/us_core_test_kit/provenance_validator.rb +3 -4
  134. data/lib/us_core_test_kit/reference_resolution_test.rb +2 -1
  135. data/lib/us_core_test_kit/resource_search_param_checker.rb +139 -0
  136. data/lib/us_core_test_kit/search_test.rb +6 -0
  137. data/lib/us_core_test_kit/version.rb +1 -1
  138. metadata +72 -59
  139. data/lib/us_core_test_kit/generated/v6.1.0/condition_granular_scope2_group.rb +0 -43
  140. data/lib/us_core_test_kit/generated/v6.1.0/granular_scopes2_group.rb +0 -52
  141. data/lib/us_core_test_kit/generated/v6.1.0/observation_granular_scope2_group.rb +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b523f64858f67e78b0320d2fdeb6d7627d325aaad65a3964fb8c6ee2b2d666c7
4
- data.tar.gz: 1c7dac1bdf1ef473c38876d67dd2a80175debc4f2fb1ede9c691e86ff8891d4b
3
+ metadata.gz: 2b693ad77df0cc7296b9ae07942cf5ea4f3496fb47ca199d63f3066f906f142f
4
+ data.tar.gz: 34d31851aabbf208e7f0db087a2f72f355e42c1c8e61da20b3c5a62885db1b72
5
5
  SHA512:
6
- metadata.gz: 99baa30564cabcba6e7c288bf114269077b6710e0b78997490a596382a7eed519509d41d601f58d95f61281a9051546d7c2a7554517fab40803d4f3ee6bdeb69
7
- data.tar.gz: 49cb5f382f48f3e3fcd154612bd3dbc01239a8cf06714825d460066fea85cf839532f6be75f601caf04383f59f09845a2df243b43b3b08db6c19e7463862b6ff
6
+ metadata.gz: 325e5643f37e0da1e02e5e4fe3d4808ed3dc4e62a24e7f290ebe146e275b86cc13db3d51f79a331f5207bca117c1d7b8fcd2707170158aa29d21f50ed38605de
7
+ data.tar.gz: 2b11e159d4e26f24571fd040155a6ac924c2b5ccda1e5474380b24caac4486d0d8ea83e7ed4b6005f57aee2df0f25cd1e1073e36057409226b17840469bb3a99
@@ -3,8 +3,10 @@ require 'smart_app_launch_test_kit'
3
3
  require_relative './smart_ehr_launch_stu2'
4
4
  require_relative './smart_scopes_constants'
5
5
  require_relative './smart_standalone_launch_stu2_group'
6
- require_relative '../granular_scope_checker'
6
+ require_relative '../granular_scope_search_test'
7
+ require_relative '../granular_scope_read_test'
7
8
  require_relative '../us_core_options'
9
+ require_relative './granted_granular_scopes_test'
8
10
 
9
11
  module USCoreTestKit
10
12
  class BaseSmartGranularScopesGroup < Inferno::TestGroup
@@ -52,8 +54,7 @@ module USCoreTestKit
52
54
  smart_credentials: {
53
55
  name: :granular_scopes_1_credentials
54
56
  }
55
- }
56
- )
57
+ } )
57
58
  group from: :us_core_smart_standalone_launch_stu2,
58
59
  optional: true,
59
60
  config: {
@@ -62,7 +63,16 @@ module USCoreTestKit
62
63
  name: :granular_scopes_1_credentials
63
64
  }
64
65
  }
65
- }
66
+ } do
67
+ groups[1].test from: :us_core_granted_granular_scopes,
68
+ config: {
69
+ inputs: {
70
+ received_scopes: {
71
+ name: :standalone_received_scopes
72
+ }
73
+ }
74
+ }
75
+ end
66
76
  group from: :us_core_smart_ehr_launch_stu2,
67
77
  optional: true,
68
78
  config: {
@@ -71,9 +81,16 @@ module USCoreTestKit
71
81
  name: :granular_scopes_1_credentials
72
82
  }
73
83
  }
74
- }
75
-
76
- # TODO: verify that all required scopes were requested and received
84
+ } do
85
+ groups[1].test from: :us_core_granted_granular_scopes,
86
+ config: {
87
+ inputs: {
88
+ received_scopes: {
89
+ name: :ehr_received_scopes
90
+ }
91
+ }
92
+ }
93
+ end
77
94
  end
78
95
  end
79
96
 
@@ -103,7 +120,16 @@ module USCoreTestKit
103
120
  name: :granular_scopes_2_credentials
104
121
  }
105
122
  }
106
- }
123
+ } do
124
+ groups[1].test from: :us_core_granted_granular_scopes,
125
+ config: {
126
+ inputs: {
127
+ received_scopes: {
128
+ name: :standalone_received_scopes
129
+ }
130
+ }
131
+ }
132
+ end
107
133
 
108
134
 
109
135
  group from: :us_core_smart_ehr_launch_stu2,
@@ -114,10 +140,16 @@ module USCoreTestKit
114
140
  name: :granular_scopes_2_credentials
115
141
  }
116
142
  }
117
- }
118
-
119
-
120
- # TODO: verify that all required scopes were requested and received
143
+ } do
144
+ groups[1].test from: :us_core_granted_granular_scopes,
145
+ config: {
146
+ inputs: {
147
+ received_scopes: {
148
+ name: :ehr_received_scopes
149
+ }
150
+ }
151
+ }
152
+ end
121
153
  end
122
154
  end
123
155
  end
@@ -0,0 +1,61 @@
1
+ module USCoreTestKit
2
+ class GrantedGranularScopesTest < Inferno::Test
3
+ id :us_core_granted_granular_scopes
4
+ title 'Required granular scopes were granted'
5
+
6
+ description %()
7
+
8
+ input :received_scopes
9
+
10
+ run do
11
+ required_granular_scopes =
12
+ config
13
+ .options[:required_scopes]
14
+ .map { |scope| scope[scope.index('/') + 1, scope.length] }
15
+
16
+ received_granular_scopes =
17
+ received_scopes
18
+ .split(' ')
19
+ .select { |scope| scope.include? '?' }
20
+ .map { |scope| scope[scope.index('/') + 1, scope.length] }
21
+
22
+ missing_scopes = required_granular_scopes - received_granular_scopes
23
+
24
+ wrapped_missing_scopes = missing_scopes.map { |scope| "`#{scope}`" }
25
+
26
+ assert missing_scopes.empty?,
27
+ "The following granular scopes were not granted: #{wrapped_missing_scopes.to_sentence}"
28
+
29
+ granular_scope_resource_types =
30
+ required_granular_scopes
31
+ .map { |scope| scope.split('.').first }
32
+ .uniq
33
+
34
+ received_resource_level_scopes =
35
+ received_scopes
36
+ .split(' ')
37
+ .reject { |scope| scope.include? '?' }
38
+ .select { |scope| scope.match? %r{\A(user|patient|system|\*)/.+\..+} }
39
+ .map { |scope| scope[scope.index('/') + 1, scope.length] }
40
+ .select { |scope| granular_scope_resource_types.include? scope[0, scope.index('.')] }
41
+
42
+ wrapped_resource_scopes = received_resource_level_scopes.map { |scope| "`#{scope}`" }
43
+
44
+ assert received_resource_level_scopes.empty?,
45
+ 'Can not verify the behavior of granular scopes because the following resource-level scopes were ' \
46
+ "granted: #{wrapped_resource_scopes.to_sentence}"
47
+
48
+ received_wildcard_scopes =
49
+ received_scopes
50
+ .split(' ')
51
+ .select { |scope| scope.match? %r{\A(user|patient|system|\*)/\*} }
52
+
53
+ wrapped_wildcard_scopes = received_wildcard_scopes.map { |scope| "`#{scope}`" }
54
+
55
+ assert received_wildcard_scopes.empty?,
56
+ 'Can not verify the behavior of granular scopes because the following wildcard scopes were ' \
57
+ "granted: #{wrapped_wildcard_scopes.to_sentence}"
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,75 @@
1
+ require_relative '../search_test'
2
+
3
+ module USCoreTestKit
4
+ class ScreeningAssessmentCategoryTest < Inferno::Test
5
+ include SearchTest
6
+
7
+ id :us_core_screening_assessment_category
8
+ title 'Server demonstrates support for the required Condition and Observation categories.'
9
+
10
+ input :patient_ids,
11
+ title: 'Patient IDs',
12
+ description: 'Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements'
13
+
14
+ # Disable tagging requests since this test doesn't have properties defined.
15
+ # TODO: investigate whether we need to tag these for granular scope
16
+ # checking.
17
+ def tags(_params)
18
+ nil
19
+ end
20
+
21
+ # rubocop:disable Metrics/CyclomaticComplexity
22
+ def category_found(resource_type:, patient_id:, category_search_values:, missing_categories:)
23
+ search_params = { patient: patient_id }
24
+
25
+ category_search_values.each do |category_search_value|
26
+ search_params[:category] = category_search_value
27
+ search_and_check_response(search_params, resource_type)
28
+
29
+ resources = fetch_all_bundled_resources(resource_type:)
30
+ .select { |resource| resource.resourceType == resource_type }
31
+
32
+ resources.each do |resource|
33
+ resource.category&.each do |category|
34
+ category.coding&.each do |coding|
35
+ missing_categories.delete(coding.code)
36
+ end
37
+ end
38
+
39
+ break if missing_categories.empty?
40
+ end
41
+
42
+ break if missing_categories.empty?
43
+ end
44
+ end
45
+ # rubocop:enable Metrics/CyclomaticComplexity
46
+
47
+ run do
48
+ missing_obs_categories = config.options[:observation_screening_assessment_categories].dup
49
+ missing_cond_categories = config.options[:condition_screening_assessment_categories].dup
50
+
51
+ patient_id_list.each do |patient_id|
52
+ unless missing_cond_categories.empty?
53
+ category_found(resource_type: 'Condition',
54
+ patient_id:,
55
+ category_search_values: ['health-concern', 'problem-list-item'],
56
+ missing_categories: missing_cond_categories)
57
+ end
58
+
59
+ next if missing_obs_categories.empty?
60
+
61
+ category_found(resource_type: 'Observation',
62
+ patient_id:,
63
+ category_search_values: ['survey'],
64
+ missing_categories: missing_obs_categories)
65
+ end
66
+
67
+ pass if missing_cond_categories.empty? && missing_obs_categories.empty?
68
+
69
+ messages = []
70
+ messages << "Observation categories: #{missing_obs_categories.join(', ')}" unless missing_obs_categories.empty?
71
+ messages << "Condition categories: #{missing_cond_categories.join(', ')}" unless missing_cond_categories.empty?
72
+ skip "Could not find these #{messages.join(' and ')}."
73
+ end
74
+ end
75
+ end
@@ -5,9 +5,13 @@ module USCoreTestKit
5
5
  SMART_GRANULAR_SCOPES_GROUP1 = {
6
6
  'v610' => [
7
7
  'patient/Condition.rs?category=http://terminology.hl7.org/CodeSystem/condition-category|encounter-diagnosis',
8
+ 'patient/Condition.rs?category=http://hl7.org/fhir/us/core/CodeSystem/condition-category|health-concern',
9
+ 'patient/Condition.rs?category=http://terminology.hl7.org/CodeSystem/condition-category|problem-list-item',
8
10
  'patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|laboratory',
9
11
  'patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|social-history',
10
- 'patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|procedure'
12
+ 'patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|vital-signs',
13
+ 'patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|survey',
14
+ 'patient/Observation.rs?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-category|sdoh'
11
15
  ].map(&:freeze).freeze,
12
16
  'v700_ballot' => [
13
17
  'patient/Condition.rs?category=http://terminology.hl7.org/CodeSystem/condition-category|encounter-diagnosis',
@@ -24,13 +28,6 @@ module USCoreTestKit
24
28
  }.freeze
25
29
 
26
30
  SMART_GRANULAR_SCOPES_GROUP2 = {
27
- 'v610' => [
28
- 'patient/Condition.rs?category=http://hl7.org/fhir/us/core/CodeSystem/condition-category|health-concern',
29
- 'patient/Condition.rs?category=http://terminology.hl7.org/CodeSystem/condition-category|problem-list-item',
30
- 'patient/Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|vital-signs',
31
- 'patient.Observation.rs?category=http://terminology.hl7.org/CodeSystem/observation-category|survey',
32
- 'patient.Observation.rs?category=http://hl7.org/fhir/us/core/CodeSystem/us-core-category|sdoh'
33
- ].map(&:freeze).freeze,
34
31
  'v700_ballot' => [
35
32
  'patient/Condition.rs?category=http://terminology.hl7.org/CodeSystem/condition-category|problem-list-item',
36
33
  'patient/DiagnosticReport.rs?category=http://loinc.org|LP7839-6',
@@ -0,0 +1,45 @@
1
+ require_relative '../screening_assessment_category_test'
2
+
3
+ module USCoreTestKit
4
+ module USCoreV610
5
+ class ScreeningAssessmentGroup < Inferno::TestGroup
6
+ id :us_core_v610_screening_assessment
7
+ title 'Screening Assessments Guidance'
8
+ short_description 'Verify Condition and Observation resources support the ' \
9
+ 'US Core Screening And Assessments Guidance.'
10
+ description %(
11
+ The #{title} Sequence tests Condition and Observation
12
+ resources associated with the provided patient. The resources returned
13
+ will be checked for consistency against the [US Core Screening And Assessments
14
+ Guidance](https://hl7.org/fhir/us/core/STU6.1/screening-and-assessments.html)
15
+ and FHIR JIRA ticket [FHIR-45319](https://jira.hl7.org/browse/FHIR-45319)
16
+
17
+ In this set of tests, Inferno serves as a FHIR client that attempts to
18
+ access the different types of Screening and Assessments specified in the guidance.
19
+ The provided patient needs to have the following four common Screening and Assessements
20
+ as Observation categories:
21
+
22
+ * SDOH Assessment (sdoh)
23
+ * Functional Status (functional-status)
24
+ * Disability Status (disability-status)
25
+ * Mental/Cognitive Status (cognitive-status)
26
+
27
+ The provided patient also needs to have the following common Screening and Assessment
28
+ as Condition category:
29
+
30
+ * SDOH Assessment (sdoh)
31
+ )
32
+ run_as_group
33
+
34
+ test from: :us_core_screening_assessment_category do
35
+ config(
36
+ options: {
37
+ condition_screening_assessment_categories: ['sdoh'].freeze,
38
+ observation_screening_assessment_categories: ['sdoh', 'functional-status', 'disability-status',
39
+ 'cognitive-status'].freeze
40
+ }
41
+ )
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,12 +1,33 @@
1
1
  require_relative '../base_smart_granular_scopes_group'
2
+ require_relative '../smart_scopes_constants'
3
+ require_relative '../granted_granular_scopes_test'
2
4
  require_relative '../../generated/v6.1.0/granular_scopes1_group'
3
- require_relative '../../generated/v6.1.0/granular_scopes2_group'
4
5
 
5
6
  module USCoreTestKit
6
7
  module USCoreV610
7
- class SmartGranularScopesGroup < BaseSmartGranularScopesGroup
8
- id :us_core_v610_smart_granular_scopes
8
+ class SmartGranularScopesGroup < Inferno::TestGroup
9
+ include SmartScopesConstants
9
10
  title 'US Core SMART Granular Scopes'
11
+ id :us_core_v610_smart_granular_scopes
12
+
13
+ description <<~DESCRIPTION
14
+ These tests verify that servers honor [SMART App Launch granular
15
+ scopes](http://hl7.org/fhir/smart-app-launch/STU2/scopes-and-launch-context.html#finer-grained-resource-constraints-using-search-parameters).
16
+ Support for these scopes is [required in US Core
17
+ 7](http://hl7.org/fhir/us/core/2024Jan/scopes.html#us-core-scopes).
18
+
19
+ Prior to running these tests, first run the US Core FHIR API tests using
20
+ resource-level scopes. This group includes a SMART App Launch followed by
21
+ FHIR API tests. The app launches require that a granular scopes be
22
+ granted. The FHIR API tests then repeat all of the queries from the
23
+ original FHIR API tests that were run using resource-level scopes, and
24
+ verify that only resources matching the granted granular scopes are
25
+ returned.
26
+ DESCRIPTION
27
+
28
+ def self.default_group_scopes(version)
29
+ [DEFAULT_SCOPES, *SMART_GRANULAR_SCOPES_GROUP1[version]].join(' ')
30
+ end
10
31
 
11
32
  def self.scopes_string(scopes)
12
33
  scopes
@@ -15,59 +36,91 @@ module USCoreTestKit
15
36
  .join("\n")
16
37
  end
17
38
 
18
- groups
19
- .first
20
- .description %(
21
- These tests perform a SMART app launch to receive the following granular scopes:
22
-
23
- #{scopes_string(SMART_GRANULAR_SCOPES_GROUP1['v610'])}
24
-
25
- Then all of the searches which have been performed in the US Core FHIR API tests
26
- are repeated to verify that the results have been filtered according to the
27
- above scopes.
28
- )
29
-
30
- groups
31
- .first
32
- .config(
33
- inputs: {
34
- requested_scopes: {
35
- name: :requested_scopes_group1,
36
- default: groups.first.default_group_scopes('v610')
37
- }
39
+ config(
40
+ inputs: {
41
+ url: {
42
+ locked: true
43
+ },
44
+ requested_scopes: {
45
+ name: :requested_scopes_group1,
46
+ default: default_group_scopes('v610')
38
47
  }
39
- )
48
+ }
49
+ )
50
+
51
+ group do
52
+ title 'SMART App Launch w/Granular Scopes'
40
53
 
41
- groups
42
- .first
43
- .group from: :us_core_v610_smart_granular_scopes_1
54
+ def self.scopes_string(scopes)
55
+ scopes
56
+ .map { |scope| scope.delete_prefix 'patient/' }
57
+ .map { |scope| "* `#{scope}`" }
58
+ .join("\n")
59
+ end
44
60
 
45
- groups
46
- .last
47
- .description %(
61
+ description %(
48
62
  These tests perform a SMART app launch to receive the following granular scopes:
49
63
 
50
- #{scopes_string(SMART_GRANULAR_SCOPES_GROUP2['v610'])}
64
+ #{scopes_string(SMART_GRANULAR_SCOPES_GROUP1['v610'])}
51
65
 
52
66
  Then all of the searches which have been performed in the US Core FHIR API tests
53
67
  are repeated to verify that the results have been filtered according to the
54
68
  above scopes.
55
69
  )
56
70
 
57
- groups
58
- .last
59
- .config(
60
- inputs: {
61
- requested_scopes: {
62
- name: :requested_scopes_group2,
63
- default: groups.last.default_group_scopes('v610')
71
+ config(
72
+ outputs: {
73
+ smart_credentials: {
74
+ name: :granular_scopes_1_credentials
64
75
  }
65
76
  }
66
77
  )
78
+ group from: :us_core_smart_standalone_launch_stu2,
79
+ optional: true,
80
+ config: {
81
+ inputs: {
82
+ smart_credentials: {
83
+ name: :granular_scopes_1_credentials
84
+ }
85
+ }
86
+ } do
87
+ groups[1].test from: :us_core_granted_granular_scopes,
88
+ config: {
89
+ inputs: {
90
+ received_scopes: {
91
+ name: :standalone_received_scopes
92
+ }
93
+ },
94
+ options: {
95
+ required_scopes: SMART_GRANULAR_SCOPES_GROUP1['v610']
96
+ }
97
+ }
98
+ end
99
+ group from: :us_core_smart_ehr_launch_stu2,
100
+ optional: true,
101
+ config: {
102
+ inputs: {
103
+ smart_credentials: {
104
+ name: :granular_scopes_1_credentials
105
+ }
106
+ }
107
+ } do
108
+ groups[1].test from: :us_core_granted_granular_scopes,
109
+ config: {
110
+ inputs: {
111
+ received_scopes: {
112
+ name: :ehr_received_scopes
113
+ }
114
+ },
115
+ options: {
116
+ required_scopes: SMART_GRANULAR_SCOPES_GROUP1['v610']
117
+ }
118
+ }
119
+ end
120
+ end
67
121
 
68
- groups
69
- .last
70
- .group from: :us_core_v610_smart_granular_scopes_2
122
+ group from: :us_core_v610_smart_granular_scopes_1,
123
+ title: 'US Core FHIR API w/Granular Scopes'
71
124
  end
72
125
  end
73
126
  end
@@ -0,0 +1,48 @@
1
+ require_relative '../screening_assessment_category_test'
2
+
3
+ module USCoreTestKit
4
+ module USCoreV700_BALLOT
5
+ class ScreeningAssessmentGroup < Inferno::TestGroup
6
+ id :us_core_v700_ballot_screening_assessment
7
+ title 'Screening Assessments Guidance'
8
+ short_description 'Verify Condition and Observation resources support the ' \
9
+ 'US Core Screening And Assessments Guidance.'
10
+ description %(
11
+ The #{title} Sequence tests Condition and Observation
12
+ resources associated with the provided patient. The resources returned
13
+ will be checked for consistency against the [US Core Screening And Assessments
14
+ Guidance](https://hl7.org/fhir/us/core/STU7/screening-and-assessments.html)
15
+ and FHIR JIRA ticket [FHIR-46052](https://jira.hl7.org/browse/FHIR-46052)
16
+
17
+ In this set of tests, Inferno serves as a FHIR client that attempts to
18
+ access the different types of Screening and Assessments specified in the guidance.
19
+ The provided patient needs to have the following four common Screening and Assessements
20
+ as Observation categories:
21
+
22
+ * SDOH Assessment (sdoh)
23
+ * Functional Status (functional-status)
24
+ * Disability Status (disability-status)
25
+ * Mental/Cognitive Status (cognitive-status)
26
+ * Physical Activity (activity)
27
+ * Alcohol Use (social-history)
28
+ * Substance Use (social-history)
29
+
30
+ The provided patient also needs to have the following common Screening and Assessment
31
+ as Condition category:
32
+
33
+ * SDOH Assessment (sdoh)
34
+ )
35
+ run_as_group
36
+
37
+ test from: :us_core_screening_assessment_category do
38
+ config(
39
+ options: {
40
+ condition_screening_assessment_categories: ['sdoh'].freeze,
41
+ observation_screening_assessment_categories: ['sdoh', 'functional-status', 'disability-status',
42
+ 'cognitive-status', 'activity', 'social-history'].freeze
43
+ }
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
@@ -43,6 +43,9 @@ above scopes.
43
43
  name: :requested_scopes_group1,
44
44
  default: groups.first.default_group_scopes('v700_ballot')
45
45
  }
46
+ },
47
+ options: {
48
+ required_scopes: SMART_GRANULAR_SCOPES_GROUP1['v700_ballot']
46
49
  }
47
50
  )
48
51
 
@@ -70,6 +73,9 @@ above scopes.
70
73
  name: :requested_scopes_group2,
71
74
  default: groups.last.default_group_scopes('v700_ballot')
72
75
  }
76
+ },
77
+ options: {
78
+ required_scopes: SMART_GRANULAR_SCOPES_GROUP2['v700_ballot']
73
79
  }
74
80
  )
75
81
 
@@ -1,6 +1,9 @@
1
+ require_relative './primitive_type'
2
+
1
3
  module USCoreTestKit
2
4
  module FHIRResourceNavigation
3
5
  DAR_EXTENSION_URL = 'http://hl7.org/fhir/StructureDefinition/data-absent-reason'.freeze
6
+ PRIMITIVE_DATA_TYPES = FHIR::PRIMITIVES.keys
4
7
 
5
8
  def resolve_path(elements, path)
6
9
  elements = Array.wrap(elements)
@@ -64,12 +67,24 @@ module USCoreTestKit
64
67
  slice = find_slice_via_discriminator(element, property)
65
68
  slice
66
69
  else
67
- element.send(property)
70
+ value = element.send(property)
71
+ primitive_value = get_primitive_type_value(element, property, value)
72
+ primitive_value.present? ? primitive_value : value
68
73
  end
69
74
  rescue NoMethodError
70
75
  nil
71
76
  end
72
77
 
78
+ def get_primitive_type_value(element, property, value)
79
+ source_value = element.source_hash["_#{property}"]
80
+
81
+ return nil unless source_value.present?
82
+
83
+ primitive_value = USCoreTestKit::PrimitiveType.new(source_value)
84
+ primitive_value.value = value
85
+ primitive_value
86
+ end
87
+
73
88
  def find_slice_via_discriminator(element, property)
74
89
  element_name = property.to_s.split(':')[0].gsub(/^class$/, 'local_class')
75
90
  slice_name = property.to_s.split(':')[1].gsub(/^class$/, 'local_class')
@@ -6636,10 +6636,13 @@
6636
6636
  :must_supports:
6637
6637
  :extensions:
6638
6638
  - :id: Patient.extension:race
6639
+ :path: extension
6639
6640
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-race
6640
6641
  - :id: Patient.extension:ethnicity
6642
+ :path: extension
6641
6643
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity
6642
6644
  - :id: Patient.extension:birthsex
6645
+ :path: extension
6643
6646
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex
6644
6647
  :slices: []
6645
6648
  :elements:
@@ -148,10 +148,13 @@
148
148
  :must_supports:
149
149
  :extensions:
150
150
  - :id: Patient.extension:race
151
+ :path: extension
151
152
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-race
152
153
  - :id: Patient.extension:ethnicity
154
+ :path: extension
153
155
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity
154
156
  - :id: Patient.extension:birthsex
157
+ :path: extension
155
158
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex
156
159
  :slices: []
157
160
  :elements:
@@ -65,6 +65,7 @@ module USCoreTestKit
65
65
  /Provenance.agent\[\d*\]: Rule provenance-1/, #Invalid invariant in US Core v5.0.1
66
66
  %r{Unknown Code System 'http://hl7.org/fhir/us/core/CodeSystem/us-core-tags'}, # Validator has an issue with this US Core 5 code system in US Core 6 resource
67
67
  %r{URL value 'http://hl7.org/fhir/us/core/CodeSystem/us-core-tags' does not resolve}, # Validator has an issue with this US Core 5 code system in US Core 6 resource
68
+ /\A\S+: \S+: URL value '.*' does not resolve/,
68
69
  %r{Observation.component\[\d+\].value.ofType\(Quantity\): The code provided \(http://unitsofmeasure.org#L/min\) was not found in the value set 'Vital Signs Units'} # Known issue with the Pulse Oximetry Profile
69
70
  ].freeze
70
71
 
@@ -76,8 +77,10 @@ module USCoreTestKit
76
77
  end
77
78
  end
78
79
 
79
- validator do
80
- url ENV.fetch('V311_VALIDATOR_URL', 'http://validator_service:4567')
80
+ id :us_core_v311
81
+
82
+ fhir_resource_validator do
83
+ igs 'hl7.fhir.us.core#3.1.1'
81
84
  message_filters = VALIDATION_MESSAGE_FILTERS + VERSION_SPECIFIC_MESSAGE_FILTERS
82
85
 
83
86
  exclude_message do |message|
@@ -90,8 +93,6 @@ module USCoreTestKit
90
93
  end
91
94
  end
92
95
 
93
- id :us_core_v311
94
-
95
96
  input :url,
96
97
  title: 'FHIR Endpoint',
97
98
  description: 'URL of the FHIR endpoint'
@@ -7260,12 +7260,15 @@
7260
7260
  :must_supports:
7261
7261
  :extensions:
7262
7262
  - :id: Patient.extension:race
7263
+ :path: extension
7263
7264
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-race
7264
7265
  :uscdi_only: true
7265
7266
  - :id: Patient.extension:ethnicity
7267
+ :path: extension
7266
7268
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity
7267
7269
  :uscdi_only: true
7268
7270
  - :id: Patient.extension:birthsex
7271
+ :path: extension
7269
7272
  :url: http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex
7270
7273
  :uscdi_only: true
7271
7274
  :slices: []