davinci_dtr_test_kit 0.11.1 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/davinci_dtr_test_kit/auth_groups/token_request_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_dinner_questionnaire_package_request_test.rb +52 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_launch_attestation_test.rb +28 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_prepopulation_attestation_test.rb +30 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_prepopulation_override_attestation_test.rb +27 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_prepopulation_representation_attestation_test.rb +33 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_questionnaire_workflow_group.rb +81 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_rendering_enabled_questions_attestation_test.rb +30 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_store_attestation_test.rb +29 -0
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/{dtr_dinner_questionnaire_package_request_test.rb → dtr_smart_app_dinner_questionnaire_package_request_test.rb} +4 -4
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/{prepopulation_attestation_test.rb → dtr_smart_app_prepopulation_attestation_test.rb} +2 -2
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/{prepopulation_override_attestation_test.rb → dtr_smart_app_prepopulation_override_attestation_test.rb} +2 -2
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/{dtr_questionnaire_response_save_test.rb → dtr_smart_app_questionnaire_response_save_test.rb} +2 -2
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_smart_app_questionnaire_workflow_group.rb +13 -13
- data/lib/davinci_dtr_test_kit/client_groups/dinner_static/{rendering_enabled_questions_attestation_test.rb → dtr_smart_app_rendering_enabled_questions_attestation_test.rb} +2 -2
- data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_package_request_validation_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_response_basic_conformance_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/docs/dtr_full_ehr_suite_description_v201.md +127 -0
- data/lib/davinci_dtr_test_kit/dtr_full_ehr_suite.rb +4 -12
- data/lib/davinci_dtr_test_kit/dtr_questionnaire_response_validation.rb +2 -2
- data/lib/davinci_dtr_test_kit/fixture_loader.rb +1 -1
- data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_next_questionnaire_expressions_test.rb +1 -1
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_request_validation_test.rb +10 -19
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_bundles_validation_test.rb +6 -6
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_search_validation_test.rb +6 -6
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_validation_test.rb +16 -18
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_request_validation_test.rb +6 -7
- data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_response_validation_test.rb +3 -1
- data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_request_validation_test.rb +9 -21
- data/lib/davinci_dtr_test_kit/payer_server_groups/static_form_response_validation_test.rb +6 -14
- data/lib/davinci_dtr_test_kit/validation_test.rb +7 -9
- data/lib/davinci_dtr_test_kit/version.rb +1 -1
- data/lib/davinci_dtr_test_kit.rb +1 -1
- metadata +18 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5120a6592cc4d31933d917e3214c89c8d505cdf6f8c3d5065d000588988052a8
|
4
|
+
data.tar.gz: c850d248ab0ae414fe399d03749d781e9f8c186525d67ba76c0d9cbad509aa17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 852190bb650b3f15d3fe25e79a08ba78778aeb85f836f32f6ed5e925859f14196cfb9d5719246a625c85803db6a606526ee2e735669bed0d574adaac3b23b8d9
|
7
|
+
data.tar.gz: 30e796f34e0b3e6b9088a2883af8bda32f8ac26d945c66cc6d4070b925c0eb40b362b9f76036d62b07aef6cc89d41e8c133efbb95d1bfb01233aa0289bd5889b
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require_relative '../../urls'
|
3
|
+
|
4
|
+
module DaVinciDTRTestKit
|
5
|
+
class DTRFullEHRDinnerQuestionnairePackageRequestTest < Inferno::Test
|
6
|
+
include URLs
|
7
|
+
|
8
|
+
id :dtr_full_ehr_dinner_questionnaire_package_request
|
9
|
+
title 'Invoke the DTR Questionnaire Package operation'
|
10
|
+
description %(
|
11
|
+
Inferno will wait for a DTR questionnaire package request from the client. Upon receipt, Inferno will generate and
|
12
|
+
send a response.
|
13
|
+
)
|
14
|
+
|
15
|
+
input :access_token,
|
16
|
+
description: %(
|
17
|
+
`Bearer` token that the client under test will send in the
|
18
|
+
`Authorization` header of each HTTP request to Inferno. Inferno
|
19
|
+
will look for this value to associate requests with this session.
|
20
|
+
)
|
21
|
+
|
22
|
+
run do
|
23
|
+
wait(
|
24
|
+
identifier: access_token,
|
25
|
+
message: %(
|
26
|
+
### Questionnaire Package
|
27
|
+
|
28
|
+
Inferno will wait for the Full EHR to invoke the DTR Questionnaire Package operation by sending a POST
|
29
|
+
request to
|
30
|
+
|
31
|
+
`#{questionnaire_package_url}`
|
32
|
+
|
33
|
+
A questionnaire package generated by Inferno will be returned.
|
34
|
+
|
35
|
+
### Request Identification
|
36
|
+
|
37
|
+
In order to identify requests for this session, Inferno will look for
|
38
|
+
an `Authorization` header with value:
|
39
|
+
|
40
|
+
```
|
41
|
+
Bearer #{access_token}
|
42
|
+
```
|
43
|
+
|
44
|
+
### Continuing the Tests
|
45
|
+
|
46
|
+
When the DTR application has finished loading the Questionnaire
|
47
|
+
[Click here](#{resume_pass_url}?token=#{access_token}) to continue.
|
48
|
+
)
|
49
|
+
)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_launch_attestation_test.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative '../../urls'
|
2
|
+
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class DTRFullEHRStaticDinnerLaunchAttestationTest < Inferno::Test
|
5
|
+
include URLs
|
6
|
+
|
7
|
+
id :dtr_full_ehr_dinner_static_launch_attestation
|
8
|
+
title 'Launch DTR for a patient that has an official name (Attestation)'
|
9
|
+
description %(
|
10
|
+
Attest that DTR has been launched for a patient with data that will be used for prepopulation.
|
11
|
+
)
|
12
|
+
input :access_token
|
13
|
+
|
14
|
+
run do
|
15
|
+
wait(
|
16
|
+
identifier: access_token,
|
17
|
+
message: %(
|
18
|
+
I attest that DTR has been launched in the context of a patient with an official name, including
|
19
|
+
first and last.
|
20
|
+
|
21
|
+
[Click here](#{resume_pass_url}?token=#{access_token}) if the above statement is **true**.
|
22
|
+
|
23
|
+
[Click here](#{resume_fail_url}?token=#{access_token}) if the above statement is **false**.
|
24
|
+
)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative '../../urls'
|
2
|
+
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class DTRFullEHRStaticDinnerPrepopulationAttestationTest < Inferno::Test
|
5
|
+
include URLs
|
6
|
+
|
7
|
+
id :dtr_full_ehr_dinner_static_rendering_prepopulation_attestation
|
8
|
+
title 'Check that the client pre-populates the questionnaire (Attestation)'
|
9
|
+
description %(
|
10
|
+
Validate that pre-population of patient name information occurs as expected.
|
11
|
+
)
|
12
|
+
input :access_token
|
13
|
+
|
14
|
+
run do
|
15
|
+
wait(
|
16
|
+
identifier: access_token,
|
17
|
+
message: %(
|
18
|
+
I attest that the DTR application pre-populates the following questions with the respective
|
19
|
+
value for the official name of the patient:
|
20
|
+
- Last Name
|
21
|
+
- First Name
|
22
|
+
|
23
|
+
[Click here](#{resume_pass_url}?token=#{access_token}) if the above statement is **true**.
|
24
|
+
|
25
|
+
[Click here](#{resume_fail_url}?token=#{access_token}) if the above statement is **false**.
|
26
|
+
)
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative '../../urls'
|
2
|
+
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class DTRFullEHRStaticDinnerPrepopulationOverrideAttestationTest < Inferno::Test
|
5
|
+
include URLs
|
6
|
+
|
7
|
+
id :dtr_full_ehr_dinner_static_prepopulation_override_attestation
|
8
|
+
title 'Validate the user can override pre-populated data (Attestation)'
|
9
|
+
description %(
|
10
|
+
Validate that the user can edit a pre-populated item and replace it with another value.
|
11
|
+
)
|
12
|
+
input :access_token
|
13
|
+
|
14
|
+
run do
|
15
|
+
wait(
|
16
|
+
identifier: access_token,
|
17
|
+
message: %(
|
18
|
+
I attest that I have changed the prepopulated value in the First Name field to a new value.
|
19
|
+
|
20
|
+
[Click here](#{resume_pass_url}?token=#{access_token}) if the above statement is **true**.
|
21
|
+
|
22
|
+
[Click here](#{resume_fail_url}?token=#{access_token}) if the above statement is **false**.
|
23
|
+
)
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative '../../urls'
|
2
|
+
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class DTRFullEHRStaticDinnerPrepopulationRepresentationAttestationTest < Inferno::Test
|
5
|
+
include URLs
|
6
|
+
|
7
|
+
id :dtr_full_ehr_dinner_static_prepopulation_representation_attestation
|
8
|
+
title 'Verify the QuestionnaireResponse representation of the item data sources (Attestation)'
|
9
|
+
description %(
|
10
|
+
Attest that the QuestionnaireResponse representation of the stored answers includes the required
|
11
|
+
source indicators, including `auto`, `override`, and `manual`.
|
12
|
+
)
|
13
|
+
input :access_token
|
14
|
+
|
15
|
+
run do
|
16
|
+
wait(
|
17
|
+
identifier: access_token,
|
18
|
+
message: %(
|
19
|
+
I attest that the QuestionnaireResponse representation of the stored answers includes the
|
20
|
+
[orgin extension with source details](https://build.fhir.org/ig/HL7/davinci-dtr/StructureDefinition-information-origin.html),
|
21
|
+
including on the following fields entered during the tests:
|
22
|
+
- PBD.1 (Last Name): `auto`
|
23
|
+
- PBD.2 (First Name): `override`
|
24
|
+
- 3.1 (dinner choice): `manual`
|
25
|
+
|
26
|
+
[Click here](#{resume_pass_url}?token=#{access_token}) if the above statement is **true**.
|
27
|
+
|
28
|
+
[Click here](#{resume_fail_url}?token=#{access_token}) if the above statement is **false**.
|
29
|
+
)
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require_relative 'dtr_full_ehr_launch_attestation_test'
|
2
|
+
require_relative 'dtr_full_ehr_dinner_questionnaire_package_request_test'
|
3
|
+
require_relative '../shared/dtr_questionnaire_package_request_validation_test'
|
4
|
+
require_relative 'dtr_full_ehr_prepopulation_attestation_test'
|
5
|
+
require_relative 'dtr_full_ehr_prepopulation_override_attestation_test'
|
6
|
+
require_relative 'dtr_full_ehr_rendering_enabled_questions_attestation_test'
|
7
|
+
require_relative 'dtr_full_ehr_store_attestation_test'
|
8
|
+
require_relative 'dtr_full_ehr_prepopulation_representation_attestation_test'
|
9
|
+
|
10
|
+
module DaVinciDTRTestKit
|
11
|
+
class DTRFullEHRStaticDinnerQuestionnaireWorkflowGroup < Inferno::TestGroup
|
12
|
+
id :dtr_full_ehr_static_dinner_questionnaire_workflow
|
13
|
+
title 'Static Questionnaire Workflow'
|
14
|
+
description %(
|
15
|
+
This test validates that a DTR Full EHR client can perform a full DTR Static Questionnaire workflow
|
16
|
+
using a mocked questionnaire requesting what a patient wants for dinner. The client system must
|
17
|
+
demonstrate its ability to:
|
18
|
+
|
19
|
+
1. Fetch the static questionnaire package
|
20
|
+
([DinnerOrderStatic](https://github.com/inferno-framework/davinci-dtr-test-kit/blob/main/lib/davinci_dtr_test_kit/fixtures/dinner_static/questionnaire_dinner_order_static.json))
|
21
|
+
2. Render and pre-populate the questionnaire appropriately, including:
|
22
|
+
- pre-populate data as directed by the questionnaire
|
23
|
+
- display questions only when they are enabled by other answers
|
24
|
+
3. Complete and store the questionnaire response for future use.
|
25
|
+
)
|
26
|
+
|
27
|
+
group do
|
28
|
+
id :dtr_full_ehr_static_questionnaire_retrieval
|
29
|
+
title 'Retrieving the Static Questionnaire'
|
30
|
+
description %(
|
31
|
+
After DTR launch, Inferno will wait for the client system to request a questionnaire using the
|
32
|
+
$questionnaire-package operation and will return a static questionnaire for the
|
33
|
+
tester to complete. Inferno will then validate the the conformance of the request.
|
34
|
+
)
|
35
|
+
run_as_group
|
36
|
+
|
37
|
+
# Test 0: attest to launch
|
38
|
+
test from: :dtr_full_ehr_dinner_static_launch_attestation
|
39
|
+
# Test 1: wait for the $questionnaire-package request
|
40
|
+
test from: :dtr_full_ehr_dinner_questionnaire_package_request
|
41
|
+
# Test 2: validate the $questionnaire-package body
|
42
|
+
test from: :dtr_questionnaire_package_request_validation
|
43
|
+
end
|
44
|
+
|
45
|
+
group do
|
46
|
+
id :dtr_full_ehr_static_questionnaire_rendering
|
47
|
+
title 'Filling Out the Static Questionnaire'
|
48
|
+
description %(
|
49
|
+
The tester will interact with the questionnaire within their client system
|
50
|
+
such that pre-population steps are taken, the qustionnaire is rendered, and
|
51
|
+
they are able to fill it out. The tester will attest that questionnaire pre-population
|
52
|
+
and rendering directives were followed.
|
53
|
+
)
|
54
|
+
run_as_group
|
55
|
+
|
56
|
+
# Test 1: attest to the pre-population of the name fields
|
57
|
+
test from: :dtr_full_ehr_dinner_static_rendering_prepopulation_attestation
|
58
|
+
# Test 2: attest to the pre-population and edit of the first name field
|
59
|
+
test from: :dtr_full_ehr_dinner_static_prepopulation_override_attestation
|
60
|
+
# Test 3: attest to the display of the toppings questions only when a dinner answer is selected
|
61
|
+
test from: :dtr_full_ehr_dinner_static_rendering_enabledQs_attestation
|
62
|
+
end
|
63
|
+
|
64
|
+
group do
|
65
|
+
id :dtr_full_ehr_static_questionnaire_response
|
66
|
+
title 'Saving the QuestionnaireResponse'
|
67
|
+
description %(
|
68
|
+
The tester will attest to the completion of the questionnaire such that
|
69
|
+
the results are stored for later use.
|
70
|
+
)
|
71
|
+
run_as_group
|
72
|
+
|
73
|
+
# Test 1: attest QuestionnaireResponse saved
|
74
|
+
test from: :dtr_full_ehr_dinner_static_store_attestation
|
75
|
+
# Test 2: validate basic conformance of the QuestionnaireResponse
|
76
|
+
# - not using currently
|
77
|
+
# Test 3: validate workflow-specific details such as pre-population and overrides
|
78
|
+
test from: :dtr_full_ehr_dinner_static_prepopulation_representation_attestation
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative '../../urls'
|
2
|
+
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class DTRFullEHRStaticDinnerRenderingAttestationTest < Inferno::Test
|
5
|
+
include URLs
|
6
|
+
|
7
|
+
id :dtr_full_ehr_dinner_static_rendering_enabledQs_attestation
|
8
|
+
title 'Check that the client renders enabled questions appropriately (Attestation)'
|
9
|
+
description %(
|
10
|
+
Validate that the rendering of the questionnaire includes only the "What would you like on..."
|
11
|
+
question appropriate for the dinner selection, if made.
|
12
|
+
)
|
13
|
+
input :access_token
|
14
|
+
|
15
|
+
run do
|
16
|
+
wait(
|
17
|
+
identifier: access_token,
|
18
|
+
message: %(
|
19
|
+
I attest that the client application does not display any "What would you like on..."
|
20
|
+
questions until I have selected a dinner choice and then only displays the
|
21
|
+
"What would you like on..." question relevant for the dinner request:
|
22
|
+
|
23
|
+
[Click here](#{resume_pass_url}?token=#{access_token}) if the above statement is **true**.
|
24
|
+
|
25
|
+
[Click here](#{resume_fail_url}?token=#{access_token}) if the above statement is **false**.
|
26
|
+
)
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_store_attestation_test.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative '../../urls'
|
2
|
+
|
3
|
+
module DaVinciDTRTestKit
|
4
|
+
class DTRFullEHRStaticDinnerStoreAttestationTest < Inferno::Test
|
5
|
+
include URLs
|
6
|
+
|
7
|
+
id :dtr_full_ehr_dinner_static_store_attestation
|
8
|
+
title 'Complete and Store the QuestionnaireResponse (Attestation)'
|
9
|
+
description %(
|
10
|
+
Attest that the questionnaire has been completed and the response has been persisted
|
11
|
+
and can be exported as a FHIR QuestionnaireResponse instance.
|
12
|
+
)
|
13
|
+
input :access_token
|
14
|
+
|
15
|
+
run do
|
16
|
+
wait(
|
17
|
+
identifier: access_token,
|
18
|
+
message: %(
|
19
|
+
I attest that the questionnaire has been completed and stored within the EHR for future
|
20
|
+
use and export as a FHIR QuestionnaireResponse instance.
|
21
|
+
|
22
|
+
[Click here](#{resume_pass_url}?token=#{access_token}) if the above statement is **true**.
|
23
|
+
|
24
|
+
[Click here](#{resume_fail_url}?token=#{access_token}) if the above statement is **false**.
|
25
|
+
)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -2,10 +2,10 @@ require 'base64'
|
|
2
2
|
require_relative '../../urls'
|
3
3
|
|
4
4
|
module DaVinciDTRTestKit
|
5
|
-
class
|
5
|
+
class DTRSmartAppDinnerQuestionnairePackageRequestTest < Inferno::Test
|
6
6
|
include URLs
|
7
7
|
|
8
|
-
id :
|
8
|
+
id :dtr_smart_app_dinner_questionnaire_package_request
|
9
9
|
title 'Invoke the DTR Questionnaire Package operation'
|
10
10
|
description %(
|
11
11
|
Inferno will wait for a DTR questionnaire package request from the client. Upon receipt, Inferno will generate and
|
@@ -49,7 +49,7 @@ module DaVinciDTRTestKit
|
|
49
49
|
Resources available from the EHR needed to drive the dinner static workflow.
|
50
50
|
Formatted as a FHIR bundle that contains resources, each with an `id` property populated. Each
|
51
51
|
instance present will be available for retrieval from Inferno at the endpoint:
|
52
|
-
|
52
|
+
|
53
53
|
```
|
54
54
|
[fhir-base]/[resource type]/[instance id]
|
55
55
|
```
|
@@ -119,7 +119,7 @@ module DaVinciDTRTestKit
|
|
119
119
|
an `Authorization` header with value:
|
120
120
|
|
121
121
|
```
|
122
|
-
Bearer
|
122
|
+
Bearer eyJhbGciOiJub25lIn0.#{example_client_jwt_payload_part}.
|
123
123
|
```
|
124
124
|
|
125
125
|
### Continuing the Tests
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require_relative '../../urls'
|
2
2
|
|
3
3
|
module DaVinciDTRTestKit
|
4
|
-
class
|
4
|
+
class DTRSmartAppStaticDinnerPrepopulationAttestationTest < Inferno::Test
|
5
5
|
include URLs
|
6
6
|
|
7
|
-
id :
|
7
|
+
id :dtr_smart_app_dinner_static_rendering_prepopulation_attestation
|
8
8
|
title 'Check that the client pre-populates the questionnaire (Attestation)'
|
9
9
|
description %(
|
10
10
|
Validate that pre-population of patient name information occurs as expected.
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require_relative '../../urls'
|
2
2
|
|
3
3
|
module DaVinciDTRTestKit
|
4
|
-
class
|
4
|
+
class DTRSmartAppStaticDinnerPrepopulationOverrideAttestationTest < Inferno::Test
|
5
5
|
include URLs
|
6
6
|
|
7
|
-
id :
|
7
|
+
id :dtr_smart_app_dinner_static_prepopulation_override_attestation
|
8
8
|
title 'Validate the user can override pre-populated data (Attestation)'
|
9
9
|
description %(
|
10
10
|
Validate that the user can edit a pre-populated item and replace it with another value.
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require_relative '../../urls'
|
2
2
|
|
3
3
|
module DaVinciDTRTestKit
|
4
|
-
class
|
4
|
+
class DTRSmartAppStaticDinnerQuestionnaireResponseSaveTest < Inferno::Test
|
5
5
|
include URLs
|
6
6
|
|
7
|
-
id :
|
7
|
+
id :dtr_smart_app_static_dinner_questionnaire_response_save
|
8
8
|
title 'Save the QuestionnaireResponse after completing it'
|
9
9
|
description %(
|
10
10
|
Inferno, acting as the EHR, will wait for a request to save the QuestionnaireResponse from the client.
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'dtr_smart_app_dinner_questionnaire_package_request_test'
|
2
2
|
require_relative '../shared/dtr_questionnaire_package_request_validation_test'
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
3
|
+
require_relative 'dtr_smart_app_prepopulation_attestation_test'
|
4
|
+
require_relative 'dtr_smart_app_prepopulation_override_attestation_test'
|
5
|
+
require_relative 'dtr_smart_app_rendering_enabled_questions_attestation_test'
|
6
|
+
require_relative 'dtr_smart_app_questionnaire_response_save_test'
|
7
7
|
require_relative '../shared/dtr_questionnaire_response_basic_conformance_test'
|
8
8
|
require_relative '../shared/dtr_questionnaire_response_pre_population_test'
|
9
9
|
|
@@ -27,7 +27,7 @@ module DaVinciDTRTestKit
|
|
27
27
|
)
|
28
28
|
|
29
29
|
group do
|
30
|
-
id :
|
30
|
+
id :dtr_smart_app_static_questionnaire_retrieval
|
31
31
|
title 'Retrieving the Static Questionnaire'
|
32
32
|
description %(
|
33
33
|
Inferno will wait for the client system to request a questionnaire using the
|
@@ -37,13 +37,13 @@ module DaVinciDTRTestKit
|
|
37
37
|
run_as_group
|
38
38
|
|
39
39
|
# Test 1: wait for the $questionnaire-package request
|
40
|
-
test from: :
|
40
|
+
test from: :dtr_smart_app_dinner_questionnaire_package_request
|
41
41
|
# Test 2: validate the $questionnaire-package body
|
42
42
|
test from: :dtr_questionnaire_package_request_validation
|
43
43
|
end
|
44
44
|
|
45
45
|
group do
|
46
|
-
id :
|
46
|
+
id :dtr_smart_app_static_questionnaire_rendering
|
47
47
|
title 'Filling Out the Static Questionnaire'
|
48
48
|
description %(
|
49
49
|
The tester will interact with the questionnaire within their client system
|
@@ -58,15 +58,15 @@ module DaVinciDTRTestKit
|
|
58
58
|
# since the questionnaire asks them to
|
59
59
|
# TODO: once Tom has gotten the reference server hooked up
|
60
60
|
# Test 2: attest to the pre-population of the name fields
|
61
|
-
test from: :
|
61
|
+
test from: :dtr_smart_app_dinner_static_rendering_prepopulation_attestation
|
62
62
|
# Test 3: attest to the pre-population and edit of the location field
|
63
|
-
test from: :
|
63
|
+
test from: :dtr_smart_app_dinner_static_prepopulation_override_attestation
|
64
64
|
# Test 4: attest to the display of the toppings questions only when a dinner answer is selected
|
65
|
-
test from: :
|
65
|
+
test from: :dtr_smart_app_dinner_static_rendering_enabledQs_attestation
|
66
66
|
end
|
67
67
|
|
68
68
|
group do
|
69
|
-
id :
|
69
|
+
id :dtr_smart_app_static_questionnaire_response
|
70
70
|
title 'Saving the QuestionnaireResponse'
|
71
71
|
description %(
|
72
72
|
The tester will complete the questionnaire such that a QuestionnaireResponse is stored
|
@@ -77,7 +77,7 @@ module DaVinciDTRTestKit
|
|
77
77
|
run_as_group
|
78
78
|
|
79
79
|
# Test 1: wait for a QuestionnaireResponse
|
80
|
-
test from: :
|
80
|
+
test from: :dtr_smart_app_static_dinner_questionnaire_response_save,
|
81
81
|
receives_request: :questionnaire_response_save
|
82
82
|
# Test 2: validate basic conformance of the QuestionnaireResponse
|
83
83
|
test from: :dtr_questionnaire_response_basic_conformance,
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require_relative '../../urls'
|
2
2
|
|
3
3
|
module DaVinciDTRTestKit
|
4
|
-
class
|
4
|
+
class DTRSmartAppStaticDinnerRenderingAttestationTest < Inferno::Test
|
5
5
|
include URLs
|
6
6
|
|
7
|
-
id :
|
7
|
+
id :dtr_smart_app_dinner_static_rendering_enabledQs_attestation
|
8
8
|
title 'Check that the client renders enabled questions appropriately (Attestation)'
|
9
9
|
description %(
|
10
10
|
Validate that the rendering of the questionnaire includes only the "What would you like on..."
|
@@ -29,7 +29,7 @@ module DaVinciDTRTestKit
|
|
29
29
|
assert input_params.present?, 'Request does not contain a recognized FHIR object'
|
30
30
|
assert_resource_type(:parameters, resource: input_params)
|
31
31
|
assert_valid_resource(resource: input_params,
|
32
|
-
profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters')
|
32
|
+
profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters|2.0.1')
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -22,7 +22,7 @@ module DaVinciDTRTestKit
|
|
22
22
|
assert_resource_type(:questionnaire_response, resource: questionnaire_response)
|
23
23
|
|
24
24
|
assert_valid_resource(resource: questionnaire_response,
|
25
|
-
profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-questionnaireresponse')
|
25
|
+
profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-questionnaireresponse|2.0.1')
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
The Da Vinci DTR Test Kit Full EHR Suite validates the conformance of SMART apps
|
2
|
+
to the STU 2 version of the HL7® FHIR®
|
3
|
+
[Da Vinci Documentation Templates and Rules (DTR) Implementation Guide](https://hl7.org/fhir/us/davinci-dtr/STU2/).
|
4
|
+
|
5
|
+
## Scope
|
6
|
+
|
7
|
+
These tests are a **DRAFT** intended to allow app implementers to perform
|
8
|
+
preliminary checks of their systems against DTR IG requirements and [provide
|
9
|
+
feedback](https://github.com/inferno-framework/davinci-dtr-test-kit/issues)
|
10
|
+
on the tests. Future versions of these tests may validate other
|
11
|
+
requirements and may change the test validation logic.
|
12
|
+
|
13
|
+
## Test Methodology
|
14
|
+
|
15
|
+
Inferno will simulate a DTR payer server that will response to
|
16
|
+
requests for questionnaires for the EHR under test to interact with.
|
17
|
+
The EHR will be expected to initiate requests to Inferno to elicit responses. Over the
|
18
|
+
course of these interactions, Inferno will seek to observe conformant handling of
|
19
|
+
DTR workflows and requirements around the retrieval, completion, and storage of
|
20
|
+
questionnaires.
|
21
|
+
|
22
|
+
Tests within this suite are associated with specific questionnaires that the EHR will
|
23
|
+
demonstrate completion of. In each case, the EHR under test will initiate a request to
|
24
|
+
the payer server simulated by Inferno for a questionnaire using the
|
25
|
+
`$questionnaire-package` operation. Inferno will always return the specific questionnaire
|
26
|
+
for the test being executed regardless of the input provided by the EHR, though it must
|
27
|
+
be conformant. The EHR will then be asked to complete the questionnaire, including
|
28
|
+
- Pre-populating answers based on directives in the questionnaire
|
29
|
+
- Rendering the questionnaire for users and allowing them to make additional updates.
|
30
|
+
These tests can include specific directions on details to include in the completed
|
31
|
+
questionnaire.
|
32
|
+
- Storing the completed questionnaire for future use as a FHIR QuestionnaireResponse.
|
33
|
+
|
34
|
+
EHRs will be required to complete all questionnaires in the suite, which in aggregate
|
35
|
+
contain all questionnaire features that apps must support. Currently, the suite includes
|
36
|
+
one questionnaire:
|
37
|
+
1. A fictious "dinner" questionnaire created for these tests. It tests basic
|
38
|
+
item rendering and pre-population.
|
39
|
+
Additional questionnaires will be added in the future.
|
40
|
+
|
41
|
+
All requests sent by the app will be checked
|
42
|
+
for conformance to the DTR IG requirements individually and used in aggregate to determine
|
43
|
+
whether required features and functionality are present. HL7® FHIR® resources are
|
44
|
+
validated with the Java validator using `tx.fhir.org` as the terminology server.
|
45
|
+
|
46
|
+
## Running the Tests
|
47
|
+
|
48
|
+
### Quick Start
|
49
|
+
|
50
|
+
In order to run these tests, EHRs must be configured to interact with Inferno's simulated
|
51
|
+
payer server endpoint. The endpoint will be `[URL prefix]/custom/dtr_full_ehr/fhir` where
|
52
|
+
`[URL prefix]` can be inferred from the URL of the test session which will be of the form
|
53
|
+
`[URL prefix]/dtr_full_ehr/[session id]`.
|
54
|
+
|
55
|
+
In order for Inferno to associate requests sent to locations under these base URLs with this session,
|
56
|
+
it needs to know the bearer token that the EHR will send on requests, for which
|
57
|
+
there are two options.
|
58
|
+
|
59
|
+
1. If you want to choose your own bearer token, then
|
60
|
+
1. Select the "2. Basic Workflows" test from the list on the left (or other target test).
|
61
|
+
2. Click the '*Run All Tests*' button on the right.
|
62
|
+
3. In the "access_token" field, enter the bearer token that will be sent by the client
|
63
|
+
under test (as part of the Authorization header - `Bearer <provided value>`).
|
64
|
+
4. Click the '*Submit*' button at the bottom of the dialog.
|
65
|
+
2. If you want to use a client_id to obtain an access token, then
|
66
|
+
1. Click the '*Run All Tests*' button on the right.
|
67
|
+
2. Provide the EHR's registered id "client_id" field of the input (NOTE, Inferno
|
68
|
+
doesn't support the registration API, so this must be obtained from another
|
69
|
+
system or configured manually).
|
70
|
+
3. Click the '*Submit*' button at the bottom of the dialog.
|
71
|
+
4. Make a token request that includes the specified client id to the
|
72
|
+
`[URL prefix]/custom/dtr_full_ehr/mock_auth/token` endpoint to get
|
73
|
+
an access token to use on the request of the requests.
|
74
|
+
|
75
|
+
In either case, the tests will continue from that point. Further executions of tests under
|
76
|
+
this session will also use the selected bearer token.
|
77
|
+
|
78
|
+
Note: authentication options for these tests have not been finalized and are subject to change.
|
79
|
+
|
80
|
+
### Postman-based Demo
|
81
|
+
|
82
|
+
If you do not have a DTR Full EHR but would like to try the tests out, you can use
|
83
|
+
[this Postman collection](https://github.com/inferno-framework/davinci-dtr-test-kit/blob/main/config/DTR%20Full%20EHR%20Tests%20Postman%20Demo.postman_collection.json)
|
84
|
+
to make requests against Inferno. This does not include the capability to render and complete the
|
85
|
+
questionnaires, but does have samples of correctly and incorrectly completed QuestionnaireResponses.
|
86
|
+
To run the tests using this approach:
|
87
|
+
|
88
|
+
1. Install [postman](https://www.postman.com/downloads/).
|
89
|
+
1. Import [this Postman collection](https://github.com/inferno-framework/davinci-dtr-test-kit/blob/main/config/DTR%20Full%20EHR%20Tests%20Postman%20Demo.postman_collection.json).
|
90
|
+
1. Start a Da Vinci DTR Full EHR Test Suite Session.
|
91
|
+
1. Update the postman collection configuration variables found by opening the "DTR Full EHR
|
92
|
+
Tests Postman Demo" collection and selecting the "Variables" tab.
|
93
|
+
- **base_url**: corresponds to the where the test suite session is running. Defaults to
|
94
|
+
`inferno.healthit.gov`. If running in another location, see guidance on the "Overview" tab
|
95
|
+
of the postman collection.
|
96
|
+
- **access_token**: note the "Current value" (update if desired) for use later.
|
97
|
+
1. Return to Inferno and in the test list at the left, select *2 Static Questionnaire Workflow*.
|
98
|
+
1. Click the "Run All Tests" button in the upper right.
|
99
|
+
1. Add the **access_token** configured in postman to the Inferno input with the same name
|
100
|
+
1. Click the "Submit" button in Inferno.
|
101
|
+
1. Attest that the EHR has launched its DTR workflow in Inferno by clicking the link for the **true** response.
|
102
|
+
1. Once the next wait dialog has appeared within Inferno asking for a `$questionnaire-package`
|
103
|
+
request, use postman to submit the "Questionnaire Package for Dinner (Static)" request. Confirm
|
104
|
+
that the response that looks similar to the "Example Working Response" in postman
|
105
|
+
and click the link to continue the tests.
|
106
|
+
1. Attest to the remainder of the tests as desired to get a sense for what is involved in testing
|
107
|
+
with an actual EHR implementation. To see what a valid QuestionnaireResponse looks like, see
|
108
|
+
the "Sample QuestionnaireResponse for Dinner (Static) ..." request in postman.
|
109
|
+
|
110
|
+
## Limitations
|
111
|
+
|
112
|
+
The DTR IG is a complex specification and these tests currently validate conformance to only
|
113
|
+
a subset of IG requirements. Future versions of the test suite will test further
|
114
|
+
features. A few specific features of interest are listed below.
|
115
|
+
|
116
|
+
### Heavy Reliance on Attestations
|
117
|
+
|
118
|
+
Currently, these test kits do not have access to the QuestionnaireResponse and so validation
|
119
|
+
that the EHR performed CQL calculations and generated a conformant QuestionnaireResponse
|
120
|
+
based on pre-population and manual answers is left to a user attestation rather than a
|
121
|
+
mechanical check. Some level of mechanical checks are expected to be added in the future.
|
122
|
+
|
123
|
+
### Questionnaire Feature Coverage
|
124
|
+
|
125
|
+
Not all questionnaire features that are must support within the DTR IG are currently represented
|
126
|
+
in questionnaires tested by the IG. Adaptive questionnaires are a notable omission.
|
127
|
+
Additional questionnaires testing additional features will be added in the future.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'ext/inferno_core/runnable'
|
2
2
|
require_relative 'ext/inferno_core/record_response_route'
|
3
3
|
require_relative 'ext/inferno_core/request'
|
4
|
-
require_relative 'client_groups/
|
4
|
+
require_relative 'client_groups/dinner_static/dtr_full_ehr_questionnaire_workflow_group'
|
5
5
|
require_relative 'auth_groups/oauth2_authentication_group'
|
6
6
|
require_relative 'mock_payer'
|
7
7
|
require_relative 'version'
|
@@ -9,19 +9,11 @@ require_relative 'version'
|
|
9
9
|
module DaVinciDTRTestKit
|
10
10
|
class DTRFullEHRSuite < Inferno::TestSuite
|
11
11
|
extend MockPayer
|
12
|
+
extend MockAuthServer
|
12
13
|
|
13
14
|
id :dtr_full_ehr
|
14
15
|
title 'Da Vinci DTR Full EHR Test Suite'
|
15
|
-
description
|
16
|
-
# Da Vinci DTR Full EHR Test Suite
|
17
|
-
|
18
|
-
This suite validates that an EHR or other application can act
|
19
|
-
as a full DTR application requesting questionnaires from a
|
20
|
-
payer server and using local data to complete and store them.
|
21
|
-
Inferno will act as payer server returning questionnaires
|
22
|
-
in response to queries from the system under test and validating
|
23
|
-
that they can be completed as expected.
|
24
|
-
)
|
16
|
+
description File.read(File.join(__dir__, 'docs', 'dtr_full_ehr_suite_description_v201.md'))
|
25
17
|
|
26
18
|
version VERSION
|
27
19
|
|
@@ -74,6 +66,6 @@ module DaVinciDTRTestKit
|
|
74
66
|
end
|
75
67
|
|
76
68
|
group from: :oauth2_authentication
|
77
|
-
group from: :
|
69
|
+
group from: :dtr_full_ehr_static_dinner_questionnaire_workflow
|
78
70
|
end
|
79
71
|
end
|
@@ -88,7 +88,7 @@ module DaVinciDTRTestKit
|
|
88
88
|
end
|
89
89
|
|
90
90
|
origin_extension = find_extension(target_item_answer,
|
91
|
-
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/information-origin')
|
91
|
+
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/information-origin|2.0.1')
|
92
92
|
source_extension = find_extension(origin_extension, 'source')
|
93
93
|
|
94
94
|
unless source_extension.present?
|
@@ -134,7 +134,7 @@ module DaVinciDTRTestKit
|
|
134
134
|
|
135
135
|
# check origin.source extension
|
136
136
|
origin_extension = find_extension(answer,
|
137
|
-
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/information-origin')
|
137
|
+
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/information-origin|2.0.1')
|
138
138
|
source_extension = find_extension(origin_extension, 'source')
|
139
139
|
|
140
140
|
if source_extension.present?
|
@@ -23,7 +23,7 @@ module DaVinciDTRTestKit
|
|
23
23
|
[
|
24
24
|
'fixtures/dinner_static/questionnaire_dinner_order_static.json',
|
25
25
|
'fixtures/dinner_static/questionnaire_response_dinner_order_static.json',
|
26
|
-
['dtr_smart_app_static_dinner_questionnaire_workflow']
|
26
|
+
['dtr_smart_app_static_dinner_questionnaire_workflow', 'dtr_full_ehr_static_dinner_questionnaire_workflow']
|
27
27
|
],
|
28
28
|
[
|
29
29
|
'fixtures/dinner_adaptive/questionnaire_dinner_order_adaptive.json',
|
data/lib/davinci_dtr_test_kit/payer_server_groups/adaptive_next_questionnaire_expressions_test.rb
CHANGED
@@ -6,7 +6,7 @@ module DaVinciDTRTestKit
|
|
6
6
|
id :dtr_v201_payer_adaptive_next_form_expressions_test
|
7
7
|
title 'Questionnaire(s) contains items with expressions necessary for pre-population'
|
8
8
|
description %(
|
9
|
-
Inferno checks that the payer server response has appropriate expressions and that expressions are
|
9
|
+
Inferno checks that the payer server response to $next-question operation has appropriate expressions and that expressions are
|
10
10
|
written in cql.
|
11
11
|
)
|
12
12
|
|
data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_request_validation_test.rb
CHANGED
@@ -3,7 +3,7 @@ module DaVinciDTRTestKit
|
|
3
3
|
class PayerAdaptiveFormRequestTest < Inferno::Test
|
4
4
|
include URLs
|
5
5
|
include DaVinciDTRTestKit::ValidationTest
|
6
|
-
title '
|
6
|
+
title 'User Input Validation: Questionnaire Package request is valid'
|
7
7
|
description %(
|
8
8
|
This test validates the conformance of the client's request to the
|
9
9
|
[DTR Questionnaire Package Input Parameters](http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters)
|
@@ -13,32 +13,23 @@ module DaVinciDTRTestKit
|
|
13
13
|
values. CodeableConcept element bindings will fail if none of their codings have a code/system belonging
|
14
14
|
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system are not found in
|
15
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
16
|
)
|
20
17
|
id :payer_server_adaptive_questionnaire_request_validation
|
21
18
|
|
22
19
|
run do
|
23
20
|
skip_if retrieval_method == 'Static', 'Performing only static flow tests - only one flow is required.'
|
21
|
+
profile_with_version = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters|2.0.1'
|
24
22
|
if initial_adaptive_questionnaire_request.nil?
|
25
|
-
|
26
|
-
|
23
|
+
requests = load_tagged_requests(QUESTIONNAIRE_TAG)
|
24
|
+
skip_if requests.blank?, 'No request resource received from the client.'
|
25
|
+
# making the assumption that only one request was made here - if there were multiple, we are only validating the first
|
26
|
+
resource_is_valid?(resource: FHIR.from_contents(requests[0].request[:body]), profile_url: profile_with_version)
|
27
27
|
else
|
28
|
-
|
29
|
-
|
28
|
+
request = FHIR.from_contents(initial_adaptive_questionnaire_request)
|
29
|
+
resource_is_valid?(resource: request, profile_url: profile_with_version)
|
30
30
|
end
|
31
|
-
|
32
|
-
|
33
|
-
resources,
|
34
|
-
:parameters,
|
35
|
-
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters',
|
36
|
-
questionnaire_package_url,
|
37
|
-
using_manual_entry
|
38
|
-
)
|
39
|
-
rescue Inferno::Exceptions::AssertionException => e
|
40
|
-
msg = e.message.to_s.strip
|
41
|
-
skip msg
|
31
|
+
errors_found = messages.any? { |message| message[:type] == 'error' }
|
32
|
+
skip_if errors_found, "Resource does not conform to the profile #{profile_with_version}"
|
42
33
|
end
|
43
34
|
end
|
44
35
|
end
|
@@ -20,21 +20,21 @@ module DaVinciDTRTestKit
|
|
20
20
|
|
21
21
|
run do
|
22
22
|
skip_if retrieval_method == 'Static', 'Performing only static flow tests - only one flow is required.'
|
23
|
-
test_passed =
|
24
|
-
profile_url = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle'
|
23
|
+
test_passed = true
|
24
|
+
profile_url = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle|2.0.1'
|
25
25
|
assert !scratch[:adaptive_responses].nil?, 'No resources to validate.'
|
26
26
|
scratch[:adaptive_responses].each_with_index do |resource, index|
|
27
27
|
fhir_resource = FHIR.from_contents(resource.response[:body])
|
28
28
|
fhir_resource.parameter.each do |param|
|
29
29
|
resource_is_valid = validate_resource(param.resource, :bundle, profile_url, index)
|
30
|
-
test_passed =
|
30
|
+
test_passed = false unless resource_is_valid
|
31
31
|
rescue StandardError
|
32
32
|
next
|
33
33
|
end
|
34
34
|
end
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
if !test_passed && !tests_failed[profile_url].blank?
|
36
|
+
assert test_passed, "Not all returned resources conform to the profile: #{profile_url}"
|
37
|
+
end
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -20,23 +20,23 @@ module DaVinciDTRTestKit
|
|
20
20
|
|
21
21
|
run do
|
22
22
|
skip_if retrieval_method == 'Static', 'Performing only static flow tests - only one flow is required.'
|
23
|
-
test_passed =
|
24
|
-
profile_url = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-questionnaire-adapt-search'
|
23
|
+
test_passed = true
|
24
|
+
profile_url = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-questionnaire-adapt-search|2.0.1'
|
25
25
|
assert !scratch[:adaptive_responses].nil?, 'No resources to validate.'
|
26
26
|
scratch[:adaptive_responses].each_with_index do |resource, index|
|
27
27
|
fhir_resource = FHIR.from_contents(resource.response[:body])
|
28
28
|
fhir_resource.parameter.each do |param|
|
29
29
|
param.resource.entry.each do |entry|
|
30
30
|
resource_is_valid = validate_resource(entry.resource, :questionnaire, profile_url, index)
|
31
|
-
test_passed =
|
31
|
+
test_passed = false unless resource_is_valid
|
32
32
|
end
|
33
33
|
rescue StandardError
|
34
34
|
next
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
if !test_passed && !tests_failed[profile_url].blank?
|
38
|
+
assert test_passed, "Not all returned resources conform to the profile: #{profile_url}"
|
39
|
+
end
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_adaptive_response_validation_test.rb
CHANGED
@@ -15,35 +15,33 @@ module DaVinciDTRTestKit
|
|
15
15
|
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system are not found in
|
16
16
|
the valueset.
|
17
17
|
|
18
|
-
This test may process multiple resources, labeling messages with the corresponding tested resources
|
19
18
|
This test may process multiple resources, labeling messages with the corresponding tested resources
|
20
19
|
in the order that they were received.
|
21
20
|
)
|
22
21
|
|
23
22
|
run do
|
24
23
|
skip_if retrieval_method == 'Static', 'Performing only static flow tests - only one flow is required.'
|
24
|
+
profile_with_version = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters|2.0.1'
|
25
25
|
endpoint = custom_endpoint.blank? ? '/Questionnaire/$questionnaire-package' : custom_endpoint
|
26
26
|
if initial_adaptive_questionnaire_request.nil?
|
27
|
-
|
27
|
+
# making the assumption that only one response was received - if there were multiple, we are only validating the first
|
28
|
+
response = load_tagged_requests(QUESTIONNAIRE_TAG)[0]
|
29
|
+
scratch[:adaptive_responses] = [response]
|
30
|
+
resource = FHIR.from_contents(response.response[:body])
|
28
31
|
else
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
32
|
+
response = fhir_operation("#{url}#{endpoint}", body: JSON.parse(initial_adaptive_questionnaire_request),
|
33
|
+
headers: { 'Content-Type': 'application/json' })
|
34
|
+
resource = FHIR.from_contents(response.response[:body])
|
35
|
+
scratch[:adaptive_responses] = [response]
|
39
36
|
end
|
40
|
-
|
37
|
+
|
41
38
|
assert !scratch[:adaptive_responses].nil?, 'No resources to validate.'
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
39
|
+
assert_response_status([200, 201], response: response.response)
|
40
|
+
assert_resource_type(:parameters, resource: resource)
|
41
|
+
assert_valid_resource(resource: resource, profile_url: profile_with_version)
|
42
|
+
questionnaire_bundle = resource.parameter.find { |param| param.resource.resourceType == 'Bundle' }&.resource
|
43
|
+
assert questionnaire_bundle, 'No questionnaire bundle found in the response'
|
44
|
+
assert_valid_resource(resource: questionnaire_bundle, profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle|2.0.1')
|
47
45
|
end
|
48
46
|
end
|
49
47
|
end
|
data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_request_validation_test.rb
CHANGED
@@ -3,7 +3,7 @@ module DaVinciDTRTestKit
|
|
3
3
|
class PayerAdaptiveFormNextRequestTest < Inferno::Test
|
4
4
|
include URLs
|
5
5
|
include DaVinciDTRTestKit::ValidationTest
|
6
|
-
title '
|
6
|
+
title 'User Input Validation: Next Question request is valid'
|
7
7
|
description %(
|
8
8
|
This test validates the conformance of the client's request to the
|
9
9
|
[SDC Parameters Next Question In](http://hl7.org/fhir/uv/sdc/StructureDefinition/parameters-questionnaire-next-question-in)
|
@@ -49,13 +49,12 @@ module DaVinciDTRTestKit
|
|
49
49
|
using_manual_entry
|
50
50
|
)
|
51
51
|
else
|
52
|
-
|
53
|
-
|
54
|
-
or http://hl7.org/fhir/uv/sdc/StructureDefinition/parameters-questionnaire-next-question-in"
|
52
|
+
messages << { type: 'error',
|
53
|
+
message: format_markdown("No resources were of type 'Parameters' or 'QuestionnaireResponse'") }
|
55
54
|
end
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
errors_found = messages.any? { |message| message[:type] == 'error' }
|
56
|
+
skip_if errors_found, "No resources conform to the profiles http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse-adapt
|
57
|
+
or http://hl7.org/fhir/uv/sdc/StructureDefinition/parameters-questionnaire-next-question-in"
|
59
58
|
end
|
60
59
|
end
|
61
60
|
end
|
data/lib/davinci_dtr_test_kit/payer_server_groups/payer_server_next_response_validation_test.rb
CHANGED
@@ -14,7 +14,6 @@ module DaVinciDTRTestKit
|
|
14
14
|
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system are not found in
|
15
15
|
the valueset.
|
16
16
|
|
17
|
-
This test may process multiple resources, labeling messages with the corresponding tested resources
|
18
17
|
This test may process multiple resources, labeling messages with the corresponding tested resources
|
19
18
|
in the order that they were received.
|
20
19
|
)
|
@@ -38,6 +37,9 @@ module DaVinciDTRTestKit
|
|
38
37
|
:questionnaireResponse,
|
39
38
|
'http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse'
|
40
39
|
)
|
40
|
+
errors_found = messages.any? { |message| message[:type] == 'error' }
|
41
|
+
skip_if errors_found, "No resources conform to the profiles http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse-adapt
|
42
|
+
or http://hl7.org/fhir/uv/sdc/StructureDefinition/parameters-questionnaire-next-question-in"
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
@@ -5,7 +5,7 @@ module DaVinciDTRTestKit
|
|
5
5
|
include DaVinciDTRTestKit::ValidationTest
|
6
6
|
include URLs
|
7
7
|
id :dtr_v201_payer_static_form_request_validation_test
|
8
|
-
title '
|
8
|
+
title 'User Input Validation: Client sends payer server a request for a static form'
|
9
9
|
description %(
|
10
10
|
Inferno will validate that the request to the payer server conforms to the
|
11
11
|
[Input Parameters profile](http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters).
|
@@ -14,36 +14,24 @@ module DaVinciDTRTestKit
|
|
14
14
|
values. CodeableConcept element bindings will fail if none of their codings have a code/system belonging
|
15
15
|
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system
|
16
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
17
|
)
|
21
18
|
input :initial_static_questionnaire_request, :access_token, :retrieval_method
|
22
19
|
|
23
20
|
run do
|
24
21
|
skip_if retrieval_method == 'Adaptive', 'Performing only adaptive flow tests - only one flow is required.'
|
22
|
+
profile_with_version = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters|2.0.1'
|
25
23
|
if initial_static_questionnaire_request.nil?
|
26
|
-
using_manual_entry = false
|
27
24
|
skip_if access_token.nil?, 'No access token provided - required for client flow.'
|
28
|
-
|
29
|
-
skip_if
|
30
|
-
|
31
|
-
|
32
|
-
:parameters,
|
33
|
-
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-input-parameters',
|
34
|
-
questionnaire_package_url,
|
35
|
-
using_manual_entry
|
36
|
-
)
|
25
|
+
requests = load_tagged_requests(QUESTIONNAIRE_TAG)
|
26
|
+
skip_if requests.blank?, 'No request resource received from the client.'
|
27
|
+
# making the assumption that only one request was made here - if there were multiple, we are only validating the first
|
28
|
+
resource_is_valid?(resource: FHIR.from_contents(requests[0].request[:body]), profile_url: profile_with_version)
|
37
29
|
else
|
38
|
-
# TODO: fix redundant logic here
|
39
|
-
skip_if initial_static_questionnaire_request.nil?, 'No request resource was provided - required for manual flow'
|
40
|
-
assert_valid_json(initial_static_questionnaire_request)
|
41
30
|
request = FHIR.from_contents(initial_static_questionnaire_request)
|
42
|
-
|
31
|
+
resource_is_valid?(resource: request, profile_url: profile_with_version)
|
43
32
|
end
|
44
|
-
|
45
|
-
|
46
|
-
skip msg
|
33
|
+
errors_found = messages.any? { |message| message[:type] == 'error' }
|
34
|
+
skip_if errors_found, "Resource does not conform to the profile #{profile_with_version}"
|
47
35
|
end
|
48
36
|
end
|
49
37
|
end
|
@@ -15,23 +15,19 @@ module DaVinciDTRTestKit
|
|
15
15
|
to the bound ValueSet. Quantity, Coding, and code element bindings will fail if their code/system are not found in
|
16
16
|
the valueset.
|
17
17
|
|
18
|
-
This test may process multiple resources, labeling messages with the corresponding tested resources
|
19
|
-
in the order that they were received.
|
20
18
|
)
|
21
19
|
input :url
|
22
20
|
|
23
21
|
run do
|
24
22
|
skip_if retrieval_method == 'Adaptive', 'Performing only adaptive flow tests - only one flow is required.'
|
23
|
+
profile_with_version = 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters|2.0.1'
|
25
24
|
if initial_static_questionnaire_request.nil?
|
26
25
|
skip_if access_token.nil?, 'No access token provided - required for client flow.'
|
27
26
|
resources = load_tagged_requests(QUESTIONNAIRE_TAG)
|
28
27
|
skip_if resources.nil?, 'No request resource received from the client.'
|
29
28
|
scratch[:output_parameters] = resources
|
30
|
-
|
31
|
-
|
32
|
-
:parameters,
|
33
|
-
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters'
|
34
|
-
)
|
29
|
+
# making the assumption that only one response was received- if there were multiple, we are only validating the first
|
30
|
+
assert_valid_resource(resource: FHIR.from_contents(resources[0].request[:body]), profile_url: profile_with_version)
|
35
31
|
else
|
36
32
|
request = fhir_operation("#{url}/Questionnaire/$questionnaire-package",
|
37
33
|
body: JSON.parse(initial_static_questionnaire_request),
|
@@ -40,15 +36,11 @@ module DaVinciDTRTestKit
|
|
40
36
|
resource = FHIR.from_contents(request.response[:body])
|
41
37
|
scratch[:output_parameters] = resource
|
42
38
|
assert_response_status([200, 201], response: request.response)
|
43
|
-
assert_resource_type(:parameters, resource:)
|
44
|
-
|
45
|
-
[request],
|
46
|
-
:parameters,
|
47
|
-
'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-qpackage-output-parameters'
|
48
|
-
)
|
39
|
+
assert_resource_type(:parameters, resource: resource)
|
40
|
+
assert_valid_resource(resource: resource, profile_url: profile_with_version)
|
49
41
|
questionnaire_bundle = resource.parameter.find { |param| param.resource.resourceType == 'Bundle' }&.resource
|
50
42
|
assert questionnaire_bundle, 'No questionnaire bundle found in the response'
|
51
|
-
assert_valid_resource(resource: questionnaire_bundle, profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle')
|
43
|
+
assert_valid_resource(resource: questionnaire_bundle, profile_url: 'http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/DTR-QPackageBundle|2.0.1')
|
52
44
|
end
|
53
45
|
end
|
54
46
|
end
|
@@ -5,14 +5,15 @@ module DaVinciDTRTestKit
|
|
5
5
|
end
|
6
6
|
|
7
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
8
|
begin
|
9
|
+
assert fhir_resource.present?, 'Resource does not contain a recognized FHIR object'
|
10
10
|
assert_resource_type(resource_type, resource: fhir_resource)
|
11
11
|
assert_valid_resource(resource: fhir_resource,
|
12
12
|
profile_url:)
|
13
13
|
rescue StandardError => e
|
14
|
+
add_message('error', e.message)
|
14
15
|
messages.each do |message|
|
15
|
-
message[:message].prepend("[Resource #{index + 1}] ")
|
16
|
+
message[:message].prepend("[Resource #{index + 1}] ") unless message[:message].start_with? '[Resource'
|
16
17
|
end
|
17
18
|
if tests_failed[profile_url].blank?
|
18
19
|
tests_failed[profile_url] = [e]
|
@@ -37,19 +38,16 @@ module DaVinciDTRTestKit
|
|
37
38
|
resources = [resources] unless resources.is_a?(Array)
|
38
39
|
resources.each_with_index do |resource, index|
|
39
40
|
if using_manual_entry
|
40
|
-
assert_valid_json(resource.to_json)
|
41
41
|
fhir_resource = FHIR.from_contents(resource.to_json)
|
42
42
|
else
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
if resource.url != resource_url
|
44
|
+
messages << { type: 'warning',
|
45
|
+
message: format_markdown("Request made to wrong URL: #{resource.request[:url]}. Should instead be to #{resource_url}") }
|
46
|
+
end
|
46
47
|
fhir_resource = FHIR.from_contents(resource.request[:body])
|
47
48
|
end
|
48
49
|
validate_resource(fhir_resource, resource_type, profile_url, index)
|
49
50
|
end
|
50
|
-
return if tests_failed[profile_url].blank?
|
51
|
-
|
52
|
-
raise tests_failed[profile_url][0]
|
53
51
|
end
|
54
52
|
|
55
53
|
def perform_response_validation_test(
|
data/lib/davinci_dtr_test_kit.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
require_relative 'davinci_dtr_test_kit/dtr_payer_server_suite'
|
2
2
|
require_relative 'davinci_dtr_test_kit/dtr_smart_app_suite'
|
3
|
-
|
3
|
+
require_relative 'davinci_dtr_test_kit/dtr_full_ehr_suite'
|
4
4
|
# require_relative 'davinci_dtr_test_kit/dtr_light_ehr_suite'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: davinci_dtr_test_kit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Naden
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-
|
13
|
+
date: 2024-09-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: inferno_core
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.4.
|
21
|
+
version: 0.4.42
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 0.4.
|
28
|
+
version: 0.4.42
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: jwt
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -54,12 +54,20 @@ files:
|
|
54
54
|
- lib/davinci_dtr_test_kit/auth_groups/token_request_test.rb
|
55
55
|
- lib/davinci_dtr_test_kit/auth_groups/token_validation_test.rb
|
56
56
|
- lib/davinci_dtr_test_kit/client_groups/dinner_adaptive/dtr_smart_app_questionnaire_workflow_group.rb
|
57
|
-
- lib/davinci_dtr_test_kit/client_groups/dinner_static/
|
58
|
-
- lib/davinci_dtr_test_kit/client_groups/dinner_static/
|
57
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_dinner_questionnaire_package_request_test.rb
|
58
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_launch_attestation_test.rb
|
59
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_prepopulation_attestation_test.rb
|
60
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_prepopulation_override_attestation_test.rb
|
61
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_prepopulation_representation_attestation_test.rb
|
62
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_questionnaire_workflow_group.rb
|
63
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_rendering_enabled_questions_attestation_test.rb
|
64
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_full_ehr_store_attestation_test.rb
|
65
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_smart_app_dinner_questionnaire_package_request_test.rb
|
66
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_smart_app_prepopulation_attestation_test.rb
|
67
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_smart_app_prepopulation_override_attestation_test.rb
|
68
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_smart_app_questionnaire_response_save_test.rb
|
59
69
|
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_smart_app_questionnaire_workflow_group.rb
|
60
|
-
- lib/davinci_dtr_test_kit/client_groups/dinner_static/
|
61
|
-
- lib/davinci_dtr_test_kit/client_groups/dinner_static/prepopulation_override_attestation_test.rb
|
62
|
-
- lib/davinci_dtr_test_kit/client_groups/dinner_static/rendering_enabled_questions_attestation_test.rb
|
70
|
+
- lib/davinci_dtr_test_kit/client_groups/dinner_static/dtr_smart_app_rendering_enabled_questions_attestation_test.rb
|
63
71
|
- lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_full_ehr_questionnaire_workflow_group.rb
|
64
72
|
- lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_questionnaire_package_group.rb
|
65
73
|
- lib/davinci_dtr_test_kit/client_groups/resp_assist_device/dtr_questionnaire_rendering_attestation_test.rb
|
@@ -72,6 +80,7 @@ files:
|
|
72
80
|
- lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_response_basic_conformance_test.rb
|
73
81
|
- lib/davinci_dtr_test_kit/client_groups/shared/dtr_questionnaire_response_pre_population_test.rb
|
74
82
|
- lib/davinci_dtr_test_kit/cql_test.rb
|
83
|
+
- lib/davinci_dtr_test_kit/docs/dtr_full_ehr_suite_description_v201.md
|
75
84
|
- lib/davinci_dtr_test_kit/docs/dtr_payer_server_suite_description_v201.md
|
76
85
|
- lib/davinci_dtr_test_kit/docs/dtr_smart_app_suite_description_v201.md
|
77
86
|
- lib/davinci_dtr_test_kit/dtr_full_ehr_suite.rb
|