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.
- checksums.yaml +4 -4
- data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/authentication.rb +34 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/must_support.rb +40 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/provenance.rb +32 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/receive_must_support.rb +34 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation.rb +24 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client_suite.rb +17 -3
- data/lib/davinci_pdex_test_kit/pdex_payer_server/urls.rb +27 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/bulk_data_transmission_restrictions.rb +33 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/consent_failure.rb +40 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/consent_requirements.rb +40 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/hrex_must_support.rb +35 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/licensing.rb +37 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/member_auth.rb +81 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/mtls.rb +61 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/payer_consent_compliance.rb +33 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/prior_authorization_decisions.rb +35 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/provenance_records.rb +40 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/read_and_search_hrex.rb +35 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/resources_in_capability_statement.rb +35 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation.rb +39 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server_suite.rb +26 -0
- data/lib/davinci_pdex_test_kit/pdex_provider_client_suite.rb +8 -0
- data/lib/davinci_pdex_test_kit/requirements/{generated/davinci-pdex-test-kit_requirements_coverage.csv → davinci_pdex_test_kit_requirements.csv} +108 -59
- data/lib/davinci_pdex_test_kit/requirements/generated/pdex_payer_client_requirements_coverage.csv +29 -0
- data/lib/davinci_pdex_test_kit/requirements/generated/pdex_payer_server_requirements_coverage.csv +479 -0
- data/lib/davinci_pdex_test_kit/requirements/hl7.fhir.us.davinci-pdex_2.0.0_reqs.xlsx +0 -0
- data/lib/davinci_pdex_test_kit/version.rb +2 -2
- data/lib/davinci_pdex_test_kit.rb +0 -1
- metadata +35 -20
- data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_out_of_scope_requirements.csv +0 -1
- data/lib/davinci_pdex_test_kit/requirements/davinci-pdex-test-kit_requirements.csv +0 -66
- data/lib/inferno_requirements_tools/ext/inferno_core/runnable.rb +0 -22
- data/lib/inferno_requirements_tools/rake/rakefile_template +0 -19
- data/lib/inferno_requirements_tools/tasks/collect_requirements.rb +0 -228
- data/lib/inferno_requirements_tools/tasks/requirements_coverage.rb +0 -284
- data/lib/requirements_config.yaml +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbdcb21dc69873f17a9bb953dfc730122d4c23b3421cb083661a69948dc9ccae
|
4
|
+
data.tar.gz: 6247c018d72c6f697dbb6e44408ea3bf4a8bdbcd011edee17ae6cc43c6d0a35f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c21fb0dd88fadc8128d3970a73d442b0bbfbd242862748b4ea85b54ed8bfb2377a03e3a9674c79f2eff9ffa6f56441fc5cc1823c0fbff4bff37df734db85db00
|
7
|
+
data.tar.gz: ca9c1ffbba669a7b9dda3823207b9c971242fbb4e18f81d5f3da93444b472693905e15e73e2918e0dadcf7b31c876fb7debed64dac2219559cb20b8b069d7e3d
|
data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/authentication.rb
ADDED
@@ -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
|
data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/must_support.rb
ADDED
@@ -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
|
data/lib/davinci_pdex_test_kit/pdex_payer_client/visual_inspection_and_attestation/provenance.rb
ADDED
@@ -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
|
data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/licensing.rb
ADDED
@@ -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
|
data/lib/davinci_pdex_test_kit/pdex_payer_server/visual_inspection_and_attestation/member_auth.rb
ADDED
@@ -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
|