davinci_pdex_test_kit 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +201 -0
- data/lib/davinci_pdex_test_kit/docs/payer_client_suite_description_v200.md +91 -0
- data/lib/davinci_pdex_test_kit/docs/payer_server_suite_description_v200.md +119 -0
- data/lib/davinci_pdex_test_kit/ext/inferno_core/record_response_route.rb +98 -0
- data/lib/davinci_pdex_test_kit/ext/inferno_core/request.rb +19 -0
- data/lib/davinci_pdex_test_kit/ext/inferno_core/runnable.rb +18 -0
- data/lib/davinci_pdex_test_kit/fhir_resource_navigation.rb +154 -0
- data/lib/davinci_pdex_test_kit/group_metadata.rb +109 -0
- data/lib/davinci_pdex_test_kit/metadata/mock_capability_statement.json +1052 -0
- data/lib/davinci_pdex_test_kit/metadata/mock_operation_outcome_resource.json +16 -0
- data/lib/davinci_pdex_test_kit/mock_server.rb +247 -0
- data/lib/davinci_pdex_test_kit/must_support_test.rb +252 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/client_member_match_tests/client_member_match_submit_test.rb +24 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/client_member_match_tests/client_member_match_validation_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/client_must_support_tests/client_member_match_must_support_submit_test.rb +26 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/client_must_support_tests/client_member_match_must_support_validation_test.rb +32 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/client_validation_test.rb +94 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/allergyintolerance_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/careplan_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/careteam_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/condition_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/device_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/diagnosticreport_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/documentreference_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/encounter_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/explanationofbenefit_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/goal_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/immunization_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/initial_scratch_storing.rb +34 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/initial_wait_test.rb +28 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/location_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/medicationdispense_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/medicationrequest_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/observation_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/organization_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/patient_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/practitioner_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/practitionerrole_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/clinical_data_request_tests/procedure_clinical_data_request_test.rb +23 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client/collection.rb +46 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_client_suite.rb +152 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/abstract_member_match_request_conformance_test.rb +33 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/abstract_member_match_request_local_references_test.rb +35 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/coverage_to_link_has_minimal_data_test.rb +52 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/coverage_to_link_must_support_test.rb +28 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_id_search_test.rb +58 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_identifier_search_test.rb +58 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_must_support_test.rb +40 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_last_updated_search_test.rb +63 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_service_date_search_test.rb +63 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_type_search_test.rb +63 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_patient_use_search_test.rb +68 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_provenance_revinclude_search_test.rb +52 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_read_test.rb +26 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_reference_resolution_test.rb +43 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit/explanation_of_benefit_validation_test.rb +40 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/explanation_of_benefit_group.rb +105 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/export_patient_group.rb +103 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/export_validation_group.rb +59 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/multiple_member_matches_group.rb +66 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/no_member_matches_group.rb +69 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_clinical_data.rb +66 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_everything.rb +184 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_export.rb +67 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server/workflow_member_match.rb +171 -0
- data/lib/davinci_pdex_test_kit/pdex_payer_server_suite.rb +158 -0
- data/lib/davinci_pdex_test_kit/pdex_provider_client_suite.rb +36 -0
- data/lib/davinci_pdex_test_kit/tags.rb +9 -0
- data/lib/davinci_pdex_test_kit/urls.rb +67 -0
- data/lib/davinci_pdex_test_kit/user_input_response.rb +32 -0
- data/lib/davinci_pdex_test_kit/version.rb +5 -0
- data/lib/davinci_pdex_test_kit.rb +8 -0
- metadata +218 -0
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'us_core_test_kit/search_test'
|
2
|
+
require 'us_core_test_kit/search_test_properties'
|
3
|
+
require 'us_core_test_kit/generator/group_metadata'
|
4
|
+
|
5
|
+
module DaVinciPDexTestKit
|
6
|
+
module PDexPayerServer
|
7
|
+
class ExplanationOfBenefitPatientTypeSearchTest < Inferno::Test
|
8
|
+
include USCoreTestKit::SearchTest
|
9
|
+
|
10
|
+
title 'Server returns valid results for ExplanationOfBenefit search by patient + type'
|
11
|
+
description %(
|
12
|
+
A server SHALL support searching by
|
13
|
+
patient + type on the ExplanationOfBenefit resource. This test
|
14
|
+
will pass if resources are returned and match the search criteria. If
|
15
|
+
none are returned, the test is skipped.
|
16
|
+
|
17
|
+
This test verifies that the server supports searching by reference using
|
18
|
+
the form `patient=[id]` as well as `patient=Patient/[id]`. The two
|
19
|
+
different forms are expected to return the same number of results. US
|
20
|
+
Core requires that both forms are supported by US Core responders, and
|
21
|
+
PDex expands upon US Core.
|
22
|
+
|
23
|
+
Because this is the first search of the sequence, resources in the
|
24
|
+
response will be used for subsequent tests.
|
25
|
+
|
26
|
+
Additionally, this test will check that GET and POST search methods
|
27
|
+
return the same number of results. Search by POST is required by the
|
28
|
+
FHIR R4 specification, and these tests interpret search by GET as a
|
29
|
+
requirement of PDex v2.0.0.
|
30
|
+
|
31
|
+
[PDex Server CapabilityStatement](https://hl7.org/fhir/us/davinci-pdex/STU2/CapabilityStatement-pdex-server.html)
|
32
|
+
|
33
|
+
)
|
34
|
+
|
35
|
+
id :pdex_explanation_of_benefit_patient_type_search_test
|
36
|
+
|
37
|
+
input :patient_ids,
|
38
|
+
title: 'Patient IDs',
|
39
|
+
description: 'Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements'
|
40
|
+
|
41
|
+
def self.properties
|
42
|
+
@properties ||= USCoreTestKit::SearchTestProperties.new(
|
43
|
+
resource_type: 'ExplanationOfBenefit',
|
44
|
+
search_param_names: ['patient', 'type'],
|
45
|
+
test_post_search: true
|
46
|
+
# TODO other properties?
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.metadata
|
51
|
+
@metadata ||= USCoreTestKit::Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml'), aliases: true))
|
52
|
+
end
|
53
|
+
|
54
|
+
def scratch_resources
|
55
|
+
scratch[:explanation_of_benefit_resources] ||= {}
|
56
|
+
end
|
57
|
+
|
58
|
+
run do
|
59
|
+
run_search_test
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'us_core_test_kit/search_test'
|
2
|
+
require 'us_core_test_kit/search_test_properties'
|
3
|
+
require 'us_core_test_kit/generator/group_metadata'
|
4
|
+
|
5
|
+
module DaVinciPDexTestKit
|
6
|
+
module PDexPayerServer
|
7
|
+
class ExplanationOfBenefitPatientUseSearchTest < Inferno::Test
|
8
|
+
include USCoreTestKit::SearchTest
|
9
|
+
|
10
|
+
title 'Server returns valid results for ExplanationOfBenefit search by patient + use'
|
11
|
+
description %(
|
12
|
+
A server SHALL support searching by
|
13
|
+
patient + use on the ExplanationOfBenefit resource. This test
|
14
|
+
will pass if resources are returned and match the search criteria. If
|
15
|
+
none are returned, the test is skipped.
|
16
|
+
|
17
|
+
This test verifies that the server supports searching by reference using
|
18
|
+
the form `patient=[id]` as well as `patient=Patient/[id]`. The two
|
19
|
+
different forms are expected to return the same number of results. US
|
20
|
+
Core requires that both forms are supported by US Core responders, and
|
21
|
+
PDex expands upon US Core.
|
22
|
+
|
23
|
+
Because this is the first search of the sequence, resources in the
|
24
|
+
response will be used for subsequent tests.
|
25
|
+
|
26
|
+
Additionally, this test will check that GET and POST search methods
|
27
|
+
return the same number of results. Search by POST is required by the
|
28
|
+
FHIR R4 specification, and these tests interpret search by GET as a
|
29
|
+
requirement of PDex v2.0.0.
|
30
|
+
|
31
|
+
[PDex Server CapabilityStatement](https://hl7.org/fhir/us/davinci-pdex/STU2/CapabilityStatement-pdex-server.html)
|
32
|
+
|
33
|
+
)
|
34
|
+
|
35
|
+
id :pdex_explanation_of_benefit_patient_use_search_test
|
36
|
+
|
37
|
+
input :patient_ids,
|
38
|
+
title: 'Patient IDs',
|
39
|
+
description: 'Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements'
|
40
|
+
|
41
|
+
def self.properties
|
42
|
+
@properties ||= USCoreTestKit::SearchTestProperties.new(
|
43
|
+
first_search: true,
|
44
|
+
fixed_value_search: true,
|
45
|
+
resource_type: 'ExplanationOfBenefit',
|
46
|
+
search_param_names: ['patient', 'use'],
|
47
|
+
saves_delayed_references: true,
|
48
|
+
possible_status_search: true,
|
49
|
+
token_search_params: ['use'],
|
50
|
+
test_reference_variants: true,
|
51
|
+
test_post_search: true
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.metadata
|
56
|
+
@metadata ||= USCoreTestKit::Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml'), aliases: true))
|
57
|
+
end
|
58
|
+
|
59
|
+
def scratch_resources
|
60
|
+
scratch[:explanation_of_benefit_resources] ||= {}
|
61
|
+
end
|
62
|
+
|
63
|
+
run do
|
64
|
+
run_search_test
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'us_core_test_kit/search_test'
|
2
|
+
require 'us_core_test_kit/search_test_properties'
|
3
|
+
require 'us_core_test_kit/generator/group_metadata'
|
4
|
+
|
5
|
+
module USCoreTestKit
|
6
|
+
module USCoreV311
|
7
|
+
class ExplanationOfBenefitProvenanceRevincludeSearchTest < Inferno::Test
|
8
|
+
include USCoreTestKit::SearchTest
|
9
|
+
|
10
|
+
title 'Server returns Provenance resources from ExplanationOfBenefit search by patient + revInclude:Provenance:target'
|
11
|
+
description %(
|
12
|
+
A server SHALL be capable of supporting _revIncludes:Provenance:target.
|
13
|
+
|
14
|
+
This test will perform a search by patient + revInclude:Provenance:target and
|
15
|
+
will pass if a Provenance resource is found in the response.
|
16
|
+
%)
|
17
|
+
|
18
|
+
id :pdex_explanation_of_benefit_provenance_revinclude_search_test
|
19
|
+
|
20
|
+
input :patient_ids,
|
21
|
+
title: 'Patient IDs',
|
22
|
+
description: 'Comma separated list of patient IDs that in sum contain all MUST SUPPORT elements'
|
23
|
+
|
24
|
+
def properties
|
25
|
+
@properties ||= USCoreTestKit::SearchTestProperties.new(
|
26
|
+
resource_type: 'ExplanationOfBenefit',
|
27
|
+
search_param_names: ['patient']
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.metadata
|
32
|
+
@metadata ||= USCoreTestKit::Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml')))
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.provenance_metadata
|
36
|
+
@provenance_metadata ||= USCoreTestKit::Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, '..', 'provenance', 'metadata.yml'), aliases: true))
|
37
|
+
end
|
38
|
+
|
39
|
+
def scratch_resources
|
40
|
+
scratch[:explanation_of_benefit_resources] ||= {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def scratch_provenance_resources
|
44
|
+
scratch[:provenance_resources] ||= {}
|
45
|
+
end
|
46
|
+
|
47
|
+
run do
|
48
|
+
run_provenance_revinclude_search_test
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'us_core_test_kit/read_test'
|
2
|
+
|
3
|
+
module DaVinciPDexTestKit
|
4
|
+
module PDexPayerServer
|
5
|
+
class ExplanationOfBenefitReadTest < Inferno::Test
|
6
|
+
include USCoreTestKit::ReadTest
|
7
|
+
|
8
|
+
title 'Server returns correct ExplanationOfBenefit resource from ExplanationOfBenefit read interaction'
|
9
|
+
description 'A server SHALL support the ExplanationOfBenefit read interaction.'
|
10
|
+
|
11
|
+
id :pdex_explanation_of_benefit_read_test
|
12
|
+
|
13
|
+
def resource_type
|
14
|
+
'ExplanationOfBenefit'
|
15
|
+
end
|
16
|
+
|
17
|
+
def scratch_resources
|
18
|
+
scratch[:explanation_of_benefit_resources] ||= {}
|
19
|
+
end
|
20
|
+
|
21
|
+
run do
|
22
|
+
perform_read_test(all_scratch_resources)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'us_core_test_kit/reference_resolution_test'
|
2
|
+
require 'us_core_test_kit/generator/group_metadata'
|
3
|
+
|
4
|
+
module DaVinciPDexTestKit
|
5
|
+
module PDexPayerServer
|
6
|
+
class ExplanationOfBenefitReferenceResolutionTest < Inferno::Test
|
7
|
+
include USCoreTestKit::ReferenceResolutionTest
|
8
|
+
|
9
|
+
title 'MustSupport references within ExplanationOfBenefit resources are valid'
|
10
|
+
description %(
|
11
|
+
This test will attempt to read external references provided within elements
|
12
|
+
marked as 'MustSupport', if any are available.
|
13
|
+
|
14
|
+
It verifies that at least one external reference for each MustSupport Reference element
|
15
|
+
can be accessed by the test client, and conforms to corresponding US Core or PDex profile.
|
16
|
+
|
17
|
+
Elements which may provide external references include:
|
18
|
+
|
19
|
+
#### TODO: list out all references:
|
20
|
+
|
21
|
+
* ...
|
22
|
+
)
|
23
|
+
|
24
|
+
id :pdex_explanation_of_benefit_reference_resolution_test
|
25
|
+
|
26
|
+
def resource_type
|
27
|
+
'ExplanationOfBenefit'
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.metadata
|
31
|
+
@metadata ||= USCoreTestKit::Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'metadata.yml'), aliases: true))
|
32
|
+
end
|
33
|
+
|
34
|
+
def scratch_resources
|
35
|
+
scratch[:explanation_of_benefit_resources] ||= {}
|
36
|
+
end
|
37
|
+
|
38
|
+
run do
|
39
|
+
perform_reference_resolution_test(scratch_resources[:all])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'us_core_test_kit/validation_test'
|
2
|
+
|
3
|
+
module DaVinciPDexTestKit
|
4
|
+
module PDexPayerServer
|
5
|
+
class ExplanationOfBenefitValidationTest < Inferno::Test
|
6
|
+
include USCoreTestKit::ValidationTest
|
7
|
+
|
8
|
+
id :pdex_explanation_of_benefit_validation_test
|
9
|
+
title 'ExplanationOfBenefit resources returned during previous tests conform to the US Core ExplanationOfBenefit Profile'
|
10
|
+
description %(
|
11
|
+
This test verifies resources returned from the first search conform to
|
12
|
+
the [PDex ExplanationOfBenefit Profile](http://hl7.org/fhir/us/davinci-pdex/StructureDefinition/pdex-priorauthorization).
|
13
|
+
Systems must demonstrate at least one valid example in order to pass this test.
|
14
|
+
|
15
|
+
It verifies the presence of mandatory elements and that elements with
|
16
|
+
required bindings contain appropriate values. CodeableConcept element
|
17
|
+
bindings will fail if none of their codings have a code/system belonging
|
18
|
+
to the bound ValueSet. Quantity, Coding, and code element bindings will
|
19
|
+
fail if their code/system are not found in the valueset.
|
20
|
+
)
|
21
|
+
|
22
|
+
output :dar_code_found, :dar_extension_found
|
23
|
+
|
24
|
+
def resource_type
|
25
|
+
'ExplanationOfBenefit'
|
26
|
+
end
|
27
|
+
|
28
|
+
def scratch_resources
|
29
|
+
scratch[:explanation_of_benefit_resources] ||= {}
|
30
|
+
end
|
31
|
+
|
32
|
+
run do
|
33
|
+
perform_validation_test(scratch_resources[:all] || [],
|
34
|
+
'http://hl7.org/fhir/us/davinci-pdex/StructureDefinition/pdex-priorauthorization',
|
35
|
+
'2.0.0',
|
36
|
+
skip_if_empty: true)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'us_core_test_kit/generator/group_metadata'
|
4
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_patient_use_search_test'
|
5
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_id_search_test'
|
6
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_patient_last_updated_search_test'
|
7
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_patient_service_date_search_test'
|
8
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_patient_type_search_test'
|
9
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_identifier_search_test'
|
10
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_read_test'
|
11
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_provenance_revinclude_search_test'
|
12
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_validation_test'
|
13
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_must_support_test'
|
14
|
+
require_relative 'explanation_of_benefit/explanation_of_benefit_reference_resolution_test'
|
15
|
+
|
16
|
+
module DaVinciPDexTestKit
|
17
|
+
module PDexPayerServer
|
18
|
+
|
19
|
+
# PDex PriorAuthorization Profile for ExplanationOfBenefit Resource Test Group
|
20
|
+
class ExplanationOfBenefitTestGroup < Inferno::TestGroup
|
21
|
+
title 'PDex Prior Authorization Tests'
|
22
|
+
short_description 'Verify support for the server capabilities required by the PDex Prior Authorization Profile.'
|
23
|
+
description %(
|
24
|
+
# Background
|
25
|
+
|
26
|
+
The PDex Prior Authorization sequence verifies that the system under test is
|
27
|
+
able to provide correct responses for ExplanationOfBenefit queries. These queries
|
28
|
+
must contain resources conforming to the PDex Prior Authorization Profile as
|
29
|
+
specified in the Da Vinci PDex v2.0.0 Implementation Guide.
|
30
|
+
|
31
|
+
# Testing Methodology
|
32
|
+
## Searching
|
33
|
+
This test sequence will first perform each required search associated
|
34
|
+
with this resource. This sequence will perform searches with the
|
35
|
+
following parameters:
|
36
|
+
|
37
|
+
* patient + use
|
38
|
+
* _id
|
39
|
+
* patient + _lastUpdated
|
40
|
+
* patient + service-date
|
41
|
+
* patient + type
|
42
|
+
* identifier
|
43
|
+
|
44
|
+
### Search Parameters
|
45
|
+
The first search uses the selected patient(s) from the Patient Tests group.
|
46
|
+
Any subsequent searches will look for its parameter values
|
47
|
+
from the results of the first search. For example, the `provider`
|
48
|
+
search in this sequence is performed by looking for an existing
|
49
|
+
`ExplanationOfBenefit.provider` from any of the resources returned in the `patient`
|
50
|
+
search. If a value cannot be found this way, the search is skipped.
|
51
|
+
|
52
|
+
### Search Validation
|
53
|
+
Inferno will retrieve up to the first 20 bundle pages of the reply for
|
54
|
+
ExplanationOfBenefit resources and save them for subsequent tests. Each of
|
55
|
+
these resources is then checked to see if it matches the searched
|
56
|
+
parameters in accordance with [FHIR search
|
57
|
+
guidelines](https://www.hl7.org/fhir/search.html). The test will fail,
|
58
|
+
for example, if a Patient search for `gender=male` returns a `female`
|
59
|
+
patient.
|
60
|
+
|
61
|
+
## Must Support
|
62
|
+
Each profile contains elements marked as "must support". This test
|
63
|
+
sequence expects to see each of these elements at least once. If at
|
64
|
+
least one cannot be found, the test will fail. The test will look
|
65
|
+
through the ExplanationOfBenefit resources found in the first test for these
|
66
|
+
elements.
|
67
|
+
|
68
|
+
## Profile Validation
|
69
|
+
Each resource returned from the first search is expected to conform to
|
70
|
+
the [PDex Prior Authorization Profile](http://hl7.org/fhir/us/davinci-pdex/StructureDefinition-pdex-priorauthorization.html).
|
71
|
+
Each element is checked against teminology binding and cardinality requirements.
|
72
|
+
|
73
|
+
Elements with a required binding are validated against their bound
|
74
|
+
ValueSet. If the code/system in the element is not part of the ValueSet,
|
75
|
+
then the test will fail.
|
76
|
+
|
77
|
+
## Reference Validation
|
78
|
+
At least one instance of each external reference in elements marked as
|
79
|
+
"must support" within the resources provided by the system must resolve.
|
80
|
+
The test will attempt to read each reference found and will fail if no
|
81
|
+
read succeeds.
|
82
|
+
)
|
83
|
+
|
84
|
+
id :pdex_explanation_of_benefit
|
85
|
+
run_as_group
|
86
|
+
|
87
|
+
def self.metadata
|
88
|
+
# TODO: create metadata.yml to fit GroupMetadata OR circumvent metadata
|
89
|
+
@metadata ||= USCoreTestKit::Generator::GroupMetadata.new(YAML.load_file(File.join(__dir__, 'explanation_of_benefit', 'metadata.yml')), aliases: true)
|
90
|
+
end
|
91
|
+
|
92
|
+
test from: :pdex_explanation_of_benefit_patient_use_search_test
|
93
|
+
test from: :pdex_explanation_of_benefit__id_search_test
|
94
|
+
test from: :pdex_explanation_of_benefit_patient__last_updated_search_test
|
95
|
+
test from: :pdex_explanation_of_benefit_patient_service_date_search_test
|
96
|
+
test from: :pdex_explanation_of_benefit_patient_type_search_test
|
97
|
+
test from: :pdex_explanation_of_benefit_identifier_search_test
|
98
|
+
test from: :pdex_explanation_of_benefit_read_test
|
99
|
+
test from: :pdex_explanation_of_benefit_provenance_revinclude_search_test
|
100
|
+
test from: :pdex_explanation_of_benefit_validation_test
|
101
|
+
test from: :pdex_explanation_of_benefit_must_support_test
|
102
|
+
# test from: :pdex_explanation_of_benefit_reference_resolution_test
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tls_test_kit'
|
4
|
+
|
5
|
+
require 'bulk_data_test_kit/v1.0.1/bulk_data_export_operation_support_test'
|
6
|
+
require 'bulk_data_test_kit/v1.0.1/bulk_data_no_auth_test'
|
7
|
+
require 'bulk_data_test_kit/v1.0.1/bulk_data_export_kick_off_test'
|
8
|
+
require 'bulk_data_test_kit/v1.0.1/bulk_data_status_check_test'
|
9
|
+
require 'bulk_data_test_kit/v1.0.1/bulk_data_output_check_test'
|
10
|
+
|
11
|
+
module DaVinciPDexTestKit
|
12
|
+
module PDexPayerServer
|
13
|
+
class ExportPatientGroup < Inferno::TestGroup
|
14
|
+
title 'Patient Export Tests'
|
15
|
+
short_description 'Verify that the system supports bulk export of Patient Data'
|
16
|
+
description <<~DESCRIPTION
|
17
|
+
Verify that patient level export on the Bulk Data server follow the Bulk Data Access Implementation Guide
|
18
|
+
DESCRIPTION
|
19
|
+
id :pdex_patient_export_group
|
20
|
+
optional
|
21
|
+
|
22
|
+
run_as_group
|
23
|
+
|
24
|
+
input :bearer_token,
|
25
|
+
title: 'Bulk Data Authorization Bearer Token',
|
26
|
+
description: 'The authorization bearer token for the Bulk FHIR server. If not required, leave blank.',
|
27
|
+
optional: true
|
28
|
+
input :bulk_timeout,
|
29
|
+
title: 'Export Times Out after (1-600)',
|
30
|
+
description: <<~DESCRIPTION,
|
31
|
+
While testing, Inferno waits for the server to complete the exporting task. If the calculated totalTime is
|
32
|
+
greater than the timeout value specified here, Inferno bulk client stops testing. Please enter an integer
|
33
|
+
for the maximum wait time in seconds. If timeout is less than 1, Inferno uses default value 180. If the
|
34
|
+
timeout is greater than 600 (10 minutes), Inferno uses the maximum value 600.
|
35
|
+
DESCRIPTION
|
36
|
+
default: 180
|
37
|
+
|
38
|
+
output :patient_requires_access_token, :patient_status_output, :patient_bulk_download_url
|
39
|
+
|
40
|
+
test from: :bulk_data_export_operation_support do
|
41
|
+
title 'Bulk Data Server declares support for Patient export operation in CapabilityStatement'
|
42
|
+
description <<~DESCRIPTION
|
43
|
+
This test verifies that the Bulk Data Server declares support for
|
44
|
+
`Patient/$export` operation in its server CapabilityStatement.
|
45
|
+
|
46
|
+
Given flexibility in the FHIR specification for declaring constrained
|
47
|
+
OperationDefinitions, this test only verifies that the server declares
|
48
|
+
any operation on the Patient resource. It does not verify that it
|
49
|
+
declares the standard Patient export OperationDefinition provided in the
|
50
|
+
Bulk Data specification, nor does it attempt to resolve any non-standard
|
51
|
+
OperationDefinitions to verify if it is a constrained version of the
|
52
|
+
standard OperationDefintion.
|
53
|
+
|
54
|
+
This test will provide a warning if no operations are declared at
|
55
|
+
`Patient/$export`, via the
|
56
|
+
`CapabilityStatement.rest.resource.operation.name` element. It will
|
57
|
+
also provide an informational message if an operation on the Patient
|
58
|
+
resource exists, but does not point to the standard OperationDefinition
|
59
|
+
canonical URL:
|
60
|
+
http://hl7.org/fhir/uv/bulkdata/OperationDefinition/patient-export
|
61
|
+
|
62
|
+
Additionally, this test provides a warning if the bulk data server does
|
63
|
+
not include the following URL in its `CapabilityStatement.instantiates`
|
64
|
+
element: http://hl7.org/fhir/uv/bulkdata/CapabilityStatement/bulk-data
|
65
|
+
DESCRIPTION
|
66
|
+
id :bulk_data_patient_export_operation_support
|
67
|
+
|
68
|
+
config(
|
69
|
+
options: { resource_type: 'Patient', require_absolute_urls_in_output: true }
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
test from: :bulk_data_kick_off,
|
74
|
+
id: :pdex_export_patient_kick_off,
|
75
|
+
config: {
|
76
|
+
outputs: { polling_url: { name: :patient_polling_url } },
|
77
|
+
options: { resource_type: 'Patient', bulk_export_url: 'Patient/$export' }
|
78
|
+
}
|
79
|
+
|
80
|
+
test from: :bulk_data_status_check,
|
81
|
+
id: :pdex_export_patient_status_check,
|
82
|
+
config: {
|
83
|
+
inputs: { polling_url: { name: :patient_polling_url } },
|
84
|
+
outputs: {
|
85
|
+
status_response: { name: :patient_status_response },
|
86
|
+
requires_access_token: { name: :patient_requires_access_token }
|
87
|
+
},
|
88
|
+
options: { resource_type: 'Patient' }
|
89
|
+
}
|
90
|
+
|
91
|
+
test from: :bulk_data_output_check,
|
92
|
+
id: :pdex_export_patient_output_check,
|
93
|
+
config: {
|
94
|
+
inputs: { status_response: { name: :patient_status_response } },
|
95
|
+
outputs: {
|
96
|
+
status_output: { name: :patient_status_output },
|
97
|
+
bulk_download_url: { name: :patient_bulk_download_url }
|
98
|
+
},
|
99
|
+
options: { resource_type: 'Patient' }
|
100
|
+
}
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# export_validation_group.rb
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
# require 'bulk_data_test_kit/v1.0.1/bulk_data_multiple_patients_test'
|
6
|
+
require 'bulk_data_test_kit/v1.0.1/bulk_data_ndjson_download_test'
|
7
|
+
require 'bulk_data_test_kit/v1.0.1/bulk_data_valid_resources_test'
|
8
|
+
|
9
|
+
module DaVinciPDexTestKit
|
10
|
+
module PDexPayerServer
|
11
|
+
class ExportValidation < Inferno::TestGroup
|
12
|
+
title 'Patient Export Validation Tests'
|
13
|
+
short_description 'Verify that the data from the export of all Patients conforms to the base FHIR standard.'
|
14
|
+
description <<~DESCRIPTION
|
15
|
+
Verify that All Patient export from the Bulk Data server follow the base FHIR standard
|
16
|
+
DESCRIPTION
|
17
|
+
|
18
|
+
id :pdex_export_validation
|
19
|
+
|
20
|
+
input :patient_status_output, :patient_requires_access_token, :bearer_token, :patient_bulk_download_url
|
21
|
+
input :lines_to_validate,
|
22
|
+
title: 'Limit validation to a maximum resource count',
|
23
|
+
description: 'To validate all, leave blank.',
|
24
|
+
optional: true
|
25
|
+
|
26
|
+
input :patient_id # from workflow_export.rb
|
27
|
+
|
28
|
+
run_as_group
|
29
|
+
|
30
|
+
test from: :tls_version_test do
|
31
|
+
title 'Bulk Data Server is secured by transport layer security'
|
32
|
+
description <<~DESCRIPTION
|
33
|
+
[§170.315(g)(10) Test Procedure]
|
34
|
+
(https://www.healthit.gov/test-method/standardized-api-patient-and-population-services)
|
35
|
+
requires that all exchanges described herein between a client and a
|
36
|
+
server SHALL be secured using Transport Layer Security (TLS)
|
37
|
+
Protocol Version 1.2 (RFC5246).
|
38
|
+
DESCRIPTION
|
39
|
+
id :bulk_file_server_tls_version
|
40
|
+
|
41
|
+
config(
|
42
|
+
inputs: { url: { name: :patient_bulk_download_url } },
|
43
|
+
options: { minimum_allowed_version: OpenSSL::SSL::TLS1_2_VERSION }
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
test from: :bulk_data_valid_resources,
|
48
|
+
id: :bulk_data_patient_valid_resources,
|
49
|
+
config: {
|
50
|
+
inputs: {
|
51
|
+
status_output: { name: :patient_status_output },
|
52
|
+
requires_access_token: { name: :patient_requires_access_token }
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
# NOTE: removed bulk_data_multiple_patients test, hence we need this file
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'abstract_member_match_request_conformance_test'
|
3
|
+
require_relative 'abstract_member_match_request_local_references_test'
|
4
|
+
require_relative 'coverage_to_link_has_minimal_data_test'
|
5
|
+
require_relative 'coverage_to_link_must_support_test'
|
6
|
+
|
7
|
+
module DaVinciPDexTestKit
|
8
|
+
module PDexPayerServer
|
9
|
+
class MultipleMemberMatchesGroup < Inferno::TestGroup
|
10
|
+
|
11
|
+
id :multiple_member_matches_group
|
12
|
+
title '$member-match with multiple matches'
|
13
|
+
|
14
|
+
run_as_group
|
15
|
+
|
16
|
+
input :multiple_member_match_request,
|
17
|
+
title: 'Member Match Request for multiple matches',
|
18
|
+
description: "A JSON payload for server's $member-match endpoint that has **more than one match**",
|
19
|
+
type: 'textarea',
|
20
|
+
optional: true
|
21
|
+
|
22
|
+
group_config = { inputs: { member_match_request: { name: :multiple_member_match_request } } }
|
23
|
+
|
24
|
+
test from: :abstract_member_match_request_conformance do
|
25
|
+
id :multiple_member_match_request_conformance
|
26
|
+
config(group_config)
|
27
|
+
title '[USER INPUT VALIDATION] Member match request for multiple matches is valid'
|
28
|
+
description %{
|
29
|
+
This test validates the conformity of the user input to the
|
30
|
+
[HRex Member Match Request Profile](https://hl7.org/fhir/us/davinci-hrex/STU1/StructureDefinition-hrex-parameters-member-match-in.html),
|
31
|
+
ensuring subsequent tests can accurately simulate content. It also checks conformance to the [Parameters Resource](https://hl7.org/fhir/R4/parameters.html),
|
32
|
+
mandatory elements, and terminology. It also checks that the Patient reference with the Consent and CoverageToMatch parameters are local references.
|
33
|
+
}
|
34
|
+
|
35
|
+
# Inherits
|
36
|
+
end
|
37
|
+
|
38
|
+
test from: :abstract_member_match_request_local_references do
|
39
|
+
id :multiple_member_match_request_local_references
|
40
|
+
config(group_config)
|
41
|
+
end
|
42
|
+
|
43
|
+
test from: :coverage_to_link_has_minimal_data, config: group_config
|
44
|
+
test from: :coverage_to_link_must_support, config: group_config
|
45
|
+
|
46
|
+
test do
|
47
|
+
id :member_match_has_multiple_matches
|
48
|
+
title 'Server $member-match operation returns 422 Unprocessable Content if multiple matches are found'
|
49
|
+
description %{
|
50
|
+
See [member matching logic](https://hl7.org/fhir/us/davinci-hrex/STU1/OperationDefinition-member-match.html#member-matching-logic)
|
51
|
+
for specification.
|
52
|
+
}
|
53
|
+
|
54
|
+
run do
|
55
|
+
skip_if !multiple_member_match_request, "No member match request inputted for multiple-match tests."
|
56
|
+
|
57
|
+
member_match_request_resource = FHIR.from_contents(multiple_member_match_request)
|
58
|
+
|
59
|
+
fhir_operation('/Patient/$member-match', body: member_match_request_resource)
|
60
|
+
assert_response_status(422)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|