davinci_pdex_test_kit 0.12.1 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/authentication.rb +34 -0
  3. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/must_support.rb +40 -0
  4. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/provenance.rb +32 -0
  5. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/receive_must_support.rb +34 -0
  6. data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation.rb +24 -0
  7. data/lib/davinci_pdex_test_kit/pdex_payer_client_suite.rb +17 -3
  8. data/lib/davinci_pdex_test_kit/pdex_payer_server/urls.rb +27 -0
  9. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/bulk_data_transmission_restrictions.rb +33 -0
  10. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/consent_failure.rb +40 -0
  11. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/consent_requirements.rb +40 -0
  12. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/hrex_must_support.rb +35 -0
  13. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/licensing.rb +37 -0
  14. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/member_auth.rb +81 -0
  15. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/mtls.rb +61 -0
  16. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/payer_consent_compliance.rb +33 -0
  17. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/prior_authorization_decisions.rb +35 -0
  18. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/provenance_records.rb +40 -0
  19. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/read_and_search_hrex.rb +35 -0
  20. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/resources_in_capability_statement.rb +35 -0
  21. data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation.rb +39 -0
  22. data/lib/davinci_pdex_test_kit/pdex_payer_server_suite.rb +26 -0
  23. data/lib/davinci_pdex_test_kit/pdex_provider_client_suite.rb +8 -0
  24. data/lib/davinci_pdex_test_kit/requirements/{generated/davinci-pdex-test-kit_requirements_coverage.csv → davinci_pdex_test_kit_requirements.csv} +108 -59
  25. data/lib/davinci_pdex_test_kit/requirements/generated/pdex_payer_client_requirements_coverage.csv +29 -0
  26. data/lib/davinci_pdex_test_kit/requirements/generated/pdex_payer_server_requirements_coverage.csv +479 -0
  27. data/lib/davinci_pdex_test_kit/requirements/hl7.fhir.us.davinci-pdex_2.0.0_reqs.xlsx +0 -0
  28. data/lib/davinci_pdex_test_kit/version.rb +2 -2
  29. data/lib/davinci_pdex_test_kit.rb +0 -1
  30. metadata +35 -20
  31. data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_out_of_scope_requirements.csv +0 -1
  32. data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_requirements.csv +0 -66
  33. data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +0 -22
  34. data/lib/inferno_requirements_tools/rake/rakefile_template +0 -19
  35. data/lib/inferno_requirements_tools/tasks/collect_requirements.rb +0 -228
  36. data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +0 -284
  37. data/lib/requirements_config.yaml +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0f40793433a43053718719f614805ddda0830e0cd2d984cc59d75f1762b13e5
4
- data.tar.gz: 842fb47429ceb04acdbcda3d90dd90b22982e1a53ea314901d7b4342e4fa0e33
3
+ metadata.gz: fbdcb21dc69873f17a9bb953dfc730122d4c23b3421cb083661a69948dc9ccae
4
+ data.tar.gz: 6247c018d72c6f697dbb6e44408ea3bf4a8bdbcd011edee17ae6cc43c6d0a35f
5
5
  SHA512:
6
- metadata.gz: 40ce4e887659579ea541da03e3567f35bcb7abe5fa2ddb09d47dd26a777733c43ce538ea315dfdf6c06f47871713a2adaf49b02e9c09ce43852400e1b8463c19
7
- data.tar.gz: 2f6584ff86cf25ab1de0019bc5f80bd0abb362d1ae5ad8f608391215b960f1b6d0366ee87bdb3a625e7dadc3ecc465948ab92fc1c80ca49ba05a52f48dd23517
6
+ metadata.gz: c21fb0dd88fadc8128d3970a73d442b0bbfbd242862748b4ea85b54ed8bfb2377a03e3a9674c79f2eff9ffa6f56441fc5cc1823c0fbff4bff37df734db85db00
7
+ data.tar.gz: ca9c1ffbba669a7b9dda3823207b9c971242fbb4e18f81d5f3da93444b472693905e15e73e2918e0dadcf7b31c876fb7debed64dac2219559cb20b8b069d7e3d
@@ -0,0 +1,34 @@
1
+ module DaVinciPDexTestKit
2
+ module PDexPayerClient
3
+ class PDexMemberAuthenticationTest < Inferno::Test
4
+ title 'Uses recognized Health Plan credentials'
5
+
6
+ description <<~DESCRIPTION
7
+ The Health IT Module requires members to authenticate
8
+ using credentials issued or recognized by the Health Plan, such as credentials used to access
9
+ a member portal, and accepts only those credentials when processing member-authorized requests.
10
+ DESCRIPTION
11
+
12
+ id :pdex_member_authentication_test
13
+
14
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@10'
15
+
16
+ run do
17
+ identifier = SecureRandom.hex(32)
18
+
19
+ wait(
20
+ identifier:,
21
+ message: <<~MESSAGE
22
+ I attest that the Health IT Module requires members to authenticate
23
+ using credentials issued or recognized by the Health Plan, such as credentials used to access
24
+ a member portal, and accepts only those credentials when processing member-authorized requests.
25
+
26
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
27
+
28
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
29
+ MESSAGE
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,40 @@
1
+ module DaVinciPDexTestKit
2
+ module PDexPayerClient
3
+ class PDexClientMustSupportInterpretationTest < Inferno::Test
4
+ title 'Interprets Must Support according to US Core and HRex'
5
+
6
+ description <<~DESCRIPTION
7
+ The Health IT Module applies Must Support rules for all profiles it implements as follows:
8
+
9
+ - For US Core profiles, Must Support elements are interpreted according to the US Core IG.
10
+ - For HRex profiles, Must Support elements are interpreted according to the HRex IG.
11
+ - For PDex profiles, Must Support elements are interpreted according to the US Core IG.
12
+ DESCRIPTION
13
+
14
+ id :pdex_client_must_support_interpretation_test
15
+
16
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@4',
17
+ 'hl7.fhir.us.davinci-pdex_2.0.0@6',
18
+ 'hl7.fhir.us.davinci-pdex_2.0.0@8'
19
+
20
+ run do
21
+ identifier = SecureRandom.hex(32)
22
+
23
+ wait(
24
+ identifier:,
25
+ message: <<~MESSAGE
26
+ The developer of the Health IT Module attests that:
27
+
28
+ - For US Core profiles, Must Support elements are interpreted according to the US Core IG.
29
+ - For HRex profiles, Must Support elements are interpreted according to the HRex IG.
30
+ - For PDex profiles, Must Support elements are interpreted according to the US Core IG.
31
+
32
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
33
+
34
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
35
+ MESSAGE
36
+ )
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,32 @@
1
+ module DaVinciPDexTestKit
2
+ module PDexPayerClient
3
+ class PDexRetainProvenanceFromPayerExchangeTest < Inferno::Test
4
+ title 'Accepts and retains Provenance in member-authorized payer-to-payer exchange'
5
+
6
+ description <<~DESCRIPTION
7
+ The Health IT Module accepts and retains
8
+ Provenance records received with data as part of a member-authorized payer-to-payer exchange.
9
+ DESCRIPTION
10
+
11
+ id :pdex_accept_retain_provenance_test
12
+
13
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@28'
14
+
15
+ run do
16
+ identifier = SecureRandom.hex(32)
17
+
18
+ wait(
19
+ identifier:,
20
+ message: <<~MESSAGE
21
+ I attest that the Health IT Module accepts and retains
22
+ Provenance records received with data as part of a member-authorized payer-to-payer exchange.
23
+
24
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
25
+
26
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
27
+ MESSAGE
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ module DaVinciPDexTestKit
2
+ module PDexPayerClient
3
+ class PDexMustSupportSubElementHandlingTest < Inferno::Test
4
+ title 'Accepts Must Support elements without error'
5
+
6
+ description <<~DESCRIPTION
7
+ The Health IT Module ensures that it can accept sub-elements marked Must Support
8
+ without generating errors — unless those sub-elements belong to a parent element
9
+ that has a minimum cardinality of 0 and no Must Support flag.
10
+ DESCRIPTION
11
+
12
+ id :pdex_must_support_sub_element_handling_test
13
+
14
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@53'
15
+
16
+ run do
17
+ identifier = SecureRandom.hex(32)
18
+
19
+ wait(
20
+ identifier:,
21
+ message: <<~MESSAGE
22
+ The developer of the Health IT Module attests that the Health IT System can accept sub-elements marked Must Support
23
+ without generating errors — unless those sub-elements belong to a parent element
24
+ that has a minimum cardinality of 0 and no Must Support flag.
25
+
26
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
27
+
28
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
29
+ MESSAGE
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,24 @@
1
+ require_relative 'visual_inspection_and_attestation/must_support'
2
+ require_relative 'visual_inspection_and_attestation/receive_must_support'
3
+ require_relative 'visual_inspection_and_attestation/provenance'
4
+ require_relative 'visual_inspection_and_attestation/authentication'
5
+
6
+ module DaVinciPDexTestKit
7
+ module PDexPayerClient
8
+ class PDexClientVisualInspectionAndAttestationGroup < Inferno::TestGroup
9
+ id :pdex_client_visual_inspection_and_attestation
10
+ title 'Visual Inspection and Attestation'
11
+
12
+ description <<~DESCRIPTION
13
+ Perform visual inspections or attestations to ensure that the Client is conformant to the Da Vinci Payer Data Exchange IG requirements.
14
+ DESCRIPTION
15
+
16
+ run_as_group
17
+
18
+ test from: :pdex_member_authentication_test
19
+ test from: :pdex_client_must_support_interpretation_test
20
+ test from: :pdex_must_support_sub_element_handling_test
21
+ test from: :pdex_accept_retain_provenance_test
22
+ end
23
+ end
24
+ end
@@ -37,6 +37,8 @@ require_relative 'pdex_payer_client/clinical_data_request_tests/practitioner_cli
37
37
  require_relative 'pdex_payer_client/clinical_data_request_tests/practitionerrole_clinical_data_request_test'
38
38
  require_relative 'pdex_payer_client/clinical_data_request_tests/procedure_clinical_data_request_test'
39
39
 
40
+ require_relative 'pdex_payer_client/visual_inspection_and_attestation'
41
+
40
42
  module DaVinciPDexTestKit
41
43
  class PDexPayerClientSuite < Inferno::TestSuite
42
44
  include PDexPayerClient
@@ -76,6 +78,14 @@ module DaVinciPDexTestKit
76
78
  end
77
79
  end
78
80
 
81
+ requirement_sets(
82
+ {
83
+ identifier: 'hl7.fhir.us.davinci-pdex_2.0.0',
84
+ title: 'Da Vinci Payer Data Exchange (PDex) v2.0.0',
85
+ actor: 'Client'
86
+ }
87
+ )
88
+
79
89
  suite_option :client_type,
80
90
  title: 'Client Security Type',
81
91
  list_options: [
@@ -96,7 +106,7 @@ module DaVinciPDexTestKit
96
106
  value: PDexClientOptions::UDAP_AUTHORIZATION_CODE
97
107
  }
98
108
  ]
99
-
109
+
100
110
  resume_test_route :get, RESUME_PASS_PATH do |request|
101
111
  PDexPayerClientSuite.extract_token_from_query_params(request)
102
112
  end
@@ -176,10 +186,14 @@ module DaVinciPDexTestKit
176
186
  end
177
187
  end
178
188
 
179
-
189
+ group from: :pdex_client_visual_inspection_and_attestation do
190
+ optional
191
+ end
192
+
193
+
180
194
  # TODO: must support validation
181
195
 
182
-
196
+
183
197
 
184
198
  private
185
199
 
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaVinciPDexTestKit
4
+ module PDexPayerServer
5
+ RESUME_PASS_PATH = '/resume_pass'
6
+ RESUME_FAIL_PATH = '/resume_fail'
7
+
8
+ # URLs
9
+ module URLs
10
+ def base_url
11
+ @base_url ||= "#{Inferno::Application['base_url']}/custom/#{suite_id}"
12
+ end
13
+
14
+ def resume_pass_url
15
+ @resume_pass_url ||= base_url + RESUME_PASS_PATH
16
+ end
17
+
18
+ def resume_fail_url
19
+ @resume_fail_url ||= base_url + RESUME_FAIL_PATH
20
+ end
21
+
22
+ def suite_id
23
+ PDexPayerServerSuite.id
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class BulkDataTransmissionRestrictionsTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Properly restricts Bulk Data transmission of individual member data'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module's use of the Bulk FHIR specification for transmission of individual member data honors jurisdictional and personal privacy restrictions.
11
+ DESCRIPTION
12
+
13
+ id :pdex_bulk_data_transmission_restrictions_test
14
+
15
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@11'
16
+
17
+ run do
18
+ identifier = SecureRandom.hex(32)
19
+
20
+ wait(
21
+ identifier:,
22
+ message: <<~MESSAGE
23
+ The developer of the Health IT Module attests that the Health IT Module's use of the Bulk FHIR specification for transmission of individual member data
24
+ honors jurisdictional and personal privacy restrictions that are relevant to a member's health record.
25
+
26
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
27
+
28
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
29
+ MESSAGE
30
+ )
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class PDexMemberMatchConsentFailureHandlingTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Handles consent non-compliance correctly during $member-match'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module correctly handles situations where during the `$member-match` operation:
11
+ - If a unique match to a member is found but the consent request cannot be honored (e.g., due to unsupported data segmentation policies), the system does not return a Patient ID in the response.
12
+ - In such cases, the system returns an HTTP 422 status code with an accompanying Operation Outcome that explains why the consent request could not be honored.
13
+
14
+ DESCRIPTION
15
+
16
+ id :pdex_member_match_consent_failure_test
17
+
18
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@38',
19
+ 'hl7.fhir.us.davinci-pdex_2.0.0@39'
20
+
21
+ run do
22
+ identifier = SecureRandom.hex(32)
23
+
24
+ wait(
25
+ identifier:,
26
+ message: <<~MESSAGE
27
+ The developer of the Health IT Module attests that during the `$member-match` operation:
28
+
29
+ - If a unique match to a member is found but the consent request cannot be honored (e.g., due to unsupported data segmentation policies), the system does not return a Patient ID in the response.
30
+
31
+ - In such cases, the system returns an HTTP 422 status code with an accompanying Operation Outcome that explains why the consent request could not be honored.
32
+
33
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
34
+
35
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
36
+ MESSAGE
37
+ )
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class ConsentRequirementsTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Assesses consent requirements'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module considers consent requirements to be met only if:
11
+ - Member Identity is matched
12
+ - Consent Policy (Everything or only Non-Sensitive data) matches the data release segmentation capabilities of the receiving payer
13
+ - Date period for consent is valid
14
+ - Payer requesting retrieval of data is matched.
15
+ DESCRIPTION
16
+
17
+ id :pdex_consent_requirements_test
18
+
19
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@40'
20
+
21
+ run do
22
+ identifier = SecureRandom.hex(32)
23
+
24
+ wait(
25
+ identifier:,
26
+ message: <<~MESSAGE
27
+ The developer of the Health IT Module attests that the Health IT Module considers consent requirements to be met only if:
28
+ - Member Identity is matched
29
+ - Consent Policy (Everything or only Non-Sensitive data) matches the data release segmentation capabilities of the receiving payer
30
+ - Date period for consent is valid
31
+ - Payer requesting retrieval of data is matched.
32
+
33
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
34
+
35
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
36
+ MESSAGE
37
+ )
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class PDexMustSupportDefinedByHRexTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Uses HRex Must Support definitions for HRex profiles'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module applies the definition of "Must Support" as defined
11
+ by the Da Vinci HRex Implementation Guide for all HRex profiles referenced in PDex.
12
+ DESCRIPTION
13
+
14
+ id :pdex_must_support_defined_by_hrex_test
15
+
16
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@5'
17
+
18
+ run do
19
+ identifier = SecureRandom.hex(32)
20
+
21
+ wait(
22
+ identifier:,
23
+ message: <<~MESSAGE
24
+ The developer of the Health IT Module attests that the system applies the definition
25
+ of "Must Support" as defined by the Da Vinci HRex Implementation Guide for all
26
+ HRex profiles referenced in PDex.
27
+
28
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
29
+
30
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
31
+ MESSAGE
32
+ )
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class PDexLicensingTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Complies with licensing requirements'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module abides by the license
11
+ requirements for each terminology content artifact utilized within a functioning implementation and obtained
12
+ terminology licenses from the Third-Party IP owner for each code system and/or other specified artifact used.
13
+ DESCRIPTION
14
+
15
+ id :pdex_licensing_test
16
+
17
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@1',
18
+ 'hl7.fhir.us.davinci-pdex_2.0.0@2'
19
+
20
+ run do
21
+ identifier = SecureRandom.hex(32)
22
+
23
+ wait(
24
+ identifier:,
25
+ message: <<~MESSAGE
26
+ The developer of the Health IT Module attests that the Health IT Module abides by the license
27
+ requirements for each terminology content artifact utilized within a functioning implementation and obtained
28
+ terminology licenses from the Third-Party IP owner for each code system and/or other specified artifact used.
29
+
30
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
31
+
32
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
33
+ MESSAGE
34
+ )
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,81 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class PDexMemberAuthorizedExchangeTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Supports Payer-to-Payer member-authorized exchange'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module supports Payer-to-Payer member-authorized
11
+ information exchange using SMART on FHIR and OAuth 2.0 by satisfying the following criteria.
12
+
13
+ The Health IT Module is acting as the **source** Health Plan, and is the Health Plan the member would like to get data from.
14
+ The **target** Health Plan is the Health PLan the member would like to share data to.
15
+
16
+ 1. **Client Authorization Credentials**
17
+ The Health IT Module issues the target Health Plan OAuth 2.0 client application credentials during client registration.
18
+
19
+ 1. **Member Consent Flow**
20
+ After the member authenticates to the Health IT Module's authorization server, the system presents an Authorization
21
+ screen enabling the member to approve sharing with the target Health Plan.
22
+
23
+ The Authorization process aligns with applicable privacy policy and regulations, allowing members to
24
+ select what data may be shared.
25
+
26
+ 4. **Token Issuance**
27
+ Upon successful authorization, the Health IT Module issues an Access Token to the target Health Plan.
28
+ The scopes associated with the Access Token are limited to the information and permissions authorized by the member.
29
+
30
+ 6. **Refresh Token Handling**:
31
+ Any Access Token subsequently issued by the Health IT Module using a Refresh Token enforces the same scope and member-specific
32
+ restrictions as the original authorization.
33
+ DESCRIPTION
34
+
35
+ id :pdex_member_authorized_exchange_test
36
+
37
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@20',
38
+ 'hl7.fhir.us.davinci-pdex_2.0.0@21',
39
+ 'hl7.fhir.us.davinci-pdex_2.0.0@22',
40
+ 'hl7.fhir.us.davinci-pdex_2.0.0@23',
41
+ 'hl7.fhir.us.davinci-pdex_2.0.0@25',
42
+ 'hl7.fhir.us.davinci-pdex_2.0.0@26'
43
+
44
+ run do
45
+ identifier = SecureRandom.hex(32)
46
+
47
+ wait(
48
+ identifier:,
49
+ message: <<~MESSAGE
50
+ I attest that the Health IT Module supports Payer-to-Payer member-authorized
51
+ information exchange using SMART on FHIR and OAuth 2.0 by satisfying the following criteria.
52
+
53
+ The **source** Health Plan is the Health Plan the member would like to get data from, and the **etarget**
54
+ Health Plan is the Health PLan the member would like to share data to.
55
+
56
+ 1. **Client Authorization Credentials**
57
+ The Health IT Module issues the target Health Plan OAuth 2.0 client application credentials during client registration.
58
+
59
+ 1. **Member Consent Flow**
60
+ After the member authenticates to the Health IT Module's authorization server, the system presents an Authorization
61
+ screen enabling the member to approve sharing with the target Health Plan.
62
+
63
+ The Authorization process aligns with applicable privacy policy and regulations, allowing members to
64
+ select what data may be shared.
65
+
66
+ 4. **Token Issuance**
67
+ Upon successful authorization, the Health IT Module issues an Access Token to the target Health Plan.
68
+ The scopes associated with the Access Token are limited to the information and permissions authorized by the member.
69
+
70
+ 6. **Refresh Token Handling**:
71
+ Any Access Token subsequently issued by the Health IT Module using a Refresh Token enforces the same scope and member-specific
72
+ restrictions as the original authorization.
73
+
74
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
75
+
76
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
77
+ MESSAGE
78
+ )
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,61 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class PDexPayerToPayerMemberMatchTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Supports mTLS for secure $member-match payer-to-payer exchange'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module attests that the system supports secure payer-to-payer exchange for $member-match as follows:
11
+
12
+ The **source** Health Plan is the Health Plan the member would like to get data from, and the **etarget**
13
+ Health Plan is the Health Plan the member would like to share data to.
14
+
15
+ 1. **Secure mTLS Connection** — Establishes a mutual TLS (mTLS) connection with the target Health Plan.
16
+
17
+ 2. **Client Registration** — Supports OAuth 2.0 Dynamic Client Registration for the target Health Plan over the mTLS-secured connection.
18
+
19
+ 3. **Token Acquisition** — Accepts a Client Credentials grant request by the target Health Plan over mTLS to issue an OAuth 2.0 access
20
+ token for the $member-match operation.
21
+
22
+ 4. **Scoped Access Token for Matched Patient** — If a Patient ID is matched, returns an OAuth 2.0 access token to the target Health Plan
23
+ that is scoped to that member to enable further data exchange.
24
+ DESCRIPTION
25
+
26
+ id :pdex_payer_to_payer_mtls
27
+
28
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@31',
29
+ 'hl7.fhir.us.davinci-pdex_2.0.0@32',
30
+ 'hl7.fhir.us.davinci-pdex_2.0.0@33',
31
+ 'hl7.fhir.us.davinci-pdex_2.0.0@34'
32
+
33
+ run do
34
+ identifier = SecureRandom.hex(32)
35
+
36
+ wait(
37
+ identifier:,
38
+ message: <<~MESSAGE
39
+ I attest that the Health IT Module supports secure payer-to-payer exchange for $member-match as follows:
40
+
41
+ The **source** Health Plan is the Health Plan the member would like to get data from, and the **etarget**
42
+ Health Plan is the Health Plan the member would like to share data to.
43
+
44
+ 1. **Secure mTLS Connection** — Establishes a mutual TLS (mTLS) connection with the target Health Plan.
45
+
46
+ 2. **Client Registration** — Supports OAuth 2.0 Dynamic Client Registration for the target Health Plan over the mTLS-secured connection.
47
+
48
+ 3. **Token Acquisition** — Accepts a Client Credentials grant request by the target Health Plan over mTLS to issue an OAuth 2.0 access
49
+ token for the $member-match operation.
50
+
51
+ 4. **Scoped Access Token for Matched Patient** — If a Patient ID is matched, returns an OAuth 2.0 access token to the target Health Plan
52
+ that is scoped to that member to enable further data exchange.
53
+
54
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** these requirements.
55
+
56
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** these requirements.
57
+ MESSAGE
58
+ )
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class PayerConsentComplianceTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Constrains response based on access permissions'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module constrains the data returned from the server to a requester based upon the access permissions of the requester.
11
+ DESCRIPTION
12
+
13
+ id :pdex_payer_consent_compliance_test
14
+
15
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@45'
16
+
17
+ run do
18
+ identifier = SecureRandom.hex(32)
19
+
20
+ wait(
21
+ identifier:,
22
+ message: <<~MESSAGE
23
+ The developer of the Health IT Module attests that the Health IT Module constrains the data returned from the server to a requester
24
+ based upon the access permissions of the requester.
25
+
26
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
27
+
28
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
29
+ MESSAGE
30
+ )
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../urls'
2
+
3
+ module DaVinciPDexTestKit
4
+ class PriorAuthorizationDecisionsTest < Inferno::Test
5
+ include PDexPayerServer::URLs
6
+
7
+ title 'Makes available pending and active prior authorization decisions'
8
+
9
+ description <<~DESCRIPTION
10
+ The Health IT Module makes available pending and active prior authorization decisions and related clinical documentation and forms for items and services.
11
+ DESCRIPTION
12
+
13
+ id :pdex_prior_authorization_decisions_test
14
+
15
+ verifies_requirements 'hl7.fhir.us.davinci-pdex_2.0.0@56'
16
+
17
+ run do
18
+ identifier = SecureRandom.hex(32)
19
+
20
+ wait(
21
+ identifier:,
22
+ message: <<~MESSAGE
23
+ The developer of the Health IT Module attests that the Health IT Module makes available pending and active prior authorization decisions
24
+ and related clinical documentation and forms for items and services, not including prescription drugs, including the date the prior authorization was approved,
25
+ the date the authorization ends, as well as the units and services approved and those used to date, no later than one (1) business day after a provider initiates
26
+ a prior authorization for the beneficiary or there is a change of status for the prior authorization.
27
+
28
+ [Click here](#{resume_pass_url}?token=#{identifier}) if the system **meets** this requirement.
29
+
30
+ [Click here](#{resume_fail_url}?token=#{identifier}) if the system **does not meet** this requirement.
31
+ MESSAGE
32
+ )
33
+ end
34
+ end
35
+ end