onc_certification_g10_test_kit 3.2.0 → 3.3.0
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.
- checksums.yaml +4 -4
- data/lib/inferno/terminology/loader.rb +1 -1
- data/lib/inferno/terminology/tasks/create_value_set_validators.rb +3 -3
- data/lib/inferno/terminology/tasks/download_umls.rb +1 -1
- data/lib/inferno/terminology/tasks/validate_code.rb +1 -1
- data/lib/inferno/terminology/terminology_validation.rb +1 -1
- data/lib/inferno/terminology/validator.rb +9 -9
- data/lib/inferno/terminology/value_set.rb +7 -7
- data/lib/onc_certification_g10_test_kit/authorization_request_builder.rb +2 -2
- data/lib/onc_certification_g10_test_kit/bulk_data_authorization.rb +4 -4
- data/lib/onc_certification_g10_test_kit/bulk_data_group_export_stu1.rb +1 -1
- data/lib/onc_certification_g10_test_kit/bulk_export_validation_tester.rb +3 -3
- data/lib/onc_certification_g10_test_kit/configuration_checker.rb +1 -1
- data/lib/onc_certification_g10_test_kit/export_kick_off_performer.rb +2 -2
- data/lib/onc_certification_g10_test_kit/incorrectly_permitted_tls_versions_messages_setup_test.rb +1 -1
- data/lib/onc_certification_g10_test_kit/patient_scope_test.rb +25 -0
- data/lib/onc_certification_g10_test_kit/profile_selector.rb +1 -1
- data/lib/onc_certification_g10_test_kit/short_id_map.yml +2 -0
- data/lib/onc_certification_g10_test_kit/smart_ehr_patient_launch_group.rb +27 -4
- data/lib/onc_certification_g10_test_kit/smart_ehr_patient_launch_group_stu2.rb +27 -4
- data/lib/onc_certification_g10_test_kit/smart_ehr_practitioner_app_group.rb +0 -1
- data/lib/onc_certification_g10_test_kit/smart_invalid_pkce_group.rb +1 -1
- data/lib/onc_certification_g10_test_kit/smart_invalid_token_group.rb +1 -1
- data/lib/onc_certification_g10_test_kit/smart_invalid_token_group_stu2.rb +1 -1
- data/lib/onc_certification_g10_test_kit/smart_standalone_patient_app_group.rb +0 -2
- data/lib/onc_certification_g10_test_kit/tasks/test_procedure.rb +1 -1
- data/lib/onc_certification_g10_test_kit/terminology_binding_validator.rb +1 -1
- data/lib/onc_certification_g10_test_kit/version.rb +1 -1
- data/lib/onc_certification_g10_test_kit.rb +16 -3
- metadata +18 -17
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 5357a415d5bb6ec45aa058974bf15193e51a2df886dd2502ec9547624aa737c6
         | 
| 4 | 
            +
              data.tar.gz: 12305e05cb0c337dd0cf96f6e473ea338f9494a6e83e04ed31af534558dacc50
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c4118a80d8819fc53fed826dfa71386b78958def1e196e96b182176e9eca66f4324be77b1bc53270a01ec8c31177919ad064b950e6c022157278a3222d6f4e4c
         | 
| 7 | 
            +
              data.tar.gz: e4969b599c5ca82c613032a9aa0feaaa3279c56d56980f35903249c341cce6bed805522e58276b5ae1ce50774f92293db8f0172813d0d1f5f7f8be0fbb9ca0ba
         | 
| @@ -19,9 +19,9 @@ module Inferno | |
| 19 19 | 
             
                      Loader.register_umls_db db_for_version
         | 
| 20 20 | 
             
                      Loader.load_value_sets_from_directory(PACKAGE_DIR, true)
         | 
| 21 21 | 
             
                      Loader.create_validators(
         | 
| 22 | 
            -
                        type | 
| 23 | 
            -
                        minimum_binding_strength | 
| 24 | 
            -
                        delete_existing: | 
| 22 | 
            +
                        type:,
         | 
| 23 | 
            +
                        minimum_binding_strength:,
         | 
| 24 | 
            +
                        delete_existing:
         | 
| 25 25 | 
             
                      )
         | 
| 26 26 | 
             
                    end
         | 
| 27 27 |  | 
| @@ -19,7 +19,7 @@ module Inferno | |
| 19 19 | 
             
                    def run
         | 
| 20 20 | 
             
                      Inferno::Terminology::Loader.load_validators
         | 
| 21 21 | 
             
                      code_display = self.system ? "#{self.system}|#{code}" : code.to_s
         | 
| 22 | 
            -
                      if validate_code(code | 
| 22 | 
            +
                      if validate_code(code:, system: self.system, value_set_url:)
         | 
| 23 23 | 
             
                        in_system = 'is in'
         | 
| 24 24 | 
             
                        symbol = "\u2713".encode('utf-8').to_s.green
         | 
| 25 25 | 
             
                      else
         | 
| @@ -5,20 +5,20 @@ module Inferno | |
| 5 5 | 
             
                class Validator
         | 
| 6 6 | 
             
                  attr_reader :url, :concept_count, :type, :code_systems, :file_name, :bloom_filter
         | 
| 7 7 |  | 
| 8 | 
            -
                  def initialize( | 
| 9 | 
            -
                    @url =  | 
| 10 | 
            -
                    @concept_count =  | 
| 11 | 
            -
                    @type =  | 
| 12 | 
            -
                    @code_systems =  | 
| 13 | 
            -
                    @file_name =  | 
| 14 | 
            -
                    @bloom_filter =  | 
| 8 | 
            +
                  def initialize(metadata)
         | 
| 9 | 
            +
                    @url = metadata[:url]
         | 
| 10 | 
            +
                    @concept_count = metadata[:count]
         | 
| 11 | 
            +
                    @type = metadata[:type]
         | 
| 12 | 
            +
                    @code_systems = metadata[:code_systems]
         | 
| 13 | 
            +
                    @file_name = metadata[:file]
         | 
| 14 | 
            +
                    @bloom_filter = metadata[:bloom_filter]
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 |  | 
| 17 17 | 
             
                  def validate(code:, system: nil)
         | 
| 18 18 | 
             
                    if system
         | 
| 19 19 | 
             
                      raise ProhibitedSystemException, system if TerminologyConfiguration.system_prohibited?(system)
         | 
| 20 20 |  | 
| 21 | 
            -
                      coding_in_filter?(code | 
| 21 | 
            +
                      coding_in_filter?(code:, system:)
         | 
| 22 22 | 
             
                    elsif contains_prohibited_systems?
         | 
| 23 23 | 
             
                      raise ProhibitedSystemException, prohibited_systems.join(', ') unless code_in_allowed_system?(code)
         | 
| 24 24 |  | 
| @@ -52,7 +52,7 @@ module Inferno | |
| 52 52 |  | 
| 53 53 | 
             
                  def code_in_systems?(code, possible_systems)
         | 
| 54 54 | 
             
                    possible_systems.any? do |possible_system|
         | 
| 55 | 
            -
                      coding_in_filter?(code | 
| 55 | 
            +
                      coding_in_filter?(code:, system: possible_system)
         | 
| 56 56 | 
             
                    end
         | 
| 57 57 | 
             
                  end
         | 
| 58 58 |  | 
| @@ -116,7 +116,7 @@ module Inferno | |
| 116 116 | 
             
                          'WA', 'WV', 'WI', 'WY', 'AE', 'AP', 'AA'
         | 
| 117 117 | 
             
                        ]
         | 
| 118 118 | 
             
                        codes.each_with_object(Set.new) do |code, set|
         | 
| 119 | 
            -
                          set.add(system: 'https://www.usps.com/', code: | 
| 119 | 
            +
                          set.add(system: 'https://www.usps.com/', code:)
         | 
| 120 120 | 
             
                        end
         | 
| 121 121 | 
             
                      end
         | 
| 122 122 | 
             
                  }.freeze
         | 
| @@ -423,11 +423,11 @@ module Inferno | |
| 423 423 | 
             
                      @db.execute(
         | 
| 424 424 | 
             
                        "SELECT code FROM mrconso WHERE SAB = '#{umls_abbreviation(system)}' AND TTY IN('PT', 'OP')"
         | 
| 425 425 | 
             
                      ) do |row|
         | 
| 426 | 
            -
                        filtered_set.add(system | 
| 426 | 
            +
                        filtered_set.add(system:, code: row[0])
         | 
| 427 427 | 
             
                      end
         | 
| 428 428 | 
             
                    elsif filter.nil?
         | 
| 429 429 | 
             
                      @db.execute("SELECT code FROM mrconso WHERE SAB = '#{umls_abbreviation(system)}'") do |row|
         | 
| 430 | 
            -
                        filtered_set.add(system | 
| 430 | 
            +
                        filtered_set.add(system:, code: row[0])
         | 
| 431 431 | 
             
                      end
         | 
| 432 432 | 
             
                    elsif ['=', 'in', nil].include? filter&.op
         | 
| 433 433 | 
             
                      if FILTER_PROP[filter.property]
         | 
| @@ -435,13 +435,13 @@ module Inferno | |
| 435 435 | 
             
                          "SELECT code FROM mrsat WHERE SAB = '#{umls_abbreviation(system)}' " \
         | 
| 436 436 | 
             
                          "AND ATN = '#{fp_self(filter.property)}' AND ATV = '#{fp_self(filter.value)}'"
         | 
| 437 437 | 
             
                        ) do |row|
         | 
| 438 | 
            -
                          filtered_set.add(system | 
| 438 | 
            +
                          filtered_set.add(system:, code: row[0])
         | 
| 439 439 | 
             
                        end
         | 
| 440 440 | 
             
                      else
         | 
| 441 441 | 
             
                        @db.execute(
         | 
| 442 442 | 
             
                          "SELECT code FROM mrconso WHERE SAB = '#{umls_abbreviation(system)}' AND #{filter_clause.call(filter)}"
         | 
| 443 443 | 
             
                        ) do |row|
         | 
| 444 | 
            -
                          filtered_set.add(system | 
| 444 | 
            +
                          filtered_set.add(system:, code: row[0])
         | 
| 445 445 | 
             
                        end
         | 
| 446 446 | 
             
                      end
         | 
| 447 447 | 
             
                    elsif filter&.op == 'is-a'
         | 
| @@ -486,9 +486,9 @@ module Inferno | |
| 486 486 | 
             
                    desired_children = Set.new
         | 
| 487 487 | 
             
                    subsume = lambda do |parent|
         | 
| 488 488 | 
             
                      # Only execute if we haven't processed this parent yet
         | 
| 489 | 
            -
                      par = { system | 
| 489 | 
            +
                      par = { system:, code: parent }
         | 
| 490 490 | 
             
                      unless desired_children.include? par
         | 
| 491 | 
            -
                        desired_children.add(system | 
| 491 | 
            +
                        desired_children.add(system:, code: parent)
         | 
| 492 492 | 
             
                        children[parent]&.each do |child|
         | 
| 493 493 | 
             
                          subsume.call(child)
         | 
| 494 494 | 
             
                        end
         | 
| @@ -46,7 +46,7 @@ module ONCCertificationG10TestKit | |
| 46 46 | 
             
                end
         | 
| 47 47 |  | 
| 48 48 | 
             
                def jwt_token
         | 
| 49 | 
            -
                  @jwt_token ||= JSON::JWT.new(iss | 
| 49 | 
            +
                  @jwt_token ||= JSON::JWT.new(iss:, sub:, aud:, exp:, jti:).compact
         | 
| 50 50 | 
             
                end
         | 
| 51 51 |  | 
| 52 52 | 
             
                def jwk
         | 
| @@ -55,7 +55,7 @@ module ONCCertificationG10TestKit | |
| 55 55 |  | 
| 56 56 | 
             
                def authorization_request_headers
         | 
| 57 57 | 
             
                  {
         | 
| 58 | 
            -
                    content_type | 
| 58 | 
            +
                    content_type:,
         | 
| 59 59 | 
             
                    accept: 'application/json'
         | 
| 60 60 | 
             
                  }.compact
         | 
| 61 61 | 
             
                end
         | 
| @@ -87,7 +87,7 @@ module ONCCertificationG10TestKit | |
| 87 87 | 
             
                                                                             aud: bulk_token_endpoint,
         | 
| 88 88 | 
             
                                                                             grant_type: 'not_a_grant_type')
         | 
| 89 89 |  | 
| 90 | 
            -
                    post({ client: :token_endpoint }.merge(post_request_content))
         | 
| 90 | 
            +
                    post(**{ client: :token_endpoint }.merge(post_request_content))
         | 
| 91 91 |  | 
| 92 92 | 
             
                    assert_response_status(400)
         | 
| 93 93 | 
             
                  end
         | 
| @@ -118,7 +118,7 @@ module ONCCertificationG10TestKit | |
| 118 118 | 
             
                                                                             aud: bulk_token_endpoint,
         | 
| 119 119 | 
             
                                                                             client_assertion_type: 'not_an_assertion_type')
         | 
| 120 120 |  | 
| 121 | 
            -
                    post({ client: :token_endpoint }.merge(post_request_content))
         | 
| 121 | 
            +
                    post(**{ client: :token_endpoint }.merge(post_request_content))
         | 
| 122 122 |  | 
| 123 123 | 
             
                    assert_response_status(400)
         | 
| 124 124 | 
             
                  end
         | 
| @@ -157,7 +157,7 @@ module ONCCertificationG10TestKit | |
| 157 157 | 
             
                                                                             sub: bulk_client_id,
         | 
| 158 158 | 
             
                                                                             aud: bulk_token_endpoint)
         | 
| 159 159 |  | 
| 160 | 
            -
                    post({ client: :token_endpoint }.merge(post_request_content))
         | 
| 160 | 
            +
                    post(**{ client: :token_endpoint }.merge(post_request_content))
         | 
| 161 161 |  | 
| 162 162 | 
             
                    assert_response_status([400, 401])
         | 
| 163 163 | 
             
                  end
         | 
| @@ -179,7 +179,7 @@ module ONCCertificationG10TestKit | |
| 179 179 | 
             
                                                                             sub: bulk_client_id,
         | 
| 180 180 | 
             
                                                                             aud: bulk_token_endpoint)
         | 
| 181 181 |  | 
| 182 | 
            -
                    authentication_response = post({ client: :token_endpoint }.merge(post_request_content))
         | 
| 182 | 
            +
                    authentication_response = post(**{ client: :token_endpoint }.merge(post_request_content))
         | 
| 183 183 |  | 
| 184 184 | 
             
                    assert_response_status([200, 201])
         | 
| 185 185 |  | 
| @@ -165,7 +165,7 @@ module ONCCertificationG10TestKit | |
| 165 165 | 
             
                    polling_url = request.response_header('content-location')&.value
         | 
| 166 166 | 
             
                    assert polling_url.present?, 'Export response headers did not include "Content-Location"'
         | 
| 167 167 |  | 
| 168 | 
            -
                    output polling_url: | 
| 168 | 
            +
                    output polling_url:
         | 
| 169 169 | 
             
                  end
         | 
| 170 170 | 
             
                end
         | 
| 171 171 |  | 
| @@ -51,7 +51,7 @@ module ONCCertificationG10TestKit | |
| 51 51 | 
             
                    end
         | 
| 52 52 | 
             
                  }
         | 
| 53 53 |  | 
| 54 | 
            -
                  stream(process_body, endpoint, headers: | 
| 54 | 
            +
                  stream(process_body, endpoint, headers:)
         | 
| 55 55 |  | 
| 56 56 | 
             
                  max_redirect = 5
         | 
| 57 57 |  | 
| @@ -66,7 +66,7 @@ module ONCCertificationG10TestKit | |
| 66 66 | 
             
                    # handle relative redirects
         | 
| 67 67 | 
             
                    redirect_url = URI.parse(endpoint).merge(redirect_url).to_s unless redirect_url.start_with?('http')
         | 
| 68 68 |  | 
| 69 | 
            -
                    redirect_headers = headers. | 
| 69 | 
            +
                    redirect_headers = headers.except(:authorization)
         | 
| 70 70 |  | 
| 71 71 | 
             
                    stream(process_body, redirect_url, headers: redirect_headers)
         | 
| 72 72 | 
             
                  end
         | 
| @@ -144,7 +144,7 @@ module ONCCertificationG10TestKit | |
| 144 144 | 
             
                    scratch[:patient_ids_seen] = patient_ids_seen | [resource.id] if resource_type == 'Patient'
         | 
| 145 145 |  | 
| 146 146 | 
             
                    profile_with_version = versioned_profile_url(profile_url)
         | 
| 147 | 
            -
                    unless resource_is_valid?(resource | 
| 147 | 
            +
                    unless resource_is_valid?(resource:, profile_url: profile_with_version)
         | 
| 148 148 | 
             
                      if first_error.key?(:line_number)
         | 
| 149 149 | 
             
                        @invalid_resource_count += 1
         | 
| 150 150 | 
             
                      else
         | 
| @@ -2,7 +2,7 @@ require_relative '../inferno/terminology/tasks/check_built_terminology' | |
| 2 2 |  | 
| 3 3 | 
             
            module ONCCertificationG10TestKit
         | 
| 4 4 | 
             
              class ConfigurationChecker
         | 
| 5 | 
            -
                EXPECTED_VALIDATOR_VERSION = '2. | 
| 5 | 
            +
                EXPECTED_VALIDATOR_VERSION = '2.2.0'.freeze
         | 
| 6 6 |  | 
| 7 7 | 
             
                def configuration_messages
         | 
| 8 8 | 
             
                  validator_version_message + terminology_messages + version_message
         | 
| @@ -9,7 +9,7 @@ module ONCCertificationG10TestKit | |
| 9 9 | 
             
                  url = "Group/#{group_id}/$export"
         | 
| 10 10 | 
             
                  param_str = params.map { |k, v| URI.encode_www_form(k => v) }.join('&')
         | 
| 11 11 | 
             
                  url.concat("?#{param_str}") unless param_str.empty?
         | 
| 12 | 
            -
                  get(url, client: :bulk_server, name: :export, headers: | 
| 12 | 
            +
                  get(url, client: :bulk_server, name: :export, headers:)
         | 
| 13 13 | 
             
                end
         | 
| 14 14 |  | 
| 15 15 | 
             
                def delete_export_kick_off_request
         | 
| @@ -18,7 +18,7 @@ module ONCCertificationG10TestKit | |
| 18 18 |  | 
| 19 19 | 
             
                  headers = { accept: 'application/json', authorization: "Bearer #{bearer_token}" }
         | 
| 20 20 |  | 
| 21 | 
            -
                  delete(polling_url, headers: | 
| 21 | 
            +
                  delete(polling_url, headers:)
         | 
| 22 22 | 
             
                  assert_response_status(202)
         | 
| 23 23 | 
             
                end
         | 
| 24 24 | 
             
              end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            module ONCCertificationG10TestKit
         | 
| 2 | 
            +
              class PatientScopeTest < Inferno::Test
         | 
| 3 | 
            +
                title 'Patient-level scopes were granted'
         | 
| 4 | 
            +
                description %(
         | 
| 5 | 
            +
                  Systems are required to support the `permission-patient` capability as
         | 
| 6 | 
            +
                  part of the [Clinician Access for EHR Launch Capability
         | 
| 7 | 
            +
                  Set.](http://hl7.org/fhir/smart-app-launch/1.0.0/conformance/index.html#clinician-access-for-ehr-launch)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  This test verifies that systems are capable of granting patient-level
         | 
| 10 | 
            +
                  scopes during an EHR Launch.
         | 
| 11 | 
            +
                )
         | 
| 12 | 
            +
                id :g10_patient_scope
         | 
| 13 | 
            +
                input :received_scopes
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                run do
         | 
| 16 | 
            +
                  expected_scope = if config.options[:scope_version] == :v2
         | 
| 17 | 
            +
                                     'patient/Patient.rs'
         | 
| 18 | 
            +
                                   else
         | 
| 19 | 
            +
                                     'patient/Patient.read'
         | 
| 20 | 
            +
                                   end
         | 
| 21 | 
            +
                  assert received_scopes&.include?(expected_scope),
         | 
| 22 | 
            +
                         "#{expected_scope} scope was requested, but not received. Received: `#{received_scopes}`"
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -135,7 +135,7 @@ module ONCCertificationG10TestKit | |
| 135 135 |  | 
| 136 136 | 
             
                    if using_us_core_5? &&
         | 
| 137 137 | 
             
                       resource_contains_category(
         | 
| 138 | 
            -
                         resource, 'clinical-test', 'http:// | 
| 138 | 
            +
                         resource, 'clinical-test', 'http://hl7.org/fhir/us/core/CodeSystem/us-core-observation-category'
         | 
| 139 139 | 
             
                       )
         | 
| 140 140 | 
             
                      return extract_profile('ObservationClinicalTest')
         | 
| 141 141 | 
             
                    end
         | 
| @@ -1507,6 +1507,7 @@ g10_certification-Group06-g10_ehr_patient_launch-smart_token_exchange: 9.8.07 | |
| 1507 1507 | 
             
            g10_certification-Group06-g10_ehr_patient_launch-smart_token_response_body: 9.8.08
         | 
| 1508 1508 | 
             
            g10_certification-Group06-g10_ehr_patient_launch-smart_token_response_headers: 9.8.09
         | 
| 1509 1509 | 
             
            g10_certification-Group06-g10_ehr_patient_launch-g10_patient_context: 9.8.10
         | 
| 1510 | 
            +
            g10_certification-Group06-g10_ehr_patient_launch-g10_patient_scope: 9.8.11
         | 
| 1510 1511 | 
             
            g10_certification-Group06-g10_ehr_patient_launch_stu2: '9.9'
         | 
| 1511 1512 | 
             
            g10_certification-Group06-g10_ehr_patient_launch_stu2-smart_app_launch: 9.9.01
         | 
| 1512 1513 | 
             
            g10_certification-Group06-g10_ehr_patient_launch_stu2-smart_launch_received: 9.9.02
         | 
| @@ -1518,6 +1519,7 @@ g10_certification-Group06-g10_ehr_patient_launch_stu2-smart_token_exchange: 9.9. | |
| 1518 1519 | 
             
            g10_certification-Group06-g10_ehr_patient_launch_stu2-smart_token_response_body: 9.9.08
         | 
| 1519 1520 | 
             
            g10_certification-Group06-g10_ehr_patient_launch_stu2-smart_token_response_headers: 9.9.09
         | 
| 1520 1521 | 
             
            g10_certification-Group06-g10_ehr_patient_launch_stu2-g10_patient_context: 9.9.10
         | 
| 1522 | 
            +
            g10_certification-Group06-g10_ehr_patient_launch_stu2-g10_patient_scope: 9.9.11
         | 
| 1521 1523 | 
             
            g10_certification-Group06-g10_visual_inspection_and_attestations: '9.10'
         | 
| 1522 1524 | 
             
            g10_certification-Group06-g10_visual_inspection_and_attestations-Test01: 9.10.01
         | 
| 1523 1525 | 
             
            g10_certification-Group06-g10_visual_inspection_and_attestations-Test02: 9.10.02
         | 
| @@ -1,17 +1,29 @@ | |
| 1 | 
            +
            require_relative 'patient_scope_test'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ONCCertificationG10TestKit
         | 
| 2 4 | 
             
              class SMARTEHRPatientLaunchGroup < SMARTAppLaunch::EHRLaunchGroup
         | 
| 3 5 | 
             
                title 'EHR Launch with Patient Scopes'
         | 
| 4 6 | 
             
                description %(
         | 
| 5 7 | 
             
                  # Background
         | 
| 8 | 
            +
                  Systems are required to support the `permission-patient` capability as
         | 
| 9 | 
            +
                  part of the [Clinician Access for EHR Launch Capability
         | 
| 10 | 
            +
                  Set.](http://hl7.org/fhir/smart-app-launch/1.0.0/conformance/index.html#clinician-access-for-ehr-launch)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  Additionally, if an application launched from an EHR requests and is
         | 
| 13 | 
            +
                  granted a clinical scope restricted to a single patient, the EHR SHALL
         | 
| 14 | 
            +
                  establish a patient in context.
         | 
| 6 15 |  | 
| 7 | 
            -
                   | 
| 8 | 
            -
                   | 
| 9 | 
            -
             | 
| 16 | 
            +
                  Register Inferno as an EHR-launched application using patient-level scopes
         | 
| 17 | 
            +
                  and the following URIs:
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  * Launch URI: `#{SMARTAppLaunch::AppLaunchTest.config.options[:launch_uri]}`
         | 
| 20 | 
            +
                  * Redirect URI: `#{SMARTAppLaunch::AppRedirectTest.config.options[:redirect_uri]}`
         | 
| 10 21 |  | 
| 11 22 | 
             
                  # Test Methodology
         | 
| 12 23 |  | 
| 13 24 | 
             
                  Inferno will attempt an EHR Launch with a clinical scope restricted to a
         | 
| 14 | 
            -
                  single patient and verify that a patient  | 
| 25 | 
            +
                  single patient and verify that a patient-level scope is granted and a
         | 
| 26 | 
            +
                  patient id is received.
         | 
| 15 27 |  | 
| 16 28 | 
             
                  For more information on the #{title}
         | 
| 17 29 |  | 
| @@ -43,6 +55,9 @@ module ONCCertificationG10TestKit | |
| 43 55 | 
             
                    launch: {
         | 
| 44 56 | 
             
                      name: :ehr_patient_launch
         | 
| 45 57 | 
             
                    },
         | 
| 58 | 
            +
                    received_scopes: {
         | 
| 59 | 
            +
                      name: :ehr_patient_received_scopes
         | 
| 60 | 
            +
                    },
         | 
| 46 61 | 
             
                    smart_credentials: {
         | 
| 47 62 | 
             
                      name: :ehr_patient_smart_credentials
         | 
| 48 63 | 
             
                    },
         | 
| @@ -67,6 +82,7 @@ module ONCCertificationG10TestKit | |
| 67 82 | 
             
                    patient_id: { name: :ehr_patient_patient_id },
         | 
| 68 83 | 
             
                    encounter_id: { name: :ehr_patient_encounter_id },
         | 
| 69 84 | 
             
                    received_scopes: { name: :ehr_patient_received_scopes },
         | 
| 85 | 
            +
                    requested_scopes: { name: :ehr_patient_requested_scopes },
         | 
| 70 86 | 
             
                    intent: { name: :ehr_patient_intent },
         | 
| 71 87 | 
             
                    smart_credentials: { name: :ehr_patient_smart_credentials }
         | 
| 72 88 | 
             
                  },
         | 
| @@ -89,5 +105,12 @@ module ONCCertificationG10TestKit | |
| 89 105 | 
             
                         smart_credentials: { name: :ehr_patient_smart_credentials }
         | 
| 90 106 | 
             
                       }
         | 
| 91 107 | 
             
                     }
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                test from: :g10_patient_scope,
         | 
| 110 | 
            +
                     config: {
         | 
| 111 | 
            +
                       options: {
         | 
| 112 | 
            +
                         scope_version: :v1
         | 
| 113 | 
            +
                       }
         | 
| 114 | 
            +
                     }
         | 
| 92 115 | 
             
              end
         | 
| 93 116 | 
             
            end
         | 
| @@ -1,17 +1,29 @@ | |
| 1 | 
            +
            require_relative 'patient_scope_test'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module ONCCertificationG10TestKit
         | 
| 2 4 | 
             
              class SMARTEHRPatientLaunchGroupSTU2 < SMARTAppLaunch::EHRLaunchGroupSTU2
         | 
| 3 5 | 
             
                title 'EHR Launch with Patient Scopes'
         | 
| 4 6 | 
             
                description %(
         | 
| 5 7 | 
             
                  # Background
         | 
| 8 | 
            +
                  Systems are required to support the `permission-patient` capability as
         | 
| 9 | 
            +
                  part of the [Clinician Access for EHR Launch Capability
         | 
| 10 | 
            +
                  Set.](http://hl7.org/fhir/smart-app-launch/STU2/conformance.html#clinician-access-for-ehr-launch)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  Additionally, if an application launched from an EHR requests and is
         | 
| 13 | 
            +
                  granted a clinical scope restricted to a single patient, the EHR SHALL
         | 
| 14 | 
            +
                  establish a patient in context.
         | 
| 6 15 |  | 
| 7 | 
            -
                   | 
| 8 | 
            -
                   | 
| 9 | 
            -
             | 
| 16 | 
            +
                  Register Inferno as an EHR-launched application using patient-level scopes
         | 
| 17 | 
            +
                  and the following URIs:
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  * Launch URI: `#{SMARTAppLaunch::AppLaunchTest.config.options[:launch_uri]}`
         | 
| 20 | 
            +
                  * Redirect URI: `#{SMARTAppLaunch::AppRedirectTest.config.options[:redirect_uri]}`
         | 
| 10 21 |  | 
| 11 22 | 
             
                  # Test Methodology
         | 
| 12 23 |  | 
| 13 24 | 
             
                  Inferno will attempt an EHR Launch with a clinical scope restricted to a
         | 
| 14 | 
            -
                  single patient and verify that a patient  | 
| 25 | 
            +
                  single patient and verify that a patient-level scope is granted and a
         | 
| 26 | 
            +
                  patient id is received.
         | 
| 15 27 |  | 
| 16 28 | 
             
                  For more information on the #{title}
         | 
| 17 29 |  | 
| @@ -43,6 +55,9 @@ module ONCCertificationG10TestKit | |
| 43 55 | 
             
                    launch: {
         | 
| 44 56 | 
             
                      name: :ehr_patient_launch
         | 
| 45 57 | 
             
                    },
         | 
| 58 | 
            +
                    received_scopes: {
         | 
| 59 | 
            +
                      name: :ehr_patient_received_scopes
         | 
| 60 | 
            +
                    },
         | 
| 46 61 | 
             
                    smart_credentials: {
         | 
| 47 62 | 
             
                      name: :ehr_patient_smart_credentials
         | 
| 48 63 | 
             
                    },
         | 
| @@ -67,6 +82,7 @@ module ONCCertificationG10TestKit | |
| 67 82 | 
             
                    patient_id: { name: :ehr_patient_patient_id },
         | 
| 68 83 | 
             
                    encounter_id: { name: :ehr_patient_encounter_id },
         | 
| 69 84 | 
             
                    received_scopes: { name: :ehr_patient_received_scopes },
         | 
| 85 | 
            +
                    requested_scopes: { name: :ehr_patient_requested_scopes },
         | 
| 70 86 | 
             
                    intent: { name: :ehr_patient_intent },
         | 
| 71 87 | 
             
                    smart_credentials: { name: :ehr_patient_smart_credentials }
         | 
| 72 88 | 
             
                  },
         | 
| @@ -90,5 +106,12 @@ module ONCCertificationG10TestKit | |
| 90 106 | 
             
                         smart_credentials: { name: :ehr_patient_smart_credentials }
         | 
| 91 107 | 
             
                       }
         | 
| 92 108 | 
             
                     }
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                test from: :g10_patient_scope,
         | 
| 111 | 
            +
                     config: {
         | 
| 112 | 
            +
                       options: {
         | 
| 113 | 
            +
                         scope_version: :v2
         | 
| 114 | 
            +
                       }
         | 
| 115 | 
            +
                     }
         | 
| 93 116 | 
             
              end
         | 
| 94 117 | 
             
            end
         | 
| @@ -186,7 +186,7 @@ module ONCCertificationG10TestKit | |
| 186 186 |  | 
| 187 187 | 
             
                    oauth2_params = {
         | 
| 188 188 | 
             
                      grant_type: 'authorization_code',
         | 
| 189 | 
            -
                      code | 
| 189 | 
            +
                      code:,
         | 
| 190 190 | 
             
                      redirect_uri: config.options[:redirect_uri]
         | 
| 191 191 | 
             
                    }
         | 
| 192 192 | 
             
                    oauth2_headers = { 'Content-Type' => 'application/x-www-form-urlencoded' }
         | 
| @@ -188,7 +188,7 @@ module ONCCertificationG10TestKit | |
| 188 188 |  | 
| 189 189 | 
             
                    oauth2_params = {
         | 
| 190 190 | 
             
                      grant_type: 'authorization_code',
         | 
| 191 | 
            -
                      code | 
| 191 | 
            +
                      code:,
         | 
| 192 192 | 
             
                      redirect_uri: config.options[:redirect_uri]
         | 
| 193 193 | 
             
                    }
         | 
| 194 194 | 
             
                    oauth2_headers = { 'Content-Type' => 'application/x-www-form-urlencoded' }
         | 
| @@ -53,7 +53,7 @@ module ONCCertificationG10TestKit | |
| 53 53 | 
             
                          second_prefix, _, ending = second.rpartition('.')
         | 
| 54 54 | 
             
                          raise "'#{prefix}' != '#{second_prefix}' in #{@group} #{@id}" unless prefix == second_prefix
         | 
| 55 55 |  | 
| 56 | 
            -
                          (beginning.to_i..ending.to_i).map { |index| "#{prefix}.#{format('%02<index>d', { index:  | 
| 56 | 
            +
                          (beginning.to_i..ending.to_i).map { |index| "#{prefix}.#{format('%02<index>d', { index: })}" }
         | 
| 57 57 | 
             
                        else
         | 
| 58 58 | 
             
                          [test]
         | 
| 59 59 | 
             
                        end
         | 
| @@ -83,10 +83,23 @@ module ONCCertificationG10TestKit | |
| 83 83 | 
             
                  end
         | 
| 84 84 |  | 
| 85 85 | 
             
                  perform_additional_validation do |resource, profile_url|
         | 
| 86 | 
            -
                     | 
| 87 | 
            -
             | 
| 86 | 
            +
                    versionless_profile_url, profile_version = profile_url.split('|')
         | 
| 87 | 
            +
                    profile_version = case profile_version
         | 
| 88 | 
            +
                                      when '4.0.0'
         | 
| 89 | 
            +
                                        '400'
         | 
| 90 | 
            +
                                      when '5.0.1'
         | 
| 91 | 
            +
                                        '501'
         | 
| 92 | 
            +
                                      else
         | 
| 93 | 
            +
                                        # This open-ended else is primarily for Vital Signs profiles in v3.1.1, which are tagged
         | 
| 94 | 
            +
                                        # with the base FHIR version (4.0.1).  The profiles were migrated to US Core in later
         | 
| 95 | 
            +
                                        # versions.
         | 
| 96 | 
            +
                                        '311'
         | 
| 97 | 
            +
                                      end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    us_core_suite = USCoreTestKit.const_get("USCoreV#{profile_version}")::USCoreTestSuite
         | 
| 100 | 
            +
                    metadata = us_core_suite.metadata.find do |metadata_candidate|
         | 
| 101 | 
            +
                      metadata_candidate.profile_url == versionless_profile_url
         | 
| 88 102 | 
             
                    end
         | 
| 89 | 
            -
             | 
| 90 103 | 
             
                    next if metadata.nil?
         | 
| 91 104 |  | 
| 92 105 | 
             
                    metadata.bindings
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: onc_certification_g10_test_kit
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3. | 
| 4 | 
            +
              version: 3.3.0
         | 
| 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- | 
| 11 | 
            +
            date: 2022-11-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bloomer
         | 
| @@ -44,28 +44,28 @@ dependencies: | |
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - ">="
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version: 0. | 
| 47 | 
            +
                    version: 0.4.2
         | 
| 48 48 | 
             
              type: :runtime
         | 
| 49 49 | 
             
              prerelease: false
         | 
| 50 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - ">="
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: 0. | 
| 54 | 
            +
                    version: 0.4.2
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 56 | 
             
              name: json-jwt
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 58 | 
             
                requirements:
         | 
| 59 59 | 
             
                - - "~>"
         | 
| 60 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: 1. | 
| 61 | 
            +
                    version: 1.15.3
         | 
| 62 62 | 
             
              type: :runtime
         | 
| 63 63 | 
             
              prerelease: false
         | 
| 64 64 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 65 | 
             
                requirements:
         | 
| 66 66 | 
             
                - - "~>"
         | 
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            -
                    version: 1. | 
| 68 | 
            +
                    version: 1.15.3
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 70 | 
             
              name: mime-types
         | 
| 71 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -114,42 +114,42 @@ dependencies: | |
| 114 114 | 
             
                requirements:
         | 
| 115 115 | 
             
                - - '='
         | 
| 116 116 | 
             
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            -
                    version: 0. | 
| 117 | 
            +
                    version: 0.2.0
         | 
| 118 118 | 
             
              type: :runtime
         | 
| 119 119 | 
             
              prerelease: false
         | 
| 120 120 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 121 | 
             
                requirements:
         | 
| 122 122 | 
             
                - - '='
         | 
| 123 123 | 
             
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            -
                    version: 0. | 
| 124 | 
            +
                    version: 0.2.0
         | 
| 125 125 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 126 126 | 
             
              name: tls_test_kit
         | 
| 127 127 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 128 128 | 
             
                requirements:
         | 
| 129 129 | 
             
                - - '='
         | 
| 130 130 | 
             
                  - !ruby/object:Gem::Version
         | 
| 131 | 
            -
                    version: 0. | 
| 131 | 
            +
                    version: 0.2.0
         | 
| 132 132 | 
             
              type: :runtime
         | 
| 133 133 | 
             
              prerelease: false
         | 
| 134 134 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 135 | 
             
                requirements:
         | 
| 136 136 | 
             
                - - '='
         | 
| 137 137 | 
             
                  - !ruby/object:Gem::Version
         | 
| 138 | 
            -
                    version: 0. | 
| 138 | 
            +
                    version: 0.2.0
         | 
| 139 139 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 140 140 | 
             
              name: us_core_test_kit
         | 
| 141 141 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 142 142 | 
             
                requirements:
         | 
| 143 143 | 
             
                - - '='
         | 
| 144 144 | 
             
                  - !ruby/object:Gem::Version
         | 
| 145 | 
            -
                    version: 0. | 
| 145 | 
            +
                    version: 0.4.1
         | 
| 146 146 | 
             
              type: :runtime
         | 
| 147 147 | 
             
              prerelease: false
         | 
| 148 148 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 149 149 | 
             
                requirements:
         | 
| 150 150 | 
             
                - - '='
         | 
| 151 151 | 
             
                  - !ruby/object:Gem::Version
         | 
| 152 | 
            -
                    version: 0. | 
| 152 | 
            +
                    version: 0.4.1
         | 
| 153 153 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 154 154 | 
             
              name: database_cleaner-sequel
         | 
| 155 155 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -272,6 +272,7 @@ files: | |
| 272 272 | 
             
            - lib/onc_certification_g10_test_kit/multi_patient_api_stu2.rb
         | 
| 273 273 | 
             
            - lib/onc_certification_g10_test_kit/onc_program_procedure.yml
         | 
| 274 274 | 
             
            - lib/onc_certification_g10_test_kit/patient_context_test.rb
         | 
| 275 | 
            +
            - lib/onc_certification_g10_test_kit/patient_scope_test.rb
         | 
| 275 276 | 
             
            - lib/onc_certification_g10_test_kit/profile_selector.rb
         | 
| 276 277 | 
             
            - lib/onc_certification_g10_test_kit/resource_access_test.rb
         | 
| 277 278 | 
             
            - lib/onc_certification_g10_test_kit/restricted_access_test.rb
         | 
| @@ -309,7 +310,7 @@ licenses: | |
| 309 310 | 
             
            metadata:
         | 
| 310 311 | 
             
              homepage_uri: https://github.com/onc-healthit/onc-certification-g10-test-kit
         | 
| 311 312 | 
             
              source_code_uri: https://github.com/onc-healthit/onc-certification-g10-test-kit
         | 
| 312 | 
            -
            post_install_message: | 
| 313 | 
            +
            post_install_message:
         | 
| 313 314 | 
             
            rdoc_options: []
         | 
| 314 315 | 
             
            require_paths:
         | 
| 315 316 | 
             
            - lib
         | 
| @@ -317,15 +318,15 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 317 318 | 
             
              requirements:
         | 
| 318 319 | 
             
              - - ">="
         | 
| 319 320 | 
             
                - !ruby/object:Gem::Version
         | 
| 320 | 
            -
                  version:  | 
| 321 | 
            +
                  version: 3.1.2
         | 
| 321 322 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 322 323 | 
             
              requirements:
         | 
| 323 324 | 
             
              - - ">="
         | 
| 324 325 | 
             
                - !ruby/object:Gem::Version
         | 
| 325 326 | 
             
                  version: '0'
         | 
| 326 327 | 
             
            requirements: []
         | 
| 327 | 
            -
            rubygems_version: 3. | 
| 328 | 
            -
            signing_key: | 
| 328 | 
            +
            rubygems_version: 3.3.7
         | 
| 329 | 
            +
            signing_key:
         | 
| 329 330 | 
             
            specification_version: 4
         | 
| 330 331 | 
             
            summary: ONC Certification (g)(10) Test Kit
         | 
| 331 332 | 
             
            test_files: []
         |