davinci_dtr_test_kit 0.9.0
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_dtr_test_kit/auth_groups/oauth2_authentication_group.rb +51 -0
- data/lib/davinci_dtr_test_kit/auth_groups/token_request_test.rb +25 -0
- data/lib/davinci_dtr_test_kit/auth_groups/token_validation_test.rb +13 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/dtr_smart_app_questionnaire_workflow_group.rb +20 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_questionnaire_response_save_test.rb +31 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_smart_app_questionnaire_workflow_group.rb +89 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/prepopulation_attestation_test.rb +29 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/prepopulation_override_attestation_test.rb +30 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/rendering_enabled_questions_attestation_test.rb +30 -0
- data/lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_full_ehr_questionnaire_workflow_group.rb +19 -0
- data/lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_questionnaire_package_group.rb +16 -0
- data/lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_questionnaire_rendering_attestation_test.rb +32 -0
- data/lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_questionnaire_rendering_group.rb +14 -0
- data/lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_questionnaire_response_group.rb +23 -0
- data/lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_questionnaire_response_save_test.rb +31 -0
- data/lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_smart_app_questionnaire_workflow_group.rb +22 -0
- data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_package_request_test.rb +36 -0
- data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_package_request_validation_test.rb +35 -0
- data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_response_basic_conformance_test.rb +28 -0
- data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_response_pre_population_test.rb +30 -0
- data/lib/davinci_dtr_test_kit/cql_test.rb +387 -0
- data/lib/davinci_dtr_test_kit/docs/dtr_payer_server_suite_description_v201.md +127 -0
- data/lib/davinci_dtr_test_kit/docs/dtr_smart_app_suite_description_v201.md +118 -0
- data/lib/davinci_dtr_test_kit/dtr_full_ehr_suite.rb +55 -0
- data/lib/davinci_dtr_test_kit/dtr_light_ehr_suite.rb +39 -0
- data/lib/davinci_dtr_test_kit/dtr_payer_server_suite.rb +104 -0
- data/lib/davinci_dtr_test_kit/dtr_questionnaire_response_validation.rb +180 -0
- data/lib/davinci_dtr_test_kit/dtr_smart_app_suite.rb +85 -0
- data/lib/davinci_dtr_test_kit/ext/inferno_core/record_response_route.rb +98 -0
- data/lib/davinci_dtr_test_kit/ext/inferno_core/request.rb +19 -0
- data/lib/davinci_dtr_test_kit/ext/inferno_core/runnable.rb +35 -0
- data/lib/davinci_dtr_test_kit/fixture_loader.rb +99 -0
- data/lib/davinci_dtr_test_kit/fixtures/dinner_adaptive/dinner_order_adaptive_next_question_burrito.json +170 -0
- data/lib/davinci_dtr_test_kit/fixtures/dinner_adaptive/dinner_order_adaptive_next_question_hamburger.json +175 -0
- data/lib/davinci_dtr_test_kit/fixtures/dinner_adaptive/dinner_order_adaptive_next_question_initial.json +140 -0
- data/lib/davinci_dtr_test_kit/fixtures/dinner_adaptive/questionnaire_dinner_order_adaptive.json +95 -0
- data/lib/davinci_dtr_test_kit/fixtures/dinner_static/questionnaire_dinner_order_static.json +283 -0
- data/lib/davinci_dtr_test_kit/fixtures/dinner_static/questionnaire_response_dinner_order_static.json +170 -0
- data/lib/davinci_dtr_test_kit/fixtures/pre_populated_questionnaire_response.json +581 -0
- data/lib/davinci_dtr_test_kit/fixtures/questionnaire_package.json +2121 -0
- data/lib/davinci_dtr_test_kit/fixtures.rb +65 -0
- data/lib/davinci_dtr_test_kit/mock_ehr.rb +72 -0
- data/lib/davinci_dtr_test_kit/mock_payer.rb +142 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_form_libraries_test.rb +19 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_form_questionnaire_expressions_test.rb +20 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_form_questionnaire_extensions_test.rb +19 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_next_questionnaire_expressions_test.rb +20 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_next_questionnaire_extensions_test.rb +19 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_group.rb +88 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_request_test.rb +41 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_request_validation_test.rb +44 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_bundles_validation_test.rb +40 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_search_validation_test.rb +42 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_validation_test.rb +49 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_request_validation_test.rb +61 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_response_complete_test.rb +17 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_response_validation_test.rb +43 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_static_group.rb +51 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_libraries_test.rb +19 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_questionnaire_expressions_test.rb +20 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_questionnaire_extensions_test.rb +19 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_request_test.rb +33 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_request_validation_test.rb +46 -0
- data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_response_validation_test.rb +50 -0
- data/lib/davinci_dtr_test_kit/tags.rb +8 -0
- data/lib/davinci_dtr_test_kit/urls.rb +50 -0
- data/lib/davinci_dtr_test_kit/validation_test.rb +72 -0
- data/lib/davinci_dtr_test_kit/version.rb +5 -0
- data/lib/davinci_dtr_test_kit.rb +4 -0
- metadata +132 -0
data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_validation_test.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative '../validation_test'
|
2
|
+
module DaVinciDTRTestKit
|
3
|
+
class PayerAdaptiveFormQuestionnaireResponseTest < Inferno::Test
|
4
|
+
include DaVinciDTRTestKit::ValidationTest
|
5
|
+
id :payer_server_adaptive_response_validation_test
|
6
|
+
title 'Validate that the adaptive response conforms to the Output Parameters profile'
|
7
|
+
# output :questionnaire_response
|
8
|
+
description %(
|
9
|
+
This test validates the conformance of the payer's response to the
|
10
|
+
[DTR Output Parameters](http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters)
|
11
|
+
structure.
|
12
|
+
|
13
|
+
It verifies the presence of mandatory elements and that elements with required bindings contain appropriate
|
14
|
+
values. CodeableConcept element bindings will fail if none of their codings have a code/system belonging
|
15
|
+
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system are not found in
|
16
|
+
the valueset.
|
17
|
+
|
18
|
+
This test may process multiple resources, labeling messages with the corresponding tested resources
|
19
|
+
This test may process multiple resources, labeling messages with the corresponding tested resources
|
20
|
+
in the order that they were received.
|
21
|
+
)
|
22
|
+
|
23
|
+
run do
|
24
|
+
skip_if retrieval_method == 'Static', 'Performing only static flow tests - only one flow is required.'
|
25
|
+
endpoint = custom_endpoint.blank? ? '/Questionnaire/$questionnaire-package' : custom_endpoint
|
26
|
+
if initial_adaptive_questionnaire_request.nil?
|
27
|
+
resources = load_tagged_requests(QUESTIONNAIRE_TAG)
|
28
|
+
else
|
29
|
+
resources = []
|
30
|
+
if initial_adaptive_questionnaire_request.is_a?(Array)
|
31
|
+
initial_adaptive_questionnaire_request.each do |_resource|
|
32
|
+
resources.push(fhir_operation("#{url}#{endpoint}", body: JSON.parse(initial_adaptive_questionnaire_request),
|
33
|
+
headers: { 'Content-Type': 'application/json' }))
|
34
|
+
end
|
35
|
+
else
|
36
|
+
resources.push(fhir_operation("#{url}#{endpoint}", body: JSON.parse(initial_adaptive_questionnaire_request),
|
37
|
+
headers: { 'Content-Type': 'application/json' }))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
scratch[:adaptive_responses] = resources
|
41
|
+
assert !scratch[:adaptive_responses].nil?, 'No resources to validate.'
|
42
|
+
perform_response_validation_test(
|
43
|
+
resources,
|
44
|
+
:parameters,
|
45
|
+
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters'
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_request_validation_test.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative '../validation_test'
|
2
|
+
module DaVinciDTRTestKit
|
3
|
+
class PayerAdaptiveFormNextRequestTest < Inferno::Test
|
4
|
+
include URLs
|
5
|
+
include DaVinciDTRTestKit::ValidationTest
|
6
|
+
title '[USER INPUT VALIDATION] Next Question request is valid'
|
7
|
+
description %(
|
8
|
+
This test validates the conformance of the client's request to the
|
9
|
+
[SDC Parameters Next Question In](http://hl7.org/fhir/uv/sdc/StructureDefinition/parameters-questionnaire-next-question-in)
|
10
|
+
structure.
|
11
|
+
|
12
|
+
It verifies the presence of mandatory elements and that elements with required bindings contain appropriate
|
13
|
+
values. CodeableConcept element bindings will fail if none of their codings have a code/system belonging
|
14
|
+
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system are not found in
|
15
|
+
the valueset.
|
16
|
+
|
17
|
+
This test may process multiple resources, labeling messages with the corresponding tested resources
|
18
|
+
in the order that they were received.
|
19
|
+
)
|
20
|
+
id :payer_server_next_request_validation
|
21
|
+
|
22
|
+
run do
|
23
|
+
skip_if retrieval_method == 'Static', 'Performing only static flow tests - only one flow is required.'
|
24
|
+
if next_question_requests.nil?
|
25
|
+
resources = load_tagged_requests(NEXT_TAG)
|
26
|
+
using_manual_entry = false
|
27
|
+
skip_if resources.nil?, 'No plain resources to validate.'
|
28
|
+
json_resources = resources.map { |r| JSON.parse(r.request_body) }
|
29
|
+
else
|
30
|
+
resources = next_question_requests
|
31
|
+
json_resources = JSON.parse(resources)
|
32
|
+
using_manual_entry = true
|
33
|
+
end
|
34
|
+
skip_if json_resources.nil?, 'No json resources to validate.'
|
35
|
+
if json_resources.any? { |r| r['resourceType'] == 'QuestionnaireResponse' }
|
36
|
+
perform_request_validation_test(
|
37
|
+
resources,
|
38
|
+
:questionnaireResponse,
|
39
|
+
'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse-adapt',
|
40
|
+
next_url,
|
41
|
+
using_manual_entry
|
42
|
+
)
|
43
|
+
elsif json_resources.any? { |r| r['resourceType'] == 'Parameters' }
|
44
|
+
perform_request_validation_test(
|
45
|
+
resources,
|
46
|
+
:parameters,
|
47
|
+
'http://hl7.org/fhir/uv/sdc/StructureDefinition/parameters-questionnaire-next-question-in',
|
48
|
+
next_url,
|
49
|
+
using_manual_entry
|
50
|
+
)
|
51
|
+
else
|
52
|
+
raise new Inferno::Exceptions::AssertionException.new "Resource does not conform to the either
|
53
|
+
accepted profiles: http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse-adapt
|
54
|
+
or http://hl7.org/fhir/uv/sdc/StructureDefinition/parameters-questionnaire-next-question-in"
|
55
|
+
end
|
56
|
+
rescue Inferno::Exceptions::AssertionException => e
|
57
|
+
msg = e.message.to_s.strip
|
58
|
+
skip msg
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DaVinciDTRTestKit
|
2
|
+
class PayerAdaptiveFormCompleteTest < Inferno::Test
|
3
|
+
id :payer_server_adaptive_completion_test
|
4
|
+
title 'Adaptive questionnaire was completed.'
|
5
|
+
description %(
|
6
|
+
This test validates that in the sequence of adaptive responses, one includes a "completed" status.
|
7
|
+
)
|
8
|
+
|
9
|
+
run do
|
10
|
+
skip_if retrieval_method == 'Static', 'Performing only static flow tests - only one flow is required.'
|
11
|
+
assert !scratch[:next_responses].nil?, 'No resources to validate.'
|
12
|
+
assert scratch[:next_responses].any? { |r|
|
13
|
+
JSON.parse(r.response_body)['status'] == 'completed'
|
14
|
+
}, 'Next request sequence did not result in a completed questionnaire.'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_response_validation_test.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../validation_test'
|
2
|
+
module DaVinciDTRTestKit
|
3
|
+
class PayerAdaptiveFormNextResponseTest < Inferno::Test
|
4
|
+
include DaVinciDTRTestKit::ValidationTest
|
5
|
+
id :payer_server_next_response_validation_test
|
6
|
+
title 'Inferno sends payer server a request for subsequent adaptive forms - validate the responses'
|
7
|
+
description %(
|
8
|
+
This test validates the conformance of the payer's response to the
|
9
|
+
[SDC Questionnaire Response](http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse)
|
10
|
+
structure.
|
11
|
+
|
12
|
+
It verifies the presence of mandatory elements and that elements with required bindings contain appropriate
|
13
|
+
values. CodeableConcept element bindings will fail if none of their codings have a code/system belonging
|
14
|
+
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system are not found in
|
15
|
+
the valueset.
|
16
|
+
|
17
|
+
This test may process multiple resources, labeling messages with the corresponding tested resources
|
18
|
+
This test may process multiple resources, labeling messages with the corresponding tested resources
|
19
|
+
in the order that they were received.
|
20
|
+
)
|
21
|
+
|
22
|
+
run do
|
23
|
+
skip_if retrieval_method == 'Static', 'Performing only static flow tests - only one flow is required.'
|
24
|
+
if next_question_requests.nil?
|
25
|
+
resources = load_tagged_requests(NEXT_TAG)
|
26
|
+
else
|
27
|
+
json_requests = JSON.parse(next_question_requests)
|
28
|
+
resources = json_requests.map do |resource|
|
29
|
+
fhir_operation("#{url}/Questionnaire/$next-question",
|
30
|
+
body: resource,
|
31
|
+
headers: { 'Content-Type': 'application/json' })
|
32
|
+
end
|
33
|
+
end
|
34
|
+
assert !resources.nil?, 'No resources to validate.'
|
35
|
+
scratch[:next_responses] = resources
|
36
|
+
perform_response_validation_test(
|
37
|
+
resources,
|
38
|
+
:questionnaireResponse,
|
39
|
+
'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse'
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative 'static_form_request_test'
|
2
|
+
require_relative 'static_form_request_validation_test'
|
3
|
+
require_relative 'static_form_response_validation_test'
|
4
|
+
require_relative 'static_form_libraries_test'
|
5
|
+
require_relative 'static_form_questionnaire_extensions_test'
|
6
|
+
require_relative 'static_form_questionnaire_expressions_test'
|
7
|
+
|
8
|
+
module DaVinciDTRTestKit
|
9
|
+
class DTRPayerServerQuestionnairePackageGroup < Inferno::TestGroup
|
10
|
+
title 'Static Questionnaire Package Retrieval'
|
11
|
+
short_description 'Verify support for the payer server capabilities required to provide
|
12
|
+
appropriate questionnaire packages upon request.'
|
13
|
+
description %(
|
14
|
+
## Background
|
15
|
+
|
16
|
+
The DTR Payer Server sequence verifies that the system under test is
|
17
|
+
able to provide correct responses for questionnaire package queries. These queries
|
18
|
+
must contain resources conforming to the questionnaire-package as
|
19
|
+
specified in the DTR v2.0.1 Implementation Guide.
|
20
|
+
|
21
|
+
## Testing Work Flow Options
|
22
|
+
|
23
|
+
- Enter the `FHIR Server Base Url` and `Access Token` if you are connecting a client that will
|
24
|
+
provide inferno with requests to be tested and sent to the server under test.
|
25
|
+
These inputs must align with the configuration of the DTR client being used to provide requests.
|
26
|
+
|
27
|
+
- Enter the `Initial Static Questionnaire Request`, in addition to the
|
28
|
+
`FHIR Server Base Url` pointing to the payer server,
|
29
|
+
to provide the json requests manually, rather than relying on a DTR client.
|
30
|
+
)
|
31
|
+
id :payer_server_static_package
|
32
|
+
run_as_group
|
33
|
+
|
34
|
+
input :initial_static_questionnaire_request,
|
35
|
+
optional: true,
|
36
|
+
title: 'Initial Static Questionnaire Request',
|
37
|
+
description: 'Manual Flow',
|
38
|
+
type: 'textarea'
|
39
|
+
|
40
|
+
input_order :retrieval_method,
|
41
|
+
:url,
|
42
|
+
:initial_static_questionnaire_request
|
43
|
+
|
44
|
+
test from: :dtr_v201_payer_static_questionnaire_request_test, receives_request: :statice_questionnaire_request
|
45
|
+
test from: :dtr_v201_payer_static_form_request_validation_test
|
46
|
+
test from: :dtr_v201_payer_static_form_response_test
|
47
|
+
test from: :dtr_v201_payer_static_form_libraries_test
|
48
|
+
test from: :dtr_v201_payer_static_form_extensions_test
|
49
|
+
test from: :dtr_v201_payer_static_form_expressions_test
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative '../cql_test'
|
2
|
+
module DaVinciDTRTestKit
|
3
|
+
class PayerStaticFormLibrariesTest < Inferno::Test
|
4
|
+
include DaVinciDTRTestKit::CQLTest
|
5
|
+
|
6
|
+
id :dtr_v201_payer_static_form_libraries_test
|
7
|
+
title 'Parameters contain libraries necessary for pre-population'
|
8
|
+
description %(
|
9
|
+
Inferno check that the payer response contains no duplicate library names
|
10
|
+
and that libraries contain cql and elm data.
|
11
|
+
)
|
12
|
+
|
13
|
+
run do
|
14
|
+
skip_if retrieval_method == 'Adaptive', 'Performing only adaptive flow tests - only one flow is required.'
|
15
|
+
skip_if scratch[:questionnaire_bundle].nil?, 'No questionnaire bundle returned.'
|
16
|
+
check_libraries(scratch[:questionnaire_bundle])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_questionnaire_expressions_test.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative '../cql_test'
|
2
|
+
module DaVinciDTRTestKit
|
3
|
+
class PayerStaticFormExpressionsTest < Inferno::Test
|
4
|
+
include DaVinciDTRTestKit::CQLTest
|
5
|
+
|
6
|
+
id :dtr_v201_payer_static_form_expressions_test
|
7
|
+
title 'Questionnaire(s) contains items with expressions necessary for pre-population'
|
8
|
+
description %(
|
9
|
+
Inferno checks that the payer server response has appropriate expressions and that expressions are
|
10
|
+
written in cql.
|
11
|
+
)
|
12
|
+
|
13
|
+
run do
|
14
|
+
skip_if retrieval_method == 'Adaptive', 'Performing only adaptive flow tests - only one flow is required.'
|
15
|
+
skip_if scratch[:questionnaire_bundle].nil?, 'No questionnaire bundle returned.'
|
16
|
+
questionnaire_items_test(scratch[:questionnaire_bundle], final_cql_test: true)
|
17
|
+
scratch[:questionnaire_bundle] = nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_questionnaire_extensions_test.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative '../cql_test'
|
2
|
+
module DaVinciDTRTestKit
|
3
|
+
class PayerStaticFormExtensionsTest < Inferno::Test
|
4
|
+
include DaVinciDTRTestKit::CQLTest
|
5
|
+
|
6
|
+
id :dtr_v201_payer_static_form_extensions_test
|
7
|
+
title 'Questionnaire(s) contains extensions necessary for pre-population'
|
8
|
+
description %(
|
9
|
+
Inferno checks that the payer server response has appropriate extensions and references to libraries within
|
10
|
+
those extensions.
|
11
|
+
)
|
12
|
+
|
13
|
+
run do
|
14
|
+
skip_if retrieval_method == 'Adaptive', 'Performing only adaptive flow tests - only one flow is required.'
|
15
|
+
skip_if scratch[:questionnaire_bundle].nil?, 'No questionnaire bundle returned.'
|
16
|
+
questionnaire_extensions_test(scratch[:questionnaire_bundle])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative '../urls'
|
2
|
+
require_relative '../validation_test'
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class StaticRFormRequestTest < Inferno::Test
|
5
|
+
include URLs
|
6
|
+
title 'Validate the questionnaires returned by the payer server'
|
7
|
+
description %(
|
8
|
+
Inferno will validate questionnaires returned by the payer server.
|
9
|
+
)
|
10
|
+
id :dtr_v201_payer_static_questionnaire_request_test
|
11
|
+
config options: { accepts_multiple_requests: false }
|
12
|
+
|
13
|
+
run do
|
14
|
+
skip_if retrieval_method == 'Adaptive', 'Performing only adaptive flow tests - only one flow is required.'
|
15
|
+
pass_if !initial_static_questionnaire_request.nil?,
|
16
|
+
'Proceeding with manually provided resources.'
|
17
|
+
skip_if access_token.nil?, 'Please provide an access token or all request resources as inputs.'
|
18
|
+
wait(
|
19
|
+
identifier: access_token,
|
20
|
+
message: %(
|
21
|
+
**Static Form Testing**
|
22
|
+
|
23
|
+
Invoke the DTR Questionnaire Package operation by sending a POST request to
|
24
|
+
|
25
|
+
`#{questionnaire_package_url}`
|
26
|
+
|
27
|
+
A set of questionnaire packages generated by Inferno will be returned. Each of the following tests
|
28
|
+
will validate all resources, marking messages in the order they are received.
|
29
|
+
)
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative '../urls'
|
2
|
+
require_relative '../validation_test'
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class PayerStaticFormRequestValidationTest < Inferno::Test
|
5
|
+
include DaVinciDTRTestKit::ValidationTest
|
6
|
+
include URLs
|
7
|
+
id :dtr_v201_payer_static_form_request_validation_test
|
8
|
+
title '[USER INPUT VALIDATION] Client sends payer server a request for a static form'
|
9
|
+
description %(
|
10
|
+
Inferno will validate that the request to the payer server conforms to the
|
11
|
+
[Input Parameters profile](http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters).
|
12
|
+
|
13
|
+
It verifies the presence of mandatory elements and that elements with required bindings contain appropriate
|
14
|
+
values. CodeableConcept element bindings will fail if none of their codings have a code/system belonging
|
15
|
+
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system
|
16
|
+
are not found in the valueset.
|
17
|
+
|
18
|
+
This test may process multiple resources, labeling messages with the corresponding tested resources
|
19
|
+
in the order that they were received.
|
20
|
+
)
|
21
|
+
|
22
|
+
run do
|
23
|
+
skip_if retrieval_method == 'Adaptive', 'Performing only adaptive flow tests - only one flow is required.'
|
24
|
+
if initial_static_questionnaire_request.nil?
|
25
|
+
using_manual_entry = false
|
26
|
+
skip_if access_token.nil?, 'No access token provided - required for client flow.'
|
27
|
+
resources = load_tagged_requests(QUESTIONNAIRE_TAG)
|
28
|
+
skip_if resources.nil?, 'No request resource received from the client.'
|
29
|
+
perform_request_validation_test(
|
30
|
+
resources,
|
31
|
+
:parameters,
|
32
|
+
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters',
|
33
|
+
questionnaire_package_url,
|
34
|
+
using_manual_entry
|
35
|
+
)
|
36
|
+
else
|
37
|
+
skip_if initial_static_questionnaire_request.nil?, 'No request resource was provided - required for manual flow'
|
38
|
+
request = FHIR.from_contents(initial_static_questionnaire_request)
|
39
|
+
assert_valid_resource(resource: request, profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters')
|
40
|
+
end
|
41
|
+
rescue Inferno::Exceptions::AssertionException => e
|
42
|
+
msg = e.message.to_s.strip
|
43
|
+
skip msg
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative '../urls'
|
2
|
+
require_relative '../validation_test'
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class PayerStaticFormResponseTest < Inferno::Test
|
5
|
+
include URLs
|
6
|
+
include DaVinciDTRTestKit::ValidationTest
|
7
|
+
id :dtr_v201_payer_static_form_response_test
|
8
|
+
title 'Validate that the static response conforms to the Output Parameters profile'
|
9
|
+
description %(
|
10
|
+
Inferno will validate that the payer server response conforms to the
|
11
|
+
[Output Parameters profile](http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters).
|
12
|
+
|
13
|
+
It verifies the presence of mandatory elements and that elements with required bindings contain appropriate
|
14
|
+
values. CodeableConcept element bindings will fail if none of their codings have a code/system belonging
|
15
|
+
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system are not found in
|
16
|
+
the valueset.
|
17
|
+
|
18
|
+
This test may process multiple resources, labeling messages with the corresponding tested resources
|
19
|
+
in the order that they were received.
|
20
|
+
)
|
21
|
+
|
22
|
+
run do
|
23
|
+
skip_if retrieval_method == 'Adaptive', 'Performing only adaptive flow tests - only one flow is required.'
|
24
|
+
|
25
|
+
if initial_static_questionnaire_request.nil?
|
26
|
+
skip_if access_token.nil?, 'No access token provided - required for client flow.'
|
27
|
+
resources = load_tagged_requests(QUESTIONNAIRE_TAG)
|
28
|
+
skip_if resources.nil?, 'No request resource received from the client.'
|
29
|
+
scratch[:questionnaire_bundle] = resources
|
30
|
+
perform_response_validation_test(
|
31
|
+
resources,
|
32
|
+
:parameters,
|
33
|
+
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters'
|
34
|
+
)
|
35
|
+
else
|
36
|
+
FHIR.from_contents(initial_static_questionnaire_request)
|
37
|
+
fhir_operation("#{url}/Questionnaire/$questionnaire-package",
|
38
|
+
body: JSON.parse(initial_static_questionnaire_request),
|
39
|
+
headers: { 'Content-Type': 'application/json' })
|
40
|
+
scratch[:questionnaire_bundle] = resource
|
41
|
+
|
42
|
+
assert_response_status(200)
|
43
|
+
assert_resource_type(:parameters)
|
44
|
+
questionnaire_bundle = resource.parameter.find { |param| param.name == 'return' }&.resource
|
45
|
+
assert questionnaire_bundle, 'No questionnaire bundle found in the response'
|
46
|
+
assert_valid_resource(resource: questionnaire_bundle, profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
QUESTIONNAIRE_TAG = 'payer_server_questionnaire_package'
|
5
|
+
NEXT_TAG = 'payer_server_adaptive_questionnaire_package'
|
6
|
+
QUESTIONNAIRE_PACKAGE_TAG = 'dtr_questionnaire_package'
|
7
|
+
SMART_APP_EHR_REQUEST_TAG = 'dtr_smart_app_ehr_request'
|
8
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
TOKEN_PATH = '/mock_auth/token'
|
5
|
+
QUESTIONNAIRE_PACKAGE_PATH = '/fhir/Questionnaire/$questionnaire-package'
|
6
|
+
NEXT_PATH = '/fhir/Questionnaire/$next-question'
|
7
|
+
QUESTIONNAIRE_RESPONSE_PATH = '/fhir/QuestionnaireResponse'
|
8
|
+
RESUME_PASS_PATH = '/resume_pass'
|
9
|
+
RESUME_FAIL_PATH = '/resume_fail'
|
10
|
+
FHIR_RESOURCE_PATH = '/fhir/:resource/:id'
|
11
|
+
FHIR_SEARCH_PATH = '/fhir/:resource'
|
12
|
+
|
13
|
+
module URLs
|
14
|
+
def base_url
|
15
|
+
@base_url ||= "#{Inferno::Application['base_url']}/custom/#{suite_id}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def token_url
|
19
|
+
@token_url ||= base_url + TOKEN_PATH
|
20
|
+
end
|
21
|
+
|
22
|
+
def questionnaire_package_url
|
23
|
+
@questionnaire_package_url ||= base_url + QUESTIONNAIRE_PACKAGE_PATH
|
24
|
+
end
|
25
|
+
|
26
|
+
def next_url
|
27
|
+
@next_url ||= base_url + NEXT_PATH
|
28
|
+
end
|
29
|
+
|
30
|
+
def questionnaire_response_url
|
31
|
+
@questionnaire_response_url ||= base_url + QUESTIONNAIRE_RESPONSE_PATH
|
32
|
+
end
|
33
|
+
|
34
|
+
def fhir_base_url
|
35
|
+
@fhir_base_url ||= "#{base_url}/fhir"
|
36
|
+
end
|
37
|
+
|
38
|
+
def resume_pass_url
|
39
|
+
@resume_pass_url ||= base_url + RESUME_PASS_PATH
|
40
|
+
end
|
41
|
+
|
42
|
+
def resume_fail_url
|
43
|
+
@resume_fail_url ||= base_url + RESUME_FAIL_PATH
|
44
|
+
end
|
45
|
+
|
46
|
+
def suite_id
|
47
|
+
self.class.suite.id
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module DaVinciDTRTestKit
|
2
|
+
module ValidationTest
|
3
|
+
def tests_failed
|
4
|
+
@tests_failed ||= {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def validate_resource(fhir_resource, resource_type, profile_url, index)
|
8
|
+
assert fhir_resource.present?, 'Resource does not contain a recognized FHIR object'
|
9
|
+
begin
|
10
|
+
assert_resource_type(resource_type, resource: fhir_resource)
|
11
|
+
assert_valid_resource(resource: fhir_resource,
|
12
|
+
profile_url:)
|
13
|
+
rescue StandardError => e
|
14
|
+
messages.each do |message|
|
15
|
+
message[:message].prepend("[Resource #{index + 1}] ")
|
16
|
+
end
|
17
|
+
if tests_failed[profile_url].blank?
|
18
|
+
tests_failed[profile_url] = [e]
|
19
|
+
else
|
20
|
+
tests_failed[profile_url] << e
|
21
|
+
end
|
22
|
+
return false
|
23
|
+
end
|
24
|
+
true
|
25
|
+
end
|
26
|
+
|
27
|
+
def perform_request_validation_test(
|
28
|
+
resources,
|
29
|
+
resource_type,
|
30
|
+
profile_url,
|
31
|
+
resource_url,
|
32
|
+
using_manual_entry
|
33
|
+
)
|
34
|
+
omit_if resources.blank?,
|
35
|
+
"No #{resource_type} resources provided so the #{profile_url} profile does not apply"
|
36
|
+
resources = JSON.parse(resources) if using_manual_entry
|
37
|
+
resources = [resources] unless resources.is_a?(Array)
|
38
|
+
resources.each_with_index do |resource, index|
|
39
|
+
if using_manual_entry
|
40
|
+
assert_valid_json(resource.to_json)
|
41
|
+
fhir_resource = FHIR.from_contents(resource.to_json)
|
42
|
+
else
|
43
|
+
assert resource.url == resource_url,
|
44
|
+
"Request made to wrong URL: #{resource.request[:url]}. Should instead be to #{resource_url}"
|
45
|
+
assert_valid_json(resource.request[:body])
|
46
|
+
fhir_resource = FHIR.from_contents(resource.request[:body])
|
47
|
+
end
|
48
|
+
validate_resource(fhir_resource, resource_type, profile_url, index)
|
49
|
+
end
|
50
|
+
return if tests_failed[profile_url].blank?
|
51
|
+
|
52
|
+
raise tests_failed[profile_url][0]
|
53
|
+
end
|
54
|
+
|
55
|
+
def perform_response_validation_test(
|
56
|
+
resources,
|
57
|
+
resource_type,
|
58
|
+
profile_url
|
59
|
+
)
|
60
|
+
omit_if resources.blank?,
|
61
|
+
"No #{resource_type} resources provided so the #{profile_url} profile does not apply"
|
62
|
+
resources.each_with_index do |resource, index|
|
63
|
+
fhir_resource = FHIR.from_contents(resource.response[:body])
|
64
|
+
assert_response_status([200, 202], request: resource, response: resource.response)
|
65
|
+
validate_resource(fhir_resource, resource_type, profile_url, index)
|
66
|
+
end
|
67
|
+
return if tests_failed[profile_url].blank?
|
68
|
+
|
69
|
+
raise tests_failed[profile_url][0]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|